diff --git a/internal/app/auth_command_test.go b/internal/app/auth_command_test.go index 751539ba..1fe99832 100644 --- a/internal/app/auth_command_test.go +++ b/internal/app/auth_command_test.go @@ -70,7 +70,7 @@ func TestAuthStatusRefreshFailureLeavesStoredTokenIntact(t *testing.T) { t.Fatal("secure token data should remain in keychain after refresh failure") } - if !bytes.Contains(out.Bytes(), []byte("已登录")) { + if !bytes.Contains(out.Bytes(), []byte("\"authenticated\"")) { t.Fatalf("output should still report authenticated status:\n%s", out.String()) } } diff --git a/internal/app/flags.go b/internal/app/flags.go index 2f3c5239..33ea9112 100644 --- a/internal/app/flags.go +++ b/internal/app/flags.go @@ -37,7 +37,7 @@ func bindPersistentFlags(cmd *cobra.Command, flags *GlobalFlags) { cmd.PersistentFlags().StringVar(&flags.ClientSecret, "client-secret", "", "Override OAuth client secret (DingTalk AppSecret)") cmd.PersistentFlags().BoolVar(&flags.Debug, "debug", false, "显示调试日志") cmd.PersistentFlags().BoolVar(&flags.DryRun, "dry-run", false, "预览操作内容,不实际执行") - cmd.PersistentFlags().StringVarP(&flags.Format, "format", "f", "table", "输出格式: json|table|raw") + cmd.PersistentFlags().StringVarP(&flags.Format, "format", "f", "json", "输出格式: json|table|raw") cmd.PersistentFlags().BoolVar(&flags.Mock, "mock", false, "使用 Mock 数据 (开发调试用)") cmd.PersistentFlags().StringVarP(&flags.Output, "output", "o", "", "Write command output to a file") _ = cmd.PersistentFlags().MarkHidden("output") diff --git a/internal/app/root_execute_test.go b/internal/app/root_execute_test.go index 35f09a0d..6a3294c4 100644 --- a/internal/app/root_execute_test.go +++ b/internal/app/root_execute_test.go @@ -29,7 +29,7 @@ import ( mockmcp "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/test/mock_mcp" ) -func TestPrintExecutionErrorDefaultsToHumanReadable(t *testing.T) { +func TestPrintExecutionErrorDefaultsToJSON(t *testing.T) { t.Parallel() root := NewRootCommand() @@ -43,14 +43,11 @@ func TestPrintExecutionErrorDefaultsToHumanReadable(t *testing.T) { if err != nil { t.Fatalf("printExecutionError() error = %v", err) } - if stdout.Len() != 0 { - t.Fatalf("stdout = %q, want empty for human-readable error output", stdout.String()) + if stderr.Len() != 0 { + t.Fatalf("stderr = %q, want empty for JSON error output", stderr.String()) } - if !strings.Contains(stderr.String(), "Error: [VALIDATION] bad flag") { - t.Fatalf("stderr = %q, want human-readable header", stderr.String()) - } - if !strings.Contains(stderr.String(), "Hint: Pass the required flag and retry.") { - t.Fatalf("stderr = %q, want hint line", stderr.String()) + if !strings.Contains(stdout.String(), "\"category\": \"validation\"") { + t.Fatalf("stdout = %q, want JSON error payload", stdout.String()) } } @@ -175,8 +172,8 @@ func TestVersionCommandDoesNotRequirePINOrLogin(t *testing.T) { if err := root.Execute(); err != nil { t.Fatalf("Execute(version) error = %v", err) } - if !strings.Contains(out.String(), "版本:") { - t.Fatalf("version output missing version header:\n%s", out.String()) + if !strings.Contains(out.String(), "\"version\"") { + t.Fatalf("version output missing version key:\n%s", out.String()) } } @@ -216,8 +213,8 @@ func TestVersionCommandUsesCachedRegistryWithoutBlockingAgedDiscovery(t *testing if elapsed := time.Since(start); elapsed >= 200*time.Millisecond { t.Fatalf("Execute(version) took %v, want cached startup under 200ms", elapsed) } - if !strings.Contains(out.String(), "版本:") { - t.Fatalf("version output missing version header:\n%s", out.String()) + if !strings.Contains(out.String(), "\"version\"") { + t.Fatalf("version output missing version key:\n%s", out.String()) } } diff --git a/internal/generator/generator.go b/internal/generator/generator.go index ca33aa97..be8c7993 100644 --- a/internal/generator/generator.go +++ b/internal/generator/generator.go @@ -394,7 +394,7 @@ func renderSharedSkill(catalog ir.Catalog) string { builder.WriteString("dws auth status\n") builder.WriteString("```\n\n") builder.WriteString("## Global Rules\n\n") - builder.WriteString("- Always prefer `--format json` for agent-readable output.\n") + builder.WriteString("- Output defaults to JSON. Use `--format table` for human-readable output.\n") builder.WriteString("- Confirm with user before any write/delete/revoke action.\n") builder.WriteString("- Never fabricate IDs; always extract from command output.\n") builder.WriteString("- For risky operations, run a read/list check before executing write operations.\n\n") diff --git a/skills/references/global-reference.md b/skills/references/global-reference.md index 90dd18a2..c25ca155 100644 --- a/skills/references/global-reference.md +++ b/skills/references/global-reference.md @@ -58,7 +58,7 @@ dws recovery finalize --event-id --outcome recovered|failed|handoff - | 标志 | 短名 | 说明 | 默认 | |------|:---:|------|------| -| `--format` | `-f` | 输出格式: json / table / raw | table | +| `--format` | `-f` | 输出格式: json / table / raw | json | | `--verbose` | `-v` | 详细日志 | false | | `--debug` | | 调试日志 | false | | `--yes` | `-y` | 跳过确认提示 | false | @@ -71,13 +71,13 @@ dws recovery finalize --event-id --outcome recovered|failed|handoff - ## 输出格式 -### --format json (机器可读, Agent 必须使用) +### --format json (机器可读, 默认) ```json {"success": true, "body": {...}} ``` -### --format table (人类可读, 默认) +### --format table (人类可读) ``` 已创建 AI 表格 "项目管理" (UUID: abc123)