@open-agent-toolkit/cli 0.2.0 → 0.2.2

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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.0",
3
- "docs-config": "0.2.0",
4
- "docs-theme": "0.2.0",
5
- "docs-transforms": "0.2.0"
2
+ "cli": "0.2.2",
3
+ "docs-config": "0.2.2",
4
+ "docs-theme": "0.2.2",
5
+ "docs-transforms": "0.2.2"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-wave-execute
3
- version: 1.5.0
3
+ version: 1.6.0
4
4
  description: Use when executing a wave of external implementation plans as a wrapper OAT project — scaffolding, drift refresh, parallel worktree groups, briefs, gates, merge choreography, and closeout.
5
5
  argument-hint: '<wave-id> [plan-names...] (e.g. wave-2 http-listener-before-indexing ...)'
6
6
  disable-model-invocation: false
@@ -303,7 +303,30 @@ archive anything first.
303
303
  branch vs main; cherry-pick stragglers), reset the working branch, clean stale
304
304
  phase branches, and run `oat-wave-program` `wave-close <wave-id>` so the
305
305
  program ledger records the merge (PR, SHA, completion-record link) and flips
306
- the wave's plan rows to `done`.
306
+ the wave's plan rows to `done`. Optionally generate the program recap using
307
+ the mechanical explainer caller below.
308
+
309
+ #### Optional program-recap explainer caller
310
+
311
+ The orchestrator owns fact-base synthesis. It synthesizes an
312
+ `explainer-kit.fact-base/v1` document from the reconciled execution-program
313
+ artifact, wave summaries, and completion records. Its required keys are exactly:
314
+ `schemaVersion, generatedAt, mode, freshnessPolicy, sources, claims, unresolvedClaims, overrides`.
315
+
316
+ The mechanical caller constructs an `explainer-kit.run-request/v1` document whose
317
+ required keys are exactly:
318
+ `schemaVersion, recipe, slug, outputRoot, factBase, mode`. Set `recipe` to
319
+ `{ "id": "program-recap", "version": "1" }`; this is an object with exactly
320
+ `id` and `version`. Set `outputRoot` to `.oat/repo/explainers/<slug>/`. Bind the
321
+ synthesized fact-base file through `factBase` with the required keys
322
+ `mode, freshnessPolicy`, set `mode` to `"supplied"`, set `freshnessPolicy` to
323
+ `"live-wins"`, and set `path` to that file.
324
+
325
+ After the run, read the `explainer-kit.manifest/v1` document. Its required keys
326
+ are exactly:
327
+ `schemaVersion, runId, slug, recipe, createdAt, source, theme, artifacts, immutableHashes, outcome, buildRecord, warnings`.
328
+ Record the manifest's `runId` and `outcome` in the wave ledger row. Publishing is
329
+ human-gated; this caller never invokes publish.
307
330
 
308
331
  ## Success Criteria
309
332
 
@@ -0,0 +1,34 @@
1
+ {
2
+ "schemaVersion": "explainer-kit.recipe/v1",
3
+ "id": "program-recap",
4
+ "version": "1",
5
+ "sourceRoles": [
6
+ {
7
+ "role": "program",
8
+ "required": true,
9
+ "accepts": ["file", "directory", "git"],
10
+ "minBindings": 1,
11
+ "maxBindings": 1
12
+ }
13
+ ],
14
+ "requiredNarrative": [
15
+ "program-overview",
16
+ "wave-map",
17
+ "per-wave-outcomes",
18
+ "convention-evolution",
19
+ "aggregate-numbers",
20
+ "follow-up-ledger"
21
+ ],
22
+ "artifacts": [
23
+ {
24
+ "id": "program-recap",
25
+ "type": "hub",
26
+ "template": "house-style",
27
+ "required": true
28
+ }
29
+ ],
30
+ "discoveryLimits": {
31
+ "consecutiveNoNewFindingsRounds": 2,
32
+ "maxRounds": 8
33
+ }
34
+ }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-wave-program
3
- version: 1.1.0
3
+ version: 1.2.0
4
4
  description: Use when decomposing a corpus of external implementation plans into an ordered wave program — coverage inventory, dependency mapping, wave composition, and the durable execution-program artifact that oat-wave-execute consumes and updates.
5
5
  argument-hint: '[new|refresh|wave-close <wave-id>] (default: refresh against the current artifact)'
6
6
  disable-model-invocation: false
@@ -89,6 +89,31 @@ target (same disclaimer as the plan indexes).
89
89
  2. Update the status ledger row: PR, merge SHA, completion-record link.
90
90
  3. Note next-wave unblocks ("W3 merged → W4 token-cost unblocked").
91
91
  4. Commit with the wave's closeout bookkeeping.
92
+ 5. Optionally run the mechanical program-recap explainer caller described below,
93
+ then add its manifest `runId` and `outcome` to the wave ledger row.
94
+
95
+ ### Program-close explainer caller
96
+
97
+ At wave-close or program-close, the orchestrator owns fact-base synthesis. It
98
+ synthesizes an `explainer-kit.fact-base/v1` document from the reconciled
99
+ execution-program artifact, wave summaries, and completion records. Its required
100
+ keys are exactly:
101
+ `schemaVersion, generatedAt, mode, freshnessPolicy, sources, claims, unresolvedClaims, overrides`.
102
+
103
+ The mechanical caller constructs an `explainer-kit.run-request/v1` document whose
104
+ required keys are exactly:
105
+ `schemaVersion, recipe, slug, outputRoot, factBase, mode`. Set `recipe` to
106
+ `{ "id": "program-recap", "version": "1" }`; this is an object with exactly
107
+ `id` and `version`. Set `outputRoot` to `.oat/repo/explainers/<slug>/`. Bind the
108
+ synthesized fact-base file through `factBase` with the required keys
109
+ `mode, freshnessPolicy`, set `mode` to `"supplied"`, set `freshnessPolicy` to
110
+ `"live-wins"`, and set `path` to that file.
111
+
112
+ After the run, read the `explainer-kit.manifest/v1` document. Its required keys
113
+ are exactly:
114
+ `schemaVersion, runId, slug, recipe, createdAt, source, theme, artifacts, immutableHashes, outcome, buildRecord, warnings`.
115
+ Record the manifest's `runId` and `outcome` in the wave or program ledger row.
116
+ Publishing is human-gated; this caller never invokes publish.
92
117
 
93
118
  ## Integration with `oat-wave-execute`
94
119
 
@@ -1 +1 @@
1
- {"version":3,"file":"copy-helpers.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/copy-helpers.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/D;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAerB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAerB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAuBrB"}
1
+ {"version":3,"file":"copy-helpers.d.ts","sourceRoot":"","sources":["../../../../../src/commands/init/tools/shared/copy-helpers.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAwBD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/D;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAerB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAyBrB"}
@@ -1,7 +1,26 @@
1
- import { rm } from 'node:fs/promises';
1
+ import { chmod, readdir, rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
2
3
  import { compareVersions } from '../../../init/tools/shared/version.js';
3
4
  import { getSkillVersion } from '../../../shared/frontmatter.js';
4
5
  import { copyDirectory, copySingleFile, dirExists, fileExists } from '../../../../fs/io.js';
6
+ async function chmodFilesExecutable(directory) {
7
+ const entries = await readdir(directory, { withFileTypes: true });
8
+ for (const entry of entries) {
9
+ const path = join(directory, entry.name);
10
+ if (entry.isDirectory()) {
11
+ await chmodFilesExecutable(path);
12
+ }
13
+ else if (entry.isFile()) {
14
+ await chmod(path, 0o755);
15
+ }
16
+ }
17
+ }
18
+ async function ensureNestedScriptsExecutable(destination) {
19
+ const scriptsDirectory = join(destination, 'scripts');
20
+ if (await dirExists(scriptsDirectory)) {
21
+ await chmodFilesExecutable(scriptsDirectory);
22
+ }
23
+ }
5
24
  export async function pathExists(path) {
6
25
  return (await fileExists(path)) || (await dirExists(path));
7
26
  }
@@ -13,9 +32,11 @@ export async function copyDirWithStatus(source, destination, force) {
13
32
  if (exists && force) {
14
33
  await rm(destination, { recursive: true, force: true });
15
34
  await copyDirectory(source, destination);
35
+ await ensureNestedScriptsExecutable(destination);
16
36
  return 'updated';
17
37
  }
18
38
  await copyDirectory(source, destination);
39
+ await ensureNestedScriptsExecutable(destination);
19
40
  return 'copied';
20
41
  }
21
42
  export async function copyFileWithStatus(source, destination, force) {
@@ -35,11 +56,13 @@ export async function copyDirWithVersionCheck(source, destination, force) {
35
56
  const exists = await pathExists(destination);
36
57
  if (!exists) {
37
58
  await copyDirectory(source, destination);
59
+ await ensureNestedScriptsExecutable(destination);
38
60
  return { status: 'copied' };
39
61
  }
40
62
  if (force) {
41
63
  await rm(destination, { recursive: true, force: true });
42
64
  await copyDirectory(source, destination);
65
+ await ensureNestedScriptsExecutable(destination);
43
66
  return { status: 'updated' };
44
67
  }
45
68
  const bundledVersion = await getSkillVersion(source);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
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.2.0"
37
+ "@open-agent-toolkit/control-plane": "0.2.2"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",