opencastle 0.26.1 → 0.27.1
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/README.md +7 -1
- package/bin/cli.mjs +10 -0
- package/dist/cli/agents.d.ts +3 -0
- package/dist/cli/agents.d.ts.map +1 -0
- package/dist/cli/agents.js +161 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/baselines.d.ts +3 -0
- package/dist/cli/baselines.d.ts.map +1 -0
- package/dist/cli/baselines.js +128 -0
- package/dist/cli/baselines.js.map +1 -0
- package/dist/cli/convoy/engine.d.ts +68 -2
- package/dist/cli/convoy/engine.d.ts.map +1 -1
- package/dist/cli/convoy/engine.js +2102 -26
- package/dist/cli/convoy/engine.js.map +1 -1
- package/dist/cli/convoy/engine.test.js +1572 -70
- package/dist/cli/convoy/engine.test.js.map +1 -1
- package/dist/cli/convoy/events.d.ts +4 -1
- package/dist/cli/convoy/events.d.ts.map +1 -1
- package/dist/cli/convoy/events.js +74 -13
- package/dist/cli/convoy/events.js.map +1 -1
- package/dist/cli/convoy/events.test.js +154 -27
- package/dist/cli/convoy/events.test.js.map +1 -1
- package/dist/cli/convoy/expertise.d.ts +16 -0
- package/dist/cli/convoy/expertise.d.ts.map +1 -0
- package/dist/cli/convoy/expertise.js +121 -0
- package/dist/cli/convoy/expertise.js.map +1 -0
- package/dist/cli/convoy/expertise.test.d.ts +2 -0
- package/dist/cli/convoy/expertise.test.d.ts.map +1 -0
- package/dist/cli/convoy/expertise.test.js +96 -0
- package/dist/cli/convoy/expertise.test.js.map +1 -0
- package/dist/cli/convoy/export.test.js +1 -0
- package/dist/cli/convoy/export.test.js.map +1 -1
- package/dist/cli/convoy/formula.d.ts +19 -0
- package/dist/cli/convoy/formula.d.ts.map +1 -0
- package/dist/cli/convoy/formula.js +142 -0
- package/dist/cli/convoy/formula.js.map +1 -0
- package/dist/cli/convoy/formula.test.d.ts +2 -0
- package/dist/cli/convoy/formula.test.d.ts.map +1 -0
- package/dist/cli/convoy/formula.test.js +342 -0
- package/dist/cli/convoy/formula.test.js.map +1 -0
- package/dist/cli/convoy/gates.d.ts +128 -0
- package/dist/cli/convoy/gates.d.ts.map +1 -0
- package/dist/cli/convoy/gates.js +606 -0
- package/dist/cli/convoy/gates.js.map +1 -0
- package/dist/cli/convoy/gates.test.d.ts +2 -0
- package/dist/cli/convoy/gates.test.d.ts.map +1 -0
- package/dist/cli/convoy/gates.test.js +976 -0
- package/dist/cli/convoy/gates.test.js.map +1 -0
- package/dist/cli/convoy/health.d.ts +11 -0
- package/dist/cli/convoy/health.d.ts.map +1 -1
- package/dist/cli/convoy/health.js +54 -0
- package/dist/cli/convoy/health.js.map +1 -1
- package/dist/cli/convoy/health.test.js +56 -1
- package/dist/cli/convoy/health.test.js.map +1 -1
- package/dist/cli/convoy/issues.d.ts +8 -0
- package/dist/cli/convoy/issues.d.ts.map +1 -0
- package/dist/cli/convoy/issues.js +98 -0
- package/dist/cli/convoy/issues.js.map +1 -0
- package/dist/cli/convoy/issues.test.d.ts +2 -0
- package/dist/cli/convoy/issues.test.d.ts.map +1 -0
- package/dist/cli/convoy/issues.test.js +107 -0
- package/dist/cli/convoy/issues.test.js.map +1 -0
- package/dist/cli/convoy/knowledge.d.ts +5 -0
- package/dist/cli/convoy/knowledge.d.ts.map +1 -0
- package/dist/cli/convoy/knowledge.js +116 -0
- package/dist/cli/convoy/knowledge.js.map +1 -0
- package/dist/cli/convoy/knowledge.test.d.ts +2 -0
- package/dist/cli/convoy/knowledge.test.d.ts.map +1 -0
- package/dist/cli/convoy/knowledge.test.js +87 -0
- package/dist/cli/convoy/knowledge.test.js.map +1 -0
- package/dist/cli/convoy/lessons.d.ts +17 -0
- package/dist/cli/convoy/lessons.d.ts.map +1 -0
- package/dist/cli/convoy/lessons.js +149 -0
- package/dist/cli/convoy/lessons.js.map +1 -0
- package/dist/cli/convoy/lessons.test.d.ts +2 -0
- package/dist/cli/convoy/lessons.test.d.ts.map +1 -0
- package/dist/cli/convoy/lessons.test.js +135 -0
- package/dist/cli/convoy/lessons.test.js.map +1 -0
- package/dist/cli/convoy/lock.d.ts +13 -0
- package/dist/cli/convoy/lock.d.ts.map +1 -0
- package/dist/cli/convoy/lock.js +88 -0
- package/dist/cli/convoy/lock.js.map +1 -0
- package/dist/cli/convoy/lock.test.d.ts +2 -0
- package/dist/cli/convoy/lock.test.d.ts.map +1 -0
- package/dist/cli/convoy/lock.test.js +136 -0
- package/dist/cli/convoy/lock.test.js.map +1 -0
- package/dist/cli/convoy/merge.d.ts +4 -0
- package/dist/cli/convoy/merge.d.ts.map +1 -1
- package/dist/cli/convoy/merge.js +18 -1
- package/dist/cli/convoy/merge.js.map +1 -1
- package/dist/cli/convoy/merge.test.js +6 -7
- package/dist/cli/convoy/merge.test.js.map +1 -1
- package/dist/cli/convoy/partition.d.ts +51 -0
- package/dist/cli/convoy/partition.d.ts.map +1 -0
- package/dist/cli/convoy/partition.js +186 -0
- package/dist/cli/convoy/partition.js.map +1 -0
- package/dist/cli/convoy/partition.test.d.ts +2 -0
- package/dist/cli/convoy/partition.test.d.ts.map +1 -0
- package/dist/cli/convoy/partition.test.js +315 -0
- package/dist/cli/convoy/partition.test.js.map +1 -0
- package/dist/cli/convoy/pipeline.test.js +6 -0
- package/dist/cli/convoy/pipeline.test.js.map +1 -1
- package/dist/cli/convoy/store.d.ts +47 -5
- package/dist/cli/convoy/store.d.ts.map +1 -1
- package/dist/cli/convoy/store.js +525 -19
- package/dist/cli/convoy/store.js.map +1 -1
- package/dist/cli/convoy/store.test.js +1345 -12
- package/dist/cli/convoy/store.test.js.map +1 -1
- package/dist/cli/convoy/types.d.ts +156 -2
- package/dist/cli/convoy/types.d.ts.map +1 -1
- package/dist/cli/destroy.d.ts +3 -0
- package/dist/cli/destroy.d.ts.map +1 -0
- package/dist/cli/destroy.js +69 -0
- package/dist/cli/destroy.js.map +1 -0
- package/dist/cli/destroy.test.d.ts +2 -0
- package/dist/cli/destroy.test.d.ts.map +1 -0
- package/dist/cli/destroy.test.js +116 -0
- package/dist/cli/destroy.test.js.map +1 -0
- package/dist/cli/gitignore.d.ts +9 -0
- package/dist/cli/gitignore.d.ts.map +1 -1
- package/dist/cli/gitignore.js +29 -0
- package/dist/cli/gitignore.js.map +1 -1
- package/dist/cli/plan.d.ts +3 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +288 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/run/adapters/claude.d.ts +2 -0
- package/dist/cli/run/adapters/claude.d.ts.map +1 -1
- package/dist/cli/run/adapters/claude.js +89 -49
- package/dist/cli/run/adapters/claude.js.map +1 -1
- package/dist/cli/run/adapters/claude.test.d.ts +2 -0
- package/dist/cli/run/adapters/claude.test.d.ts.map +1 -0
- package/dist/cli/run/adapters/claude.test.js +205 -0
- package/dist/cli/run/adapters/claude.test.js.map +1 -0
- package/dist/cli/run/adapters/copilot.d.ts +1 -0
- package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
- package/dist/cli/run/adapters/copilot.js +84 -46
- package/dist/cli/run/adapters/copilot.js.map +1 -1
- package/dist/cli/run/adapters/copilot.test.d.ts +2 -0
- package/dist/cli/run/adapters/copilot.test.d.ts.map +1 -0
- package/dist/cli/run/adapters/copilot.test.js +195 -0
- package/dist/cli/run/adapters/copilot.test.js.map +1 -0
- package/dist/cli/run/adapters/cursor.d.ts +1 -0
- package/dist/cli/run/adapters/cursor.d.ts.map +1 -1
- package/dist/cli/run/adapters/cursor.js +83 -47
- package/dist/cli/run/adapters/cursor.js.map +1 -1
- package/dist/cli/run/adapters/cursor.test.d.ts +2 -0
- package/dist/cli/run/adapters/cursor.test.d.ts.map +1 -0
- package/dist/cli/run/adapters/cursor.test.js +129 -0
- package/dist/cli/run/adapters/cursor.test.js.map +1 -0
- package/dist/cli/run/adapters/opencode.d.ts +1 -0
- package/dist/cli/run/adapters/opencode.d.ts.map +1 -1
- package/dist/cli/run/adapters/opencode.js +81 -47
- package/dist/cli/run/adapters/opencode.js.map +1 -1
- package/dist/cli/run/adapters/opencode.test.d.ts +2 -0
- package/dist/cli/run/adapters/opencode.test.d.ts.map +1 -0
- package/dist/cli/run/adapters/opencode.test.js +119 -0
- package/dist/cli/run/adapters/opencode.test.js.map +1 -0
- package/dist/cli/run/executor.js +1 -1
- package/dist/cli/run/executor.js.map +1 -1
- package/dist/cli/run/schema.d.ts.map +1 -1
- package/dist/cli/run/schema.js +245 -4
- package/dist/cli/run/schema.js.map +1 -1
- package/dist/cli/run/schema.test.js +669 -0
- package/dist/cli/run/schema.test.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +362 -22
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/types.d.ts +85 -2
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/cli/watch.d.ts +15 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +279 -0
- package/dist/cli/watch.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/agents.ts +177 -0
- package/src/cli/baselines.ts +143 -0
- package/src/cli/convoy/engine.test.ts +1839 -70
- package/src/cli/convoy/engine.ts +2417 -38
- package/src/cli/convoy/events.test.ts +179 -38
- package/src/cli/convoy/events.ts +88 -16
- package/src/cli/convoy/expertise.test.ts +128 -0
- package/src/cli/convoy/expertise.ts +163 -0
- package/src/cli/convoy/export.test.ts +1 -0
- package/src/cli/convoy/formula.test.ts +405 -0
- package/src/cli/convoy/formula.ts +174 -0
- package/src/cli/convoy/gates.test.ts +1169 -0
- package/src/cli/convoy/gates.ts +774 -0
- package/src/cli/convoy/health.test.ts +64 -2
- package/src/cli/convoy/health.ts +80 -2
- package/src/cli/convoy/issues.test.ts +143 -0
- package/src/cli/convoy/issues.ts +136 -0
- package/src/cli/convoy/knowledge.test.ts +101 -0
- package/src/cli/convoy/knowledge.ts +132 -0
- package/src/cli/convoy/lessons.test.ts +188 -0
- package/src/cli/convoy/lessons.ts +164 -0
- package/src/cli/convoy/lock.test.ts +181 -0
- package/src/cli/convoy/lock.ts +103 -0
- package/src/cli/convoy/merge.test.ts +6 -7
- package/src/cli/convoy/merge.ts +19 -1
- package/src/cli/convoy/partition.test.ts +423 -0
- package/src/cli/convoy/partition.ts +232 -0
- package/src/cli/convoy/pipeline.test.ts +6 -0
- package/src/cli/convoy/store.test.ts +1512 -14
- package/src/cli/convoy/store.ts +676 -30
- package/src/cli/convoy/types.ts +170 -1
- package/src/cli/destroy.test.ts +141 -0
- package/src/cli/destroy.ts +88 -0
- package/src/cli/gitignore.ts +36 -0
- package/src/cli/plan.ts +316 -0
- package/src/cli/run/adapters/claude.test.ts +234 -0
- package/src/cli/run/adapters/claude.ts +45 -5
- package/src/cli/run/adapters/copilot.test.ts +224 -0
- package/src/cli/run/adapters/copilot.ts +34 -4
- package/src/cli/run/adapters/cursor.test.ts +144 -0
- package/src/cli/run/adapters/cursor.ts +33 -2
- package/src/cli/run/adapters/opencode.test.ts +135 -0
- package/src/cli/run/adapters/opencode.ts +30 -2
- package/src/cli/run/executor.ts +1 -1
- package/src/cli/run/schema.test.ts +758 -0
- package/src/cli/run/schema.ts +300 -25
- package/src/cli/run.ts +341 -21
- package/src/cli/types.ts +86 -1
- package/src/cli/watch.ts +298 -0
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
package/README.md
CHANGED
|
@@ -70,6 +70,8 @@ MCP servers are auto-configured for your stack in each IDE's native format.
|
|
|
70
70
|
| `opencastle init` | Set up agents in your project |
|
|
71
71
|
| `opencastle update` | Update framework files (keeps your customizations) |
|
|
72
72
|
| `opencastle eject` | Remove the dependency, keep all files |
|
|
73
|
+
| `opencastle destroy` | Remove ALL OpenCastle files (reverse of init) |
|
|
74
|
+
| `opencastle plan` | Generate a convoy spec from a task description |
|
|
73
75
|
| `opencastle run` | Run the Convoy Engine (deterministic, crash-recoverable orchestrator) |
|
|
74
76
|
| `opencastle dashboard` | Open the observability dashboard |
|
|
75
77
|
| `opencastle doctor` | Validate your setup and surface issues |
|
|
@@ -165,7 +167,11 @@ gates:
|
|
|
165
167
|
- **Observable** — real-time dashboard auto-starts during execution.
|
|
166
168
|
- **Multi-runtime** — mix Copilot, Claude Code, Cursor, and OpenCode in the same convoy.
|
|
167
169
|
|
|
168
|
-
|
|
170
|
+
Generate a convoy spec from a plain text description — no YAML by hand:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
npx opencastle plan --file task.txt
|
|
174
|
+
```
|
|
169
175
|
|
|
170
176
|
📖 [Full Convoy Engine documentation →](https://www.opencastle.dev/docs/cli#run)
|
|
171
177
|
|
package/bin/cli.mjs
CHANGED
|
@@ -21,7 +21,12 @@ const HELP = `
|
|
|
21
21
|
init Set up OpenCastle in your project
|
|
22
22
|
update Update framework files (preserves customizations)
|
|
23
23
|
eject Remove dependency, keep all files standalone
|
|
24
|
+
destroy Remove ALL OpenCastle files (reverse of init)
|
|
24
25
|
run Process a task queue from a spec file autonomously
|
|
26
|
+
agents Manage persistent agent identities
|
|
27
|
+
dispute Manage convoy dispute resolution
|
|
28
|
+
plan Generate a convoy spec from a task description file
|
|
29
|
+
baselines Manage visual regression baselines
|
|
25
30
|
dashboard View agent observability dashboard in your browser
|
|
26
31
|
doctor Validate your OpenCastle setup
|
|
27
32
|
log Append a structured event to the observability log
|
|
@@ -50,11 +55,16 @@ const commands = {
|
|
|
50
55
|
init: () => import('../dist/cli/init.js'),
|
|
51
56
|
update: () => import('../dist/cli/update.js'),
|
|
52
57
|
eject: () => import('../dist/cli/eject.js'),
|
|
58
|
+
destroy: () => import('../dist/cli/destroy.js'),
|
|
53
59
|
run: () => import('../dist/cli/run.js'),
|
|
60
|
+
plan: () => import('../dist/cli/plan.js'),
|
|
54
61
|
dashboard: () => import('../dist/cli/dashboard.js'),
|
|
55
62
|
doctor: () => import('../dist/cli/doctor.js'),
|
|
56
63
|
log: () => import('../dist/cli/log.js'),
|
|
57
64
|
lesson: () => import('../dist/cli/lesson.js'),
|
|
65
|
+
agents: () => import('../dist/cli/agents.js'),
|
|
66
|
+
dispute: () => import('../dist/cli/dispute.js'),
|
|
67
|
+
baselines: () => import('../dist/cli/baselines.js'),
|
|
58
68
|
}
|
|
59
69
|
|
|
60
70
|
if (!commands[command]) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/cli/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAyE5C,wBAA8B,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGxE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { c } from './prompt.js';
|
|
4
|
+
const HELP = `
|
|
5
|
+
opencastle agents [subcommand] [options]
|
|
6
|
+
|
|
7
|
+
Manage persistent agent identities.
|
|
8
|
+
|
|
9
|
+
Subcommands:
|
|
10
|
+
list List all agent identities (agent, task count, latest date)
|
|
11
|
+
inspect <agent> Show summaries for a specific agent
|
|
12
|
+
purge <agent> Delete all identities for an agent
|
|
13
|
+
compact --older-than <d> Delete identities older than N days
|
|
14
|
+
|
|
15
|
+
Options:
|
|
16
|
+
--older-than <days> Days threshold for compact subcommand
|
|
17
|
+
--yes, -y Skip confirmation prompt
|
|
18
|
+
--help, -h Show this help
|
|
19
|
+
`;
|
|
20
|
+
function parseAgentsArgs(args) {
|
|
21
|
+
const opts = {
|
|
22
|
+
subcommand: null,
|
|
23
|
+
agentName: null,
|
|
24
|
+
olderThan: null,
|
|
25
|
+
yes: false,
|
|
26
|
+
help: false,
|
|
27
|
+
};
|
|
28
|
+
for (let i = 0; i < args.length; i++) {
|
|
29
|
+
const arg = args[i];
|
|
30
|
+
switch (arg) {
|
|
31
|
+
case '--help':
|
|
32
|
+
case '-h':
|
|
33
|
+
opts.help = true;
|
|
34
|
+
break;
|
|
35
|
+
case '--older-than':
|
|
36
|
+
if (i + 1 >= args.length) {
|
|
37
|
+
console.error(' \u2717 --older-than requires a number');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
opts.olderThan = parseInt(args[++i], 10);
|
|
41
|
+
if (!Number.isFinite(opts.olderThan) || opts.olderThan < 1) {
|
|
42
|
+
console.error(' \u2717 --older-than must be a positive integer');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
break;
|
|
46
|
+
case '--yes':
|
|
47
|
+
case '-y':
|
|
48
|
+
opts.yes = true;
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
if (arg.startsWith('--')) {
|
|
52
|
+
console.error(` \u2717 Unknown option: ${arg}`);
|
|
53
|
+
console.log(HELP);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
if (!opts.subcommand) {
|
|
57
|
+
opts.subcommand = arg;
|
|
58
|
+
}
|
|
59
|
+
else if (!opts.agentName) {
|
|
60
|
+
opts.agentName = arg;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return opts;
|
|
65
|
+
}
|
|
66
|
+
export default async function agents({ args }) {
|
|
67
|
+
const opts = parseAgentsArgs(args);
|
|
68
|
+
if (opts.help || !opts.subcommand) {
|
|
69
|
+
console.log(HELP);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const dbPath = resolve(process.cwd(), '.opencastle', 'convoy.db');
|
|
73
|
+
if (!existsSync(dbPath)) {
|
|
74
|
+
console.log(' No convoy database found at .opencastle/convoy.db');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const { createConvoyStore } = await import('./convoy/store.js');
|
|
78
|
+
const store = createConvoyStore(dbPath);
|
|
79
|
+
try {
|
|
80
|
+
switch (opts.subcommand) {
|
|
81
|
+
case 'list': {
|
|
82
|
+
const summaries = store.listAgentIdentitySummary();
|
|
83
|
+
if (summaries.length === 0) {
|
|
84
|
+
console.log(' No agent identities found.');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log(`\n Agent Identities (${summaries.length} agents):\n`);
|
|
88
|
+
console.log(` ${'Agent'.padEnd(25)} ${'Tasks'.padEnd(8)} Latest`);
|
|
89
|
+
console.log(` ${'\u2500'.repeat(25)} ${'\u2500'.repeat(8)} ${'\u2500'.repeat(20)}`);
|
|
90
|
+
for (const s of summaries) {
|
|
91
|
+
console.log(` ${s.agent.padEnd(25)} ${String(s.task_count).padEnd(8)} ${s.latest_date}`);
|
|
92
|
+
}
|
|
93
|
+
console.log();
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case 'inspect': {
|
|
97
|
+
if (!opts.agentName) {
|
|
98
|
+
console.error(' \u2717 inspect requires an agent name: opencastle agents inspect <agent>');
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
const identities = store.getAgentIdentities(opts.agentName, 100);
|
|
102
|
+
if (identities.length === 0) {
|
|
103
|
+
console.log(` No identities found for agent "${opts.agentName}".`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log(`\n Agent: ${opts.agentName} (${identities.length} identities)\n`);
|
|
107
|
+
for (const id of identities) {
|
|
108
|
+
console.log(` ${c.dim('\u2500'.repeat(60))}`);
|
|
109
|
+
console.log(` Task: ${id.task_id} | Convoy: ${id.convoy_id}`);
|
|
110
|
+
console.log(` Date: ${id.created_at} | Retention: ${id.retention_days}d`);
|
|
111
|
+
console.log(` Summary:`);
|
|
112
|
+
const lines = id.summary.split('\n');
|
|
113
|
+
for (const line of lines.slice(0, 10)) {
|
|
114
|
+
console.log(` ${line}`);
|
|
115
|
+
}
|
|
116
|
+
if (lines.length > 10) {
|
|
117
|
+
console.log(` ${c.dim(`... ${lines.length - 10} more lines`)}`);
|
|
118
|
+
}
|
|
119
|
+
console.log();
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case 'purge': {
|
|
124
|
+
if (!opts.agentName) {
|
|
125
|
+
console.error(' \u2717 purge requires an agent name: opencastle agents purge <agent>');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
if (!opts.yes) {
|
|
129
|
+
const existing = store.getAgentIdentities(opts.agentName, 1000);
|
|
130
|
+
if (existing.length === 0) {
|
|
131
|
+
console.log(` No identities found for agent "${opts.agentName}".`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
console.log(`\n This will delete ${existing.length} identities for agent "${opts.agentName}".`);
|
|
135
|
+
console.log(` Use --yes or -y to confirm.`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const deleted = store.purgeAgentIdentities(opts.agentName);
|
|
139
|
+
console.log(` \u2713 Purged ${deleted} identities for agent "${opts.agentName}".`);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case 'compact': {
|
|
143
|
+
if (!opts.olderThan) {
|
|
144
|
+
console.error(' \u2717 compact requires --older-than <days>');
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
const deleted = store.deleteAgentIdentitiesOlderThan(opts.olderThan);
|
|
148
|
+
console.log(` \u2713 Deleted ${deleted} identities older than ${opts.olderThan} days.`);
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
default:
|
|
152
|
+
console.error(` \u2717 Unknown subcommand: ${opts.subcommand}`);
|
|
153
|
+
console.log(HELP);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
store.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/cli/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baselines.d.ts","sourceRoot":"","sources":["../../src/cli/baselines.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AA6E5C,wBAA8B,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D3E"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { join, basename } from 'node:path';
|
|
3
|
+
import { scanForSecrets } from './convoy/gates.js';
|
|
4
|
+
const HELP = `
|
|
5
|
+
opencastle baselines <subcommand> [options]
|
|
6
|
+
|
|
7
|
+
Manage visual regression baselines.
|
|
8
|
+
|
|
9
|
+
Subcommands:
|
|
10
|
+
update --slug <name> --from <file> Update a baseline from a PNG file
|
|
11
|
+
list List all baselines
|
|
12
|
+
|
|
13
|
+
Options:
|
|
14
|
+
--slug <name> Baseline name (used as filename)
|
|
15
|
+
--from <file> Source PNG file path
|
|
16
|
+
--dir <path> Baselines directory (default: .opencastle/baselines)
|
|
17
|
+
--help, -h Show this help
|
|
18
|
+
`;
|
|
19
|
+
function parseBaselinesArgs(args) {
|
|
20
|
+
const opts = {
|
|
21
|
+
subcommand: null,
|
|
22
|
+
slug: null,
|
|
23
|
+
from: null,
|
|
24
|
+
dir: '.opencastle/baselines',
|
|
25
|
+
help: false,
|
|
26
|
+
};
|
|
27
|
+
for (let i = 0; i < args.length; i++) {
|
|
28
|
+
const arg = args[i];
|
|
29
|
+
switch (arg) {
|
|
30
|
+
case '--help':
|
|
31
|
+
case '-h':
|
|
32
|
+
opts.help = true;
|
|
33
|
+
break;
|
|
34
|
+
case '--slug':
|
|
35
|
+
if (i + 1 >= args.length) {
|
|
36
|
+
console.error(' \u2717 --slug requires a name');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
opts.slug = args[++i];
|
|
40
|
+
break;
|
|
41
|
+
case '--from':
|
|
42
|
+
if (i + 1 >= args.length) {
|
|
43
|
+
console.error(' \u2717 --from requires a file path');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
opts.from = args[++i];
|
|
47
|
+
break;
|
|
48
|
+
case '--dir':
|
|
49
|
+
if (i + 1 >= args.length) {
|
|
50
|
+
console.error(' \u2717 --dir requires a path');
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
opts.dir = args[++i];
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
if (arg.startsWith('--')) {
|
|
57
|
+
console.error(` \u2717 Unknown option: ${arg}`);
|
|
58
|
+
console.log(HELP);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
if (!opts.subcommand) {
|
|
62
|
+
opts.subcommand = arg;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return opts;
|
|
67
|
+
}
|
|
68
|
+
export default async function baselines({ args }) {
|
|
69
|
+
const opts = parseBaselinesArgs(args);
|
|
70
|
+
if (opts.help || !opts.subcommand) {
|
|
71
|
+
console.log(HELP);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
switch (opts.subcommand) {
|
|
75
|
+
case 'update': {
|
|
76
|
+
if (!opts.slug) {
|
|
77
|
+
console.error(' \u2717 update requires --slug <name>');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(opts.slug)) {
|
|
81
|
+
console.error(' \u2717 Slug must contain only alphanumeric characters, hyphens, and underscores');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (!opts.from) {
|
|
85
|
+
console.error(' \u2717 update requires --from <file>');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
if (!existsSync(opts.from)) {
|
|
89
|
+
console.error(` \u2717 Source file not found: ${opts.from}`);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const data = readFileSync(opts.from);
|
|
93
|
+
const scan = scanForSecrets(data.toString('base64'), opts.from);
|
|
94
|
+
if (!scan.clean) {
|
|
95
|
+
console.error(' \u2717 Source file contains potential secrets \u2014 baseline not updated');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
mkdirSync(opts.dir, { recursive: true });
|
|
99
|
+
const dest = join(opts.dir, `${opts.slug}.png`);
|
|
100
|
+
writeFileSync(dest, data);
|
|
101
|
+
console.log(` \u2713 Baseline updated: ${dest}`);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case 'list': {
|
|
105
|
+
if (!existsSync(opts.dir)) {
|
|
106
|
+
console.log(` No baselines directory found at ${opts.dir}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const files = readdirSync(opts.dir).filter((f) => f.endsWith('.png'));
|
|
110
|
+
if (files.length === 0) {
|
|
111
|
+
console.log(' No baselines found.');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
console.log(`\n Baselines in ${opts.dir}:\n`);
|
|
115
|
+
for (const file of files) {
|
|
116
|
+
const stats = statSync(join(opts.dir, file));
|
|
117
|
+
console.log(` ${basename(file, '.png').padEnd(30)} ${(stats.size / 1024).toFixed(1)} KB`);
|
|
118
|
+
}
|
|
119
|
+
console.log();
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
default:
|
|
123
|
+
console.error(` \u2717 Unknown subcommand: ${opts.subcommand}`);
|
|
124
|
+
console.log(HELP);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=baselines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baselines.js","sourceRoot":"","sources":["../../src/cli/baselines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { TaskSpec, AgentAdapter } from '../types.js';
|
|
1
|
+
import type { TaskSpec, AgentAdapter, ReviewHeuristics } from '../types.js';
|
|
2
|
+
import { type ConvoyStore } from './store.js';
|
|
2
3
|
import { type WorktreeManager } from './worktree.js';
|
|
3
4
|
import { type MergeQueue } from './merge.js';
|
|
4
|
-
import type { ConvoyStatus } from './types.js';
|
|
5
|
+
import type { TaskRecord, ConvoyStatus, GuardConfig, CircuitBreakerConfig } from './types.js';
|
|
5
6
|
export interface ConvoyEngineOptions {
|
|
6
7
|
spec: TaskSpec;
|
|
7
8
|
specYaml: string;
|
|
@@ -13,6 +14,10 @@ export interface ConvoyEngineOptions {
|
|
|
13
14
|
pipelineId?: string;
|
|
14
15
|
_worktreeManager?: WorktreeManager;
|
|
15
16
|
_mergeQueue?: MergeQueue;
|
|
17
|
+
/** Override for test injection. Pass `ensureBranch` for real behavior, or a mock. */
|
|
18
|
+
_ensureBranch?: (branchName: string, basePath: string) => Promise<void>;
|
|
19
|
+
/** Injectable for test injection of the review pipeline. */
|
|
20
|
+
_reviewRunner?: (task: TaskRecord, level: ReviewLevel, reviewerModel: string) => Promise<ReviewResult>;
|
|
16
21
|
}
|
|
17
22
|
export interface ConvoyResult {
|
|
18
23
|
convoyId: string;
|
|
@@ -38,6 +43,67 @@ export interface ConvoyResult {
|
|
|
38
43
|
export interface ConvoyEngine {
|
|
39
44
|
run(): Promise<ConvoyResult>;
|
|
40
45
|
resume(convoyId: string): Promise<ConvoyResult>;
|
|
46
|
+
retryFailed(convoyId: string, taskIds?: string[]): Promise<void>;
|
|
47
|
+
injectTask(convoyId: string, task: {
|
|
48
|
+
id: string;
|
|
49
|
+
prompt: string;
|
|
50
|
+
agent: string;
|
|
51
|
+
phase: number;
|
|
52
|
+
timeout_ms?: number;
|
|
53
|
+
depends_on?: string[];
|
|
54
|
+
files?: string[];
|
|
55
|
+
max_retries?: number;
|
|
56
|
+
provenance?: string;
|
|
57
|
+
idempotency_key?: string;
|
|
58
|
+
on_exhausted?: 'dlq' | 'skip' | 'stop';
|
|
59
|
+
}): TaskRecord;
|
|
41
60
|
}
|
|
61
|
+
export interface CircuitBreakerState {
|
|
62
|
+
status: 'closed' | 'open' | 'half-open';
|
|
63
|
+
failures: number;
|
|
64
|
+
last_failure_at: string | null;
|
|
65
|
+
opened_at: string | null;
|
|
66
|
+
}
|
|
67
|
+
export declare class CircuitBreakerManager {
|
|
68
|
+
private states;
|
|
69
|
+
private threshold;
|
|
70
|
+
private cooldownMs;
|
|
71
|
+
private fallbackAgent;
|
|
72
|
+
constructor(config?: CircuitBreakerConfig, initialState?: Record<string, CircuitBreakerState>);
|
|
73
|
+
getState(agent: string): CircuitBreakerState;
|
|
74
|
+
recordFailure(agent: string): {
|
|
75
|
+
tripped: boolean;
|
|
76
|
+
state: CircuitBreakerState;
|
|
77
|
+
};
|
|
78
|
+
recordSuccess(agent: string): CircuitBreakerState;
|
|
79
|
+
canAssign(agent: string): boolean;
|
|
80
|
+
get fallback(): string | null;
|
|
81
|
+
serialize(): string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Ensure the given branch exists and is checked out.
|
|
85
|
+
* Creates the branch from HEAD if it does not yet exist.
|
|
86
|
+
* Fails fast if there are uncommitted changes.
|
|
87
|
+
*/
|
|
88
|
+
export declare function ensureBranch(branchName: string, basePath: string): Promise<void>;
|
|
89
|
+
export declare function recoverNdjson(store: ConvoyStore, convoyId: string, ndjsonPath: string): void;
|
|
90
|
+
export interface ConvoyGuardResult {
|
|
91
|
+
passed: boolean;
|
|
92
|
+
warnings: string[];
|
|
93
|
+
}
|
|
94
|
+
export declare function runConvoyGuard(store: ConvoyStore, convoyId: string, _wtManager: WorktreeManager, ndjsonPath: string, guardConfig?: GuardConfig): ConvoyGuardResult;
|
|
95
|
+
export interface DiffStats {
|
|
96
|
+
linesChanged: number;
|
|
97
|
+
filesChanged: number;
|
|
98
|
+
filePaths: string[];
|
|
99
|
+
}
|
|
100
|
+
export type ReviewLevel = 'auto-pass' | 'fast' | 'panel';
|
|
101
|
+
export interface ReviewResult {
|
|
102
|
+
verdict: 'pass' | 'block';
|
|
103
|
+
feedback: string;
|
|
104
|
+
tokens: number;
|
|
105
|
+
model: string;
|
|
106
|
+
}
|
|
107
|
+
export declare function evaluateReviewLevel(task: TaskRecord, diff: DiffStats, heuristics?: ReviewHeuristics, allGatesPassed?: boolean): ReviewLevel;
|
|
42
108
|
export declare function createConvoyEngine(options: ConvoyEngineOptions): ConvoyEngine;
|
|
43
109
|
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/engine.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAQ,QAAQ,EAAE,YAAY,EAAiB,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAChG,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAG1F,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAGlF,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAoB,WAAW,EAAE,oBAAoB,EAAyC,MAAM,YAAY,CAAA;AAgBtJ,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,eAAe,CAAA;IAClC,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,qFAAqF;IACrF,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,4DAA4D;IAC5D,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;CACvG;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3F,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5F,IAAI,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;IAC5B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QACjC,EAAE,EAAE,MAAM,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;QACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;KACvC,GAAG,UAAU,CAAA;CACf;AAID,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,aAAa,CAAe;gBAExB,MAAM,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAY7F,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB;IAI5C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,mBAAmB,CAAA;KAAE;IA2B9E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB;IAgBjD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAmBjC,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,SAAS,IAAI,MAAM;CAGpB;AAID;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BtF;AAiBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA6D5F;AAID,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,WAAW,GACxB,iBAAiB,CAyEnB;AAID,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAA;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,UAAU,CAAC,EAAE,gBAAgB,EAC7B,cAAc,CAAC,EAAE,OAAO,GACvB,WAAW,CAsBb;AAopED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CA0b7E"}
|