fix(config): print only the value of config get and add display preferences

tea config get printed "key<TAB>value", so $(tea config get editor) was
not usable; it now prints the value alone, and --show-source appends the
source (D18). config get reads the instance's user, and instance settings
come from the selected instance (--host, TEA_HOST, default_host or the
sole instance). Unknown keys list the valid ones, and keys that need
--host or --user say so. config path no longer loads the settings, so it
works when hosts.yml is broken. config list is a table on a terminal.
config set confirms the change on a terminal and warns when default_host
has no account.

config.yml stores the hyperlinks (auto, always, never) and markdown
(auto, raw) preferences that tables and views now read, instead of the
TEA_HYPERLINKS and TEA_MARKDOWN variables. The environment table moves
out of tea config --help into tea help environment.

alias set refuses to replace an alias without --clobber, drops a leading
"tea", and explains how to quote an expansion with spaces or flags.
alias delete takes several names or --all, alias list is a table, and
an empty list says so on a terminal.

Signed-off-by: bircni <bircni@icloud.com>
This commit is contained in:
bircni committed 2026-10-11 23:49:52 +02:00
1 parent 0dfe7def9b
commit 5e8aa1011f
9 files changed
+687 -271

No files matched your search

+20 -1
View File
@@ -120,7 +120,7 @@ func TestUpdatePersistsOnlyExplicitPreferences(t *testing.T) {
snapshot, err := s.Load()
require.NoError(t, err)
require.True(t, snapshot.Configured["editor"])
for _, key := range []string{"git_protocol", "prompt", "color", "aliases"} {
for _, key := range []string{"git_protocol", "prompt", "color", "hyperlinks", "markdown", "aliases"} {
require.False(t, snapshot.Configured[key], key)
}
require.Equal(t, Defaults().GitProtocol, snapshot.Preferences.GitProtocol)
@@ -130,6 +130,25 @@ func TestUpdatePersistsOnlyExplicitPreferences(t *testing.T) {
require.Equal(t, "version: \"1\"\neditor: vi\ncolor: never\n", string(data))
}
func TestDisplayPreferencesAcceptOnlyTheirValues(t *testing.T) {
for _, tc := range []struct {
config string
valid bool
}{
{"hyperlinks: never\n", true},
{"hyperlinks: always\nmarkdown: raw\n", true},
{"hyperlinks: off\n", false},
{"markdown: never\n", false},
} {
t.Run(tc.config, func(t *testing.T) {
s := New(t.TempDir())
require.NoError(t, os.WriteFile(filepath.Join(s.Dir, "config.yml"), []byte("version: '1'\n"+tc.config), 0o600))
_, err := s.Load()
require.Equal(t, tc.valid, err == nil, "%v", err)
})
}
}
func TestTokenlessAccounts(t *testing.T) {
for method, want := range map[string]bool{AuthToken: false, AuthOAuth: false, AuthSSH: true, AuthHTTPSign: true} {
require.Equal(t, want, Account{AuthMethod: method}.Tokenless(), method)