@entelligentsia/forgecli 0.10.0 → 0.11.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 (188) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +21 -3
  3. package/dist/CHANGELOG-forge-plugin.md +90 -0
  4. package/dist/bin/config.js +6 -0
  5. package/dist/bin/config.js.map +1 -1
  6. package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
  7. package/dist/extensions/forgecli/add-pipeline.js +143 -0
  8. package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
  9. package/dist/extensions/forgecli/add-task.d.ts +20 -0
  10. package/dist/extensions/forgecli/add-task.js +154 -0
  11. package/dist/extensions/forgecli/add-task.js.map +1 -0
  12. package/dist/extensions/forgecli/calibrate.d.ts +61 -0
  13. package/dist/extensions/forgecli/calibrate.js +488 -0
  14. package/dist/extensions/forgecli/calibrate.js.map +1 -0
  15. package/dist/extensions/forgecli/fix-bug.d.ts +9 -1
  16. package/dist/extensions/forgecli/fix-bug.js +155 -45
  17. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  18. package/dist/extensions/forgecli/forge-commands.js +15 -22
  19. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  20. package/dist/extensions/forgecli/forge-subagent.d.ts +16 -1
  21. package/dist/extensions/forgecli/forge-subagent.js +45 -8
  22. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  23. package/dist/extensions/forgecli/forge-update-command.d.ts +9 -0
  24. package/dist/extensions/forgecli/forge-update-command.js +106 -7
  25. package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
  26. package/dist/extensions/forgecli/health-check.d.ts +22 -1
  27. package/dist/extensions/forgecli/health-check.js +177 -4
  28. package/dist/extensions/forgecli/health-check.js.map +1 -1
  29. package/dist/extensions/forgecli/hook-dispatcher.d.ts +25 -1
  30. package/dist/extensions/forgecli/hook-dispatcher.js +104 -9
  31. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  32. package/dist/extensions/forgecli/hooks/check-update.d.ts +81 -0
  33. package/dist/extensions/forgecli/hooks/check-update.js +308 -0
  34. package/dist/extensions/forgecli/hooks/check-update.js.map +1 -0
  35. package/dist/extensions/forgecli/hooks/forge-permissions.d.ts +32 -0
  36. package/dist/extensions/forgecli/hooks/forge-permissions.js +119 -0
  37. package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -0
  38. package/dist/extensions/forgecli/hooks/triage-error.d.ts +23 -0
  39. package/dist/extensions/forgecli/hooks/triage-error.js +62 -0
  40. package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -0
  41. package/dist/extensions/forgecli/hooks/write-guard.d.ts +28 -0
  42. package/dist/extensions/forgecli/hooks/write-guard.js +225 -0
  43. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -0
  44. package/dist/extensions/forgecli/index.js +60 -0
  45. package/dist/extensions/forgecli/index.js.map +1 -1
  46. package/dist/extensions/forgecli/init-context.d.ts +1 -1
  47. package/dist/extensions/forgecli/init-context.js +21 -6
  48. package/dist/extensions/forgecli/init-context.js.map +1 -1
  49. package/dist/extensions/forgecli/materialize.d.ts +16 -0
  50. package/dist/extensions/forgecli/materialize.js +195 -0
  51. package/dist/extensions/forgecli/materialize.js.map +1 -0
  52. package/dist/extensions/forgecli/migrate.d.ts +19 -0
  53. package/dist/extensions/forgecli/migrate.js +258 -0
  54. package/dist/extensions/forgecli/migrate.js.map +1 -0
  55. package/dist/extensions/forgecli/migration-engine.d.ts +111 -0
  56. package/dist/extensions/forgecli/migration-engine.js +533 -0
  57. package/dist/extensions/forgecli/migration-engine.js.map +1 -0
  58. package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
  59. package/dist/extensions/forgecli/quiz-agent.js +98 -0
  60. package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
  61. package/dist/extensions/forgecli/remove-command.d.ts +17 -0
  62. package/dist/extensions/forgecli/remove-command.js +124 -0
  63. package/dist/extensions/forgecli/remove-command.js.map +1 -0
  64. package/dist/extensions/forgecli/report-bug.d.ts +25 -0
  65. package/dist/extensions/forgecli/report-bug.js +159 -0
  66. package/dist/extensions/forgecli/report-bug.js.map +1 -0
  67. package/dist/extensions/forgecli/retrospective.d.ts +19 -0
  68. package/dist/extensions/forgecli/retrospective.js +156 -0
  69. package/dist/extensions/forgecli/retrospective.js.map +1 -0
  70. package/dist/extensions/forgecli/run-sprint.js +36 -3
  71. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  72. package/dist/extensions/forgecli/run-task.d.ts +9 -1
  73. package/dist/extensions/forgecli/run-task.js +66 -13
  74. package/dist/extensions/forgecli/run-task.js.map +1 -1
  75. package/dist/extensions/forgecli/session-registry.d.ts +40 -2
  76. package/dist/extensions/forgecli/session-registry.js +71 -1
  77. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  78. package/dist/extensions/forgecli/status-command.d.ts +19 -0
  79. package/dist/extensions/forgecli/status-command.js +140 -0
  80. package/dist/extensions/forgecli/status-command.js.map +1 -0
  81. package/dist/extensions/forgecli/store-query.d.ts +22 -0
  82. package/dist/extensions/forgecli/store-query.js +107 -0
  83. package/dist/extensions/forgecli/store-query.js.map +1 -0
  84. package/dist/extensions/forgecli/store-repair.d.ts +17 -0
  85. package/dist/extensions/forgecli/store-repair.js +123 -0
  86. package/dist/extensions/forgecli/store-repair.js.map +1 -0
  87. package/dist/extensions/forgecli/test-orchestrate.js +1 -0
  88. package/dist/extensions/forgecli/test-orchestrate.js.map +1 -1
  89. package/dist/extensions/forgecli/thread-switcher.js +286 -41
  90. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  91. package/dist/extensions/forgecli/transition-guard.js +7 -2
  92. package/dist/extensions/forgecli/transition-guard.js.map +1 -1
  93. package/dist/extensions/forgecli/update-tools.d.ts +23 -0
  94. package/dist/extensions/forgecli/update-tools.js +136 -0
  95. package/dist/extensions/forgecli/update-tools.js.map +1 -0
  96. package/dist/extensions/forgecli/viewport-events.js +10 -0
  97. package/dist/extensions/forgecli/viewport-events.js.map +1 -1
  98. package/dist/extensions/forgecli/viewport-renderer.d.ts +18 -0
  99. package/dist/extensions/forgecli/viewport-renderer.js +27 -0
  100. package/dist/extensions/forgecli/viewport-renderer.js.map +1 -1
  101. package/dist/extensions/forgecli/viewport-theme.js +4 -0
  102. package/dist/extensions/forgecli/viewport-theme.js.map +1 -1
  103. package/dist/extensions/forgecli/whats-new-widget.d.ts +13 -8
  104. package/dist/extensions/forgecli/whats-new-widget.js +111 -42
  105. package/dist/extensions/forgecli/whats-new-widget.js.map +1 -1
  106. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +29 -3
  107. package/dist/forge-payload/.base-pack/workflows/commit_task.md +15 -8
  108. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +327 -185
  109. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +18 -10
  110. package/dist/forge-payload/.base-pack/workflows/plan_task.md +15 -9
  111. package/dist/forge-payload/.base-pack/workflows/review_code.md +14 -6
  112. package/dist/forge-payload/.base-pack/workflows/review_plan.md +18 -10
  113. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  114. package/dist/forge-payload/.schemas/bug.schema.json +3 -2
  115. package/dist/forge-payload/.schemas/config.schema.json +83 -0
  116. package/dist/forge-payload/.schemas/migrations.json +2049 -0
  117. package/dist/forge-payload/commands/regenerate.md +17 -1
  118. package/dist/forge-payload/meta/personas/README.md +16 -0
  119. package/dist/forge-payload/meta/personas/meta-architect.md +70 -0
  120. package/dist/forge-payload/meta/personas/meta-bug-fixer.md +73 -0
  121. package/dist/forge-payload/meta/personas/meta-collator.md +72 -0
  122. package/dist/forge-payload/meta/personas/meta-engineer.md +70 -0
  123. package/dist/forge-payload/meta/personas/meta-orchestrator.md +71 -0
  124. package/dist/forge-payload/meta/personas/meta-product-manager.md +82 -0
  125. package/dist/forge-payload/meta/personas/meta-qa-engineer.md +91 -0
  126. package/dist/forge-payload/meta/personas/meta-supervisor.md +92 -0
  127. package/dist/forge-payload/meta/skill-recommendations.md +154 -0
  128. package/dist/forge-payload/meta/skills/meta-architect-skills.md +43 -0
  129. package/dist/forge-payload/meta/skills/meta-bug-fixer-skills.md +43 -0
  130. package/dist/forge-payload/meta/skills/meta-collator-skills.md +41 -0
  131. package/dist/forge-payload/meta/skills/meta-engineer-skills.md +43 -0
  132. package/dist/forge-payload/meta/skills/meta-generic-skills.md +58 -0
  133. package/dist/forge-payload/meta/skills/meta-qa-engineer-skills.md +46 -0
  134. package/dist/forge-payload/meta/skills/meta-supervisor-skills.md +43 -0
  135. package/dist/forge-payload/meta/store-schema/bug.schema.md +71 -0
  136. package/dist/forge-payload/meta/store-schema/event.schema.md +76 -0
  137. package/dist/forge-payload/meta/store-schema/feature.schema.md +65 -0
  138. package/dist/forge-payload/meta/store-schema/sprint.schema.md +64 -0
  139. package/dist/forge-payload/meta/store-schema/task.schema.md +78 -0
  140. package/dist/forge-payload/meta/templates/meta-code-review.md +26 -0
  141. package/dist/forge-payload/meta/templates/meta-plan-review.md +28 -0
  142. package/dist/forge-payload/meta/templates/meta-plan.md +28 -0
  143. package/dist/forge-payload/meta/templates/meta-progress.md +25 -0
  144. package/dist/forge-payload/meta/templates/meta-retrospective.md +28 -0
  145. package/dist/forge-payload/meta/templates/meta-sprint-manifest.md +26 -0
  146. package/dist/forge-payload/meta/templates/meta-sprint-requirements.md +91 -0
  147. package/dist/forge-payload/meta/templates/meta-task-prompt.md +26 -0
  148. package/dist/forge-payload/meta/tool-specs/collate.spec.md +88 -0
  149. package/dist/forge-payload/meta/tool-specs/generation-manifest.spec.md +139 -0
  150. package/dist/forge-payload/meta/tool-specs/manage-config.spec.md +143 -0
  151. package/dist/forge-payload/meta/tool-specs/seed-store.spec.md +91 -0
  152. package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +328 -0
  153. package/dist/forge-payload/meta/tool-specs/validate-store.spec.md +191 -0
  154. package/dist/forge-payload/meta/workflows/_fragments/context-injection.md +75 -0
  155. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +73 -0
  156. package/dist/forge-payload/meta/workflows/_fragments/finalize.md +13 -0
  157. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +73 -0
  158. package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +38 -0
  159. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +39 -0
  160. package/dist/forge-payload/meta/workflows/meta-approve.md +119 -0
  161. package/dist/forge-payload/meta/workflows/meta-collate.md +89 -0
  162. package/dist/forge-payload/meta/workflows/meta-commit.md +93 -0
  163. package/dist/forge-payload/meta/workflows/meta-enhance.md +286 -0
  164. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +501 -0
  165. package/dist/forge-payload/meta/workflows/meta-implement.md +132 -0
  166. package/dist/forge-payload/meta/workflows/meta-migrate.md +455 -0
  167. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +993 -0
  168. package/dist/forge-payload/meta/workflows/meta-plan-task.md +133 -0
  169. package/dist/forge-payload/meta/workflows/meta-quiz-agent.md +135 -0
  170. package/dist/forge-payload/meta/workflows/meta-retrospective.md +65 -0
  171. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +119 -0
  172. package/dist/forge-payload/meta/workflows/meta-review-plan.md +108 -0
  173. package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +65 -0
  174. package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +76 -0
  175. package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +147 -0
  176. package/dist/forge-payload/meta/workflows/meta-update-implementation.md +76 -0
  177. package/dist/forge-payload/meta/workflows/meta-update-plan.md +76 -0
  178. package/dist/forge-payload/meta/workflows/meta-validate.md +111 -0
  179. package/dist/forge-payload/tools/check-structure.cjs +344 -0
  180. package/dist/forge-payload/tools/collate.cjs +34 -9
  181. package/dist/forge-payload/tools/list-skills.js +76 -0
  182. package/dist/forge-payload/tools/parse-gates.cjs +8 -2
  183. package/dist/forge-payload/tools/store-cli.cjs +56 -11
  184. package/dist/forge-payload/tools/store.cjs +61 -0
  185. package/dist/forge-payload/tools/substitute-placeholders.cjs +60 -8
  186. package/dist/forge-payload/tools/validate-store.cjs +6 -2
  187. package/dist/forge-payload/tools/verify-integrity.cjs +86 -0
  188. package/package.json +2 -2
@@ -30,6 +30,9 @@ export class SessionRegistry extends EventEmitter {
30
30
  // Resume — refresh status, keep prior events for visibility.
31
31
  existing.status = "running";
32
32
  existing.updatedAt = now;
33
+ // Re-create AbortController on resume (previous one was from a
34
+ // prior run that may have been aborted or completed).
35
+ existing.abortController = new AbortController();
33
36
  }
34
37
  else {
35
38
  this.sessions.set(taskId, {
@@ -39,6 +42,7 @@ export class SessionRegistry extends EventEmitter {
39
42
  status: "running",
40
43
  phases: [],
41
44
  events: [],
45
+ abortController: new AbortController(),
42
46
  });
43
47
  this.evictIfNeeded();
44
48
  }
@@ -128,10 +132,13 @@ export class SessionRegistry extends EventEmitter {
128
132
  // it again. This lets every early-return path in run-task.ts blindly
129
133
  // call completeSession("failed") without clobbering the success-path's
130
134
  // prior "completed" mark.
131
- if (s.status !== "running")
135
+ // "cancelling" is treated as non-terminal here — the phase loop will
136
+ // call confirmCancelled() to transition it to "cancelled".
137
+ if (s.status !== "running" && s.status !== "cancelling")
132
138
  return;
133
139
  s.status = status;
134
140
  s.currentPhaseRole = undefined;
141
+ s.abortController = undefined; // clear on any terminal transition
135
142
  s.updatedAt = Date.now();
136
143
  this.emit("change", taskId);
137
144
  }
@@ -140,6 +147,50 @@ export class SessionRegistry extends EventEmitter {
140
147
  s.events.splice(0, s.events.length - MAX_EVENTS_PER_SESSION);
141
148
  }
142
149
  }
150
+ /**
151
+ * Request cancellation of a running session. Transitions status to
152
+ * "cancelling" and fires the session's AbortController.abort().
153
+ * Returns false if session not found or already terminal.
154
+ */
155
+ requestCancel(taskId) {
156
+ const s = this.sessions.get(taskId);
157
+ if (!s)
158
+ return false;
159
+ // Only running sessions can be cancelled.
160
+ if (s.status !== "running")
161
+ return false;
162
+ s.status = "cancelling";
163
+ s.abortController?.abort();
164
+ s.updatedAt = Date.now();
165
+ this.emit("change", taskId);
166
+ return true;
167
+ }
168
+ /**
169
+ * Confirm that cancellation has fully unwound. Called by the orchestrator
170
+ * after abort is detected and the pipeline exits. Transitions
171
+ * "cancelling" → "cancelled".
172
+ */
173
+ confirmCancelled(taskId) {
174
+ const s = this.sessions.get(taskId);
175
+ if (!s)
176
+ return;
177
+ if (s.status !== "cancelling")
178
+ return;
179
+ s.status = "cancelled";
180
+ s.currentPhaseRole = undefined;
181
+ s.abortController = undefined;
182
+ s.updatedAt = Date.now();
183
+ this.emit("change", taskId);
184
+ }
185
+ /**
186
+ * Convenience accessor — returns the AbortSignal from the session's
187
+ * AbortController, or undefined if the session doesn't exist or has
188
+ * no controller.
189
+ */
190
+ getAbortSignal(taskId) {
191
+ const s = this.sessions.get(taskId);
192
+ return s?.abortController?.signal;
193
+ }
143
194
  // ── Per-phase tail buffer + unread tracking ──────────────────────────────
144
195
  //
145
196
  // These feed the thread-switcher widget. They are decoupled from the
@@ -216,6 +267,25 @@ export class SessionRegistry extends EventEmitter {
216
267
  this.emit("tail", { taskId, phaseRole });
217
268
  this.emit("change", taskId);
218
269
  }
270
+ setPhaseModel(taskId, phaseRole, modelInfo) {
271
+ const p = this.findPhase(taskId, phaseRole);
272
+ if (!p)
273
+ return;
274
+ // Only emit when the value actually changes — turn_end fires every
275
+ // turn and the (provider, model) is stable across the phase, so this
276
+ // keeps the tail re-render fan-out quiet.
277
+ const nextProvider = modelInfo.provider ?? p.provider;
278
+ const nextModel = modelInfo.model ?? p.model;
279
+ if (nextProvider === p.provider && nextModel === p.model)
280
+ return;
281
+ p.provider = nextProvider;
282
+ p.model = nextModel;
283
+ const s = this.sessions.get(taskId);
284
+ if (s)
285
+ s.updatedAt = Date.now();
286
+ this.emit("tail", { taskId, phaseRole });
287
+ this.emit("change", taskId);
288
+ }
219
289
  appendTail(taskId, phaseRole, line, opts) {
220
290
  const p = this.findPhase(taskId, phaseRole);
221
291
  if (!p)
@@ -1 +1 @@
1
- {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/session-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/session-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface StatusResult {
3
+ lines: string[];
4
+ hasActiveSprint: boolean;
5
+ }
6
+ /**
7
+ * Read active sprint and its tasks from store-cli.
8
+ * Returns formatted text lines for display via ctx.ui.notify.
9
+ * Exported so orchestrators can call directly without going through sendUserMessage.
10
+ */
11
+ export declare function runStatus(forgeRoot: string, cwd: string): Promise<StatusResult>;
12
+ /**
13
+ * Register /forge:status (v0 native handler).
14
+ * forgeRoot is nullable — null means we're outside a Forge project.
15
+ */
16
+ export declare function registerStatusCommand(pi: ExtensionAPI, opts: {
17
+ forgeRoot: string | null;
18
+ }): void;
19
+ export declare function readForgeRootFromConfig(cwd: string): string | null;
@@ -0,0 +1,140 @@
1
+ // status-command.ts — native v0 handler for /forge:status (FORGE-S23-T10)
2
+ //
3
+ // Replaces the delegateMarkdownCommand stub that previously lived in forge-commands.ts.
4
+ // Reads the active sprint from store and lists tasks with their statuses.
5
+ // No TUI — text-only widget via ctx.ui.notify.
6
+ //
7
+ // Archetype: Atomic (no LLM in loop — pack-04 §Atomic).
8
+ // Iron Laws:
9
+ // IL1 — new code lives in forge-cli/ only
10
+ // IL6 — no shell-string interpolation (argv-array throughout)
11
+ // IL7 — silent continuation past failures is never acceptable
12
+ import { execFile } from "node:child_process";
13
+ import * as fs from "node:fs";
14
+ import * as path from "node:path";
15
+ import { promisify } from "node:util";
16
+ import { resolveToolDir } from "./store-resolver.js";
17
+ const execFileAsync = promisify(execFile);
18
+ /**
19
+ * Read active sprint and its tasks from store-cli.
20
+ * Returns formatted text lines for display via ctx.ui.notify.
21
+ * Exported so orchestrators can call directly without going through sendUserMessage.
22
+ */
23
+ export async function runStatus(forgeRoot, cwd) {
24
+ const toolDir = resolveToolDir(forgeRoot);
25
+ const storeCliPath = path.join(toolDir, "store-cli.cjs");
26
+ // Step 1: list all sprints
27
+ let listResult;
28
+ try {
29
+ const out = await execFileAsync("node", [storeCliPath, "query", "--list-sprints"], {
30
+ cwd,
31
+ encoding: "utf8",
32
+ timeout: 10_000,
33
+ });
34
+ listResult = JSON.parse(out.stdout);
35
+ }
36
+ catch (err) {
37
+ const msg = err instanceof Error ? err.message : String(err);
38
+ return {
39
+ lines: [`× forge:status — could not list sprints: ${msg}`],
40
+ hasActiveSprint: false,
41
+ };
42
+ }
43
+ // Step 2: filter active sprints, sort by ID descending (proxy for recency)
44
+ const activeSprints = (listResult.results ?? [])
45
+ .filter((s) => s.status === "active")
46
+ .sort((a, b) => b.id.localeCompare(a.id));
47
+ if (activeSprints.length === 0) {
48
+ return {
49
+ lines: [
50
+ "forge:status — No active sprint found.",
51
+ 'Run /forge:init to initialise a project, or check your store with /forge:store-query "--list-sprints".',
52
+ ],
53
+ hasActiveSprint: false,
54
+ };
55
+ }
56
+ // Use the most recent active sprint
57
+ const sprint = activeSprints[0];
58
+ // Step 3: fetch tasks for this sprint
59
+ let sprintResult;
60
+ try {
61
+ const out = await execFileAsync("node", [storeCliPath, "query", "--sprint", sprint.id], {
62
+ cwd,
63
+ encoding: "utf8",
64
+ timeout: 10_000,
65
+ });
66
+ sprintResult = JSON.parse(out.stdout);
67
+ }
68
+ catch (err) {
69
+ const msg = err instanceof Error ? err.message : String(err);
70
+ return {
71
+ lines: [`× forge:status — could not fetch tasks for sprint ${sprint.id}: ${msg}`],
72
+ hasActiveSprint: true,
73
+ };
74
+ }
75
+ const tasks = sprintResult.results ?? [];
76
+ // Step 4: format output
77
+ const lines = [
78
+ `Sprint: ${sprint.id}${sprint.title ? ` — ${sprint.title}` : ""}`,
79
+ `Tasks: ${tasks.length}`,
80
+ "",
81
+ ];
82
+ if (tasks.length === 0) {
83
+ lines.push(" (no tasks found)");
84
+ }
85
+ else {
86
+ for (const task of tasks) {
87
+ const status = task.status ?? "unknown";
88
+ const title = task.title ? ` — ${task.title.slice(0, 60)}` : "";
89
+ lines.push(` ${task.id} [${status}]${title}`);
90
+ }
91
+ }
92
+ if (activeSprints.length > 1) {
93
+ lines.push("");
94
+ lines.push(` Note: ${activeSprints.length - 1} other active sprint(s) found. Showing most recent (${sprint.id}).`);
95
+ }
96
+ return { lines, hasActiveSprint: true };
97
+ }
98
+ // ── Register ─────────────────────────────────────────────────────────────────
99
+ /**
100
+ * Register /forge:status (v0 native handler).
101
+ * forgeRoot is nullable — null means we're outside a Forge project.
102
+ */
103
+ export function registerStatusCommand(pi, opts) {
104
+ pi.registerCommand("forge:status", {
105
+ description: "Sprint and task summary widget — lists active sprint and task statuses.",
106
+ async handler(_args, ctx) {
107
+ const cwd = process.cwd();
108
+ // Outside-project guard
109
+ if (!opts.forgeRoot) {
110
+ ctx.ui.notify("× forge:status — not inside a Forge project. Run /forge:init first.", "error");
111
+ return;
112
+ }
113
+ ctx.ui.setStatus?.("forge:status", "Loading sprint status…");
114
+ const result = await runStatus(opts.forgeRoot, cwd);
115
+ ctx.ui.setStatus?.("forge:status", undefined);
116
+ for (const line of result.lines) {
117
+ const severity = line.startsWith("×") ? "error" : "info";
118
+ ctx.ui.notify(line, severity);
119
+ }
120
+ },
121
+ });
122
+ }
123
+ // ── Outside-project config guard helper ──────────────────────────────────────
124
+ // Not used above because forgeRoot is passed in at register time, but exported
125
+ // for use in tests that need to verify the guard path.
126
+ export function readForgeRootFromConfig(cwd) {
127
+ try {
128
+ const configPath = path.join(cwd, ".forge", "config.json");
129
+ const raw = fs.readFileSync(configPath, "utf8");
130
+ const cfg = JSON.parse(raw);
131
+ const paths = cfg.paths;
132
+ if (paths && typeof paths.forgeRoot === "string")
133
+ return paths.forgeRoot;
134
+ }
135
+ catch {
136
+ // fall through
137
+ }
138
+ return null;
139
+ }
140
+ //# sourceMappingURL=status-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/status-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface StoreQueryResult {
3
+ stdout: string;
4
+ ok: boolean;
5
+ errorMessage?: string;
6
+ }
7
+ /**
8
+ * Run store-cli in query or nlp mode.
9
+ * - Args starting with "--" → query branch: `store-cli query ...flags`
10
+ * - Otherwise → nlp branch: `store-cli nlp "<args>"`
11
+ *
12
+ * Returns raw stdout for display. Does NOT JSON-parse — caller renders as-is.
13
+ * Exported so orchestrators can call directly without going through sendUserMessage.
14
+ */
15
+ export declare function runStoreQuery(args: string, forgeRoot: string, cwd: string): Promise<StoreQueryResult>;
16
+ /**
17
+ * Register /forge:store-query.
18
+ * forgeRoot is nullable — null means we're outside a Forge project.
19
+ */
20
+ export declare function registerStoreQuery(pi: ExtensionAPI, opts: {
21
+ forgeRoot: string | null;
22
+ }): void;
@@ -0,0 +1,107 @@
1
+ // store-query.ts — native atomic handler for /forge:store-query (FORGE-S23-T10)
2
+ //
3
+ // Dispatches to store-cli query (flags path) or store-cli nlp (intent path)
4
+ // and emits raw stdout via ctx.ui.notify.
5
+ //
6
+ // Archetype: Atomic (no LLM in loop — pack-04 §Atomic).
7
+ // Iron Laws:
8
+ // IL1 — new code lives in forge-cli/ only
9
+ // IL6 — no shell-string interpolation (argv-array throughout)
10
+ // IL7 — silent continuation past failures is never acceptable
11
+ import { execFile } from "node:child_process";
12
+ import * as path from "node:path";
13
+ import { promisify } from "node:util";
14
+ import { resolveToolDir } from "./store-resolver.js";
15
+ const execFileAsync = promisify(execFile);
16
+ // ── Usage message ─────────────────────────────────────────────────────────────
17
+ const USAGE = `Usage: /forge:store-query <intent or flags>
18
+
19
+ Examples:
20
+ /forge:store-query open bugs in S12
21
+ /forge:store-query FORGE-BUG-047
22
+ /forge:store-query --sprint FORGE-S12 --status in-progress
23
+ /forge:store-query --keyword auth
24
+ /forge:store-query schema`;
25
+ /**
26
+ * Run store-cli in query or nlp mode.
27
+ * - Args starting with "--" → query branch: `store-cli query ...flags`
28
+ * - Otherwise → nlp branch: `store-cli nlp "<args>"`
29
+ *
30
+ * Returns raw stdout for display. Does NOT JSON-parse — caller renders as-is.
31
+ * Exported so orchestrators can call directly without going through sendUserMessage.
32
+ */
33
+ export async function runStoreQuery(args, forgeRoot, cwd) {
34
+ const trimmed = args.trim();
35
+ const toolDir = resolveToolDir(forgeRoot);
36
+ const storeCliPath = path.join(toolDir, "store-cli.cjs");
37
+ let argv;
38
+ let timeoutMs;
39
+ if (trimmed.startsWith("--")) {
40
+ // Query branch: pass flags verbatim as argv tokens
41
+ const tokens = trimmed.split(/\s+/).filter(Boolean);
42
+ argv = ["query", ...tokens];
43
+ timeoutMs = 10_000;
44
+ }
45
+ else {
46
+ // NLP branch: pass entire trimmed arg string as single argument
47
+ argv = ["nlp", trimmed];
48
+ timeoutMs = 30_000;
49
+ }
50
+ try {
51
+ const result = await execFileAsync("node", [storeCliPath, ...argv], {
52
+ cwd,
53
+ encoding: "utf8",
54
+ timeout: timeoutMs,
55
+ });
56
+ return { stdout: result.stdout, ok: true };
57
+ }
58
+ catch (err) {
59
+ const e = err;
60
+ // execFile rejects on non-zero exit; stdout may still contain partial results
61
+ const stderr = e.stderr || e.message || String(err);
62
+ const stdout = e.stdout || "";
63
+ return {
64
+ stdout,
65
+ ok: false,
66
+ errorMessage: stderr.slice(0, 500),
67
+ };
68
+ }
69
+ }
70
+ // ── Register ─────────────────────────────────────────────────────────────────
71
+ /**
72
+ * Register /forge:store-query.
73
+ * forgeRoot is nullable — null means we're outside a Forge project.
74
+ */
75
+ export function registerStoreQuery(pi, opts) {
76
+ pi.registerCommand("forge:store-query", {
77
+ description: "Query the Forge store by natural language or exact flags. " +
78
+ "Use flags (--sprint, --task, --keyword) for exact queries; " +
79
+ "use plain text for NLP intent queries.",
80
+ async handler(args, ctx) {
81
+ const cwd = process.cwd();
82
+ // Outside-project guard
83
+ if (!opts.forgeRoot) {
84
+ ctx.ui.notify("× forge:store-query — not inside a Forge project. Run /forge:init first.", "error");
85
+ return;
86
+ }
87
+ const trimmed = args.trim();
88
+ if (!trimmed) {
89
+ ctx.ui.notify(USAGE, "info");
90
+ return;
91
+ }
92
+ ctx.ui.setStatus?.("forge:store-query", "Querying store…");
93
+ const result = await runStoreQuery(trimmed, opts.forgeRoot, cwd);
94
+ ctx.ui.setStatus?.("forge:store-query", undefined);
95
+ if (!result.ok && result.errorMessage) {
96
+ ctx.ui.notify(`× forge:store-query — ${result.errorMessage}`, "error");
97
+ // Still show partial stdout if available
98
+ if (result.stdout.trim()) {
99
+ ctx.ui.notify(result.stdout.trim(), "info");
100
+ }
101
+ return;
102
+ }
103
+ ctx.ui.notify(result.stdout.trim() || "(no results)", "info");
104
+ },
105
+ });
106
+ }
107
+ //# sourceMappingURL=store-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-query.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/store-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface ParsedStoreRepairArgs {
3
+ dryRun: boolean;
4
+ seed: string;
5
+ sourceLabel: string;
6
+ }
7
+ export declare function parseStoreRepairArgs(rawArgs: string, cwd: string): ParsedStoreRepairArgs;
8
+ export interface ComposeStoreRepairKickoffOpts {
9
+ commandMd: string;
10
+ parsed: ParsedStoreRepairArgs;
11
+ }
12
+ export declare function composeStoreRepairKickoff(opts: ComposeStoreRepairKickoffOpts): string;
13
+ export interface RegisterStoreRepairOptions {
14
+ forgeRoot: string | null;
15
+ cwd?: string;
16
+ }
17
+ export declare function registerStoreRepair(pi: ExtensionAPI, options: RegisterStoreRepairOptions): void;
@@ -0,0 +1,123 @@
1
+ // forge:store-repair — native kickoff handler (FORGE-S23-T11).
2
+ //
3
+ // Replaces the auto-generated stub previously installed by
4
+ // registerAllForgeCommands (forge-commands.ts). Kickoff Shim archetype
5
+ // (Pack-04 + Pack-06): single LLM handoff in current context, no fork.
6
+ //
7
+ // --dry-run flag is forwarded in the kickoff body so the LLM calls
8
+ // validate-store --dry-run and skips write phases accordingly.
9
+ //
10
+ // Workflow source: <forgeRoot>/commands/store-repair.md (command file).
11
+ // File-existence check only — command files lack Pack-06 workflow markers.
12
+ //
13
+ // Iron Laws:
14
+ // IL1 — code only under forge-cli/src/extensions/forgecli/.
15
+ // IL4 — no JSON.stringify-into-subagent dispatch.
16
+ // IL6 — no shell-string interpolation; no spawn calls here.
17
+ // IL7 — every failure path emits ctx.ui.notify and returns; no silent
18
+ // continuation.
19
+ import * as fs from "node:fs";
20
+ import * as path from "node:path";
21
+ import { sendKickoff } from "./kickoff.js";
22
+ export function parseStoreRepairArgs(rawArgs, cwd) {
23
+ const trimmed = (rawArgs ?? "").trim();
24
+ const result = {
25
+ dryRun: false,
26
+ seed: "",
27
+ sourceLabel: "",
28
+ };
29
+ if (!trimmed) {
30
+ result.sourceLabel = "(no args — full repair run)";
31
+ return result;
32
+ }
33
+ const tokens = trimmed.split(/\s+/);
34
+ const remaining = [];
35
+ for (const tok of tokens) {
36
+ if (tok === "--dry-run") {
37
+ result.dryRun = true;
38
+ }
39
+ else {
40
+ remaining.push(tok);
41
+ }
42
+ }
43
+ const tail = remaining.join(" ").trim();
44
+ if (tail.startsWith("@")) {
45
+ const ref = tail.slice(1).trim();
46
+ const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
47
+ result.seed = fs.readFileSync(filePath, "utf8");
48
+ result.sourceLabel = `(seed from file: ${ref})`;
49
+ }
50
+ else if (tail) {
51
+ result.seed = tail;
52
+ result.sourceLabel = "(seed from inline text)";
53
+ }
54
+ else {
55
+ result.sourceLabel = result.dryRun ? "(--dry-run mode)" : "(no args — full repair run)";
56
+ }
57
+ return result;
58
+ }
59
+ export function composeStoreRepairKickoff(opts) {
60
+ const { commandMd, parsed } = opts;
61
+ const sections = ["# /forge:store-repair", ""];
62
+ sections.push("## Dispatch", "");
63
+ sections.push("Diagnose and repair the Forge JSON store. Run the repair workflow below. Specifically:");
64
+ sections.push("");
65
+ if (parsed.dryRun) {
66
+ sections.push("**`--dry-run` mode.** Preview all repairs without writing anything. " +
67
+ "In Phase 2 (LLM repair) and Phase 3 (final validation), show what would change but skip all writes. " +
68
+ "Skip Phase 4 verification (nothing changed).");
69
+ }
70
+ else {
71
+ sections.push("Full repair mode: diagnose, propose fixes, apply approved repairs, verify.");
72
+ }
73
+ sections.push("", "Use `forge_store` for all store reads and writes (never raw file writes to `.forge/store/`).");
74
+ sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
75
+ if (parsed.seed) {
76
+ sections.push("", `## Additional Context — ${parsed.sourceLabel}`, "", parsed.seed.trim());
77
+ }
78
+ return sections.join("\n");
79
+ }
80
+ // ── Registration ──────────────────────────────────────────────────────────
81
+ const COMMAND_NAME = "store-repair";
82
+ export function registerStoreRepair(pi, options) {
83
+ pi.registerCommand("forge:store-repair", {
84
+ description: "Diagnose and repair corrupted Forge store records. " +
85
+ "Usage: /forge:store-repair [--dry-run]. " +
86
+ "--dry-run shows what would be repaired without making changes.",
87
+ async handler(args, ctx) {
88
+ const { forgeRoot } = options;
89
+ const cwd = options.cwd ?? process.cwd();
90
+ if (!forgeRoot) {
91
+ ctx.ui.notify("× forge:store-repair — no Forge project at cwd; run /forge:init to bootstrap", "warning");
92
+ return;
93
+ }
94
+ const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
95
+ let commandMd;
96
+ try {
97
+ commandMd = fs.readFileSync(commandPath, "utf8");
98
+ }
99
+ catch (err) {
100
+ const e = err;
101
+ if (e.code === "ENOENT") {
102
+ ctx.ui.notify(`× forge:store-repair — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:regenerate first.`, "error");
103
+ }
104
+ else {
105
+ ctx.ui.notify(`× forge:store-repair — failed to read command file: ${e.message ?? "unknown error"}`, "error");
106
+ }
107
+ return;
108
+ }
109
+ let parsed;
110
+ try {
111
+ parsed = parseStoreRepairArgs(args, cwd);
112
+ }
113
+ catch (err) {
114
+ const e = err;
115
+ ctx.ui.notify(`× forge:store-repair — failed to parse args: ${e.message ?? "unknown"}`, "error");
116
+ return;
117
+ }
118
+ const kickoff = composeStoreRepairKickoff({ commandMd, parsed });
119
+ sendKickoff(pi, kickoff);
120
+ },
121
+ });
122
+ }
123
+ //# sourceMappingURL=store-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-repair.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/store-repair.ts"],"names":[],"mappings":"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"}
@@ -96,6 +96,7 @@ export function registerTestOrchestrate(pi) {
96
96
  task: parsed.text,
97
97
  cwd,
98
98
  signal: ac.signal,
99
+ modelRegistry: ctx.modelRegistry,
99
100
  onEvent: (event) => {
100
101
  switch (event.type) {
101
102
  case "agent_start":