@open-agent-toolkit/cli 0.3.15 → 0.3.16

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 (97) hide show
  1. package/assets/NOTICES.md +48 -0
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/provider-sync/commands.md +21 -0
  4. package/assets/docs/reference/cli-reference.md +2 -1
  5. package/assets/docs/reference/configuration.md +10 -2
  6. package/assets/docs/skills/index.md +1 -0
  7. package/assets/docs/skills/recon.md +8 -5
  8. package/assets/docs/workflows/advanced/autonomy.md +10 -0
  9. package/assets/docs/workflows/advanced/workflow-gates.md +109 -10
  10. package/assets/docs/workflows/approvals-and-automation.md +3 -1
  11. package/assets/docs/workflows/projects/closeout/closeout-skills.md +62 -1
  12. package/assets/docs/workflows/projects/execution/implementation-execution.md +23 -3
  13. package/assets/docs/workflows/projects/execution/project-log.md +6 -0
  14. package/assets/docs/workflows/projects/lifecycle.md +7 -0
  15. package/assets/docs/workflows/projects/reviews/index.md +63 -1
  16. package/assets/docs/workflows/waves/wave-workflows.md +11 -3
  17. package/assets/public-package-versions.json +4 -4
  18. package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
  19. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +172 -165
  20. package/assets/skills/oat-project-complete-auto/SKILL.md +388 -0
  21. package/assets/skills/oat-project-document/SKILL.md +1 -1
  22. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +172 -165
  23. package/assets/skills/oat-project-implement/SKILL.md +6 -1
  24. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +28 -1
  25. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +172 -165
  26. package/assets/skills/oat-project-implement/references/docs/complexity-review-fallback.md +262 -0
  27. package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +80 -0
  28. package/assets/skills/oat-project-implement/references/phase-execution.md +18 -0
  29. package/assets/skills/oat-project-lite/SKILL.md +1 -1
  30. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +172 -165
  31. package/assets/skills/oat-project-next/SKILL.md +19 -2
  32. package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +80 -0
  33. package/assets/skills/oat-project-pr-final/SKILL.md +4 -3
  34. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +172 -165
  35. package/assets/skills/oat-project-progress/SKILL.md +15 -1
  36. package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +80 -0
  37. package/assets/skills/oat-project-quick-start/SKILL.md +31 -3
  38. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +172 -165
  39. package/assets/skills/oat-project-quick-start/references/docs/complexity-review-fallback.md +262 -0
  40. package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +80 -0
  41. package/assets/skills/oat-project-review-receive/SKILL.md +21 -3
  42. package/assets/skills/oat-project-review-receive/references/docs/complexity-review-fallback.md +262 -0
  43. package/assets/skills/oat-wave-execute/SKILL.md +49 -28
  44. package/assets/skills/oat-wave-program/SKILL.md +15 -6
  45. package/assets/skills/oat-wrap-up/SKILL.md +9 -3
  46. package/assets/skills/oat-wrap-up/references/report-template.md +1 -1
  47. package/assets/skills/recon/SKILL.md +1 -1
  48. package/assets/skills/recon/references/packet-contract.md +18 -3
  49. package/assets/skills/recon/scripts/lib/contracts.mjs +16 -2
  50. package/assets/skills/recon/scripts/reconcile-ledger.mjs +20 -10
  51. package/assets/skills/recon/scripts/render-packet.mjs +31 -3
  52. package/assets/skills/recon/scripts/validate-packet.mjs +5 -5
  53. package/assets/templates/state.md +7 -0
  54. package/dist/commands/config/index.d.ts.map +1 -1
  55. package/dist/commands/config/index.js +13 -0
  56. package/dist/commands/gate/index.d.ts +5 -0
  57. package/dist/commands/gate/index.d.ts.map +1 -1
  58. package/dist/commands/gate/index.js +270 -9
  59. package/dist/commands/shared/frontmatter.d.ts +1 -1
  60. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  61. package/dist/commands/shared/frontmatter.js +1 -0
  62. package/dist/commands/state/generate.d.ts +1 -1
  63. package/dist/commands/state/generate.d.ts.map +1 -1
  64. package/dist/commands/state/generate.js +87 -8
  65. package/dist/commands/sync/apply.d.ts.map +1 -1
  66. package/dist/commands/sync/apply.js +31 -5
  67. package/dist/commands/sync/dry-run.d.ts.map +1 -1
  68. package/dist/commands/sync/dry-run.js +28 -11
  69. package/dist/commands/sync/sync.utils.d.ts +13 -0
  70. package/dist/commands/sync/sync.utils.d.ts.map +1 -1
  71. package/dist/commands/sync/sync.utils.js +21 -1
  72. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  73. package/dist/commands/tools/shared/pack-manifest.js +1 -0
  74. package/dist/config/oat-config.d.ts +1 -0
  75. package/dist/config/oat-config.d.ts.map +1 -1
  76. package/dist/config/oat-config.js +3 -0
  77. package/dist/config/resolve.d.ts.map +1 -1
  78. package/dist/config/resolve.js +1 -0
  79. package/dist/drift/detector.js +6 -6
  80. package/dist/engine/compute-plan.d.ts.map +1 -1
  81. package/dist/engine/compute-plan.js +87 -2
  82. package/dist/engine/engine.types.d.ts +10 -1
  83. package/dist/engine/engine.types.d.ts.map +1 -1
  84. package/dist/engine/engine.types.js +4 -0
  85. package/dist/engine/execute-plan.d.ts.map +1 -1
  86. package/dist/engine/execute-plan.js +42 -5
  87. package/dist/engine/managed-copy-hash.d.ts +4 -3
  88. package/dist/engine/managed-copy-hash.d.ts.map +1 -1
  89. package/dist/engine/managed-copy-hash.js +4 -3
  90. package/dist/fs/assets.d.ts.map +1 -1
  91. package/dist/fs/assets.js +7 -1
  92. package/dist/manifest/hash.d.ts +8 -10
  93. package/dist/manifest/hash.d.ts.map +1 -1
  94. package/dist/ui/output.js +1 -1
  95. package/dist/validation/skills.d.ts.map +1 -1
  96. package/dist/validation/skills.js +13 -0
  97. package/package.json +2 -2
@@ -42,9 +42,10 @@ import type { ManifestEntry } from '../manifest/manifest.types.js';
42
42
  * skipped it. Combined with the unframed digest that let a view drop
43
43
  * `SKILL.md`, fuse its bytes into a surviving file, and read `in_sync`. The
44
44
  * requirement is unconditional, so a skill directory that genuinely has no
45
- * `SKILL.md` (a layout `applyCopyMarker` tolerates as best-effort) is now
46
- * permanently `drifted` / `update_copy` rather than `in_sync`: the safe
47
- * direction, and the direction the review asked for.
45
+ * `SKILL.md` reads `drifted` rather than `in_sync`: the safe direction, and
46
+ * the direction the review asked for. The planner does not loop on it:
47
+ * `computeSyncPlan` reports a canonical directory without its marker as a
48
+ * configuration `error` entry instead of planning `update_copy`.
48
49
  *
49
50
  * These claims describe a quiescent tree. Every check here is path-based, so
50
51
  * none of them survives an adversary swapping an entry between the check and
@@ -1 +1 @@
1
- {"version":3,"file":"managed-copy-hash.d.ts","sourceRoot":"","sources":["../../src/engine/managed-copy-hash.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,wBAAsB,+BAA+B,CACnD,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,GACxC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyHxB"}
1
+ {"version":3,"file":"managed-copy-hash.d.ts","sourceRoot":"","sources":["../../src/engine/managed-copy-hash.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,wBAAsB,+BAA+B,CACnD,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,GACxC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyHxB"}
@@ -45,9 +45,10 @@ import { OAT_DIRECTORY_SENTINEL, OAT_MARKER_PREFIX } from './markers.js';
45
45
  * skipped it. Combined with the unframed digest that let a view drop
46
46
  * `SKILL.md`, fuse its bytes into a surviving file, and read `in_sync`. The
47
47
  * requirement is unconditional, so a skill directory that genuinely has no
48
- * `SKILL.md` (a layout `applyCopyMarker` tolerates as best-effort) is now
49
- * permanently `drifted` / `update_copy` rather than `in_sync`: the safe
50
- * direction, and the direction the review asked for.
48
+ * `SKILL.md` reads `drifted` rather than `in_sync`: the safe direction, and
49
+ * the direction the review asked for. The planner does not loop on it:
50
+ * `computeSyncPlan` reports a canonical directory without its marker as a
51
+ * configuration `error` entry instead of planning `update_copy`.
51
52
  *
52
53
  * These claims describe a quiescent tree. Every check here is path-based, so
53
54
  * none of them survives an adversary swapping an entry between the check and
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/fs/assets.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,CAAC;AA0CvD;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,YACtC,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,CACA,CAAC;AAgFX;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,eAAe,SAAc,EAC7B,MAAM,GAAE,gBAA6B,GACpC,OAAO,CAAC,IAAI,CAAC,CAsCf;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/fs/assets.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,CAAC;AA0CvD;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,YACtC,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,CACA,CAAC;AAgFX;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,eAAe,SAAc,EAC7B,MAAM,GAAE,gBAA6B,GACpC,OAAO,CAAC,IAAI,CAAC,CAsCf;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
package/dist/fs/assets.js CHANGED
@@ -179,7 +179,13 @@ export async function resolveAssetsRoot(env = process.env) {
179
179
  if (error instanceof CliError) {
180
180
  throw error;
181
181
  }
182
- throw new CliError(`Assets directory not found: ${assetsRoot}. ${assetsRemedy(source, PACKAGED_ROOT_REMEDY)}`, 2);
182
+ // Only an absent root is "not found". EACCES, ELOOP, and EIO on a root
183
+ // that exists need a different response, so name the errno, as
184
+ // `validateBundleStructure` does for the directories inside it.
185
+ if (isMissingPathError(error)) {
186
+ throw new CliError(`Assets directory not found: ${assetsRoot}. ${assetsRemedy(source, PACKAGED_ROOT_REMEDY)}`, 2);
187
+ }
188
+ throw new CliError(`Assets directory could not be read (${errorCode(error)}): ${assetsRoot}. ${assetsRemedy(source, PACKAGED_ROOT_REMEDY)}`, 2);
183
189
  }
184
190
  await validateAssetsBundle(assetsRoot, OAT_VERSION, source);
185
191
  return assetsRoot;
@@ -45,16 +45,14 @@ export declare function computeContentHash(contentPath: string, isFile: boolean)
45
45
  * framed digest equals a legacy digest under SHA-256 collision resistance —
46
46
  * the same assumption every other comparison here already rests on.
47
47
  *
48
- * `legacy` is retained for exactly one purpose: `drift/detector.ts` uses it to
49
- * recognize a manifest written before the framing change and re-decide with
50
- * `framed`. It is never an acceptance basis for provider content on its own.
51
- * The migration is needed because framing changes every recorded
52
- * `contentHash`, and `oat sync` plans `skip` for a faithful tree while
53
- * `ensureSkipEntryManaged` (`engine/execute-plan.ts`) does not restamp an entry
54
- * it already owns — so a legacy value is never rewritten by a no-op sync.
55
- * Measured on the built CLI: a directory-copy entry whose `contentHash` no
56
- * longer matches reports `drifted/modified` from `oat status`, `oat sync`
57
- * answers `skip` / "already in sync", and the manifest keeps the old value.
48
+ * `legacy` is retained for exactly one purpose: recognizing a manifest written
49
+ * before the framing change and re-deciding with `framed`, in
50
+ * `drift/detector.ts` and in the obsolete-mapping retirement classifier
51
+ * (`classifyObsoleteMappingRetirement` in `engine/compute-plan.ts`). It is
52
+ * never an acceptance basis for provider content on its own. The migration is
53
+ * needed because framing changes every recorded `contentHash`; `oat sync` now
54
+ * restamps a stale value when it plans `skip` for a faithful tree, so the
55
+ * bridge only covers installs that have not run such a sync yet.
58
56
  *
59
57
  * ## Bounds this digest still does not cover
60
58
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/manifest/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAMpD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzD;AAqBD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBvE;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAIjB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAED,gEAAgE;AAChE,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAMN;AAgFD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3E"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/manifest/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAMpD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzD;AAqBD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBvE;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAIjB;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAED,gEAAgE;AAChE,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAMN;AAgFD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3E"}
package/dist/ui/output.js CHANGED
@@ -90,7 +90,7 @@ function colorSyncOperation(operation) {
90
90
  if (operation === 'update_symlink' || operation === 'update_copy') {
91
91
  return chalk.yellow(operation);
92
92
  }
93
- if (operation === 'remove') {
93
+ if (operation === 'remove' || operation === 'error') {
94
94
  return chalk.red(operation);
95
95
  }
96
96
  return chalk.gray(operation);
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/validation/skills.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sCAAsC;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAChD,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,UAAU,6BAA6B;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAu1CD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,uCAAuC,EAChD,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,sCAAsC,CAAC,CAsBjD;AAsGD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,EACtC,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CAsJlC"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/validation/skills.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sCAAsC;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KAChD,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,UAAU,6BAA6B;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAu1CD,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,uCAAuC,EAChD,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,sCAAsC,CAAC,CAsBjD;AAsGD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,EACtC,YAAY,GAAE,6BAAkC,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CAoKlC"}
@@ -1084,6 +1084,19 @@ export async function validateOatSkills(repoRoot, options = {}, dependencies = {
1084
1084
  .map((entry) => entry.name)
1085
1085
  .sort();
1086
1086
  const oatSkillDirs = allSkillDirs.filter((name) => name.startsWith('oat-'));
1087
+ // Every canonical skill directory needs its marker, not only oat-* ones: a
1088
+ // copy-strategy sync of a directory without SKILL.md has no banner to anchor
1089
+ // its managed-copy digest. The oat-* loop below reports its own missing
1090
+ // marker, so this pass covers the remaining directories only.
1091
+ for (const dir of allSkillDirs) {
1092
+ if (dir.startsWith('oat-')) {
1093
+ continue;
1094
+ }
1095
+ const skillPath = join(skillsRoot, dir, 'SKILL.md');
1096
+ if (!(await isFile(skillPath))) {
1097
+ findings.push({ file: skillPath, message: 'Missing SKILL.md' });
1098
+ }
1099
+ }
1087
1100
  for (const dir of oatSkillDirs) {
1088
1101
  const skillPath = join(skillsRoot, dir, 'SKILL.md');
1089
1102
  let content;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.3.15",
3
+ "version": "0.3.16",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.3.15"
37
+ "@open-agent-toolkit/control-plane": "0.3.16"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",