opencastle 0.31.0 → 0.31.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.
Files changed (45) hide show
  1. package/README.md +3 -3
  2. package/bin/cli.mjs +4 -2
  3. package/dist/cli/convoy/spec-builder.d.ts +68 -0
  4. package/dist/cli/convoy/spec-builder.d.ts.map +1 -0
  5. package/dist/cli/convoy/spec-builder.js +179 -0
  6. package/dist/cli/convoy/spec-builder.js.map +1 -0
  7. package/dist/cli/convoy/spec-builder.test.d.ts +2 -0
  8. package/dist/cli/convoy/spec-builder.test.d.ts.map +1 -0
  9. package/dist/cli/convoy/spec-builder.test.js +453 -0
  10. package/dist/cli/convoy/spec-builder.test.js.map +1 -0
  11. package/dist/cli/pipeline.d.ts +1 -0
  12. package/dist/cli/pipeline.d.ts.map +1 -1
  13. package/dist/cli/pipeline.js +254 -185
  14. package/dist/cli/pipeline.js.map +1 -1
  15. package/dist/cli/pipeline.test.js +15 -1
  16. package/dist/cli/pipeline.test.js.map +1 -1
  17. package/dist/cli/plan.d.ts +1 -1
  18. package/dist/cli/plan.d.ts.map +1 -1
  19. package/dist/cli/plan.js +4 -4
  20. package/dist/cli/plan.js.map +1 -1
  21. package/dist/cli/prompt.js +2 -1
  22. package/dist/cli/prompt.js.map +1 -1
  23. package/dist/cli/run/adapters/claude.js +2 -2
  24. package/dist/cli/run/adapters/claude.js.map +1 -1
  25. package/dist/cli/run/adapters/copilot.js +2 -2
  26. package/dist/cli/run/adapters/copilot.js.map +1 -1
  27. package/dist/cli/run/adapters/cursor.js +1 -1
  28. package/dist/cli/run/adapters/cursor.js.map +1 -1
  29. package/dist/cli/run/adapters/opencode.js +1 -1
  30. package/dist/cli/run/adapters/opencode.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/cli/convoy/spec-builder.test.ts +523 -0
  33. package/src/cli/convoy/spec-builder.ts +221 -0
  34. package/src/cli/pipeline.test.ts +21 -1
  35. package/src/cli/pipeline.ts +274 -224
  36. package/src/cli/plan.ts +5 -4
  37. package/src/cli/prompt.ts +1 -1
  38. package/src/cli/run/adapters/claude.ts +2 -2
  39. package/src/cli/run/adapters/copilot.ts +2 -2
  40. package/src/cli/run/adapters/cursor.ts +1 -1
  41. package/src/cli/run/adapters/opencode.ts +1 -1
  42. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  43. package/src/orchestrator/prompts/fix-convoy.prompt.md +47 -56
  44. package/src/orchestrator/prompts/generate-convoy.prompt.md +85 -295
  45. package/src/orchestrator/prompts/validate-convoy.prompt.md +31 -42
package/README.md CHANGED
@@ -71,7 +71,7 @@ MCP servers are auto-configured for your stack in each IDE's native format.
71
71
  | `opencastle update` | Update framework files (keeps your customizations) |
72
72
  | `opencastle eject` | Remove the dependency, keep all files |
73
73
  | `opencastle destroy` | Remove ALL OpenCastle files (reverse of init) |
74
- | `opencastle pipeline` | Go from idea to convoy spec in one command (PRD → validate → convoy → validate → fix) |
74
+ | `opencastle start` | Go from idea to convoy spec in one command (PRD → validate → convoy → validate → fix) |
75
75
  | `opencastle plan` | Run a single prompt template step (generate PRD, convoy spec, or validate) |
76
76
  | `opencastle validate` | Validate a convoy YAML spec file without executing it |
77
77
  | `opencastle run` | Run the Convoy Engine (deterministic, crash-recoverable orchestrator) |
@@ -177,10 +177,10 @@ gates:
177
177
  Generate a validated convoy spec from a plain text description — no YAML by hand:
178
178
 
179
179
  ```bash
180
- npx opencastle pipeline --text "Add user reviews to the place detail page"
180
+ npx opencastle start --text "Add user reviews to the place detail page"
181
181
  ```
182
182
 
183
- The pipeline command runs 5 steps automatically: generate PRD → validate PRD → generate convoy spec → validate spec → auto-fix if needed. For lower-level control, use `opencastle plan` to run individual steps.
183
+ The start command runs 7 steps automatically: generate PRD → validate PRD → auto-fix PRD if needed → assess complexity → generate convoy spec → validate spec → auto-fix spec if needed. For lower-level control, use `opencastle plan` to run individual steps.
184
184
 
185
185
  📖 [Full Convoy Engine documentation →](https://www.opencastle.dev/docs/cli#run)
186
186
 
package/bin/cli.mjs CHANGED
@@ -25,7 +25,9 @@ const HELP = `
25
25
  doctor Validate your OpenCastle setup
26
26
 
27
27
  Convoy Commands:
28
- pipeline Run the full PRD → validate convoy validate → fix pipeline
28
+ start Run the full generate PRD → validate PRDauto-fix PRD
29
+ → assess complexity → generate convoy spec → validate spec
30
+ → auto-fix spec
29
31
  plan Generate a convoy spec (or PRD) from a task description
30
32
  validate Validate a convoy YAML spec file
31
33
  run Process a task queue from a spec file autonomously
@@ -64,7 +66,7 @@ const commands = {
64
66
  destroy: () => import('../dist/cli/destroy.js'),
65
67
  run: () => import('../dist/cli/run.js'),
66
68
  plan: () => import('../dist/cli/plan.js'),
67
- pipeline: () => import('../dist/cli/pipeline.js'),
69
+ start: () => import('../dist/cli/pipeline.js'),
68
70
  dashboard: () => import('../dist/cli/dashboard.js'),
69
71
  doctor: () => import('../dist/cli/doctor.js'),
70
72
  log: () => import('../dist/cli/log.js'),
@@ -0,0 +1,68 @@
1
+ /** The task plan generated by the LLM — just the creative decomposition, no YAML concerns */
2
+ export interface TaskPlanTask {
3
+ id: string;
4
+ agent?: string;
5
+ description?: string;
6
+ files?: string[];
7
+ depends_on?: string[];
8
+ timeout?: string;
9
+ max_retries?: number;
10
+ review?: string;
11
+ prompt: string;
12
+ gates?: string[];
13
+ built_in_gates?: Record<string, boolean | string>;
14
+ }
15
+ export interface TaskPlan {
16
+ name: string;
17
+ branch?: string;
18
+ concurrency?: number | 'auto';
19
+ on_failure?: 'continue' | 'stop';
20
+ tasks: TaskPlanTask[];
21
+ gates?: string[];
22
+ gate_retries?: number;
23
+ }
24
+ /** A patch to apply to a task plan — output of the fix-convoy prompt */
25
+ export interface TaskPatch {
26
+ task_id: string;
27
+ field: string;
28
+ value: unknown;
29
+ }
30
+ /** Advanced spec properties derived programmatically from complexity assessment */
31
+ export interface SpecEnrichment {
32
+ guard?: {
33
+ enabled: boolean;
34
+ };
35
+ circuit_breaker?: {
36
+ threshold: number;
37
+ cooldown_ms: number;
38
+ };
39
+ detect_drift?: boolean;
40
+ built_in_gates?: Record<string, boolean | string>;
41
+ max_concurrent_reviews?: number;
42
+ }
43
+ /**
44
+ * Derives advanced convoy spec properties from a complexity assessment.
45
+ * These are infrastructure concerns the LLM shouldn't generate — they're computed from signals.
46
+ */
47
+ export declare function deriveSpecEnrichment(complexity: {
48
+ complexity: 'low' | 'medium' | 'high';
49
+ total_tasks: number;
50
+ domains: string[];
51
+ }): SpecEnrichment;
52
+ /**
53
+ * Converts a TaskPlan into a valid convoy YAML string with a comment header.
54
+ */
55
+ export declare function buildConvoyYaml(plan: TaskPlan, enrichment?: SpecEnrichment): string;
56
+ /**
57
+ * Applies an array of patches to a task plan. Returns a new TaskPlan (immutable).
58
+ */
59
+ export declare function applyPatches(plan: TaskPlan, patches: TaskPatch[]): TaskPlan;
60
+ /**
61
+ * Parses a JSON string into a TaskPlan. Returns null if parsing fails or required fields are missing.
62
+ */
63
+ export declare function parseTaskPlan(jsonText: string): TaskPlan | null;
64
+ /**
65
+ * Parses a JSON string into a TaskPatch[]. Returns null if parsing fails.
66
+ */
67
+ export declare function parsePatches(jsonText: string): TaskPatch[] | null;
68
+ //# sourceMappingURL=spec-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-builder.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/spec-builder.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAA;IAChC,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wEAAwE;AACxE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf;AASD,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IAC5B,eAAe,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAA;IACjD,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE;IAC/C,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,GAAG,cAAc,CA2CjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,cAAc,GAAG,MAAM,CA0DnF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,QAAQ,CAc3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAa/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,IAAI,CAcjE"}
@@ -0,0 +1,179 @@
1
+ import { stringify } from 'yaml';
2
+ function toKebabCase(name) {
3
+ return name
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9]+/g, '-')
6
+ .replace(/^-+|-+$/g, '');
7
+ }
8
+ /**
9
+ * Derives advanced convoy spec properties from a complexity assessment.
10
+ * These are infrastructure concerns the LLM shouldn't generate — they're computed from signals.
11
+ */
12
+ export function deriveSpecEnrichment(complexity) {
13
+ const enrichment = {};
14
+ // Circuit breaker: higher complexity → lower threshold (trip faster)
15
+ if (complexity.complexity === 'high') {
16
+ enrichment.circuit_breaker = { threshold: 2, cooldown_ms: 300_000 };
17
+ }
18
+ else if (complexity.complexity === 'medium') {
19
+ enrichment.circuit_breaker = { threshold: 3, cooldown_ms: 300_000 };
20
+ }
21
+ // Drift detection for medium/high
22
+ if (complexity.complexity !== 'low') {
23
+ enrichment.detect_drift = true;
24
+ }
25
+ // Guard: enabled for medium/high
26
+ if (complexity.complexity !== 'low') {
27
+ enrichment.guard = { enabled: true };
28
+ }
29
+ // Built-in gates based on domains
30
+ const domains = new Set(complexity.domains.map(d => d.toLowerCase()));
31
+ const gates = {
32
+ secret_scan: true,
33
+ blast_radius: true,
34
+ };
35
+ if (domains.has('frontend') || domains.has('ui')) {
36
+ gates.browser_test = 'auto';
37
+ }
38
+ if (domains.has('testing') || complexity.total_tasks > 5) {
39
+ gates.regression_test = 'auto';
40
+ }
41
+ if (domains.has('database') || domains.has('api') || domains.has('backend')) {
42
+ gates.dependency_audit = 'auto';
43
+ }
44
+ enrichment.built_in_gates = gates;
45
+ // Review concurrency scales with task count
46
+ enrichment.max_concurrent_reviews = complexity.total_tasks > 6 ? 3 : 2;
47
+ return enrichment;
48
+ }
49
+ /**
50
+ * Converts a TaskPlan into a valid convoy YAML string with a comment header.
51
+ */
52
+ export function buildConvoyYaml(plan, enrichment) {
53
+ const tasks = plan.tasks.map((task) => {
54
+ const t = {};
55
+ t.id = task.id;
56
+ t.agent = task.agent ?? 'developer';
57
+ t.description = task.description ?? task.id;
58
+ if (task.timeout !== undefined)
59
+ t.timeout = task.timeout;
60
+ if (task.files && task.files.length > 0)
61
+ t.files = task.files;
62
+ if (task.depends_on && task.depends_on.length > 0)
63
+ t.depends_on = task.depends_on;
64
+ if (task.max_retries !== undefined)
65
+ t.max_retries = task.max_retries;
66
+ if (task.review !== undefined)
67
+ t.review = task.review;
68
+ if (task.gates !== undefined)
69
+ t.gates = task.gates;
70
+ if (task.built_in_gates !== undefined)
71
+ t.built_in_gates = task.built_in_gates;
72
+ // prompt last — keeps the long text at the end of each task block
73
+ t.prompt = task.prompt;
74
+ return t;
75
+ });
76
+ const spec = {
77
+ name: plan.name,
78
+ version: 1,
79
+ concurrency: plan.concurrency ?? 2,
80
+ on_failure: plan.on_failure ?? 'stop',
81
+ };
82
+ if (plan.branch !== undefined)
83
+ spec.branch = plan.branch;
84
+ const defaults = {
85
+ timeout: '30m',
86
+ max_retries: 1,
87
+ review: 'fast',
88
+ inject_lessons: true,
89
+ track_discovered_issues: true,
90
+ avoid_weak_agents: true,
91
+ };
92
+ if (enrichment?.circuit_breaker)
93
+ defaults.circuit_breaker = enrichment.circuit_breaker;
94
+ if (enrichment?.detect_drift)
95
+ defaults.detect_drift = enrichment.detect_drift;
96
+ if (enrichment?.built_in_gates)
97
+ defaults.built_in_gates = enrichment.built_in_gates;
98
+ if (enrichment?.max_concurrent_reviews)
99
+ defaults.max_concurrent_reviews = enrichment.max_concurrent_reviews;
100
+ spec.defaults = defaults;
101
+ // guard is spec-level (not inside defaults)
102
+ if (enrichment?.guard)
103
+ spec.guard = enrichment.guard;
104
+ spec.tasks = tasks;
105
+ if (plan.gates !== undefined)
106
+ spec.gates = plan.gates;
107
+ if (plan.gate_retries !== undefined)
108
+ spec.gate_retries = plan.gate_retries;
109
+ const header = `# .opencastle/convoys/${toKebabCase(plan.name)}.convoy.yml\n`;
110
+ const yaml = stringify(spec, {
111
+ lineWidth: 120,
112
+ defaultKeyType: 'PLAIN',
113
+ defaultStringType: 'PLAIN',
114
+ });
115
+ return header + yaml;
116
+ }
117
+ /**
118
+ * Applies an array of patches to a task plan. Returns a new TaskPlan (immutable).
119
+ */
120
+ export function applyPatches(plan, patches) {
121
+ const clone = structuredClone(plan);
122
+ for (const patch of patches) {
123
+ if (patch.task_id === '_plan') {
124
+ ;
125
+ clone[patch.field] = patch.value;
126
+ }
127
+ else {
128
+ const task = clone.tasks.find((t) => t.id === patch.task_id);
129
+ if (task) {
130
+ ;
131
+ task[patch.field] = patch.value;
132
+ }
133
+ // task not found: skip silently
134
+ }
135
+ }
136
+ return clone;
137
+ }
138
+ /**
139
+ * Parses a JSON string into a TaskPlan. Returns null if parsing fails or required fields are missing.
140
+ */
141
+ export function parseTaskPlan(jsonText) {
142
+ try {
143
+ const parsed = JSON.parse(jsonText.trim());
144
+ if (!parsed || typeof parsed.name !== 'string')
145
+ return null;
146
+ if (!Array.isArray(parsed.tasks) || parsed.tasks.length === 0)
147
+ return null;
148
+ for (const task of parsed.tasks) {
149
+ const t = task;
150
+ if (typeof t.id !== 'string' || typeof t.prompt !== 'string')
151
+ return null;
152
+ }
153
+ return parsed;
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * Parses a JSON string into a TaskPatch[]. Returns null if parsing fails.
161
+ */
162
+ export function parsePatches(jsonText) {
163
+ try {
164
+ const parsed = JSON.parse(jsonText.trim());
165
+ if (!Array.isArray(parsed))
166
+ return null;
167
+ for (const item of parsed) {
168
+ const p = item;
169
+ if (typeof p.task_id !== 'string' || typeof p.field !== 'string' || p.value === undefined) {
170
+ return null;
171
+ }
172
+ }
173
+ return parsed;
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ }
179
+ //# sourceMappingURL=spec-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-builder.js","sourceRoot":"","sources":["../../../src/cli/convoy/spec-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spec-builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-builder.test.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/spec-builder.test.ts"],"names":[],"mappings":""}