YeonGyu-Kim and GitHub
9d05573f24
fix: unknown slash command emits unknown_slash_command error_kind ( #827 )
...
Both direct-slash CLI path (claw /boguscommand) and resume slash path
(claw --resume session /boguscommand) previously emitted error_kind:unknown
(opaque fallback). Machine consumers could not distinguish unrecognized
slash commands from other error classes.
Fix:
- format_unknown_direct_slash_command: prefix with 'unknown_slash_command:'
- format_unknown_slash_command (resume path): prefix with 'unknown_slash_command:'
- Add classifier arm for 'unknown_slash_command:' prefix
One new regression test: direct_unknown_slash_command_emits_typed_error_kind
Uses the direct-slash CLI path (no session load needed; reproducible on CI).
572 tests pass, 1 pre-existing worker_boot failure unrelated.
2026-05-29 16:00:37 +09:00
YeonGyu-Kim
58902915f6
docs: record #827 - resume unknown slash command emits opaque error_kind:unknown
2026-05-29 14:59:12 +09:00
YeonGyu-Kim and GitHub
d47b015100
fix: unknown single-word subcommand emits command_not_found (#825/#826)
...
Single-word all-alpha/dash tokens that don't match any known subcommand
now always emit command_not_found (with or without fuzzy suggestions).
Multi-word cases fall through to CliAction::Prompt (natural language
prompt passthrough like 'claw explain this' must still work). The
multi-word gap is documented as ROADMAP #826 (known limitation).
Tests:
- unknown_subcommand_json_emits_command_not_found (new)
- unknown_subcommand_text_emits_command_not_found_on_stderr (new)
- unknown_subcommand_typo_with_suggestions_json_emits_command_not_found (new)
- multi_word_unknown_subcommand_falls_through_to_prompt_826 (documents gap)
572 tests pass, 1 pre-existing worker_boot failure unrelated.
2026-05-29 14:58:07 +09:00
YeonGyu-Kim
5458d3547a
docs: record #826 - multi-word unknown subcommand falls through to missing_credentials
2026-05-29 14:38:09 +09:00
YeonGyu-Kim and GitHub
70d64be033
fix: unknown single-word subcommand emits command_not_found instead of missing_credentials ( #825 )
...
When looks_like_subcommand_typo fires on a single word with no close
fuzzy matches, the fallthrough reached CliAction::Prompt → provider
startup → misleading missing_credentials error.
Fix: always return Err with command_not_found: prefix from the typo
guard (with or without suggestions). Added command_not_found classifier
arm in classify_error_kind. Unified existing unknown_subcommand kind
under command_not_found in #825 .
Three new regression tests in output_format_contract.rs:
- unknown_subcommand_json_emits_command_not_found
- unknown_subcommand_text_emits_command_not_found_on_stderr
- unknown_subcommand_typo_with_suggestions_json_emits_command_not_found
Updated pre-existing unit test assertion (starts_with → contains) and
classifier unit test (unknown_subcommand → command_not_found).
572 tests pass, 1 pre-existing worker_boot failure unrelated.
2026-05-29 14:37:29 +09:00
YeonGyu-Kim and GitHub
de7edd5bb1
fix: suppress config deprecation stderr in JSON mode globally ( #824 )
...
Add SUPPRESS_CONFIG_WARNINGS_STDERR AtomicBool flag in runtime/config.rs
and expose suppress_config_warnings_for_json_mode() via runtime crate.
In main.rs, scan raw argv for --output-format json before parse_args
and activate the flag so no settings-load warnings reach stderr on any
JSON-mode surface (status, sandbox, system-prompt, mcp list, skills list,
agents list, --resume /config*, etc.).
Text-mode surfaces are unaffected; prose deprecation warnings continue
to appear on stderr.
All 572+ tests pass (one pre-existing worker_boot failure unrelated).
2026-05-29 14:00:32 +09:00
YeonGyu-Kim
f0e6671538
docs: record #824 - global settings-load deprecation leaks to stderr in JSON mode
2026-05-29 13:34:29 +09:00
YeonGyu-Kim and GitHub
b4b1ba10f6
fix: route all JSON-mode abort envelopes to stdout ( #819 #820 #823 ) ( #3197 )
...
* fix: route all JSON-mode abort envelopes to stdout (#819 #820 #823 )
All handled errors in --output-format json mode now write the structured
abort envelope to stdout (rc=1) and keep stderr empty. Previously the
top-level error handler and resume_session JSON branches used eprintln!
which sent the envelope to stderr, breaking machine consumers that read
stdout for command payloads.
Surfaces fixed:
- Top-level abort handler (main.rs): export --session <missing>,
session <subcommand>, prompt (no text), unknown subcommand fallthrough,
flag errors, and all other run() failures
- resume_session JSON branches: session load errors, unsupported commands,
parse errors, command execution errors
Test changes: updated 24 failing contract tests to assert JSON envelopes
on stdout. Added stderr-clean assertions where appropriate. 70 contract
tests pass (was 68; 2 additional from regression coverage).
ROADMAP: #819 (export session-not-found), #820 (interactive_only class),
#823 (missing prompt)
* style: cargo fmt on main.rs after eprintln->println fix
* fix(tests): fmt + update compact_output test for stdout abort envelope routing
* fix(tests): update resume_slash_commands stub test for stdout envelope routing
2026-05-29 13:30:35 +09:00
YeonGyu-Kim
e50c46c1ed
docs: extend #821 - config/providers also leak deprecation warning in JSON mode
2026-05-29 12:01:09 +09:00
YeonGyu-Kim
3dbb35c3aa
docs: record prompt missing-text JSON stderr routing gap ( #823 )
2026-05-29 11:31:28 +09:00
YeonGyu-Kim
3a76c4f4fd
docs: record unknown subcommand falls through to provider startup ( #822 )
2026-05-29 11:01:13 +09:00
YeonGyu-Kim
69b59079c5
docs: record status/sandbox/system-prompt JSON stderr deprecation leak ( #821 )
2026-05-29 10:31:13 +09:00
YeonGyu-Kim
42aff269d1
docs: record interactive_only error class JSON stderr routing gap ( #820 )
2026-05-29 10:01:01 +09:00
YeonGyu-Kim
efe59c22e4
docs: record export session-not-found JSON stderr routing gap ( #819 )
2026-05-29 09:33:25 +09:00
YeonGyu-Kim
37a9a543d6
docs: record AGENTS.md and .claude/CLAUDE.md instruction cascade gap ( #818 )
2026-05-29 08:09:51 +09:00
YeonGyu-Kim
87b7e74770
fix( #806 ): plugins show <not-found> in text mode returned empty success instead of error
2026-05-27 22:34:10 +09:00
YeonGyu-Kim
efd34c151a
fix( #805 ): skills show <not-found> in text mode silently returned empty success instead of error
2026-05-27 21:05:41 +09:00
YeonGyu-Kim
2c3c0f60e7
fix( #804 ): agents/skills show <name> <extra> in text mode returned wrong error instead of unexpected_extra_args
2026-05-27 20:05:39 +09:00
YeonGyu-Kim
bad1b97f8e
fix( #803 ): agents/skills/plugins list --flag in text mode silently returned empty success
2026-05-27 19:38:31 +09:00
YeonGyu-Kim
fcebf64468
fix( #802 ): four resume-mode and broad-cwd error envelopes now include hint field
2026-05-27 19:04:15 +09:00
YeonGyu-Kim
53953a8157
fix( #801 ): diff non-git-dir error envelope now includes error_kind, hint, and message fields
2026-05-27 18:34:58 +09:00
YeonGyu-Kim
1201dc60ef
docs(roadmap): add deferred entries #798-#800 (plugins extra-arg, empty-prompt, classifier coverage)
2026-05-27 18:21:35 +09:00
YeonGyu-Kim
6ee67d6c61
test: add unit test coverage for invalid_history_count and unknown_option classifier arms
...
Two classifier arms had no corresponding assert_eq! in
test_classify_error_kind_returns_correct_discriminants: invalid_history_count
(both prefix and contains paths) and unknown_option (#790 ). Now 49/39 = full
coverage of all classify_error_kind return values.
2026-05-27 18:05:33 +09:00
YeonGyu-Kim
efb1542a39
fix: empty-prompt error now returns non-null hint via newline-delimited usage string
...
claw '' and claw ' ' returned empty_prompt + hint:null because the
error message had no newline delimiter. Added usage hint. 61 CLI
contract tests pass.
2026-05-27 16:34:37 +09:00
YeonGyu-Kim
bff370003b
fix: plugins extra-arg errors now return non-null hint via newline-delimited usage string
...
Parity with #791 (config extra-arg fix). The plugins arg parser emitted
'unexpected extra arguments after claw plugins show ...' with no newline
delimiter, so split_error_hint returned None. Added usage hint after newline.
60 CLI contract tests pass.
2026-05-27 15:04:03 +09:00
YeonGyu-Kim
9976585f87
fix( #796 ): agents/skills show <name> <extra> returned wrong not-found instead of unexpected_extra_args
2026-05-27 14:07:04 +09:00
YeonGyu-Kim
18b4cee5fd
fix( #795 ): skill_not_found and unsupported_skills_action now return non-null hints via fallback table
2026-05-27 13:34:09 +09:00
YeonGyu-Kim
491f179a03
fix( #794 ): plugins install not-found path returns typed plugin_source_not_found instead of unknown+null
2026-05-27 13:08:14 +09:00
YeonGyu-Kim
57a57ef771
fix( #793 ): plugins list --flag silent success + uninstall not-found hint:null
2026-05-27 12:34:35 +09:00
YeonGyu-Kim
abfa2e4cf7
fix( #792 ): agents/skills list --flag silently returned empty success; now returns unknown_option error
2026-05-27 11:39:44 +09:00
YeonGyu-Kim
93a159dca5
fix( #791 ): config extra-arg errors now return non-null hint via \n-delimited usage string
2026-05-27 11:04:50 +09:00
YeonGyu-Kim
9968a27e92
fix( #790 ): system-prompt unknown-option errors now return typed unknown_option kind + non-null hint
2026-05-27 10:36:12 +09:00
YeonGyu-Kim
e4c3c1aa80
fix( #789 ): agents show and plugins show not-found now exit 1; parity with skills ( #788 ) and mcp ( #68 )
2026-05-27 10:07:51 +09:00
YeonGyu-Kim
abdbf61acf
fix( #788 ): skills show not-found emitted duplicate JSON error envelope; use exit(1) instead of Err propagation
2026-05-27 09:36:11 +09:00
YeonGyu-Kim
113145a42a
fix( #787 ): --resume with directory path returns session_path_is_directory kind + hint; wire fallback_hint_for_error_kind into both resume error emission sites
2026-05-27 09:06:28 +09:00
YeonGyu-Kim
22b423b651
fix( #786 ): dump-manifests --manifests-dir missing-value errors now return typed missing_flag_value kind + non-null hint
2026-05-27 08:39:11 +09:00
YeonGyu-Kim
87f4334728
fix( #785 ): add unknown_subcommand classifier arm for unknown subcommand: prose prefix
2026-05-27 08:36:41 +09:00
YeonGyu-Kim
e628b4bb68
fix( #784 ): export --output missing-value and extra-positional errors now return typed error_kind + non-null hint
2026-05-27 08:07:32 +09:00
YeonGyu-Kim
81fe0ccbb7
fix( #783 ): init JSON envelope now includes hint and already_initialized fields for orchestrator parity
2026-05-27 08:04:15 +09:00
YeonGyu-Kim
32c9276fdb
fix( #782 ): acp unsupported invocation now returns non-null hint with newline-delimited remediation text
2026-05-27 07:37:26 +09:00
YeonGyu-Kim
16c1117af6
fix( #781 ): sub-classify api_auth_error/api_rate_limit_error from api_http_error; add fallback_hint_for_error_kind for hint-less API errors
2026-05-27 07:34:57 +09:00
YeonGyu-Kim
d9844cfe8d
fix( #780 ): classifier arm ordering bug — legacy_session_no_workspace_binding and no_managed_sessions shadowed by generic session_load_failed arm
2026-05-27 05:34:49 +09:00
YeonGyu-Kim
364e7909f4
fix( #779 ): resumed /skills invocation returns interactive_only error_kind + non-null hint
2026-05-27 05:09:07 +09:00
YeonGyu-Kim
fded4f6b11
fix( #778 ): doctor check JSON objects now include hint field with stable remediation text for warn/fail checks
2026-05-27 05:07:02 +09:00
YeonGyu-Kim
e02030364d
fix( #777 ): resumed /plugins mutations return interactive_only error_kind + non-null hint instead of unknown+null
2026-05-27 04:44:06 +09:00
YeonGyu-Kim
2684737d9e
fix( #776 ): resume command errors now return typed error_kind + non-null hint (invalid_history_count, session action errors)
2026-05-27 04:39:43 +09:00
YeonGyu-Kim
028998d040
test( #775 ): integration tests for #769-#771 interactive-only guards and #774 hint fields; fix stale classifier unit test string
2026-05-27 04:03:52 +09:00
YeonGyu-Kim
c760a49c47
fix( #774 ): agents/plugins/mcp unknown-subcommand errors now include non-null hint
2026-05-27 03:37:00 +09:00
YeonGyu-Kim
727a1ea4a3
fix( #773 ): config --output-format json now surfaces deprecation warnings in warnings[] array instead of only stderr text
2026-05-27 03:05:14 +09:00
YeonGyu-Kim
212f0b2ad4
fix( #772 ): slash command aliases now resolve to canonical forms in interactive_only guidance
2026-05-27 02:37:17 +09:00
YeonGyu-Kim
bf212b986d
fix( #771 ): init rejects extra args; usage/stats/fork return interactive_only instead of credential check
2026-05-27 02:33:55 +09:00
YeonGyu-Kim
3a1d88386c
fix( #770 ): cost/clear/memory/ultraplan/model with args now return interactive_only instead of falling to credential check
2026-05-27 02:10:41 +09:00
YeonGyu-Kim
9e1be05634
fix( #769 ): claw session <arg> now returns interactive_only instead of falling to credential check
2026-05-27 02:05:14 +09:00
YeonGyu-Kim
b778d4e3d4
fix( #768 ): --resume non-slash trailing arg now has error_kind:invalid_resume_argument + hint
2026-05-27 01:35:46 +09:00
YeonGyu-Kim
89735dbd33
fix( #766 ): claw diff extra args now classified as unexpected_extra_args with hint; track #767 session subcommand gap
2026-05-27 01:33:24 +09:00
YeonGyu-Kim
d29a8e216b
fix( #765 ): login/logout removed_subcommand now has error_kind + non-null hint
2026-05-27 01:28:35 +09:00
YeonGyu-Kim
4ea255ca6a
fix( #764 ): config_parse_error now populates hint field via Display newline delimiter
2026-05-27 01:23:00 +09:00
YeonGyu-Kim
c86dc73d8c
fix( #763 ): config JSON parse errors now classify as config_parse_error
2026-05-27 01:16:04 +09:00
YeonGyu-Kim
88ce181031
test( #762 ): classify_error_kind now covers all 23 classifier arms (was 8 of 23)
2026-05-27 00:33:11 +09:00
YeonGyu-Kim
d83de563c1
fix( #761 ): mcp server_not_found and skill_not_found envelopes now include hint field
2026-05-27 00:03:53 +09:00
YeonGyu-Kim
7fa81b5dae
fix( #760 ): agent_not_found and plugin_not_found envelopes now include hint field
2026-05-26 23:36:30 +09:00
YeonGyu-Kim
ef31328aab
fix( #759 ): validate_model_syntax error strings now use newline separator so hint is non-null
2026-05-26 23:04:04 +09:00
YeonGyu-Kim
b8b3af6fc9
fix( #758 ): --cwd, --date, --session missing-value errors now use missing_flag_value prefix + hint
2026-05-26 22:34:18 +09:00
YeonGyu-Kim
02d77ae1f1
fix( #757 ): --permission-mode invalid and --allowedTools missing now emit typed error_kind and hint
2026-05-26 22:04:00 +09:00
YeonGyu-Kim
4df146188f
fix+test( #756 ): missing/invalid flag-value errors now emit typed error_kind and non-null hint
2026-05-26 21:37:28 +09:00
YeonGyu-Kim
0e8a449ea9
fix+test( #755 ): -p consumes exactly one token; flags after prompt text now parse normally
2026-05-26 21:27:39 +09:00
YeonGyu-Kim
c70312bd04
fix( #754 ): missing_credentials hint now newline-delimited so JSON hint field is non-null
2026-05-26 21:23:03 +09:00
YeonGyu-Kim
e93271356f
fix+test( #753 ): claw -p (no arg) parity with #750 : error_kind:missing_prompt with non-null hint
2026-05-26 20:46:27 +09:00
YeonGyu-Kim
cfc26729cf
fix( #752 ): cli_parse unrecognized-arg errors now emit non-null hint for all subcommands
2026-05-26 20:41:12 +09:00
YeonGyu-Kim
ddc71b5620
test( #751 ): regression guard for #750 prompt no-arg error_kind and hint contract
2026-05-26 20:05:34 +09:00
YeonGyu-Kim
ac925ed41c
fix( #750 ): claw prompt (no arg) now emits error_kind:missing_prompt with non-null hint
2026-05-26 20:03:14 +09:00
YeonGyu-Kim
2dfb7af66e
fix+test( #749 ): compact interactive-only hint now non-null; extend compact JSON test for hint contract
2026-05-26 19:38:09 +09:00
YeonGyu-Kim
3975f2b3ab
fix( #748 ): mcp unknown subcommand now emits error_kind:unknown_mcp_action matching agents/plugins parity
2026-05-26 19:35:55 +09:00
YeonGyu-Kim
04eb661e57
test( #747 ): regression guard for #745 bare slash command hint contract (issue/pr/commit)
2026-05-26 19:06:59 +09:00
YeonGyu-Kim
18e7744e42
fix( #746 ): non-TTY interactive-only error populates hint field via newline split
2026-05-26 19:04:56 +09:00
YeonGyu-Kim
3c5459a33b
fix( #745 ): bare slash command guidance adds newline before hint; claw issue/pr/commit etc now have non-null hint
2026-05-26 18:36:21 +09:00
YeonGyu-Kim
92e053a133
test( #744 ): regression guard for #741 config unsupported-section hint contract
2026-05-26 18:06:35 +09:00
YeonGyu-Kim
1d5db5f77d
fix( #743 ): plugins help --output-format json now emits usage envelope matching agents/mcp/skills help shape; resolves #420
2026-05-26 18:04:04 +09:00
YeonGyu-Kim
2036f0bd4c
test( #742 ): add git-fixture test for diff changed_file_count dedup; fixes unreachable branch in #740 coverage
2026-05-26 17:41:02 +09:00
YeonGyu-Kim
6e78c1fc8b
fix( #741 ): config unsupported_config_section error now populates hint field; list/show/help verbs get usage hint
2026-05-26 17:38:02 +09:00
YeonGyu-Kim
5d072d21e9
test( #740 ): diff JSON contract test now asserts changed_file_count field behavior per #733
2026-05-26 16:45:02 +09:00
YeonGyu-Kim
d5f0d6ed3e
fix( #739 ): skills unknown-subcommand JSON path no longer emits double error envelope; help action not propagated as Err
2026-05-26 16:38:17 +09:00
YeonGyu-Kim
4c3cb0f347
fix( #738 ): interactive-only slash command error adds newline before hint; hint field now non-null with remediation text
2026-05-26 16:06:38 +09:00
YeonGyu-Kim
c592313d9a
test( #737 ): add boot_preflight details non-null-value regression guard to output_format_contract
2026-05-26 15:05:00 +09:00
YeonGyu-Kim
ad982d20c2
fix( #736 ): boot_preflight doctor details[] null-value entries: add double-space separator to Required binary, Last failed boot, MCP/Plugin eligible format strings
2026-05-26 14:33:18 +09:00
YeonGyu-Kim
b3242e8c04
fix( #735 ): classify_error_kind: /compact and other interactive-only slash commands now emit error_kind:interactive_only not unknown
2026-05-26 14:08:53 +09:00
YeonGyu-Kim
d4494a8aeb
fix( #734 ): agents/plugins show not-found envelopes gain message field; parity with skills show
2026-05-26 13:34:36 +09:00
YeonGyu-Kim
cc86f54d65
fix( #701 ): doctor JSON details[] now {key,value} objects; prose preserved as details_prose[]; acceptance check passes
2026-05-26 13:10:05 +09:00
YeonGyu-Kim
db80c9b96e
fix( #733 ): diff JSON adds changed_file_count; run git diff --name-only for staged+unstaged and deduplicate into BTreeSet
2026-05-26 13:05:44 +09:00
YeonGyu-Kim
4c16a42f39
fix( #732 ): status JSON allowed_tools.entries:null→[] when unrestricted; callers can use .entries|length without null guard
2026-05-26 12:36:13 +09:00
YeonGyu-Kim
29dcd478a0
fix( #731 ): sandbox JSON status:error→warn when filesystem sandbox active but namespace unsupported (macOS degraded state)
2026-05-26 12:05:11 +09:00
YeonGyu-Kim
425d94ee43
fix( #730 ): add path field to plugins list/show JSON; completes path-discoverability trio (agents #728 , skills #729 , plugins #730 )
2026-05-26 11:38:48 +09:00
YeonGyu-Kim
8f44ad308d
fix( #729 ): add path field to skills list/show JSON; SkillSummary parity with AgentSummary ( #728 )
2026-05-26 11:32:53 +09:00
YeonGyu-Kim
fa29909f05
fix( #728 ): add path field to agents list/show JSON; AgentSummary now stores on-disk .toml path from discovery loop
2026-05-26 11:09:46 +09:00
YeonGyu-Kim
9757fef8a7
fix( #727 ): add has_upstream bool to branch_freshness JSON to disambiguate fresh:null-no-upstream from fresh:null-unknown
2026-05-26 10:34:28 +09:00
YeonGyu-Kim
a0c6c8ba53
fix( #726 ): classify legacy_session_no_workspace_binding error_kind in export path
2026-05-26 10:04:32 +09:00
YeonGyu-Kim
922c239863
fix( #723 ): add scripts/roadmap-next-id.sh to prevent concurrent ROADMAP id collision; document optimistic-append pattern
2026-05-26 08:09:54 +09:00
YeonGyu-Kim
d8a6109085
docs(#721/#722): re-add ROADMAP entry for config section expansion after rebase conflict
2026-05-26 08:06:11 +09:00
YeonGyu-Kim
02d1f6a04d
fix( #720 ): claw help <topic> now routes to subsystem help instead of cli_parse error; add Agents/Skills/Plugins/Mcp/Config/Diff help topics
2026-05-26 07:36:50 +09:00
YeonGyu-Kim
fe2b13a46a
fix( #719 ): plugins list <filter> now applies substring filter on plugin id, matching agents/skills parity
2026-05-26 07:03:22 +09:00