@@ -6,6 +6,122 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
66
77<!-- changelog:entries -->
88
9+ ## [0.1.114-rc.2] - 2026-07-22
10+
11+
12+ ### Added
13+
14+ - Feat(cli): surface the harness golden path (af wait, catalog, golden_path help, JSON envelopes) (#816)
15+
16+ * feat(cli): emit a JSON envelope for af call --async under -o json
17+
18+ `af call --async` printed a bare run-id string on stdout for every output
19+ format, so a harness parsing `-o json` got a non-JSON token. Under an
20+ explicitly requested machine format (-o json/-o yaml) it now emits
21+ {"run_id": "...", "status": "accepted"} so parsers get valid JSON/YAML.
22+
23+ The default and pretty paths keep the bare run-id line that shell scripts
24+ capture via RUN_ID=$(af call node.reasoner --async), so that contract does
25+ not regress.
26+
27+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
28+
29+ * feat(cli): surface the golden path in af agent help
30+
31+ The machine-friendly `af agent help` payload taught discovery and
32+ introspection but never execution: quick_start omitted `af call` and
33+ `af tail` entirely, so a harness could find agents but was never shown how
34+ to run one.
35+
36+ Add a `golden_path` field — an ordered array of {step, command, purpose}
37+ covering the full driving loop (doctor → catalog → install → secrets →
38+ run → ls/discover → call --schema → call --async → wait/tail) — and add
39+ `af call` and `af tail` entries to quick_start.
40+
41+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
42+
43+ * feat(cli): install both AgentField skills when no skill name is given
44+
45+ `af skill install` with no argument resolved to Catalog[0] and installed
46+ only the `agentfield` build skill, never `agentfield-use` — the drive
47+ skill that documents the discover → call → wait loop. A first-time user
48+ therefore never got the golden-loop docs.
49+
50+ Add skillkit.InstallAll, which installs every catalog skill into the
51+ resolved targets, and call it from `af skill install` when no skill name
52+ is passed. Explicit `af skill install <name>` is unchanged. The
53+ interactive picker copy now names both skills (build + drive).
54+
55+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
56+
57+ * feat(cli): add a shared control-plane-unreachable hint
58+
59+ `af call`/`af ls`/`af tail` emitted a raw Go dial error when the control
60+ plane was down, with no guidance — while `af agent` commands already
61+ appended a reachability hint. Every CLI command that talks to the control
62+ plane routes through makeRequest, so wrap a transport-level failure there
63+ with a shared, actionable hint:
64+
65+ Control plane not reachable at <url>. Start it with `af server` or
66+ launch the AgentField desktop app.
67+
68+ A cancelled context (Ctrl-C / caller-handled timeout) is passed through
69+ unwrapped so only genuine connectivity failures get the hint.
70+
71+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
72+
73+ * feat(cli): add af wait to block on an async run
74+
75+ `af call --async` returns a run_id, but there was no first-class way to
76+ block until that run finished — a harness had to poll or tail. Add
77+ `af wait <run_id> [--timeout <sec, default 600>]`: it polls the run
78+ overview (the same /api/v1/agentic/run/:run_id API `af agent run --id`
79+ uses) until every execution is terminal, prints the final status and
80+ result as JSON, and maps outcomes to exit codes — 0 on succeeded, 1 on
81+ failed/cancelled, 2 on timeout.
82+
83+ A 404 (records not yet written after an async accept) is treated as
84+ "not ready" so a freshly-accepted run keeps polling. The command also
85+ exercises the shared control-plane-unreachable hint, covered here by a
86+ cross-command test over call/ls/tail/wait.
87+
88+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
89+
90+ * feat(cli): add af catalog to browse installable agent nodes
91+
92+ There was no CLI way to discover installable nodes — the only curated
93+ catalog lived in the desktop app (desktop/src/shared/catalog.ts). Add
94+ `af catalog`, backed by an in-binary catalog seeded from that same
95+ curated list (name, description, install source, docs URL), so a harness
96+ can browse nodes before `af install` and works offline.
97+
98+ Supports `-o json`/`-o yaml`; the human table ends with the hint
99+ `af install <source>`.
100+
101+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
102+
103+ * test(cli): cover af wait/catalog command paths for the patch gate
104+
105+ Add behavior tests for the previously-untested command wiring and
106+ error paths surfaced by the coverage patch gate:
107+
108+ - af wait: pretty output, invalid-format/empty-id (exit 2), a control
109+ plane 5xx (exit 3), the nil-opts default path, end-to-end command
110+ execution, and rootExecutionResult (explicit root, last-execution
111+ fallback, non-JSON, empty).
112+ - af catalog: end-to-end command execution under -o json.
113+ - af skill install <name>: the explicit-name path stays single-skill.
114+ - makeRequest: a cancelled context is passed through unwrapped, not
115+ relabeled as an unreachable-control-plane error.
116+
117+ Raises control-plane patch coverage back over the 80% floor.
118+
119+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
120+
121+ ---------
122+
123+ Co-authored-by: Claude Fable 5 <noreply@anthropic.com> (d6197f0)
124+
9125## [0.1.114-rc.1] - 2026-07-22
10126
11127
0 commit comments