@scanton/phase2s 1.0.0 → 1.8.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 (65) hide show
  1. package/README.md +18 -1
  2. package/dist/src/cli/doctor.d.ts +39 -0
  3. package/dist/src/cli/doctor.d.ts.map +1 -0
  4. package/dist/src/cli/doctor.js +244 -0
  5. package/dist/src/cli/doctor.js.map +1 -0
  6. package/dist/src/cli/goal.d.ts +38 -1
  7. package/dist/src/cli/goal.d.ts.map +1 -1
  8. package/dist/src/cli/goal.js +274 -23
  9. package/dist/src/cli/goal.js.map +1 -1
  10. package/dist/src/cli/index.d.ts.map +1 -1
  11. package/dist/src/cli/index.js +116 -9
  12. package/dist/src/cli/index.js.map +1 -1
  13. package/dist/src/cli/init.d.ts +73 -0
  14. package/dist/src/cli/init.d.ts.map +1 -0
  15. package/dist/src/cli/init.js +366 -0
  16. package/dist/src/cli/init.js.map +1 -0
  17. package/dist/src/cli/lint.d.ts +32 -0
  18. package/dist/src/cli/lint.d.ts.map +1 -0
  19. package/dist/src/cli/lint.js +140 -0
  20. package/dist/src/cli/lint.js.map +1 -0
  21. package/dist/src/cli/report.d.ts +62 -0
  22. package/dist/src/cli/report.d.ts.map +1 -0
  23. package/dist/src/cli/report.js +188 -0
  24. package/dist/src/cli/report.js.map +1 -0
  25. package/dist/src/cli/upgrade.d.ts +35 -0
  26. package/dist/src/cli/upgrade.d.ts.map +1 -0
  27. package/dist/src/cli/upgrade.js +126 -0
  28. package/dist/src/cli/upgrade.js.map +1 -0
  29. package/dist/src/core/config.d.ts +60 -8
  30. package/dist/src/core/config.d.ts.map +1 -1
  31. package/dist/src/core/config.js +31 -1
  32. package/dist/src/core/config.js.map +1 -1
  33. package/dist/src/core/notify.d.ts +41 -0
  34. package/dist/src/core/notify.d.ts.map +1 -0
  35. package/dist/src/core/notify.js +153 -0
  36. package/dist/src/core/notify.js.map +1 -0
  37. package/dist/src/core/run-logger.d.ts +83 -0
  38. package/dist/src/core/run-logger.d.ts.map +1 -0
  39. package/dist/src/core/run-logger.js +70 -0
  40. package/dist/src/core/run-logger.js.map +1 -0
  41. package/dist/src/core/state.d.ts +74 -0
  42. package/dist/src/core/state.d.ts.map +1 -0
  43. package/dist/src/core/state.js +132 -0
  44. package/dist/src/core/state.js.map +1 -0
  45. package/dist/src/mcp/server.d.ts +17 -0
  46. package/dist/src/mcp/server.d.ts.map +1 -1
  47. package/dist/src/mcp/server.js +243 -4
  48. package/dist/src/mcp/server.js.map +1 -1
  49. package/dist/src/providers/gemini.d.ts +29 -0
  50. package/dist/src/providers/gemini.d.ts.map +1 -0
  51. package/dist/src/providers/gemini.js +47 -0
  52. package/dist/src/providers/gemini.js.map +1 -0
  53. package/dist/src/providers/index.d.ts +2 -0
  54. package/dist/src/providers/index.d.ts.map +1 -1
  55. package/dist/src/providers/index.js +8 -0
  56. package/dist/src/providers/index.js.map +1 -1
  57. package/dist/src/providers/openrouter.d.ts +25 -0
  58. package/dist/src/providers/openrouter.d.ts.map +1 -0
  59. package/dist/src/providers/openrouter.js +43 -0
  60. package/dist/src/providers/openrouter.js.map +1 -0
  61. package/dist/src/tools/registry.d.ts +5 -3
  62. package/dist/src/tools/registry.d.ts.map +1 -1
  63. package/dist/src/tools/registry.js +35 -12
  64. package/dist/src/tools/registry.js.map +1 -1
  65. package/package.json +1 -1
@@ -6,37 +6,100 @@
6
6
  * output, retries failed sub-tasks with failure context, and loops until all
7
7
  * criteria pass or max attempts are exhausted.
8
8
  *
9
- * Usage: phase2s goal <spec-file> [--max-attempts <n>]
9
+ * Usage: phase2s goal <spec-file> [--max-attempts <n>] [--resume] [--review-before-run]
10
+ *
11
+ * With --resume: reads existing state from .phase2s/state/<hash>.json
12
+ * (relative to the spec file directory), skips completed sub-tasks, and
13
+ * injects saved failure context for failed ones. Starts fresh if no state
14
+ * exists.
15
+ *
16
+ * With --review-before-run: runs the spec through adversarial review (fresh
17
+ * Agent instance, adversarial SKILL.md template) before execution begins.
18
+ * Halts and returns challenged: true if verdict is CHALLENGED or
19
+ * NEEDS_CLARIFICATION.
10
20
  */
11
21
  import { execFile } from "child_process";
12
22
  import { readFileSync } from "fs";
13
- import { resolve } from "path";
23
+ import { resolve, dirname, basename } from "path";
14
24
  import { Agent } from "../core/agent.js";
15
25
  import { loadConfig } from "../core/config.js";
16
26
  import { loadLearnings, formatLearningsForPrompt } from "../core/memory.js";
17
27
  import { parseSpec } from "../core/spec-parser.js";
28
+ import { computeSpecHash, readState, writeState, clearState } from "../core/state.js";
29
+ import { RunLogger } from "../core/run-logger.js";
30
+ import { sendNotification, buildNotifyPayload } from "../core/notify.js";
18
31
  import { loadAllSkills } from "../skills/index.js";
19
32
  import { substituteInputs, stripAskTokens } from "../skills/template.js";
33
+ /** Cap on bytes stored for failureContext per sub-task. */
34
+ const FAILURE_CONTEXT_MAX_BYTES = 4096;
20
35
  export async function runGoal(specFile, options = {}) {
21
36
  const specPath = resolve(process.cwd(), specFile);
37
+ // State and run logs are stored relative to the spec file directory, not
38
+ // invocation cwd. This keeps logs next to the spec regardless of where
39
+ // `phase2s goal` is invoked from.
40
+ const specDir = dirname(specPath);
22
41
  let markdown;
23
42
  try {
24
43
  markdown = readFileSync(specPath, "utf8");
25
44
  }
26
45
  catch {
27
- console.error(`Error: Cannot read spec file: ${specPath}`);
28
- process.exit(1);
46
+ throw new Error(`Cannot read spec file: ${specPath}`);
29
47
  }
48
+ const specHash = computeSpecHash(markdown);
30
49
  const spec = parseSpec(markdown);
31
50
  const maxAttempts = Math.max(1, parseInt(options.maxAttempts ?? "3", 10) || 3);
51
+ const resume = !!options.resume;
52
+ // Initialise RunLogger now so we can capture the path even if we halt early.
53
+ const logger = new RunLogger(specDir, specHash);
54
+ const startMs = Date.now();
55
+ // Load config early so it's available for all return paths (including early exits).
56
+ const config = await loadConfig();
57
+ // -------------------------------------------------------------------------
58
+ // State: load existing state when resuming, otherwise start fresh.
59
+ // -------------------------------------------------------------------------
60
+ let state = resume ? readState(specDir, specHash) : null;
61
+ // If --resume but no prior state found: silently start fresh (no error).
62
+ if (state === null) {
63
+ state = {
64
+ specFile: basename(specPath),
65
+ specHash,
66
+ startedAt: new Date().toISOString(),
67
+ lastUpdatedAt: new Date().toISOString(),
68
+ maxAttempts,
69
+ attempt: 0,
70
+ subTaskResults: {},
71
+ };
72
+ }
73
+ logger.log({
74
+ event: "goal_started",
75
+ specFile: basename(specPath),
76
+ specHash,
77
+ subTaskCount: spec.decomposition.length,
78
+ maxAttempts,
79
+ resuming: resume,
80
+ });
32
81
  console.log(`\nGoal executor: ${spec.title}`);
33
82
  console.log(`Eval command: ${spec.evalCommand}`);
34
83
  console.log(`Sub-tasks: ${spec.decomposition.length}`);
35
84
  console.log(`Acceptance criteria: ${spec.acceptanceCriteria.length}`);
36
85
  console.log(`Max attempts: ${maxAttempts}`);
86
+ if (resume) {
87
+ const doneCount = Object.values(state.subTaskResults).filter((r) => r.status === "passed").length;
88
+ console.log(`Resuming: ${doneCount}/${spec.decomposition.length} sub-tasks already completed`);
89
+ }
37
90
  if (spec.decomposition.length === 0 && spec.acceptanceCriteria.length === 0) {
38
91
  console.log("\nSpec has no sub-tasks and no acceptance criteria. Nothing to execute.");
39
- return { success: true, attempts: 0, criteriaResults: {} };
92
+ logger.log({ event: "goal_completed", success: true, attempts: 0 });
93
+ const result = {
94
+ success: true,
95
+ attempts: 0,
96
+ criteriaResults: {},
97
+ runLogPath: logger.close(),
98
+ summary: "Spec has no sub-tasks and no acceptance criteria.",
99
+ durationMs: Date.now() - startMs,
100
+ };
101
+ await maybeNotify(options, config, result, basename(specPath));
102
+ return result;
40
103
  }
41
104
  // Warn on large specs
42
105
  if (spec.decomposition.length * maxAttempts > 15) {
@@ -44,74 +107,262 @@ export async function runGoal(specFile, options = {}) {
44
107
  "This may take a while and consume significant ChatGPT usage.");
45
108
  }
46
109
  // Set up agent
47
- const config = await loadConfig();
48
110
  const learningsList = await loadLearnings(process.cwd());
49
111
  const learningsStr = formatLearningsForPrompt(learningsList);
50
- const agent = new Agent({ config, learnings: learningsStr });
51
- // Load skills to get satori template + settings
112
+ // Load skills to get satori + adversarial templates and settings
52
113
  const skills = await loadAllSkills();
53
114
  const satoriSkill = skills.find((s) => s.name === "satori");
115
+ const adversarialSkill = skills.find((s) => s.name === "adversarial");
54
116
  const satoriRetries = satoriSkill?.retries ?? 3;
55
117
  const satoriModel = satoriSkill?.model;
118
+ const adversarialModel = adversarialSkill?.model;
56
119
  // Build the satori base prompt from its template (same as what the REPL does)
57
120
  const satoriTemplate = satoriSkill
58
121
  ? stripAskTokens(substituteInputs(satoriSkill.promptTemplate, {}, satoriSkill.inputs)).result
59
122
  : "";
60
- let attempt = 0;
123
+ // -------------------------------------------------------------------------
124
+ // Pre-execution adversarial review (optional, uses fresh Agent to avoid
125
+ // contaminating the implementation agent's conversation history).
126
+ // -------------------------------------------------------------------------
127
+ if (options.reviewBeforeRun) {
128
+ logger.log({ event: "plan_review_started" });
129
+ const adversarialTemplate = adversarialSkill?.promptTemplate ?? "";
130
+ const reviewPrompt = buildAdversarialPrompt(spec, adversarialTemplate);
131
+ const reviewAgent = new Agent({ config, learnings: learningsStr });
132
+ const response = await reviewAgent.run(reviewPrompt, { modelOverride: adversarialModel });
133
+ const verdict = response.includes("VERDICT: CHALLENGED")
134
+ ? "CHALLENGED"
135
+ : response.includes("NEEDS_CLARIFICATION")
136
+ ? "NEEDS_CLARIFICATION"
137
+ : "APPROVED";
138
+ logger.log({ event: "plan_review_completed", verdict, response });
139
+ if (verdict !== "APPROVED") {
140
+ console.log(`\nSpec ${verdict} before execution. Adversarial review response:\n`);
141
+ console.log(response);
142
+ const result = {
143
+ success: false,
144
+ attempts: 0,
145
+ criteriaResults: {},
146
+ runLogPath: logger.close(),
147
+ summary: `Spec ${verdict} before execution.`,
148
+ durationMs: Date.now() - startMs,
149
+ challenged: true,
150
+ challengeResponse: response,
151
+ };
152
+ await maybeNotify(options, config, result, basename(specPath));
153
+ return result;
154
+ }
155
+ console.log("\nAdversarial review: APPROVED. Proceeding with execution.");
156
+ }
157
+ // -------------------------------------------------------------------------
158
+ // Main execution loop
159
+ // -------------------------------------------------------------------------
160
+ const agent = new Agent({ config, learnings: learningsStr });
161
+ let attempt = state.attempt;
61
162
  let subtasksToRun = spec.decomposition;
62
163
  let previousFailureContext;
63
164
  let criteriaResults = {};
64
165
  while (attempt < maxAttempts) {
65
166
  attempt++;
167
+ state.attempt = attempt;
168
+ logger.log({ event: "attempt_started", attempt });
66
169
  console.log(`\n${"=".repeat(50)}`);
67
170
  console.log(`Attempt ${attempt}/${maxAttempts}`);
68
171
  console.log("=".repeat(50));
69
172
  // Run sub-tasks through satori
70
- for (const subtask of subtasksToRun) {
173
+ for (let i = 0; i < subtasksToRun.length; i++) {
174
+ const subtask = subtasksToRun[i];
175
+ // When resuming, find the original index of this sub-task in the full decomposition.
176
+ const globalIndex = spec.decomposition.indexOf(subtask);
177
+ const indexKey = String(globalIndex >= 0 ? globalIndex : i);
178
+ const priorResult = state.subTaskResults[indexKey];
179
+ // Skip sub-tasks already marked passed on a prior run.
180
+ if (priorResult?.status === "passed") {
181
+ console.log(`\nSkipping sub-task (already passed): ${subtask.name}`);
182
+ continue;
183
+ }
184
+ // Inject prior failure context if this sub-task failed before.
185
+ const priorFailureContext = priorResult?.status === "failed"
186
+ ? priorResult.failureContext
187
+ : previousFailureContext;
188
+ const numericIndex = globalIndex >= 0 ? globalIndex : i;
189
+ logger.log({ event: "subtask_started", attempt, index: numericIndex, name: subtask.name });
71
190
  console.log(`\nRunning sub-task: ${subtask.name}`);
72
- const taskContext = buildSatoriContext(subtask, spec.constraints, previousFailureContext);
191
+ const taskContext = buildSatoriContext(subtask, spec.constraints, priorFailureContext);
73
192
  // Combine satori system instructions + task-specific context
74
193
  const effectivePrompt = satoriTemplate
75
194
  ? `${satoriTemplate}\n\n## Task\n${taskContext}`
76
195
  : taskContext;
77
- await agent.run(effectivePrompt, {
78
- modelOverride: satoriModel,
79
- maxRetries: satoriRetries,
80
- verifyCommand: spec.evalCommand,
81
- onDelta: (chunk) => process.stdout.write(chunk),
82
- });
196
+ // Capture satori output so we can store it as failureContext if needed.
197
+ const outputChunks = [];
198
+ let satoriError = null;
199
+ try {
200
+ await agent.run(effectivePrompt, {
201
+ modelOverride: satoriModel,
202
+ maxRetries: satoriRetries,
203
+ verifyCommand: spec.evalCommand,
204
+ onDelta: (chunk) => {
205
+ process.stdout.write(chunk);
206
+ outputChunks.push(chunk);
207
+ },
208
+ });
209
+ }
210
+ catch (err) {
211
+ satoriError = err;
212
+ }
83
213
  process.stdout.write("\n");
214
+ const outputStr = outputChunks.join("");
215
+ const truncated = outputStr.slice(-FAILURE_CONTEXT_MAX_BYTES);
216
+ if (satoriError) {
217
+ // Sub-task threw — mark as failed, write checkpoint, continue.
218
+ state.subTaskResults[indexKey] = {
219
+ status: "failed",
220
+ failureContext: truncated,
221
+ attempts: (priorResult?.attempts ?? 0) + 1,
222
+ };
223
+ state.lastUpdatedAt = new Date().toISOString();
224
+ writeState(specDir, specHash, state);
225
+ logger.log({ event: "subtask_completed", attempt, index: numericIndex, status: "failed", failureContext: truncated });
226
+ console.error(`\nSub-task failed: ${subtask.name}`);
227
+ }
228
+ else {
229
+ // Sub-task completed without throwing — mark as passed, write checkpoint.
230
+ state.subTaskResults[indexKey] = {
231
+ status: "passed",
232
+ completedAt: new Date().toISOString(),
233
+ };
234
+ state.lastUpdatedAt = new Date().toISOString();
235
+ writeState(specDir, specHash, state);
236
+ logger.log({ event: "subtask_completed", attempt, index: numericIndex, status: "passed" });
237
+ }
84
238
  }
85
239
  // Run evaluation
86
240
  console.log(`\nRunning evaluation: ${spec.evalCommand}`);
241
+ logger.log({ event: "eval_started", command: spec.evalCommand });
87
242
  const evalOutput = await runCommand(spec.evalCommand);
88
243
  console.log(evalOutput.slice(0, 1000) + (evalOutput.length > 1000 ? "\n[...truncated...]" : ""));
244
+ // Store first 2000 chars in log (enough for diagnostics, not overwhelming)
245
+ logger.log({ event: "eval_completed", output: evalOutput.slice(0, 2000) });
89
246
  // If no acceptance criteria, report raw output and exit
90
247
  if (spec.acceptanceCriteria.length === 0) {
91
248
  console.log("\nNo acceptance criteria defined. Eval output shown above.");
92
- return { success: true, attempts: attempt, criteriaResults: {} };
249
+ logger.log({ event: "goal_completed", success: true, attempts: attempt });
250
+ const result = {
251
+ success: true,
252
+ attempts: attempt,
253
+ criteriaResults: {},
254
+ runLogPath: logger.close(),
255
+ summary: `Goal completed successfully after ${attempt} attempt(s).`,
256
+ durationMs: Date.now() - startMs,
257
+ };
258
+ await maybeNotify(options, config, result, basename(specPath));
259
+ return result;
93
260
  }
94
261
  // Check acceptance criteria
95
262
  criteriaResults = await checkCriteria(spec.acceptanceCriteria, evalOutput, agent);
96
263
  printCriteriaTable(criteriaResults);
97
264
  const failing = Object.entries(criteriaResults).filter(([, pass]) => !pass).map(([c]) => c);
265
+ logger.log({ event: "criteria_checked", results: criteriaResults, failing });
98
266
  if (failing.length === 0) {
99
267
  console.log(`\n✓ All acceptance criteria met after ${attempt} attempt(s).`);
100
- return { success: true, attempts: attempt, criteriaResults };
268
+ // Clean completion: remove state so stale state doesn't block future runs.
269
+ clearState(specDir, specHash);
270
+ logger.log({ event: "goal_completed", success: true, attempts: attempt });
271
+ const result = {
272
+ success: true,
273
+ attempts: attempt,
274
+ criteriaResults,
275
+ runLogPath: logger.close(),
276
+ summary: `All criteria passed after ${attempt} attempt(s).`,
277
+ durationMs: Date.now() - startMs,
278
+ };
279
+ await maybeNotify(options, config, result, basename(specPath));
280
+ return result;
101
281
  }
102
282
  if (attempt < maxAttempts) {
103
283
  previousFailureContext = await analyzeFailures(failing, evalOutput, spec, agent);
104
284
  subtasksToRun = await identifyFailedSubtasks(failing, spec.decomposition, previousFailureContext, agent);
285
+ // Reset passed sub-tasks on the next attempt so they re-run in context of new failures.
286
+ // We only keep the state for cross-run resumability, not within the same goal invocation.
105
287
  console.log(`\nRetrying ${subtasksToRun.length} sub-task(s): ${subtasksToRun.map((s) => s.name).join(", ")}`);
106
288
  }
107
289
  }
108
290
  console.log(`\n✗ Goal not achieved after ${maxAttempts} attempts.`);
109
291
  console.log("Failing criteria:");
110
- for (const [criterion, pass] of Object.entries(criteriaResults)) {
111
- if (!pass)
112
- console.log(` ✗ ${criterion}`);
292
+ const failingFinal = Object.entries(criteriaResults).filter(([, pass]) => !pass).map(([c]) => c);
293
+ for (const criterion of failingFinal) {
294
+ console.log(` ✗ ${criterion}`);
295
+ }
296
+ logger.log({ event: "goal_completed", success: false, attempts: maxAttempts });
297
+ const failResult = {
298
+ success: false,
299
+ attempts: maxAttempts,
300
+ criteriaResults,
301
+ runLogPath: logger.close(),
302
+ summary: `Goal failed after ${maxAttempts} attempts. ${failingFinal.length} criteria not met.`,
303
+ durationMs: Date.now() - startMs,
304
+ };
305
+ await maybeNotify(options, config, failResult, basename(specPath));
306
+ return failResult;
307
+ }
308
+ // ---------------------------------------------------------------------------
309
+ // Notification helper
310
+ // ---------------------------------------------------------------------------
311
+ /**
312
+ * Send a post-run notification if the caller requested one.
313
+ * Errors are swallowed — notification failures never surface to the user.
314
+ */
315
+ async function maybeNotify(options, config, result, specFile) {
316
+ if (!options.notify)
317
+ return;
318
+ const notifyOptions = typeof options.notify === "object"
319
+ ? options.notify
320
+ : {
321
+ mac: config.notify?.mac,
322
+ slack: config.notify?.slack,
323
+ discord: config.notify?.discord,
324
+ teams: config.notify?.teams,
325
+ };
326
+ const payload = buildNotifyPayload(specFile, result.success, result.attempts, result.challenged ?? false, result.durationMs);
327
+ try {
328
+ await sendNotification(payload, notifyOptions);
329
+ }
330
+ catch (err) {
331
+ console.error(`[phase2s notify] Notification failed: ${String(err)}`);
113
332
  }
114
- return { success: false, attempts: maxAttempts, criteriaResults };
333
+ }
334
+ // ---------------------------------------------------------------------------
335
+ // buildAdversarialPrompt
336
+ // ---------------------------------------------------------------------------
337
+ /**
338
+ * Build a pre-execution adversarial review prompt.
339
+ *
340
+ * Injects the spec's decomposition and acceptance criteria as the "plan" to
341
+ * challenge, then appends the adversarial SKILL.md template which instructs
342
+ * the model to review what came before it and emit a structured verdict.
343
+ */
344
+ export function buildAdversarialPrompt(spec, adversarialTemplate) {
345
+ const decompositionLines = spec.decomposition
346
+ .map((t, i) => `${i + 1}. **${t.name}**: ${t.successCriteria}`)
347
+ .join("\n");
348
+ const criteriaLines = spec.acceptanceCriteria
349
+ .map((c, i) => `${i + 1}. ${c}`)
350
+ .join("\n");
351
+ const plan = [
352
+ `## Spec: ${spec.title}`,
353
+ "",
354
+ "### Problem",
355
+ spec.problemStatement,
356
+ "",
357
+ "### Sub-task decomposition",
358
+ decompositionLines || "(none)",
359
+ "",
360
+ "### Acceptance criteria",
361
+ criteriaLines || "(none)",
362
+ ].join("\n");
363
+ return adversarialTemplate
364
+ ? `${plan}\n\n${adversarialTemplate}`
365
+ : plan;
115
366
  }
116
367
  // ---------------------------------------------------------------------------
117
368
  // Helpers
@@ -1 +1 @@
1
- {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../src/cli/goal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../src/cli/goal.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAiEA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIvE;AAkfD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,oBAAoB,EAAE,KAAK,EAAE,GAC3C;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA6BjI"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAiEA,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4PvE;AAwfD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,oBAAoB,EAAE,KAAK,EAAE,GAC3C;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA6BjI"}
@@ -124,11 +124,16 @@ export async function main(argv = process.argv) {
124
124
  });
125
125
  // List available skills
126
126
  program
127
- .command("skills")
128
- .description("List available skills")
127
+ .command("skills [query]")
128
+ .description("List available skills, or filter with an optional search query")
129
129
  .option("--json", "Output as JSON")
130
- .action(async (cmdOpts) => {
131
- const skills = await loadAllSkills();
130
+ .action(async (query, cmdOpts) => {
131
+ let skills = await loadAllSkills();
132
+ if (query) {
133
+ const q = query.toLowerCase();
134
+ skills = skills.filter((s) => s.name.toLowerCase().includes(q) ||
135
+ (s.description?.toLowerCase().includes(q) ?? false));
136
+ }
132
137
  if (cmdOpts.json) {
133
138
  const output = skills.map((s) => ({
134
139
  name: s.name,
@@ -145,10 +150,18 @@ export async function main(argv = process.argv) {
145
150
  return;
146
151
  }
147
152
  if (skills.length === 0) {
148
- log.info("No skills found. Add skills to .phase2s/skills/ or ~/.phase2s/skills/");
153
+ if (query) {
154
+ console.log(chalk.yellow(`\n No skills match "${query}". Try a broader term or run phase2s skills to list all.\n`));
155
+ }
156
+ else {
157
+ log.info("No skills found. Add skills to .phase2s/skills/ or ~/.phase2s/skills/");
158
+ }
149
159
  return;
150
160
  }
151
- console.log(chalk.bold("\nAvailable skills:\n"));
161
+ const header = query
162
+ ? chalk.bold(`\nSkills matching "${query}":\n`)
163
+ : chalk.bold("\nAvailable skills:\n");
164
+ console.log(header);
152
165
  for (const skill of skills) {
153
166
  const tierBadge = skill.model === "fast"
154
167
  ? chalk.blue(" [fast]")
@@ -164,10 +177,98 @@ export async function main(argv = process.argv) {
164
177
  .command("goal <spec-file>")
165
178
  .description("Execute a spec file end-to-end: run sub-tasks, evaluate, retry until done")
166
179
  .option("--max-attempts <n>", "Maximum retry loops (default: 3)", "3")
180
+ .option("--resume", "Resume from the last completed sub-task (reads state from .phase2s/state/)")
181
+ .option("--review-before-run", "Run adversarial review on spec before executing")
182
+ .option("--notify", "Send a notification when the run completes (macOS + optional Slack webhook)")
167
183
  .action(async (specFile, cmdOpts) => {
168
184
  const { runGoal } = await import("./goal.js");
169
- const result = await runGoal(specFile, { maxAttempts: cmdOpts.maxAttempts });
170
- process.exit(result.success ? 0 : 1);
185
+ try {
186
+ const result = await runGoal(specFile, {
187
+ maxAttempts: cmdOpts.maxAttempts,
188
+ resume: cmdOpts.resume,
189
+ reviewBeforeRun: cmdOpts.reviewBeforeRun,
190
+ notify: cmdOpts.notify,
191
+ });
192
+ if (result.runLogPath)
193
+ console.log(`Run log: ${result.runLogPath}`);
194
+ process.exit(result.success ? 0 : 1);
195
+ }
196
+ catch (err) {
197
+ console.error(err instanceof Error ? err.message : String(err));
198
+ process.exit(1);
199
+ }
200
+ });
201
+ // Run log report viewer
202
+ program
203
+ .command("report <logfile>")
204
+ .description("Display a human-readable summary of a dark factory run log (.jsonl)")
205
+ .action(async (logfile) => {
206
+ const { parseRunLog, buildRunReport, formatRunReport } = await import("./report.js");
207
+ try {
208
+ const events = parseRunLog(logfile);
209
+ const report = buildRunReport(events);
210
+ console.log(formatRunReport(report));
211
+ }
212
+ catch (err) {
213
+ console.error(`Error reading run log: ${err instanceof Error ? err.message : String(err)}`);
214
+ process.exit(1);
215
+ }
216
+ });
217
+ // Interactive setup wizard
218
+ program
219
+ .command("init")
220
+ .description("Interactive setup wizard — configure .phase2s.yaml for your provider")
221
+ .option("--non-interactive", "Skip prompts and use flag values (for CI)")
222
+ .option("--provider <provider>", "Provider: codex-cli, openai-api, anthropic, ollama, openrouter, gemini")
223
+ .option("--api-key <key>", "API key for openai-api or anthropic provider")
224
+ .option("--openrouter-api-key <key>", "API key for openrouter provider")
225
+ .option("--gemini-api-key <key>", "API key for gemini provider (starts with AIza)")
226
+ .option("--fast-model <model>", "Fast tier model name")
227
+ .option("--smart-model <model>", "Smart tier model name")
228
+ .option("--slack-webhook <url>", "Slack webhook URL for notifications")
229
+ .option("--discord-webhook <url>", "Discord webhook URL for notifications")
230
+ .option("--teams-webhook <url>", "Microsoft Teams webhook URL for notifications")
231
+ .action(async (cmdOpts) => {
232
+ const { runInit } = await import("./init.js");
233
+ await runInit({
234
+ nonInteractive: cmdOpts.nonInteractive,
235
+ provider: cmdOpts.provider,
236
+ apiKey: cmdOpts.apiKey,
237
+ openrouterApiKey: cmdOpts.openrouterApiKey,
238
+ geminiApiKey: cmdOpts.geminiApiKey,
239
+ fastModel: cmdOpts.fastModel,
240
+ smartModel: cmdOpts.smartModel,
241
+ slackWebhook: cmdOpts.slackWebhook,
242
+ discordWebhook: cmdOpts.discordWebhook,
243
+ teamsWebhook: cmdOpts.teamsWebhook,
244
+ });
245
+ });
246
+ // Self-update command
247
+ program
248
+ .command("upgrade")
249
+ .description("Check for a newer version and offer to install it")
250
+ .option("--check", "Report whether an update is available without prompting")
251
+ .action(async (cmdOpts) => {
252
+ const { runUpgrade } = await import("./upgrade.js");
253
+ await runUpgrade(VERSION, { check: cmdOpts.check });
254
+ });
255
+ // Spec linting
256
+ program
257
+ .command("lint <spec-file>")
258
+ .description("Validate a 5-pillar spec file before running it — catches structural errors before the dark factory run begins")
259
+ .action(async (specFile) => {
260
+ const { runLint } = await import("./lint.js");
261
+ const ok = await runLint(specFile);
262
+ if (!ok)
263
+ process.exit(1);
264
+ });
265
+ // Installation health check
266
+ program
267
+ .command("doctor")
268
+ .description("Check Phase2S installation health — Node version, auth, config, working dir")
269
+ .action(async () => {
270
+ const { runDoctor } = await import("./doctor.js");
271
+ await runDoctor();
171
272
  });
172
273
  // Shell completion script generator
173
274
  program
@@ -202,7 +303,7 @@ _phase2s_complete() {
202
303
 
203
304
  # Complete subcommands at position 1
204
305
  if [[ \${COMP_CWORD} -eq 1 ]]; then
205
- COMPREPLY=($(compgen -W "chat run skills mcp completion" -- "\$cur"))
306
+ COMPREPLY=($(compgen -W "chat run skills mcp goal report init upgrade lint doctor completion" -- "\$cur"))
206
307
  return
207
308
  fi
208
309
 
@@ -238,6 +339,12 @@ _phase2s() {
238
339
  'run:Run a single prompt and exit'
239
340
  'skills:List available skills'
240
341
  'mcp:Start as an MCP server for Claude Code'
342
+ 'goal:Run a spec file autonomously (dark factory)'
343
+ 'report:Display a human-readable summary of a run log'
344
+ 'init:Interactive setup wizard — configure .phase2s.yaml'
345
+ 'upgrade:Check for a newer version and offer to install it'
346
+ 'lint:Validate a 5-pillar spec file before running it'
347
+ 'doctor:Check Phase2S installation health'
241
348
  'completion:Output shell completion script'
242
349
  )
243
350