@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.
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-wave-execute/SKILL.md +25 -2
- package/assets/skills/oat-wave-execute/assets/program-recap.recipe.json +34 -0
- package/assets/skills/oat-wave-program/SKILL.md +26 -1
- package/dist/commands/init/tools/shared/copy-helpers.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/copy-helpers.js +24 -1
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-wave-execute
|
|
3
|
-
version: 1.
|
|
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.
|
|
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":"
|
|
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.
|
|
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.
|
|
37
|
+
"@open-agent-toolkit/control-plane": "0.2.2"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^22.10.0",
|