opencastle 0.1.0

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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/bin/cli.mjs +69 -0
  4. package/dist/cli/adapters/claude-code.d.ts +22 -0
  5. package/dist/cli/adapters/claude-code.d.ts.map +1 -0
  6. package/dist/cli/adapters/claude-code.js +237 -0
  7. package/dist/cli/adapters/claude-code.js.map +1 -0
  8. package/dist/cli/adapters/cursor.d.ts +20 -0
  9. package/dist/cli/adapters/cursor.d.ts.map +1 -0
  10. package/dist/cli/adapters/cursor.js +231 -0
  11. package/dist/cli/adapters/cursor.js.map +1 -0
  12. package/dist/cli/adapters/vscode.d.ts +20 -0
  13. package/dist/cli/adapters/vscode.d.ts.map +1 -0
  14. package/dist/cli/adapters/vscode.js +132 -0
  15. package/dist/cli/adapters/vscode.js.map +1 -0
  16. package/dist/cli/copy.d.ts +14 -0
  17. package/dist/cli/copy.d.ts.map +1 -0
  18. package/dist/cli/copy.js +62 -0
  19. package/dist/cli/copy.js.map +1 -0
  20. package/dist/cli/dashboard.d.ts +3 -0
  21. package/dist/cli/dashboard.d.ts.map +1 -0
  22. package/dist/cli/dashboard.js +183 -0
  23. package/dist/cli/dashboard.js.map +1 -0
  24. package/dist/cli/diff.d.ts +3 -0
  25. package/dist/cli/diff.d.ts.map +1 -0
  26. package/dist/cli/diff.js +27 -0
  27. package/dist/cli/diff.js.map +1 -0
  28. package/dist/cli/eject.d.ts +3 -0
  29. package/dist/cli/eject.d.ts.map +1 -0
  30. package/dist/cli/eject.js +27 -0
  31. package/dist/cli/eject.js.map +1 -0
  32. package/dist/cli/init.d.ts +3 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +92 -0
  35. package/dist/cli/init.js.map +1 -0
  36. package/dist/cli/manifest.d.ts +14 -0
  37. package/dist/cli/manifest.d.ts.map +1 -0
  38. package/dist/cli/manifest.js +34 -0
  39. package/dist/cli/manifest.js.map +1 -0
  40. package/dist/cli/mcp.d.ts +14 -0
  41. package/dist/cli/mcp.d.ts.map +1 -0
  42. package/dist/cli/mcp.js +35 -0
  43. package/dist/cli/mcp.js.map +1 -0
  44. package/dist/cli/prompt.d.ts +12 -0
  45. package/dist/cli/prompt.d.ts.map +1 -0
  46. package/dist/cli/prompt.js +104 -0
  47. package/dist/cli/prompt.js.map +1 -0
  48. package/dist/cli/run/adapters/claude-code.d.ts +16 -0
  49. package/dist/cli/run/adapters/claude-code.d.ts.map +1 -0
  50. package/dist/cli/run/adapters/claude-code.js +82 -0
  51. package/dist/cli/run/adapters/claude-code.js.map +1 -0
  52. package/dist/cli/run/adapters/copilot.d.ts +16 -0
  53. package/dist/cli/run/adapters/copilot.d.ts.map +1 -0
  54. package/dist/cli/run/adapters/copilot.js +84 -0
  55. package/dist/cli/run/adapters/copilot.js.map +1 -0
  56. package/dist/cli/run/adapters/cursor.d.ts +16 -0
  57. package/dist/cli/run/adapters/cursor.d.ts.map +1 -0
  58. package/dist/cli/run/adapters/cursor.js +81 -0
  59. package/dist/cli/run/adapters/cursor.js.map +1 -0
  60. package/dist/cli/run/adapters/index.d.ts +14 -0
  61. package/dist/cli/run/adapters/index.d.ts.map +1 -0
  62. package/dist/cli/run/adapters/index.js +35 -0
  63. package/dist/cli/run/adapters/index.js.map +1 -0
  64. package/dist/cli/run/executor.d.ts +15 -0
  65. package/dist/cli/run/executor.d.ts.map +1 -0
  66. package/dist/cli/run/executor.js +249 -0
  67. package/dist/cli/run/executor.js.map +1 -0
  68. package/dist/cli/run/reporter.d.ts +10 -0
  69. package/dist/cli/run/reporter.d.ts.map +1 -0
  70. package/dist/cli/run/reporter.js +112 -0
  71. package/dist/cli/run/reporter.js.map +1 -0
  72. package/dist/cli/run/schema.d.ts +28 -0
  73. package/dist/cli/run/schema.d.ts.map +1 -0
  74. package/dist/cli/run/schema.js +511 -0
  75. package/dist/cli/run/schema.js.map +1 -0
  76. package/dist/cli/run.d.ts +6 -0
  77. package/dist/cli/run.d.ts.map +1 -0
  78. package/dist/cli/run.js +123 -0
  79. package/dist/cli/run.js.map +1 -0
  80. package/dist/cli/stack-config.d.ts +12 -0
  81. package/dist/cli/stack-config.d.ts.map +1 -0
  82. package/dist/cli/stack-config.js +146 -0
  83. package/dist/cli/stack-config.js.map +1 -0
  84. package/dist/cli/types.d.ts +169 -0
  85. package/dist/cli/types.d.ts.map +1 -0
  86. package/dist/cli/types.js +2 -0
  87. package/dist/cli/types.js.map +1 -0
  88. package/dist/cli/update.d.ts +3 -0
  89. package/dist/cli/update.d.ts.map +1 -0
  90. package/dist/cli/update.js +50 -0
  91. package/dist/cli/update.js.map +1 -0
  92. package/package.json +48 -0
  93. package/src/cli/adapters/claude-code.ts +287 -0
  94. package/src/cli/adapters/cursor.ts +377 -0
  95. package/src/cli/adapters/vscode.ts +168 -0
  96. package/src/cli/copy.ts +79 -0
  97. package/src/cli/dashboard.ts +225 -0
  98. package/src/cli/diff.ts +44 -0
  99. package/src/cli/eject.ts +39 -0
  100. package/src/cli/init.ts +120 -0
  101. package/src/cli/manifest.ts +45 -0
  102. package/src/cli/mcp.ts +49 -0
  103. package/src/cli/prompt.ts +115 -0
  104. package/src/cli/run/adapters/claude-code.ts +95 -0
  105. package/src/cli/run/adapters/copilot.ts +97 -0
  106. package/src/cli/run/adapters/cursor.ts +94 -0
  107. package/src/cli/run/adapters/index.ts +40 -0
  108. package/src/cli/run/executor.ts +292 -0
  109. package/src/cli/run/reporter.ts +129 -0
  110. package/src/cli/run/schema.ts +595 -0
  111. package/src/cli/run.ts +137 -0
  112. package/src/cli/stack-config.ts +180 -0
  113. package/src/cli/types.ts +207 -0
  114. package/src/cli/update.ts +75 -0
  115. package/src/dashboard/astro.config.mjs +6 -0
  116. package/src/dashboard/package-lock.json +5455 -0
  117. package/src/dashboard/package.json +14 -0
  118. package/src/dashboard/public/data/delegations.ndjson +35 -0
  119. package/src/dashboard/public/data/panels.ndjson +13 -0
  120. package/src/dashboard/public/data/sessions.ndjson +50 -0
  121. package/src/dashboard/public/icon-192.png +0 -0
  122. package/src/dashboard/scripts/generate-seed-data.ts +355 -0
  123. package/src/dashboard/src/layouts/Layout.astro +25 -0
  124. package/src/dashboard/src/pages/index.astro +1070 -0
  125. package/src/dashboard/src/styles/dashboard.css +1078 -0
  126. package/src/dashboard/tsconfig.json +6 -0
  127. package/src/orchestrator/agent-workflows/README.md +22 -0
  128. package/src/orchestrator/agent-workflows/bug-fix.md +128 -0
  129. package/src/orchestrator/agent-workflows/data-pipeline.md +145 -0
  130. package/src/orchestrator/agent-workflows/database-migration.md +159 -0
  131. package/src/orchestrator/agent-workflows/feature-implementation.md +223 -0
  132. package/src/orchestrator/agent-workflows/performance-optimization.md +125 -0
  133. package/src/orchestrator/agent-workflows/refactoring.md +142 -0
  134. package/src/orchestrator/agent-workflows/schema-changes.md +164 -0
  135. package/src/orchestrator/agent-workflows/security-audit.md +148 -0
  136. package/src/orchestrator/agent-workflows/shared-delivery-phase.md +33 -0
  137. package/src/orchestrator/agents/api-designer.agent.md +68 -0
  138. package/src/orchestrator/agents/architect.agent.md +129 -0
  139. package/src/orchestrator/agents/content-engineer.agent.md +57 -0
  140. package/src/orchestrator/agents/copywriter.agent.md +95 -0
  141. package/src/orchestrator/agents/data-expert.agent.md +63 -0
  142. package/src/orchestrator/agents/database-engineer.agent.md +62 -0
  143. package/src/orchestrator/agents/developer.agent.md +66 -0
  144. package/src/orchestrator/agents/devops-expert.agent.md +57 -0
  145. package/src/orchestrator/agents/documentation-writer.agent.md +60 -0
  146. package/src/orchestrator/agents/performance-expert.agent.md +58 -0
  147. package/src/orchestrator/agents/release-manager.agent.md +72 -0
  148. package/src/orchestrator/agents/researcher.agent.md +145 -0
  149. package/src/orchestrator/agents/reviewer.agent.md +62 -0
  150. package/src/orchestrator/agents/security-expert.agent.md +64 -0
  151. package/src/orchestrator/agents/seo-specialist.agent.md +67 -0
  152. package/src/orchestrator/agents/team-lead.agent.md +644 -0
  153. package/src/orchestrator/agents/testing-expert.agent.md +85 -0
  154. package/src/orchestrator/agents/ui-ux-expert.agent.md +63 -0
  155. package/src/orchestrator/copilot-instructions.md +3 -0
  156. package/src/orchestrator/customizations/AGENT-EXPERTISE.md +325 -0
  157. package/src/orchestrator/customizations/AGENT-FAILURES.md +69 -0
  158. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +58 -0
  159. package/src/orchestrator/customizations/DISPUTES.md +162 -0
  160. package/src/orchestrator/customizations/KNOWLEDGE-GRAPH.md +10 -0
  161. package/src/orchestrator/customizations/LESSONS-LEARNED.md +70 -0
  162. package/src/orchestrator/customizations/README.md +59 -0
  163. package/src/orchestrator/customizations/agents/agent-registry.md +46 -0
  164. package/src/orchestrator/customizations/agents/skill-matrix.md +142 -0
  165. package/src/orchestrator/customizations/logs/README.md +181 -0
  166. package/src/orchestrator/customizations/logs/delegations.ndjson +1 -0
  167. package/src/orchestrator/customizations/logs/panels.ndjson +1 -0
  168. package/src/orchestrator/customizations/logs/sessions.ndjson +1 -0
  169. package/src/orchestrator/customizations/project/docs-structure.md +23 -0
  170. package/src/orchestrator/customizations/project/tracker-config.md +45 -0
  171. package/src/orchestrator/customizations/project.instructions.md +64 -0
  172. package/src/orchestrator/customizations/stack/api-config.md +37 -0
  173. package/src/orchestrator/customizations/stack/cms-config.md +26 -0
  174. package/src/orchestrator/customizations/stack/data-pipeline-config.md +41 -0
  175. package/src/orchestrator/customizations/stack/database-config.md +44 -0
  176. package/src/orchestrator/customizations/stack/deployment-config.md +45 -0
  177. package/src/orchestrator/customizations/stack/testing-config.md +56 -0
  178. package/src/orchestrator/instructions/ai-optimization.instructions.md +143 -0
  179. package/src/orchestrator/instructions/general.instructions.md +194 -0
  180. package/src/orchestrator/mcp.json +55 -0
  181. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +235 -0
  182. package/src/orchestrator/prompts/brainstorm.prompt.md +115 -0
  183. package/src/orchestrator/prompts/bug-fix.prompt.md +141 -0
  184. package/src/orchestrator/prompts/create-skill.prompt.md +103 -0
  185. package/src/orchestrator/prompts/generate-task-spec.prompt.md +154 -0
  186. package/src/orchestrator/prompts/implement-feature.prompt.md +124 -0
  187. package/src/orchestrator/prompts/metrics-report.prompt.md +142 -0
  188. package/src/orchestrator/prompts/quick-refinement.prompt.md +137 -0
  189. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +100 -0
  190. package/src/orchestrator/skills/accessibility-standards/SKILL.md +164 -0
  191. package/src/orchestrator/skills/agent-hooks/SKILL.md +147 -0
  192. package/src/orchestrator/skills/agent-memory/SKILL.md +144 -0
  193. package/src/orchestrator/skills/api-patterns/SKILL.md +106 -0
  194. package/src/orchestrator/skills/browser-testing/SKILL.md +203 -0
  195. package/src/orchestrator/skills/code-commenting/SKILL.md +133 -0
  196. package/src/orchestrator/skills/contentful-cms/SKILL.md +43 -0
  197. package/src/orchestrator/skills/context-map/SKILL.md +135 -0
  198. package/src/orchestrator/skills/convex-database/SKILL.md +80 -0
  199. package/src/orchestrator/skills/data-engineering/SKILL.md +99 -0
  200. package/src/orchestrator/skills/deployment-infrastructure/SKILL.md +49 -0
  201. package/src/orchestrator/skills/documentation-standards/SKILL.md +85 -0
  202. package/src/orchestrator/skills/fast-review/SKILL.md +327 -0
  203. package/src/orchestrator/skills/frontend-design/SKILL.md +42 -0
  204. package/src/orchestrator/skills/jira-management/SKILL.md +168 -0
  205. package/src/orchestrator/skills/memory-merger/SKILL.md +123 -0
  206. package/src/orchestrator/skills/nextjs-patterns/SKILL.md +75 -0
  207. package/src/orchestrator/skills/nx-workspace/SKILL.md +192 -0
  208. package/src/orchestrator/skills/panel-majority-vote/SKILL.md +184 -0
  209. package/src/orchestrator/skills/panel-majority-vote/panel-report.template.md +38 -0
  210. package/src/orchestrator/skills/performance-optimization/SKILL.md +101 -0
  211. package/src/orchestrator/skills/react-development/SKILL.md +117 -0
  212. package/src/orchestrator/skills/sanity-cms/SKILL.md +18 -0
  213. package/src/orchestrator/skills/security-hardening/SKILL.md +118 -0
  214. package/src/orchestrator/skills/self-improvement/SKILL.md +137 -0
  215. package/src/orchestrator/skills/seo-patterns/SKILL.md +40 -0
  216. package/src/orchestrator/skills/session-checkpoints/SKILL.md +205 -0
  217. package/src/orchestrator/skills/slack-notifications/SKILL.md +211 -0
  218. package/src/orchestrator/skills/strapi-cms/SKILL.md +43 -0
  219. package/src/orchestrator/skills/supabase-database/SKILL.md +24 -0
  220. package/src/orchestrator/skills/task-management/SKILL.md +143 -0
  221. package/src/orchestrator/skills/team-lead-reference/SKILL.md +317 -0
  222. package/src/orchestrator/skills/teams-notifications/SKILL.md +249 -0
  223. package/src/orchestrator/skills/testing-workflow/SKILL.md +134 -0
  224. package/src/orchestrator/skills/validation-gates/SKILL.md +100 -0
@@ -0,0 +1,511 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ /**
3
+ * Minimal YAML parser for task spec files.
4
+ * Handles: key-value, lists, nested objects, block scalars (|), comments, quoted strings.
5
+ * Does NOT handle: anchors, aliases, flow mappings, merge keys, tags.
6
+ */
7
+ /**
8
+ * Parse a YAML string into a JS object.
9
+ */
10
+ export function parseYaml(text) {
11
+ const lines = text.split('\n');
12
+ return parseBlock(lines, 0, -1).value;
13
+ }
14
+ /**
15
+ * Remove inline comments and trim trailing whitespace.
16
+ * Respects quoted strings — won't strip # inside quotes.
17
+ */
18
+ function stripInlineComment(line) {
19
+ let inSingle = false;
20
+ let inDouble = false;
21
+ for (let i = 0; i < line.length; i++) {
22
+ const ch = line[i];
23
+ if (ch === "'" && !inDouble)
24
+ inSingle = !inSingle;
25
+ else if (ch === '"' && !inSingle)
26
+ inDouble = !inDouble;
27
+ else if (ch === '#' && !inSingle && !inDouble) {
28
+ // Must be preceded by whitespace (or be at start)
29
+ if (i === 0 || /\s/.test(line[i - 1])) {
30
+ return line.slice(0, i).trimEnd();
31
+ }
32
+ }
33
+ }
34
+ return line.trimEnd();
35
+ }
36
+ /**
37
+ * Measure indent level (number of leading spaces).
38
+ */
39
+ function indentOf(line) {
40
+ const m = line.match(/^( *)/);
41
+ return m ? m[1].length : 0;
42
+ }
43
+ /**
44
+ * Unquote a string value (strip surrounding quotes).
45
+ */
46
+ function unquote(val) {
47
+ if ((val.startsWith('"') && val.endsWith('"')) ||
48
+ (val.startsWith("'") && val.endsWith("'"))) {
49
+ return val.slice(1, -1);
50
+ }
51
+ return val;
52
+ }
53
+ /**
54
+ * Cast a scalar value to its JS type.
55
+ */
56
+ function castScalar(raw) {
57
+ const val = raw.trim();
58
+ if (val === '' || val === '~' || val === 'null')
59
+ return null;
60
+ if (val === 'true')
61
+ return true;
62
+ if (val === 'false')
63
+ return false;
64
+ if (/^-?\d+$/.test(val))
65
+ return parseInt(val, 10);
66
+ if (/^-?\d+\.\d+$/.test(val))
67
+ return parseFloat(val);
68
+ return unquote(val);
69
+ }
70
+ /**
71
+ * Parse a block of YAML lines starting at `startIdx` with minimum indent `parentIndent`.
72
+ * Returns { value, nextIndex }.
73
+ */
74
+ function parseBlock(lines, startIdx, parentIndent) {
75
+ let i = startIdx;
76
+ // Skip blank / comment-only lines
77
+ while (i < lines.length) {
78
+ const stripped = lines[i].trimStart();
79
+ if (stripped === '' || stripped.startsWith('#')) {
80
+ i++;
81
+ continue;
82
+ }
83
+ break;
84
+ }
85
+ if (i >= lines.length)
86
+ return { value: null, nextIndex: i };
87
+ const firstLine = stripInlineComment(lines[i]);
88
+ const firstIndent = indentOf(firstLine);
89
+ if (firstIndent <= parentIndent)
90
+ return { value: null, nextIndex: i };
91
+ const trimmedFirst = firstLine.trimStart();
92
+ // Detect whether this block is a list or a mapping
93
+ if (trimmedFirst.startsWith('- ') || trimmedFirst === '-') {
94
+ return parseList(lines, i, firstIndent);
95
+ }
96
+ return parseMapping(lines, i, firstIndent);
97
+ }
98
+ /**
99
+ * Parse a YAML list block.
100
+ */
101
+ function parseList(lines, startIdx, blockIndent) {
102
+ const result = [];
103
+ let i = startIdx;
104
+ while (i < lines.length) {
105
+ // Skip blanks / comments
106
+ const raw = lines[i];
107
+ const stripped = raw.trimStart();
108
+ if (stripped === '' || stripped.startsWith('#')) {
109
+ i++;
110
+ continue;
111
+ }
112
+ const indent = indentOf(raw);
113
+ if (indent < blockIndent)
114
+ break;
115
+ if (indent > blockIndent)
116
+ break; // Shouldn't happen at list level
117
+ const line = stripInlineComment(raw);
118
+ const trimmed = line.trimStart();
119
+ if (!trimmed.startsWith('- ') && trimmed !== '-')
120
+ break;
121
+ // Content after "- "
122
+ const after = trimmed === '-' ? '' : trimmed.slice(2).trim();
123
+ i++;
124
+ if (after === '' || after.endsWith(':')) {
125
+ // List item is a nested mapping or empty
126
+ // Check if the next non-empty lines at deeper indent form an object
127
+ // If after ends with ':', it's the first key in a mapping
128
+ const obj = {};
129
+ if (after.endsWith(':')) {
130
+ const key = after.slice(0, -1).trim();
131
+ // Value on next lines or empty
132
+ const nested = parseValueAfterColon('', lines, i, blockIndent + 2);
133
+ obj[key] = nested.value;
134
+ i = nested.nextIndex;
135
+ }
136
+ // Collect remaining keys at the deeper indent
137
+ const sub = parseItemBody(lines, i, blockIndent + 2);
138
+ Object.assign(obj, sub.value || {});
139
+ i = sub.nextIndex;
140
+ result.push(Object.keys(obj).length > 0 ? obj : null);
141
+ }
142
+ else if (after.includes(': ') || after.endsWith(':')) {
143
+ // Inline mapping start: "- key: value"
144
+ const colonIdx = after.indexOf(':');
145
+ const key = after.slice(0, colonIdx).trim();
146
+ const rest = after.slice(colonIdx + 1).trim();
147
+ const obj = {};
148
+ if (rest === '' || rest === '|') {
149
+ const nested = parseValueAfterColon(rest, lines, i, blockIndent + 2);
150
+ obj[key] = nested.value;
151
+ i = nested.nextIndex;
152
+ }
153
+ else {
154
+ obj[key] = castScalar(rest);
155
+ }
156
+ // Collect remaining keys at deeper indent
157
+ const sub = parseItemBody(lines, i, blockIndent + 2);
158
+ Object.assign(obj, sub.value || {});
159
+ i = sub.nextIndex;
160
+ result.push(obj);
161
+ }
162
+ else if (after.startsWith('[') && after.endsWith(']')) {
163
+ // Inline flow sequence
164
+ result.push(parseFlowSequence(after));
165
+ }
166
+ else {
167
+ // Simple scalar list item
168
+ result.push(castScalar(after));
169
+ }
170
+ }
171
+ return { value: result, nextIndex: i };
172
+ }
173
+ /**
174
+ * Parse the body (remaining keys) of a list item at a given indent.
175
+ */
176
+ function parseItemBody(lines, startIdx, minIndent) {
177
+ let i = startIdx;
178
+ const obj = {};
179
+ while (i < lines.length) {
180
+ const raw = lines[i];
181
+ const stripped = raw.trimStart();
182
+ if (stripped === '' || stripped.startsWith('#')) {
183
+ i++;
184
+ continue;
185
+ }
186
+ const indent = indentOf(raw);
187
+ if (indent < minIndent)
188
+ break;
189
+ const line = stripInlineComment(raw);
190
+ const trimmed = line.trimStart();
191
+ // If this is a list item at this indent, it belongs to a parent list
192
+ if (trimmed.startsWith('- '))
193
+ break;
194
+ const colonIdx = trimmed.indexOf(':');
195
+ if (colonIdx === -1) {
196
+ i++;
197
+ continue;
198
+ }
199
+ const key = trimmed.slice(0, colonIdx).trim();
200
+ const rest = trimmed.slice(colonIdx + 1).trim();
201
+ i++;
202
+ const nested = parseValueAfterColon(rest, lines, i, indent);
203
+ obj[key] = nested.value;
204
+ i = nested.nextIndex;
205
+ }
206
+ return { value: Object.keys(obj).length > 0 ? obj : null, nextIndex: i };
207
+ }
208
+ /**
209
+ * Parse a YAML mapping block.
210
+ */
211
+ function parseMapping(lines, startIdx, blockIndent) {
212
+ const result = {};
213
+ let i = startIdx;
214
+ while (i < lines.length) {
215
+ const raw = lines[i];
216
+ const stripped = raw.trimStart();
217
+ if (stripped === '' || stripped.startsWith('#')) {
218
+ i++;
219
+ continue;
220
+ }
221
+ const indent = indentOf(raw);
222
+ if (indent < blockIndent)
223
+ break;
224
+ if (indent > blockIndent) {
225
+ i++;
226
+ continue;
227
+ }
228
+ const line = stripInlineComment(raw);
229
+ const trimmed = line.trimStart();
230
+ const colonIdx = trimmed.indexOf(':');
231
+ if (colonIdx === -1) {
232
+ i++;
233
+ continue;
234
+ }
235
+ const key = trimmed.slice(0, colonIdx).trim();
236
+ const rest = trimmed.slice(colonIdx + 1).trim();
237
+ i++;
238
+ const nested = parseValueAfterColon(rest, lines, i, blockIndent);
239
+ result[key] = nested.value;
240
+ i = nested.nextIndex;
241
+ }
242
+ return { value: result, nextIndex: i };
243
+ }
244
+ /**
245
+ * Parse the value after a colon — could be inline scalar, block scalar (|),
246
+ * nested mapping, or nested list.
247
+ */
248
+ function parseValueAfterColon(rest, lines, nextIdx, parentIndent) {
249
+ // Block scalar
250
+ if (rest === '|') {
251
+ return parseBlockScalar(lines, nextIdx, parentIndent);
252
+ }
253
+ // Flow sequence [a, b, c]
254
+ if (rest.startsWith('[') && rest.endsWith(']')) {
255
+ return { value: parseFlowSequence(rest), nextIndex: nextIdx };
256
+ }
257
+ // Inline scalar value present
258
+ if (rest !== '') {
259
+ return { value: castScalar(rest), nextIndex: nextIdx };
260
+ }
261
+ // Empty after colon — check for nested block
262
+ const nested = parseBlock(lines, nextIdx, parentIndent);
263
+ if (nested.value !== null) {
264
+ return nested;
265
+ }
266
+ return { value: null, nextIndex: nextIdx };
267
+ }
268
+ /**
269
+ * Parse a block scalar (| indicator).
270
+ * Collects all lines with indent greater than the parent.
271
+ */
272
+ function parseBlockScalar(lines, startIdx, parentIndent) {
273
+ let i = startIdx;
274
+ const collected = [];
275
+ let blockIndent = -1;
276
+ while (i < lines.length) {
277
+ const raw = lines[i];
278
+ // Blank line inside block scalar — preserve it
279
+ if (raw.trim() === '') {
280
+ collected.push('');
281
+ i++;
282
+ continue;
283
+ }
284
+ const indent = indentOf(raw);
285
+ if (blockIndent === -1) {
286
+ // First content line determines the block indent
287
+ if (indent <= parentIndent)
288
+ break;
289
+ blockIndent = indent;
290
+ }
291
+ if (indent < blockIndent)
292
+ break;
293
+ collected.push(raw.slice(blockIndent));
294
+ i++;
295
+ }
296
+ // Remove trailing blank lines
297
+ while (collected.length > 0 && collected[collected.length - 1] === '') {
298
+ collected.pop();
299
+ }
300
+ return { value: collected.join('\n') + '\n', nextIndex: i };
301
+ }
302
+ /**
303
+ * Parse a flow sequence: [item1, item2, item3]
304
+ */
305
+ function parseFlowSequence(text) {
306
+ const inner = text.slice(1, -1).trim();
307
+ if (inner === '')
308
+ return [];
309
+ return inner.split(',').map((s) => castScalar(s.trim()));
310
+ }
311
+ // ── Schema validation ──────────────────────────────────────────────
312
+ const VALID_ON_FAILURE = ['continue', 'stop'];
313
+ const TIMEOUT_RE = /^(\d+)(s|m|h)$/;
314
+ /**
315
+ * Parse a timeout string into milliseconds.
316
+ */
317
+ export function parseTimeout(timeout) {
318
+ const m = String(timeout).match(TIMEOUT_RE);
319
+ if (!m)
320
+ return NaN;
321
+ const num = parseInt(m[1], 10);
322
+ const unit = m[2];
323
+ if (unit === 's')
324
+ return num * 1000;
325
+ if (unit === 'm')
326
+ return num * 60 * 1000;
327
+ if (unit === 'h')
328
+ return num * 60 * 60 * 1000;
329
+ return NaN;
330
+ }
331
+ /**
332
+ * Validate a parsed spec object.
333
+ */
334
+ export function validateSpec(spec) {
335
+ const errors = [];
336
+ if (!spec || typeof spec !== 'object') {
337
+ return { valid: false, errors: ['Spec must be a YAML object'] };
338
+ }
339
+ const s = spec;
340
+ // Name
341
+ if (!s.name || typeof s.name !== 'string') {
342
+ errors.push('`name` is required and must be a string');
343
+ }
344
+ // Concurrency
345
+ if (s.concurrency !== undefined) {
346
+ const c = Number(s.concurrency);
347
+ if (!Number.isInteger(c) || c < 1) {
348
+ errors.push('`concurrency` must be an integer >= 1');
349
+ }
350
+ }
351
+ // on_failure
352
+ if (s.on_failure !== undefined) {
353
+ if (!VALID_ON_FAILURE.includes(s.on_failure)) {
354
+ errors.push(`\`on_failure\` must be one of: ${VALID_ON_FAILURE.join(', ')}`);
355
+ }
356
+ }
357
+ // adapter
358
+ if (s.adapter !== undefined && typeof s.adapter !== 'string') {
359
+ errors.push('`adapter` must be a string');
360
+ }
361
+ // Tasks
362
+ if (!s.tasks || !Array.isArray(s.tasks) || s.tasks.length === 0) {
363
+ errors.push('`tasks` is required and must be a non-empty array');
364
+ return { valid: false, errors };
365
+ }
366
+ const taskIds = new Set();
367
+ const tasks = s.tasks;
368
+ for (let i = 0; i < tasks.length; i++) {
369
+ const task = tasks[i];
370
+ const prefix = `tasks[${i}]`;
371
+ if (!task || typeof task !== 'object') {
372
+ errors.push(`${prefix}: must be an object`);
373
+ continue;
374
+ }
375
+ // id
376
+ if (!task.id || typeof task.id !== 'string') {
377
+ errors.push(`${prefix}: \`id\` is required and must be a string`);
378
+ }
379
+ else if (taskIds.has(task.id)) {
380
+ errors.push(`${prefix}: duplicate task id "${task.id}"`);
381
+ }
382
+ else {
383
+ taskIds.add(task.id);
384
+ }
385
+ // prompt
386
+ if (!task.prompt || typeof task.prompt !== 'string') {
387
+ errors.push(`${prefix}: \`prompt\` is required and must be a string`);
388
+ }
389
+ // timeout
390
+ if (task.timeout !== undefined) {
391
+ if (isNaN(parseTimeout(task.timeout))) {
392
+ errors.push(`${prefix}: \`timeout\` must be in format: <number><s|m|h> (e.g. "10m")`);
393
+ }
394
+ }
395
+ // depends_on
396
+ if (task.depends_on !== undefined) {
397
+ if (!Array.isArray(task.depends_on)) {
398
+ errors.push(`${prefix}: \`depends_on\` must be an array`);
399
+ }
400
+ else {
401
+ for (const dep of task.depends_on) {
402
+ if (!taskIds.has(dep) && !tasks.some((t) => t && t.id === dep)) {
403
+ errors.push(`${prefix}: \`depends_on\` references unknown task "${dep}"`);
404
+ }
405
+ }
406
+ }
407
+ }
408
+ // files
409
+ if (task.files !== undefined && !Array.isArray(task.files)) {
410
+ errors.push(`${prefix}: \`files\` must be an array`);
411
+ }
412
+ }
413
+ // DAG cycle detection
414
+ if (errors.length === 0) {
415
+ const cycleErr = detectCycles(tasks);
416
+ if (cycleErr)
417
+ errors.push(cycleErr);
418
+ }
419
+ return { valid: errors.length === 0, errors };
420
+ }
421
+ /**
422
+ * Detect cycles in the task dependency graph using DFS.
423
+ */
424
+ function detectCycles(tasks) {
425
+ const adj = new Map();
426
+ for (const t of tasks) {
427
+ adj.set(t.id, t.depends_on || []);
428
+ }
429
+ const WHITE = 0, GRAY = 1, BLACK = 2;
430
+ const color = new Map();
431
+ for (const id of adj.keys())
432
+ color.set(id, WHITE);
433
+ function dfs(node, path) {
434
+ color.set(node, GRAY);
435
+ path.push(node);
436
+ for (const dep of adj.get(node) || []) {
437
+ if (color.get(dep) === GRAY) {
438
+ const cycleStart = path.indexOf(dep);
439
+ return [...path.slice(cycleStart), dep];
440
+ }
441
+ if (color.get(dep) === WHITE) {
442
+ const result = dfs(dep, path);
443
+ if (result)
444
+ return result;
445
+ }
446
+ }
447
+ color.set(node, BLACK);
448
+ path.pop();
449
+ return null;
450
+ }
451
+ for (const id of adj.keys()) {
452
+ if (color.get(id) === WHITE) {
453
+ const cycle = dfs(id, []);
454
+ if (cycle) {
455
+ return `Circular dependency detected: ${cycle.join(' → ')}`;
456
+ }
457
+ }
458
+ }
459
+ return null;
460
+ }
461
+ /**
462
+ * Apply default values to a parsed spec.
463
+ */
464
+ export function applyDefaults(spec) {
465
+ const s = spec;
466
+ s.concurrency = s.concurrency !== undefined ? Number(s.concurrency) : 1;
467
+ s.on_failure = s.on_failure || 'continue';
468
+ s.adapter = s.adapter || 'claude-code';
469
+ const tasks = s.tasks;
470
+ for (const task of tasks) {
471
+ task.agent = task.agent || 'developer';
472
+ task.timeout = task.timeout || '30m';
473
+ task.depends_on = task.depends_on || [];
474
+ task.files = task.files || [];
475
+ task.description = task.description || task.id;
476
+ }
477
+ return s;
478
+ }
479
+ /**
480
+ * Read, parse, validate, and return a typed task spec from a YAML file.
481
+ * @throws If file cannot be read, parsed, or spec is invalid
482
+ */
483
+ export async function parseTaskSpec(filePath) {
484
+ let text;
485
+ try {
486
+ text = await readFile(filePath, 'utf8');
487
+ }
488
+ catch (err) {
489
+ const e = err;
490
+ if (e.code === 'ENOENT') {
491
+ throw new Error(`Task spec file not found: ${filePath}`);
492
+ }
493
+ throw new Error(`Cannot read task spec file: ${e.message}`);
494
+ }
495
+ if (!text.trim()) {
496
+ throw new Error('Task spec file is empty');
497
+ }
498
+ let spec;
499
+ try {
500
+ spec = parseYaml(text);
501
+ }
502
+ catch (err) {
503
+ throw new Error(`YAML parse error: ${err.message}`);
504
+ }
505
+ const { valid, errors } = validateSpec(spec);
506
+ if (!valid) {
507
+ throw new Error(`Invalid task spec:\n • ${errors.join('\n • ')}`);
508
+ }
509
+ return applyDefaults(spec);
510
+ }
511
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/cli/run/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CliContext } from './types.js';
2
+ /**
3
+ * CLI entry point for the `run` command.
4
+ */
5
+ export default function run({ args }: CliContext): Promise<void>;
6
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,YAAY,CAAA;AA2ExD;;GAEG;AACH,wBAA8B,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDrE"}
@@ -0,0 +1,123 @@
1
+ import { resolve } from 'node:path';
2
+ import { parseTaskSpec } from './run/schema.js';
3
+ import { createExecutor, buildPhases } from './run/executor.js';
4
+ import { getAdapter } from './run/adapters/index.js';
5
+ import { createReporter, printExecutionPlan } from './run/reporter.js';
6
+ const HELP = `
7
+ opencastle run [options]
8
+
9
+ Process a task queue from a spec file, delegating to AI agents autonomously.
10
+
11
+ Options:
12
+ --file, -f <path> Task spec file (default: opencastle.tasks.yml)
13
+ --dry-run Show execution plan without running
14
+ --concurrency, -c <n> Override max parallel tasks
15
+ --adapter, -a <name> Override agent runtime adapter
16
+ --report-dir <path> Where to write run reports (default: .opencastle/runs)
17
+ --verbose Show full agent output
18
+ --help, -h Show this help
19
+ `;
20
+ /**
21
+ * Parse CLI arguments for the run command.
22
+ */
23
+ function parseArgs(args) {
24
+ const opts = {
25
+ file: 'opencastle.tasks.yml',
26
+ dryRun: false,
27
+ concurrency: null,
28
+ adapter: null,
29
+ reportDir: null,
30
+ verbose: false,
31
+ help: false,
32
+ };
33
+ for (let i = 0; i < args.length; i++) {
34
+ const arg = args[i];
35
+ switch (arg) {
36
+ case '--help':
37
+ case '-h':
38
+ opts.help = true;
39
+ break;
40
+ case '--file':
41
+ case '-f':
42
+ opts.file = args[++i];
43
+ break;
44
+ case '--dry-run':
45
+ opts.dryRun = true;
46
+ break;
47
+ case '--concurrency':
48
+ case '-c': {
49
+ const val = parseInt(args[++i], 10);
50
+ if (!Number.isFinite(val) || val < 1) {
51
+ console.error(` ✗ --concurrency must be an integer >= 1`);
52
+ process.exit(1);
53
+ }
54
+ opts.concurrency = val;
55
+ break;
56
+ }
57
+ case '--adapter':
58
+ case '-a':
59
+ opts.adapter = args[++i];
60
+ break;
61
+ case '--report-dir':
62
+ opts.reportDir = args[++i];
63
+ break;
64
+ case '--verbose':
65
+ opts.verbose = true;
66
+ break;
67
+ default:
68
+ console.error(` ✗ Unknown option: ${arg}`);
69
+ console.log(HELP);
70
+ process.exit(1);
71
+ }
72
+ }
73
+ return opts;
74
+ }
75
+ /**
76
+ * CLI entry point for the `run` command.
77
+ */
78
+ export default async function run({ args }) {
79
+ const opts = parseArgs(args);
80
+ if (opts.help) {
81
+ console.log(HELP);
82
+ return;
83
+ }
84
+ // ── Read and validate spec ────────────────────────────────────
85
+ const specPath = resolve(process.cwd(), opts.file);
86
+ const spec = await parseTaskSpec(specPath);
87
+ // Apply CLI overrides
88
+ if (opts.concurrency !== null)
89
+ spec.concurrency = opts.concurrency;
90
+ if (opts.adapter !== null)
91
+ spec.adapter = opts.adapter;
92
+ if (opts.verbose)
93
+ spec._verbose = true;
94
+ // ── Dry run ──────────────────────────────────────────────────
95
+ const phases = buildPhases(spec.tasks);
96
+ if (opts.dryRun) {
97
+ printExecutionPlan(spec, phases);
98
+ return;
99
+ }
100
+ // ── Check adapter ────────────────────────────────────────────
101
+ const adapter = await getAdapter(spec.adapter);
102
+ const available = await adapter.isAvailable();
103
+ if (!available) {
104
+ console.error(` ✗ Adapter "${spec.adapter}" is not available.\n` +
105
+ ` Make sure the "${spec.adapter === 'claude-code' ? 'claude' : spec.adapter}" CLI is installed and on your PATH.`);
106
+ process.exit(1);
107
+ }
108
+ // ── Execute ──────────────────────────────────────────────────
109
+ console.log(`\n 🏰 OpenCastle Run: ${spec.name}`);
110
+ console.log(` Adapter: ${adapter.name} | Concurrency: ${spec.concurrency} | Tasks: ${spec.tasks.length}`);
111
+ const reporter = createReporter(spec, {
112
+ reportDir: opts.reportDir
113
+ ? resolve(process.cwd(), opts.reportDir)
114
+ : undefined,
115
+ verbose: opts.verbose,
116
+ });
117
+ const executor = createExecutor(spec, adapter, reporter);
118
+ const report = await executor.run();
119
+ // ── Exit code ────────────────────────────────────────────────
120
+ const hasFailures = report.summary.failed > 0 || report.summary['timed-out'] > 0;
121
+ process.exit(hasFailures ? 1 : 0);
122
+ }
123
+ //# sourceMappingURL=run.js.map