@open-agent-toolkit/cli 0.2.56 → 0.2.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/assets/agents/oat-phase-implementer.md +166 -10
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/contributing/smoke-testing.md +44 -0
  4. package/assets/docs/workflows/projects/implementation-execution.md +6 -2
  5. package/assets/docs/workflows/skills/explainer-kit.md +8 -5
  6. package/assets/public-package-versions.json +4 -4
  7. package/assets/skills/analyze/SKILL.md +18 -17
  8. package/assets/skills/oat-brainstorm/SKILL.md +2 -2
  9. package/assets/skills/oat-doctor/SKILL.md +49 -36
  10. package/assets/skills/oat-idea-summarize/SKILL.md +2 -2
  11. package/assets/skills/oat-project-autonomous/SKILL.md +17 -10
  12. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +3 -3
  13. package/assets/skills/oat-project-complete/SKILL.md +18 -8
  14. package/assets/skills/oat-project-design/SKILL.md +15 -1
  15. package/assets/skills/oat-project-discover/SKILL.md +3 -3
  16. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +3 -3
  17. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  18. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +12 -3
  19. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +3 -3
  20. package/assets/skills/oat-project-implement/references/phase-execution.md +225 -7
  21. package/assets/skills/oat-project-implement/references/plan-and-resume.md +5 -2
  22. package/assets/skills/oat-project-implement/scripts/capture-dirty-tree.mjs +1069 -0
  23. package/assets/skills/oat-project-import-plan/SKILL.md +12 -6
  24. package/assets/skills/oat-project-next/SKILL.md +7 -5
  25. package/assets/skills/oat-project-plan/SKILL.md +24 -12
  26. package/assets/skills/oat-project-pr-final/SKILL.md +2 -2
  27. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +3 -3
  28. package/assets/skills/oat-project-quick-start/SKILL.md +11 -6
  29. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +3 -3
  30. package/assets/skills/oat-project-retro/SKILL.md +4 -2
  31. package/assets/skills/oat-project-review-receive/SKILL.md +9 -5
  32. package/assets/skills/oat-project-revise/SKILL.md +6 -6
  33. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-phase-implementer
3
- version: 1.1.1
3
+ version: 1.1.3
4
4
  description: Implements one plan phase end-to-end, commits each task separately, self-checks between tasks, and handles bounded review fixes when resumed by oat-project-implement.
5
5
  tools: Read, Write, Edit, Bash, Grep, Glob, Task
6
6
  color: cyan
@@ -37,7 +37,8 @@ The root supplies:
37
37
  candidates, and formal dispatch stamp;
38
38
  - `phase_recovery_limit`, `phase_recovery_attempts_used`,
39
39
  `original_request_id`, and the root-resolved recovery authorization source;
40
- - optional `parallel_group`, `expected_base_sha`, and smoke run metadata.
40
+ - optional `parallel_group`, `expected_base_sha`, `recovered_patch`, and
41
+ smoke run metadata.
41
42
 
42
43
  Fix mode also supplies:
43
44
 
@@ -341,12 +342,62 @@ use ancestry from `expected_base_sha` as a substitute for the exact
341
342
  `phase_base_head` check. For a plan-declared parallel group, verify this before
342
343
  any task edit.
343
344
 
345
+ A fresh child never starts on a dirty tree. The one exception is a supplied
346
+ `recovered_patch`, which carries work a lost child left behind: verify it,
347
+ apply it, review it, and commit it as your first action before task one,
348
+ exactly as `## Mode: Recover` steps 2 and 4 describe, and only after every
349
+ precondition that can park the phase has passed. That single commit is a
350
+ recovery commit rather than a planned task commit, so it does not consume any
351
+ task's one-commit budget; report it under `### Recovery Events` with the
352
+ artifact reference and manifest digest. Without a verified `recovered_patch`,
353
+ any dirt blocks.
354
+
344
355
  When smoke containment, ownership registration, expected base, or fixture
345
356
  readiness proves the run invalid, return `INVALID_RUN_ABORT` with the evidence.
346
357
  Do not launch a child, continue sequentially, review, or repair the invalid run.
347
358
 
348
359
  ### 2. Execute Tasks in Plan Order
349
360
 
361
+ #### Cross-Cutting Option Sweep
362
+
363
+ Before the first edit of a task that adds, renames, retypes, or changes the
364
+ default or meaning of an option, argument, flag, configuration field, schema
365
+ property, or policy value consumed outside the module that defines it,
366
+ inventory that symbol repository-wide. A value that is defined, read, and
367
+ written only inside its own module does not trigger this rule.
368
+
369
+ The inventory is repository-wide. It is never limited to the declared file
370
+ boundary and never limited to production source: sweep declarations and type
371
+ definitions, constructors and factories, adapters and wrappers, serializers and
372
+ deserializers, persisted schemas and templates, fixtures, mocks, snapshots, and
373
+ tests, and every call site that constructs, forwards, or defaults the value.
374
+ Use `rg` or an equivalent repository-wide search together with whatever
375
+ language-aware check this repository already provides; no single tool is proof
376
+ of completeness, so search the property name, its serialized spelling, and its
377
+ accessors.
378
+
379
+ A declared file list is review scope, not a correctness boundary. When the
380
+ sweep finds files outside that list:
381
+
382
+ - **Widen mechanically and proceed** when every discovered file is already
383
+ required by the declared task outcome, the edit to it is mechanical
384
+ propagation of the same value, and no sibling or active parallel task owns
385
+ it. The effective task boundary is the declared list plus those mechanically
386
+ discovered files. Record every addition in the Task Outcomes `Files` cell and
387
+ in Self-Review Observations, and never edit `plan.md` to match.
388
+ - **Stop and report** the exact discovered file set and the ownership conflict
389
+ when the expansion would change the declared task outcome, cross sibling or
390
+ parallel-lane ownership, invalidate a plan-declared parallel group, or
391
+ require a new design, architecture, or public-behavior decision.
392
+
393
+ Threading an already-agreed option through four call sites that would otherwise
394
+ keep the stale default is mechanical propagation. Adding new behavior at a
395
+ discovered call site, changing an unrelated default, or deciding how two lanes
396
+ divide a shared file is not, and stops for direction. This pre-edit rule
397
+ matches the mechanically derived, in-phase widening already allowed during
398
+ post-commit recovery, and it never relaxes the standing rule against scope
399
+ expansion beyond the phase.
400
+
350
401
  For every task:
351
402
 
352
403
  1. Record `PRE_TASK_HEAD`.
@@ -369,7 +420,9 @@ For every task:
369
420
  mutate Git config or use `--no-verify`.
370
421
  9. Verify:
371
422
  - HEAD is exactly one commit after `PRE_TASK_HEAD`;
372
- - the commit changes only declared task files;
423
+ - the commit changes only files in the effective task boundary, which is
424
+ the declared task files plus any mechanical additions permitted by, and
425
+ reported under, the cross-cutting option sweep;
373
426
  - every task verification passed; and
374
427
  - the worktree is clean.
375
428
  10. Perform a brief between-task transition check before starting the next
@@ -462,8 +515,18 @@ phase_verification: { relevant phase command }
462
515
  dispatch_target: { exact original launcher-owned target }
463
516
  dispatch_axes: { unchanged original launcher-owned axes }
464
517
  dispatch_stamp: { original formal Dispatch line }
518
+ recovered_patch: { artifact, manifest_digest, size, stat, components }
465
519
  ```
466
520
 
521
+ `recovered_patch` is optional. It is present only when a lost child left
522
+ uncommitted work that the lifecycle captured before restoring the worktree to
523
+ its clean base. Its `artifact` is a readable path outside the worktree, never a
524
+ mutable worktree path; `manifest_digest` and `size` are the capture's recorded
525
+ values; `stat` is the captured `git diff --cached --stat` summary; and
526
+ `components` lists the `index`, `worktree`, and `untracked` entries the
527
+ artifact holds. The same field may arrive on a same-target `implement`
528
+ continuation.
529
+
467
530
  1. Validate every recover input. Confirm the exact launcher-owned target equals
468
531
  the original target and the generic `continuation_events` record links
469
532
  `continuation_event` to `original_request_id`.
@@ -471,23 +534,116 @@ dispatch_stamp: { original formal Dispatch line }
471
534
  remains immutable at the same history position; and the worktree contains
472
535
  only the reconciled pending ledger reservation plus an optional mechanically
473
536
  bounded diff inside `bounded_files`. Any other dirt or history change
474
- blocks.
537
+ blocks. Compare against the briefed `recovery_base_head`, never a remembered
538
+ earlier value: once a recovery-patch commit has landed, the retry's
539
+ `recovery_base_head` is the reconciled current HEAD, which includes that
540
+ recovery commit and any candidate or ledger-only commit already durably
541
+ made, and the brief omits the already-committed artifact because re-applying
542
+ it would duplicate the work. Beyond that reconciled reservation and its
543
+ bounded diff, a supplied `recovered_patch` is the only permitted
544
+ pre-existing dirt, and only after it verifies. Verification is read-only and
545
+ happens here; the apply and the commit wait for step 4, so every precondition
546
+ that can park the phase resolves before anything is written. When the brief
547
+ carries no `recovered_patch` — an ordinary resume, or a retry after the
548
+ recovery commit already landed — the ordinary permitted-dirt invariant above
549
+ is the whole of this step: there is no artifact to resolve a script for, so
550
+ the continuation skips verification and continues to the ledger
551
+ reconciliation in step 3, and step 4 is a no-op. Resolve
552
+ `capture-dirty-tree.mjs` through installed scope rather than a
553
+ repository-relative path, probing in order and binding the first match, and
554
+ only when an artifact was briefed:
555
+
556
+ ```bash
557
+ set -eu
558
+ # `recovered_patch` is optional and all-or-nothing. Without one there is
559
+ # nothing to verify and nothing to apply, so the verifier is skipped
560
+ # entirely; a partial brief is a named stop rather than an unbound-variable
561
+ # death. Never dereference an artifact variable outside the branch: under
562
+ # `set -u` an unset one exits here, and an empty one fails verification —
563
+ # either way an artifact-free retry parks before the ledger reconciliation
564
+ # it needs to reach.
565
+ if [ -z "${ARTIFACT_DIR:-}${MANIFEST_DIGEST:-}${ARTIFACT_SIZE:-}" ]; then
566
+ : # No recovered_patch: continue to the ledger reconciliation.
567
+ elif [ -z "${ARTIFACT_DIR:-}" ] || [ -z "${MANIFEST_DIGEST:-}" ] ||
568
+ [ -z "${ARTIFACT_SIZE:-}" ]; then
569
+ echo "artifact-verification-failed: a partial recovered_patch is unusable; artifact, manifest_digest and size travel together" >&2
570
+ exit 1
571
+ else
572
+ CAPTURE_SCRIPT=""
573
+ REPO_ROOT=$(git -C "$PHASE_WORKTREE" rev-parse --show-toplevel 2>/dev/null || true)
574
+ for CAPTURE_ROOT in "${HOME:-}/.agents/skills/oat-project-implement" \
575
+ "${REPO_ROOT:+$REPO_ROOT/.agents/skills/oat-project-implement}"; do
576
+ [ -n "$CAPTURE_ROOT" ] || continue
577
+ [ -f "$CAPTURE_ROOT/scripts/capture-dirty-tree.mjs" ] || continue
578
+ CAPTURE_SCRIPT="$CAPTURE_ROOT/scripts/capture-dirty-tree.mjs"
579
+ break
580
+ done
581
+ [ -n "$CAPTURE_SCRIPT" ] || {
582
+ echo "capture-script-unavailable" >&2
583
+ exit 1
584
+ }
585
+
586
+ EXPECTED_HEAD=$(git -C "$PHASE_WORKTREE" rev-parse --verify HEAD)
587
+ node "$CAPTURE_SCRIPT" --verify \
588
+ --artifact-dir "$ARTIFACT_DIR" \
589
+ --manifest-digest "$MANIFEST_DIGEST" \
590
+ --size "$ARTIFACT_SIZE" \
591
+ --expected-head "$EXPECTED_HEAD"
592
+ fi
593
+ ```
594
+
595
+ `ARTIFACT_DIR`, `MANIFEST_DIGEST`, and `ARTIFACT_SIZE` are the
596
+ `recovered_patch` fields; bind them as shell variables rather than pasting
597
+ `<placeholder>` tokens, which a shell reads as input redirections. The guard
598
+ terminates rather than warning: `node ""` reads its program from stdin and
599
+ exits zero at EOF, so a fall-through would report an unverified artifact as
600
+ verified. Every block that runs the script repeats the resolution and the
601
+ guard, because shell variables do not survive across separate tool
602
+ invocations. `--expected-head` and the
603
+ apply below both resolve against `$PHASE_WORKTREE`, never the ambient
604
+ working directory. An empty `CAPTURE_SCRIPT` is a
605
+ `capture-script-unavailable` stop: report it verbatim with the probed roots
606
+ and the recovery command
607
+ `oat tools install workflows --scope <user|project>` or
608
+ `oat tools update --pack workflows --scope <user|project>`, and never fall
609
+ back to a repository-relative path. With an artifact briefed, verify before
610
+ touching the tree and stop on any `artifact-verification-failed` mismatch, including the base mismatch
611
+ `--expected-head` catches: integrity is not base agreement, and a hunk whose
612
+ context happens to match applies cleanly at the wrong commit. Report an
613
+ `active-writer`, `unsupported-dirt`, `round-trip-failed`, or
614
+ `artifact-verification-failed` reason verbatim and stop; never improvise a
615
+ partial or best-effort restore. Without a verified `recovered_patch` you
616
+ start on a clean tree.
617
+
475
618
  3. Reconcile the authoritative `pending_attempt` and nonzero
476
619
  `phase_recovery_attempts_used` with `state.md`. Recover mode continues that
477
620
  same consumed attempt and must not increment usage again. Missing,
478
- contradictory, or unreconciled state blocks before editing.
479
- 4. Apply or complete only `bounded_correction_scope`. Recover mode must not
621
+ contradictory, or unreconciled state blocks before editing. Nothing has been
622
+ applied or committed yet, so this block leaves the branch exactly at
623
+ `recovery_base_head` with the artifact untouched and re-verifiable; the root
624
+ re-briefs from current authoritative state once the ledger is repaired.
625
+ 4. Only now apply the verified `recovered_patch`, if one was supplied:
626
+ `git apply --index` for the `index` component, `git apply` for the
627
+ `worktree` component, and byte copies plus the manifest's recorded
628
+ executable bit for the `untracked` component. Review the result and commit
629
+ it as your first action. That commit is immutable, and so is every commit
630
+ this mode durably makes after it: if anything later parks the phase, the
631
+ retry's `recovery_base_head` is the reconciled current HEAD, which includes
632
+ that recovery commit and any candidate or ledger-only commit already made.
633
+ That brief omits the already-committed artifact; dirt that accumulated
634
+ afterwards travels as its own newly captured `recovered_patch`.
635
+ 5. Apply or complete only `bounded_correction_scope`. Recover mode must not
480
636
  replay planned tasks and must not require, fabricate, or consume a review
481
637
  artifact.
482
- 5. Apply the bounded correction, then run `focused_verification` and
638
+ 6. Apply the bounded correction, then run `focused_verification` and
483
639
  `phase_verification` before creating a candidate commit. If either check
484
640
  fails, restore `bounded_files` to their original committed content,
485
641
  atomically mark the pending entry `failed`, durably commit only that
486
642
  ledger transition, emit one `failed-attempt` event, and stop.
487
- 6. When both pre-commit checks pass, atomically mark the pending entry
643
+ 7. When both pre-commit checks pass, atomically mark the pending entry
488
644
  `completed` and create one append-only candidate recovery commit containing
489
645
  only `bounded_files` plus that ledger transition.
490
- 7. Immediately rerun `focused_verification` and `phase_verification` against the
646
+ 8. Immediately rerun `focused_verification` and `phase_verification` against the
491
647
  committed HEAD; these reruns are authoritative. On pass, emit one `recovered`
492
648
  event and report the candidate as the successful recovery commit. On
493
649
  failure, atomically replace `completed` with `failed`, durably commit that
@@ -496,7 +652,7 @@ dispatch_stamp: { original formal Dispatch line }
496
652
  commit. If terminal evidence cannot be committed, report an unreconciled
497
653
  block that root must reject before bookkeeping. Never amend history or
498
654
  launch fallback.
499
- 8. Return the report below. `DONE` is accepted success;
655
+ 9. Return the report below. `DONE` is accepted success;
500
656
  `DONE_WITH_CONCERNS` and `BLOCKED` may be accepted terminal stops and must
501
657
  still report provenance, accounting, immutable history, and the event.
502
658
 
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.56"
3
+ "oatVersion": "0.2.58"
4
4
  }
@@ -249,6 +249,50 @@ journaled worktree that is already gone from disk is still recoverable; a
249
249
  contradictory or unjournaled resource fails closed with a refusal rather than
250
250
  guessing.
251
251
 
252
+ ### Reserved versus registered ownership
253
+
254
+ The deterministic provider's nested phase worktrees are journaled as a
255
+ transaction, so an interruption can no longer leave an _unjournaled_ child.
256
+ It can still leave state cleanup refuses by design — an interruption inside
257
+ `git worktree add` may leave a path with no Git registration, and that is
258
+ refused rather than deleted.
259
+
260
+ Other nested creators still register directly after creation. Their entries are
261
+ read as ownership the same way, but they are validated more loosely: a
262
+ directly-registered entry carries no reservation origin, so it is not subject
263
+ to the run-directory containment and run-baseline checks a finalized
264
+ reservation gets. Their creation transaction has not been migrated yet.
265
+
266
+ The two reservation states are:
267
+
268
+ - **`reserved`** — the exact branch, worktree path, marker path, expected
269
+ baseline, shared Git directory, and run identity are written to the manifest
270
+ _before_ `git worktree add` runs. The entry is durable intent, not ownership.
271
+ - **`registered`** — the child's marker, Git worktree registration, branch,
272
+ HEAD ancestry, and shared Git directory have all been corroborated.
273
+ Finalization only flips a matching reservation; it never rewrites what was
274
+ reserved, and a child contradicting its reservation is refused.
275
+
276
+ Cleanup reconciles a reservation only against exactly matching state. If
277
+ neither the branch nor the worktree was ever created, nothing is deleted and
278
+ the reservation goes away with the manifest. If both exist exactly as reserved,
279
+ they are removed after baseline, shared Git directory, and run-marker
280
+ corroboration. If only the branch survives, its tip must equal the reserved
281
+ baseline exactly. Anything else — an occupied path Git never registered, a
282
+ different branch at the reserved path, a missing marker — fails closed.
283
+
284
+ Manifests written before this transaction existed use ownership journal schema
285
+ version 1. They stay readable and all of their entries read as already
286
+ `registered`. Such a manifest is never rewritten to a newer schema version and
287
+ never gains a reservation, and a v1 entry claiming reserved state is refused
288
+ rather than treated as owned. Direct registration may still append a
289
+ `registered` entry to one, which leaves its schema version untouched.
290
+
291
+ Nothing is ever pruned by `smoke-*` name, path prefix, run age, or ancestry
292
+ alone. Without an ownership lease the runner cannot tell a stale run from an
293
+ active one, so it refuses instead of guessing and leaves the state for you to
294
+ resolve.
295
+
252
296
  To finish a stalled run, re-run the matching `--stage collect` (collection-only
253
297
  triggers cleanup) or start a fresh run; the runner reconciles journaled
254
298
  resources on the next errored or collection-bearing invocation. If cleanup fails
@@ -88,7 +88,7 @@ The phase implementer receives one `Phase Scope`, reads the relevant artifacts
88
88
  once, and directly executes each task in plan order. For every task it:
89
89
 
90
90
  1. records the pre-task HEAD;
91
- 2. implements only the declared task files;
91
+ 2. implements the declared task files plus any mechanical additions permitted by, and reported under, the cross-cutting option sweep (a repository-wide sweep for every consumer of a changed option; cross-owner expansions stop and report instead);
92
92
  3. runs task verification;
93
93
  4. self-checks requirements and scope before commit;
94
94
  5. creates exactly one task commit; and
@@ -152,7 +152,11 @@ by the phase's standing authority. The important distinctions are:
152
152
  boundary, not for every eligible defect;
153
153
  - a **continuation** preserves the original request and exact target, either in
154
154
  the accepted handle or through an explicitly linked fresh same-target
155
- recovery launch; and
155
+ recovery launch, and never starts on a dirty tree: uncommitted work a lost
156
+ child left behind is first captured into a digest-verified artifact,
157
+ restored out of the worktree, handed forward as `recovered_patch`, and
158
+ committed by the continuation as its first action, while unverified or
159
+ unsupported dirt still blocks; and
156
160
  - a **successful repair** produces one immutable append-only recovery commit.
157
161
 
158
162
  This recovery is not accepted-launch fallback. After a launch is accepted,
@@ -434,11 +434,14 @@ typed adapter settings.
434
434
  Private integrations use the core boundary directly: resolve private inputs
435
435
  before the run, construct one versioned request, invoke the core once, then
436
436
  publish or link the versioned manifest after the run. Wrapper acceptance reads
437
- the complete post-run `publish-receipt/v2`, verifies every manifest artifact
438
- and the core run ID, and rejects foreign or stale receipts; `publish-receipt/v1`
439
- remains readable for replay of older runs only. Presets, private source
440
- systems, external-document synchronization, and personal destinations remain
441
- wrapper-owned.
437
+ the complete post-run `publish-receipt/v2`, requires complete manifest and
438
+ catalog evidence, verifies the core run ID, and rejects foreign or stale
439
+ receipts; `publish-receipt/v1` remains readable for replay of older runs only.
440
+ Public and protected v2 receipts must each provide exactly one entry for every
441
+ finalized manifest artifact and exactly one generated catalog entry. The
442
+ `explainer-kit` wrapper extension contract owns this rule; this page restates
443
+ it for integrators. Presets, private source systems, external-document
444
+ synchronization, and personal destinations remain wrapper-owned.
442
445
 
443
446
  V1 exposes no plugin registry or private mid-pipeline hook. Unsupported
444
447
  contract majors and identity mismatches fail closed instead of being guessed
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.56",
3
- "docs-config": "0.2.56",
4
- "docs-theme": "0.2.56",
5
- "docs-transforms": "0.2.56"
2
+ "cli": "0.2.58",
3
+ "docs-config": "0.2.58",
4
+ "docs-theme": "0.2.58",
5
+ "docs-transforms": "0.2.58"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: analyze
3
- version: 0.1.1
3
+ version: 0.2.0
4
4
  description: Multi-angle analysis of existing artifacts, codebases, documents, or systems. Examines what you have from six analysis angles and produces structured findings with prioritized recommendations.
5
5
  argument-hint: 'target [--context path]'
6
6
  user-invocable: true
@@ -49,15 +49,16 @@ Print this banner once at start:
49
49
 
50
50
  Then print step indicators before beginning work:
51
51
 
52
- - `[1/9] Parsing arguments…`
53
- - `[2/9] Reading context…` (if applicable)
54
- - `[3/9] Classifying input type…`
55
- - `[4/9] Selecting analysis angles…`
56
- - `[5/9] Checking sub-agent availability…`
57
- - `[6/9] Executing analysis angles…`
58
- - `[7/9] Checking for comparisons…` (if applicable)
59
- - `[8/9] Cross-angle synthesis…`
60
- - `[9/9] Writing artifact…`
52
+ - `[1/10] Parsing arguments…`
53
+ - `[2/10] Reading context…` (if applicable)
54
+ - `[3/10] Classifying input type…`
55
+ - `[4/10] Selecting analysis angles…`
56
+ - `[5/10] Checking sub-agent availability…`
57
+ - `[6/10] Executing analysis angles…`
58
+ - `[7/10] Checking for comparisons…` (if applicable)
59
+ - `[8/10] Cross-angle synthesis…`
60
+ - `[9/10] Resolving output destination…`
61
+ - `[10/10] Writing artifact…`
61
62
 
62
63
  For long-running operations, print a start line and a completion line:
63
64
 
@@ -72,7 +73,7 @@ Keep it concise; don't print a line for every shell command.
72
73
 
73
74
  ### Step 1: Parse arguments
74
75
 
75
- `[1/9] Parsing arguments…`
76
+ `[1/10] Parsing arguments…`
76
77
 
77
78
  Parse from `$ARGUMENTS`:
78
79
 
@@ -91,7 +92,7 @@ The prompt should ask: _"What would you like me to analyze? Provide a file path,
91
92
 
92
93
  ### Step 2: Read context (if provided)
93
94
 
94
- `[2/9] Reading context…`
95
+ `[2/10] Reading context…`
95
96
 
96
97
  If `--context` is specified:
97
98
 
@@ -107,7 +108,7 @@ If `--context` is not specified, skip this step.
107
108
 
108
109
  ### Step 3: Input type classification
109
110
 
110
- `[3/9] Classifying input type…`
111
+ `[3/10] Classifying input type…`
111
112
 
112
113
  Classify the target to determine analysis angle emphasis:
113
114
 
@@ -126,7 +127,7 @@ Log: `→ Input type: {type}`
126
127
 
127
128
  ### Step 4: Analysis angle selection
128
129
 
129
- `[4/9] Selecting analysis angles…`
130
+ `[4/10] Selecting analysis angles…`
130
131
 
131
132
  All six angles are ALWAYS run. The input type determines emphasis weighting (primary angles get deeper investigation):
132
133
 
@@ -157,7 +158,7 @@ Log the selected emphasis: `→ Primary: {angles} · Secondary: {angles}`
157
158
  ### Step 5: Sub-agent availability probe
158
159
 
159
160
  ```
160
- [5/9] Checking sub-agent availability…
161
+ [5/10] Checking sub-agent availability…
161
162
  → analysis workers: {available | not resolved} ({reason})
162
163
  → Selected: Execution Tier {1|2|3} — {description}
163
164
  ```
@@ -184,7 +185,7 @@ Log the selected emphasis: `→ Primary: {angles} · Secondary: {angles}`
184
185
 
185
186
  ### Step 6: Execute analysis angles
186
187
 
187
- `[6/9] Executing analysis angles…`
188
+ `[6/10] Executing analysis angles…`
188
189
 
189
190
  For each angle, the worker (sub-agent or self) receives:
190
191
 
@@ -209,7 +210,7 @@ Print progress for each angle:
209
210
 
210
211
  ### Step 7: Conditional /compare dispatch
211
212
 
212
- `[7/9] Checking for comparisons…`
213
+ `[7/10] Checking for comparisons…`
213
214
 
214
215
  If any angle surfaces comparables (e.g. "this component could use library A or B"):
215
216
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-brainstorm
3
- version: 1.3.4
3
+ version: 1.3.5
4
4
  description: Use when the user explicitly invokes the `brainstorm` verb, including `/oat-brainstorm`, "let's brainstorm", "brainstorm this", "can we brainstorm X", or "help me brainstorm X". For ambiguous exploratory phrasing ("I've been thinking", "what if", "help me think through"), do NOT auto-enter; respond conversationally and offer mode only after ≥2 sustained exploratory turns. Do NOT use for review, debug, PR, status, implementation, or active-workflow questions.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -191,7 +191,7 @@ Classify the opening brainstorm topic before running the Node preflight or print
191
191
  command -v node >/dev/null 2>&1 && echo "available" || echo "missing"
192
192
  ```
193
193
 
194
- - If `node` is **missing**: skip the offer entirely. Do not print the offer message. Log a one-line note in the conversation that the visual companion is unavailable in this environment (a state `oat-doctor` can pick up later: "visual companion suppressed — node not on PATH"). Proceed with `VISUAL_COMPANION = "unavailable"`.
194
+ - If `node` is **missing**: skip the offer entirely. Do not print the offer message. Log a one-line note in the conversation for this session only: "visual companion suppressed — node not on PATH". Nothing persists that note, so no later diagnostic run can report it. Proceed with `VISUAL_COMPANION = "unavailable"`.
195
195
  - If `node` is **available**: print the offer as its own message. Suggested wording (adapt freely; the constraint is "own message, no other content"):
196
196
 
197
197
  > "Some of what we're working on might be easier to explain if I can show it in a local web browser — mockups, diagrams, side-by-side comparisons. The visual companion is bundled with this skill (a small Node-based local server). Want me to start it? (Requires opening a `localhost` URL.)"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-doctor
3
- version: 1.1.0
3
+ version: 1.2.0
4
4
  description: Use when you need to diagnose your OAT setup, check for outdated skills, identify misconfigurations, or get a summary of installed tools and config. Runs health checks and recommends corrective actions.
5
5
  argument-hint: '[--summary]'
6
6
  disable-model-invocation: true
@@ -151,47 +151,60 @@ For summary mode, compare installed skills against the full manifest to identify
151
151
 
152
152
  **Bundled skill manifest (source of truth):**
153
153
 
154
- Core pack skills:
154
+ Each heading below names a pack exactly as `oat tools install <pack>` expects
155
+ it, and lists every skill that pack ships.
155
156
 
156
- - oat-docs, oat-doctor
157
+ `core` pack skills:
157
158
 
158
- Workflow pack skills:
159
+ - oat-docs, oat-doctor
159
160
 
160
- - oat-project-capture, oat-project-clear-active, oat-project-complete
161
- - oat-project-design, oat-project-discover, oat-project-document
162
- - oat-project-implement, oat-project-import-plan, oat-project-new
163
- - oat-project-open, oat-project-plan, oat-project-plan-writing
164
- - oat-project-pr-final, oat-project-pr-progress, oat-project-progress
165
- - oat-project-promote-spec-driven, oat-project-quick-start
166
- - oat-project-reconcile, oat-project-revise, oat-project-review-provide
167
- - oat-project-review-receive, oat-project-review-receive-remote
168
- - oat-project-spec, oat-project-summary
169
- - oat-repo-knowledge-index, oat-worktree-bootstrap, oat-worktree-bootstrap-auto
170
-
171
- Ideas pack skills:
161
+ `ideas` pack skills:
172
162
 
173
163
  - oat-idea-new, oat-idea-ideate, oat-idea-summarize, oat-idea-scratchpad
174
164
 
175
- Docs pack skills:
165
+ `docs` pack skills:
166
+
167
+ - authoring-docs, oat-agent-instructions-analyze
168
+ - oat-agent-instructions-apply, oat-docs-analyze
169
+ - oat-docs-apply, oat-docs-authoring, oat-docs-bootstrap
176
170
 
177
- - oat-agent-instructions-analyze, oat-agent-instructions-apply
178
- - oat-docs-analyze, oat-docs-apply
171
+ `workflows` pack skills:
179
172
 
180
- Utility pack skills:
173
+ - oat-cursor-cloud-projects, oat-explainer-kit, oat-project-autonomous
174
+ - oat-project-capture, oat-project-clear-active, oat-project-complete
175
+ - oat-project-design, oat-project-dispatch-subagents, oat-project-discover
176
+ - oat-project-document, oat-project-implement, oat-project-import-plan
177
+ - oat-project-new, oat-project-next, oat-project-open
178
+ - oat-project-plan, oat-project-plan-writing, oat-project-pr-final
179
+ - oat-project-pr-progress, oat-project-progress, oat-project-promote-spec-driven
180
+ - oat-project-quick-start, oat-project-reconcile, oat-project-retro
181
+ - oat-project-retro-file, oat-project-revise, oat-project-review-provide
182
+ - oat-project-review-provide-remote, oat-project-review-receive
183
+ - oat-project-review-receive-remote, oat-project-spec, oat-project-split
184
+ - oat-project-summary, oat-repo-knowledge-index, oat-worktree-bootstrap
185
+ - oat-worktree-bootstrap-auto, oat-wave-execute, oat-wave-program
186
+ - oat-wrap-up
187
+
188
+ `utility` pack skills:
181
189
 
182
- - create-agnostic-skill
183
- - oat-repo-maintainability-review, oat-review-provide
184
- - oat-review-receive, oat-review-receive-remote
190
+ - create-agnostic-skill, explainer-kit, oat-dispatch-subagents
191
+ - subagent-orchestration, oat-repo-improve, oat-repo-maintainability-review
192
+ - oat-review-provide, oat-review-provide-remote, oat-review-receive
193
+ - oat-review-receive-remote
185
194
 
186
- Project management pack skills:
195
+ `project-management` pack skills:
187
196
 
188
- - oat-pjm-add-backlog-item, oat-pjm-update-repo-reference
189
- - oat-pjm-review-backlog
197
+ - oat-pjm-add-backlog-item, oat-pjm-decision
198
+ - oat-pjm-update-repo-reference, oat-pjm-review-backlog
190
199
 
191
- Research pack skills:
200
+ `research` pack skills:
192
201
 
193
202
  - analyze, compare, deep-research
194
- - skeptic, synthesize
203
+ - recon, skeptic, synthesize
204
+
205
+ `brainstorm` pack skills:
206
+
207
+ - oat-brainstorm
195
208
 
196
209
  For each pack, determine:
197
210
 
@@ -224,12 +237,12 @@ OAT ▸ DOCTOR SUMMARY
224
237
  | Pack | Scope | Skills | Status |
225
238
  | --------- | ------- | ------ | -------- |
226
239
  | core | user | 2/2 | current |
227
- | docs | project | 4/4 | current |
228
- | workflows | project | 26/26 | current |
240
+ | docs | project | 7/7 | current |
241
+ | workflows | project | 39/39 | current |
229
242
  | ideas | user | 4/4 | current |
230
- | project-management | project | 3/3 | current |
231
- | research | project | 5/5 | current |
232
- | utility | project | 5/5 | outdated |
243
+ | project-management | project | 4/4 | current |
244
+ | research | project | 6/6 | current |
245
+ | utility | project | 10/10 | outdated |
233
246
 
234
247
  ## Outdated Skills
235
248
 
@@ -239,11 +252,11 @@ OAT ▸ DOCTOR SUMMARY
239
252
 
240
253
  ## Available But Not Installed
241
254
 
242
- - **docs** pack: oat-docs-analyze, oat-docs-apply, oat-agent-instructions-analyze, oat-agent-instructions-apply (4 skills available)
255
+ - **docs** pack: authoring-docs, oat-agent-instructions-analyze, oat-agent-instructions-apply, oat-docs-analyze, oat-docs-apply, oat-docs-authoring, oat-docs-bootstrap (7 skills available)
243
256
  → Run: oat tools install docs --scope {scope}
244
- - **project-management** pack: oat-pjm-add-backlog-item, oat-pjm-update-repo-reference, oat-pjm-review-backlog (3 skills available)
257
+ - **project-management** pack: oat-pjm-add-backlog-item, oat-pjm-decision, oat-pjm-update-repo-reference, oat-pjm-review-backlog (4 skills available)
245
258
  → Run: oat tools install project-management --scope {scope}
246
- - **research** pack: analyze, compare, deep-research, skeptic, synthesize (5 skills available)
259
+ - **research** pack: analyze, compare, deep-research, recon, skeptic, synthesize (6 skills available)
247
260
  → Run: oat tools install research --scope {scope}
248
261
 
249
262
  ## Configuration
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: oat-idea-summarize
3
- version: 1.2.1
3
+ version: 1.3.0
4
4
  description: Use when an idea is mature enough to move from brainstorming into the backlog. Generates a summary document and adds the idea to the backlog.
5
5
  argument-hint: '[--global]'
6
6
  disable-model-invocation: true
7
7
  user-invocable: true
8
- allowed-tools: Read, Write, Grep, AskUserQuestion
8
+ allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
9
9
  ---
10
10
 
11
11
  # Summarize Idea