@open-agent-toolkit/cli 0.2.75 → 0.2.77

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 (48) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/config-and-local-state.md +3 -3
  3. package/assets/docs/cli-utilities/configuration.md +3 -1
  4. package/assets/docs/cli-utilities/index.md +1 -0
  5. package/assets/docs/cli-utilities/tool-packs.md +1 -1
  6. package/assets/docs/reference/file-locations.md +1 -1
  7. package/assets/docs/reference/oat-directory-structure.md +1 -1
  8. package/assets/public-package-versions.json +4 -4
  9. package/assets/skills/explainer-kit/SKILL.md +1 -1
  10. package/assets/skills/explainer-kit/scripts/bundle.mjs +26 -2
  11. package/assets/skills/explainer-kit/scripts/record.mjs +26 -3
  12. package/assets/skills/explainer-kit/scripts/verify.mjs +26 -3
  13. package/assets/skills/oat-doctor/SKILL.md +153 -193
  14. package/assets/skills/oat-explainer-kit/SKILL.md +1 -1
  15. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +25 -5
  16. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  17. package/assets/skills/oat-project-complete/SKILL.md +1 -1
  18. package/assets/skills/oat-project-complete/scripts/consume-persisted-recap-intent.mjs +26 -6
  19. package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +26 -6
  20. package/assets/skills/oat-project-complete/scripts/finalize-synced-archive.mjs +7 -0
  21. package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +26 -5
  22. package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +26 -5
  23. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +26 -6
  24. package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +26 -6
  25. package/assets/skills/oat-project-complete/scripts/resolve-synced-archive-entry.mjs +26 -5
  26. package/assets/skills/oat-project-complete/scripts/validate-durable-archive-receipt.mjs +7 -0
  27. package/assets/skills/oat-project-complete/scripts/validate-nonarchive-lifecycle-receipt.mjs +126 -95
  28. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  29. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  30. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  31. package/assets/skills/oat-project-implement/scripts/capture-dirty-tree.mjs +3 -0
  32. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +1 -1
  33. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  34. package/assets/skills/oat-project-quick-start/SKILL.md +9 -6
  35. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  36. package/assets/skills/recon/SKILL.md +1 -1
  37. package/assets/skills/recon/scripts/create-review-brief.mjs +25 -5
  38. package/assets/skills/recon/scripts/prepare-routing.mjs +26 -2
  39. package/assets/skills/recon/scripts/render-packet.mjs +25 -5
  40. package/assets/skills/recon/scripts/validate-artifact.mjs +25 -5
  41. package/assets/skills/recon/scripts/validate-packet.mjs +25 -5
  42. package/assets/templates/implementation.md +1 -1
  43. package/dist/commands/config/index.d.ts.map +1 -1
  44. package/dist/commands/config/index.js +18 -1
  45. package/dist/config/oat-config.d.ts +1 -0
  46. package/dist/config/oat-config.d.ts.map +1 -1
  47. package/dist/config/oat-config.js +1 -1
  48. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.75"
3
+ "oatVersion": "0.2.77"
4
4
  }
@@ -124,7 +124,7 @@ Use `oat config` for repo runtime config inspection and supported key mutation.
124
124
  - `oat config list` - show the resolved command-surface values with source information
125
125
  - `oat config dump --json` - emit the full merged config payload with per-key source attribution, suitable for automation and debugging
126
126
  - `oat config describe` - list supported config surfaces and keys across shared repo, repo-local, user, and sync/provider config
127
- - `oat config describe <key>` - show file location, scope, default, mutability, and owning command for one key
127
+ - `oat config describe <key>` - show file location, scope, default, mutability, and owning command for one key; a deprecated key also prints a `Deprecated: prefer …` line, and `--json` carries it as a `deprecated` object with `supersededBy` (plus `legacyValues` when only a legacy value form is deprecated), which `oat-doctor` reads
128
128
 
129
129
  Use `oat config dump --json` when you need the whole resolved config in one machine-readable response rather than a single key or a human-oriented list view.
130
130
 
@@ -281,6 +281,6 @@ For the full state model, repair semantics, and examples, see [Instruction Sync]
281
281
  - `oat internal validate-oat-skills` - validate `oat-*` skill contracts and metadata
282
282
  - `oat doctor` - run environment and setup diagnostics, including installed-vs-bundled skill version checks
283
283
 
284
- `oat doctor` is the quickest way to confirm that your runtime, directory structure, and installed OAT assets are healthy before deeper debugging. At project scope it also scans bounded repository script and documentation surfaces for known-stale CLI grammar, such as `oat --scope all sync`, and reports file/line evidence plus the current `oat sync --scope all` form. Generated provider views, OAT lifecycle artifacts, archived content, dependencies, build output, and nested worktrees are excluded.
284
+ `oat doctor` is the quickest way to confirm that your runtime, directory structure, and installed OAT assets are healthy before deeper debugging. At project scope it also scans bounded repository script and documentation surfaces for known-stale CLI grammar, such as `oat --scope all sync` <!-- oat-doctor: allow-stale-invocation -->, and reports file/line evidence plus the current `oat sync --scope all` form. Generated provider views, OAT lifecycle artifacts, archived content, dependencies, build output, and nested worktrees are excluded.
285
285
 
286
- The `/oat-doctor` skill (installed via the core pack) provides richer diagnostics with check and summary modes, including config explanations sourced from bundled documentation.
286
+ The `/oat-doctor` skill (installed via the core pack) goes further: it sweeps config, project management (PJM), agent instructions, docs, and installed tools read-only, prints one report grouped by area and severity, and then dives into any area you pick, teaching from the bundled documentation and the `oat config describe` entries and offering the exact fix command or the owning skill. It applies nothing except a single fix command you approve. Unattended (`OAT_NON_INTERACTIVE=1`), the report is the whole output; `--summary` keeps the installed-tools dashboard.
@@ -54,7 +54,9 @@ What each command is for:
54
54
  - `oat config set <key> <value>` updates supported shared or repo-local keys.
55
55
  - `oat config unset <key>` removes a supported key from one surface, using the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. The resolved value then falls back to the next surface down, or to the built-in default. A key the surface does not hold exits 0 as already-unset (`--json` adds a `removed` boolean to tell the two apart). Unknown keys, lifecycle state, `tools.*` pack intent, aggregate read views, read-only remote-policy structure, and environment-shadowed keys with nothing stored are refused with exit 1 — see [CLI Reference](../reference/cli-reference.md#oat-config-surface-flags).
56
56
  - `oat config describe` shows the supported config catalog across shared repo, repo-local, user, and sync/provider surfaces.
57
- - `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key.
57
+ - `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key. A deprecated key also prints `Deprecated: prefer <successor>`, and `--json` carries the same fact as a `deprecated` object (`supersededBy`, plus `note` and `legacyValues` where they apply).
58
+
59
+ For a guided pass instead of individual commands, run the `/oat-doctor` skill (core pack). It sweeps every config surface read-only, flags stale `activeProject` / `lastPausedProject` pointers, keys set on the wrong surface, and deprecated values, then walks each key group you have not set: what it does, when you would want it, and which surface owns it. It offers the exact `oat config` command for each fix and runs one only after you approve it. See [Config and Local State](config-and-local-state.md#internal-helpers-and-diagnostics) for the other areas it covers.
58
60
 
59
61
  ### Source labels
60
62
 
@@ -31,6 +31,7 @@ Examples include:
31
31
  - general configuration guidance
32
32
  - workflow gate commands for per-skill final checks and cross-runtime review dispatch
33
33
  - utility command groups for config, local state, diagnostics, and related inspection flows
34
+ - a guided health check, the `/oat-doctor` skill, that sweeps config, project management, agent instructions, docs, and installed tools, then explains and offers fixes for what it finds (described in [Config and Local State](config-and-local-state.md))
34
35
 
35
36
  ## Who It's For
36
37
 
@@ -850,7 +850,7 @@ packs and is retained while either pack still owns it in that scope.
850
850
 
851
851
  The `core` pack contains foundational diagnostic and documentation skills:
852
852
 
853
- - **oat-doctor** — Setup diagnostics with two modes: check mode (terse `brew doctor`-style warnings with fix commands) and summary mode (full dashboard of installed packs, config values, and sync status).
853
+ - **oat-doctor** — One read-only sweep over config, PJM, agent instructions, docs, and tools; a report grouped by area and severity; then a dive into any area on request that explains findings and unset settings from the bundled docs and offers the exact fix command or the owning skill (nothing is applied without approval). `--summary` keeps the installed-tools dashboard.
854
854
  - **oat-docs** — Interactive Q&A skill backed by locally-bundled OAT documentation at `~/.oat/docs/`.
855
855
 
856
856
  Key behavior:
@@ -62,7 +62,7 @@ Pack intent is stored per scope:
62
62
  Config discovery via CLI:
63
63
 
64
64
  - `oat config describe` lists the supported config surfaces and keys across `.oat/config.json`, `.oat/config.local.json`, `~/.oat/config.json`, `.oat/sync/config.json`, and `~/.oat/sync/config.json`.
65
- - `oat config describe <key>` shows file location, scope, default, mutability, and the owning command for one key.
65
+ - `oat config describe <key>` shows file location, scope, default, mutability, and the owning command for one key, and for a deprecated key its successor.
66
66
  - `oat config list` shows the currently resolved values for the repo-local/shared command surface.
67
67
 
68
68
  Config ownership note:
@@ -104,7 +104,7 @@ Current config ownership:
104
104
  CLI discovery surfaces:
105
105
 
106
106
  - `oat config describe` lists the supported config surfaces and keys across shared repo, repo-local, user, and sync/provider config.
107
- - `oat config describe <key>` prints scope, file, default, mutability, owning command, and description for one config key.
107
+ - `oat config describe <key>` prints scope, file, default, mutability, owning command, and description for one config key, plus a `Deprecated: prefer …` line when the key is deprecated.
108
108
  - `oat config list` prints the resolved values for the repo-scoped/local command surface.
109
109
 
110
110
  Legacy `.oat/active-project` / `.oat/projects-root` / `.oat/active-idea` files may still be present in some environments but are no longer the canonical source in migrated command paths.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.75",
3
- "docs-config": "0.2.75",
4
- "docs-theme": "0.2.75",
5
- "docs-transforms": "0.2.75"
2
+ "cli": "0.2.77",
3
+ "docs-config": "0.2.77",
4
+ "docs-theme": "0.2.77",
5
+ "docs-transforms": "0.2.77"
6
6
  }
@@ -4,7 +4,7 @@ description: Use when building destination-neutral visual explainer artifacts fr
4
4
  user-invocable: true
5
5
  allowed-tools: Read, Write, Edit, Bash, Grep, Glob, Agent, mcp__*
6
6
  metadata:
7
- version: 3.0.2
7
+ version: 3.0.3
8
8
  ---
9
9
 
10
10
  # Explainer Kit
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { createHash } from 'node:crypto';
4
+ import { realpathSync } from 'node:fs';
4
5
  import {
5
6
  lstat,
6
7
  mkdir,
@@ -20,8 +21,9 @@ import {
20
21
  isAbsolute,
21
22
  join,
22
23
  relative,
24
+ resolve,
23
25
  } from 'node:path';
24
- import { pathToFileURL } from 'node:url';
26
+ import { fileURLToPath } from 'node:url';
25
27
 
26
28
  import {
27
29
  harvestNumericTokens,
@@ -704,7 +706,29 @@ function bundleError(message) {
704
706
  return error;
705
707
  }
706
708
 
707
- if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
709
+ /**
710
+ * Direct invocation, compared as canonical paths on both sides. Comparing a raw
711
+ * `process.argv[1]` against `import.meta.url` makes this script a silent no-op
712
+ * that exits 0 whenever the skill is reached through a symlinked install root,
713
+ * and canonicalizing only one side has the same effect under
714
+ * `--preserve-symlinks-main`, which keeps the link in `import.meta.url`.
715
+ * A path that cannot be canonicalized is not a module Node loaded as the entry
716
+ * point, so a thrown `realpathSync` means "not invoked directly" and returns
717
+ * `false`; it never masks a direct run.
718
+ */
719
+ function isDirectInvocation(invokedPath) {
720
+ if (!invokedPath) return false;
721
+ try {
722
+ return (
723
+ realpathSync(fileURLToPath(import.meta.url)) ===
724
+ realpathSync(resolve(invokedPath))
725
+ );
726
+ } catch {
727
+ return false;
728
+ }
729
+ }
730
+
731
+ if (isDirectInvocation(process.argv[1])) {
708
732
  runBundle(process.argv.slice(2)).catch((error) => {
709
733
  console.error(error.message);
710
734
  process.exitCode = 1;
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { createHash, randomUUID } from 'node:crypto';
4
+ import { realpathSync } from 'node:fs';
4
5
  import { access, readFile, readdir, rename, writeFile } from 'node:fs/promises';
5
- import { join } from 'node:path';
6
- import { pathToFileURL } from 'node:url';
6
+ import { join, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
7
8
 
8
9
  import { validateContract } from './lib/contracts.mjs';
9
10
  import {
@@ -327,7 +328,29 @@ function recordError(code, message) {
327
328
  return error;
328
329
  }
329
330
 
330
- if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
331
+ /**
332
+ * Direct invocation, compared as canonical paths on both sides. Comparing a raw
333
+ * `process.argv[1]` against `import.meta.url` makes this script a silent no-op
334
+ * that exits 0 whenever the skill is reached through a symlinked install root,
335
+ * and canonicalizing only one side has the same effect under
336
+ * `--preserve-symlinks-main`, which keeps the link in `import.meta.url`.
337
+ * A path that cannot be canonicalized is not a module Node loaded as the entry
338
+ * point, so a thrown `realpathSync` means "not invoked directly" and returns
339
+ * `false`; it never masks a direct run.
340
+ */
341
+ function isDirectInvocation(invokedPath) {
342
+ if (!invokedPath) return false;
343
+ try {
344
+ return (
345
+ realpathSync(fileURLToPath(import.meta.url)) ===
346
+ realpathSync(resolve(invokedPath))
347
+ );
348
+ } catch {
349
+ return false;
350
+ }
351
+ }
352
+
353
+ if (isDirectInvocation(process.argv[1])) {
331
354
  runRecord(process.argv.slice(2)).catch((error) => {
332
355
  console.error(`${error.code}: ${error.message}`);
333
356
  process.exitCode = 1;
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { createHash } from 'node:crypto';
4
+ import { realpathSync } from 'node:fs';
4
5
  import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
5
- import { join } from 'node:path';
6
- import { pathToFileURL } from 'node:url';
6
+ import { join, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
7
8
 
8
9
  import { writeFailure } from './bundle.mjs';
9
10
  import {
@@ -640,7 +641,29 @@ function verifyError(code, message) {
640
641
  return error;
641
642
  }
642
643
 
643
- if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
644
+ /**
645
+ * Direct invocation, compared as canonical paths on both sides. Comparing a raw
646
+ * `process.argv[1]` against `import.meta.url` makes this script a silent no-op
647
+ * that exits 0 whenever the skill is reached through a symlinked install root,
648
+ * and canonicalizing only one side has the same effect under
649
+ * `--preserve-symlinks-main`, which keeps the link in `import.meta.url`.
650
+ * A path that cannot be canonicalized is not a module Node loaded as the entry
651
+ * point, so a thrown `realpathSync` means "not invoked directly" and returns
652
+ * `false`; it never masks a direct run.
653
+ */
654
+ function isDirectInvocation(invokedPath) {
655
+ if (!invokedPath) return false;
656
+ try {
657
+ return (
658
+ realpathSync(fileURLToPath(import.meta.url)) ===
659
+ realpathSync(resolve(invokedPath))
660
+ );
661
+ } catch {
662
+ return false;
663
+ }
664
+ }
665
+
666
+ if (isDirectInvocation(process.argv[1])) {
644
667
  runVerify(process.argv.slice(2)).catch((error) => {
645
668
  console.error(`${error.code ?? 'verify-error'}: ${error.message}`);
646
669
  process.exitCode = 1;