@entelligentsia/forgecli 1.0.21 → 1.0.25

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 (232) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/CHANGELOG-forge-plugin.md +118 -0
  3. package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
  4. package/dist/extensions/forgecli/forge-tools.js +73 -0
  5. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  6. package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
  7. package/dist/extensions/forgecli/lib/forge-root.js +14 -1
  8. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
  9. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
  10. package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
  11. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  12. package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
  13. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  14. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
  15. package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
  16. package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
  17. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
  18. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
  19. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
  20. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  21. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  22. package/dist/forge-payload/.schemas/event.schema.json +8 -3
  23. package/dist/forge-payload/.schemas/migrations.json +56 -0
  24. package/dist/forge-payload/integrity.json +3 -3
  25. package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
  26. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
  27. package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
  28. package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
  29. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
  30. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
  31. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
  32. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  33. package/dist/forge-payload/schemas/event.schema.json +8 -3
  34. package/dist/forge-payload/schemas/structure-manifest.json +4 -2
  35. package/dist/forge-payload/tools/commit-task.cjs +218 -0
  36. package/dist/forge-payload/tools/store-cli.cjs +6 -1
  37. package/node_modules/@mariozechner/clipboard/package.json +2 -1
  38. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
  39. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
  40. package/package.json +2 -2
  41. package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
  42. package/dist/extensions/forgecli/add-pipeline.js +0 -143
  43. package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
  44. package/dist/extensions/forgecli/add-task.d.ts +0 -20
  45. package/dist/extensions/forgecli/add-task.js +0 -154
  46. package/dist/extensions/forgecli/add-task.js.map +0 -1
  47. package/dist/extensions/forgecli/approve.d.ts +0 -22
  48. package/dist/extensions/forgecli/approve.js +0 -152
  49. package/dist/extensions/forgecli/approve.js.map +0 -1
  50. package/dist/extensions/forgecli/banner.d.ts +0 -10
  51. package/dist/extensions/forgecli/banner.js +0 -36
  52. package/dist/extensions/forgecli/banner.js.map +0 -1
  53. package/dist/extensions/forgecli/calibrate.d.ts +0 -64
  54. package/dist/extensions/forgecli/calibrate.js +0 -481
  55. package/dist/extensions/forgecli/calibrate.js.map +0 -1
  56. package/dist/extensions/forgecli/collate.d.ts +0 -22
  57. package/dist/extensions/forgecli/collate.js +0 -134
  58. package/dist/extensions/forgecli/collate.js.map +0 -1
  59. package/dist/extensions/forgecli/commit.d.ts +0 -22
  60. package/dist/extensions/forgecli/commit.js +0 -152
  61. package/dist/extensions/forgecli/commit.js.map +0 -1
  62. package/dist/extensions/forgecli/config-command.d.ts +0 -8
  63. package/dist/extensions/forgecli/config-command.js +0 -67
  64. package/dist/extensions/forgecli/config-command.js.map +0 -1
  65. package/dist/extensions/forgecli/config-layer.d.ts +0 -53
  66. package/dist/extensions/forgecli/config-layer.js +0 -72
  67. package/dist/extensions/forgecli/config-layer.js.map +0 -1
  68. package/dist/extensions/forgecli/config-writer.d.ts +0 -16
  69. package/dist/extensions/forgecli/config-writer.js +0 -69
  70. package/dist/extensions/forgecli/config-writer.js.map +0 -1
  71. package/dist/extensions/forgecli/enhance.d.ts +0 -27
  72. package/dist/extensions/forgecli/enhance.js +0 -199
  73. package/dist/extensions/forgecli/enhance.js.map +0 -1
  74. package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
  75. package/dist/extensions/forgecli/fix-bug.js +0 -1580
  76. package/dist/extensions/forgecli/fix-bug.js.map +0 -1
  77. package/dist/extensions/forgecli/forge-header.d.ts +0 -12
  78. package/dist/extensions/forgecli/forge-header.js +0 -114
  79. package/dist/extensions/forgecli/forge-header.js.map +0 -1
  80. package/dist/extensions/forgecli/forge-init.d.ts +0 -26
  81. package/dist/extensions/forgecli/forge-init.js +0 -514
  82. package/dist/extensions/forgecli/forge-init.js.map +0 -1
  83. package/dist/extensions/forgecli/forge-root.d.ts +0 -10
  84. package/dist/extensions/forgecli/forge-root.js +0 -62
  85. package/dist/extensions/forgecli/forge-root.js.map +0 -1
  86. package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
  87. package/dist/extensions/forgecli/forge-update-command.js +0 -435
  88. package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
  89. package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
  90. package/dist/extensions/forgecli/friction-emit.js +0 -245
  91. package/dist/extensions/forgecli/friction-emit.js.map +0 -1
  92. package/dist/extensions/forgecli/implement.d.ts +0 -22
  93. package/dist/extensions/forgecli/implement.js +0 -170
  94. package/dist/extensions/forgecli/implement.js.map +0 -1
  95. package/dist/extensions/forgecli/init-context.d.ts +0 -99
  96. package/dist/extensions/forgecli/init-context.js +0 -178
  97. package/dist/extensions/forgecli/init-context.js.map +0 -1
  98. package/dist/extensions/forgecli/init-progress.d.ts +0 -39
  99. package/dist/extensions/forgecli/init-progress.js +0 -117
  100. package/dist/extensions/forgecli/init-progress.js.map +0 -1
  101. package/dist/extensions/forgecli/input-router.d.ts +0 -33
  102. package/dist/extensions/forgecli/input-router.js +0 -136
  103. package/dist/extensions/forgecli/input-router.js.map +0 -1
  104. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
  105. package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
  106. package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
  107. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
  108. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
  109. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
  110. package/dist/extensions/forgecli/materialize.d.ts +0 -16
  111. package/dist/extensions/forgecli/materialize.js +0 -195
  112. package/dist/extensions/forgecli/materialize.js.map +0 -1
  113. package/dist/extensions/forgecli/migrate.d.ts +0 -22
  114. package/dist/extensions/forgecli/migrate.js +0 -260
  115. package/dist/extensions/forgecli/migrate.js.map +0 -1
  116. package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
  117. package/dist/extensions/forgecli/migration-engine.js +0 -563
  118. package/dist/extensions/forgecli/migration-engine.js.map +0 -1
  119. package/dist/extensions/forgecli/model-registry.d.ts +0 -61
  120. package/dist/extensions/forgecli/model-registry.js +0 -127
  121. package/dist/extensions/forgecli/model-registry.js.map +0 -1
  122. package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
  123. package/dist/extensions/forgecli/model-resolver.js +0 -65
  124. package/dist/extensions/forgecli/model-resolver.js.map +0 -1
  125. package/dist/extensions/forgecli/model-validator.d.ts +0 -29
  126. package/dist/extensions/forgecli/model-validator.js +0 -107
  127. package/dist/extensions/forgecli/model-validator.js.map +0 -1
  128. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
  129. package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
  130. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
  131. package/dist/extensions/forgecli/plan.d.ts +0 -22
  132. package/dist/extensions/forgecli/plan.js +0 -167
  133. package/dist/extensions/forgecli/plan.js.map +0 -1
  134. package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
  135. package/dist/extensions/forgecli/quiz-agent.js +0 -98
  136. package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
  137. package/dist/extensions/forgecli/read-command.d.ts +0 -2
  138. package/dist/extensions/forgecli/read-command.js +0 -100
  139. package/dist/extensions/forgecli/read-command.js.map +0 -1
  140. package/dist/extensions/forgecli/regenerate.d.ts +0 -40
  141. package/dist/extensions/forgecli/regenerate.js +0 -438
  142. package/dist/extensions/forgecli/regenerate.js.map +0 -1
  143. package/dist/extensions/forgecli/remove-command.d.ts +0 -17
  144. package/dist/extensions/forgecli/remove-command.js +0 -124
  145. package/dist/extensions/forgecli/remove-command.js.map +0 -1
  146. package/dist/extensions/forgecli/report-bug.d.ts +0 -25
  147. package/dist/extensions/forgecli/report-bug.js +0 -159
  148. package/dist/extensions/forgecli/report-bug.js.map +0 -1
  149. package/dist/extensions/forgecli/retrospective.d.ts +0 -20
  150. package/dist/extensions/forgecli/retrospective.js +0 -126
  151. package/dist/extensions/forgecli/retrospective.js.map +0 -1
  152. package/dist/extensions/forgecli/review-code.d.ts +0 -35
  153. package/dist/extensions/forgecli/review-code.js +0 -196
  154. package/dist/extensions/forgecli/review-code.js.map +0 -1
  155. package/dist/extensions/forgecli/review-plan.d.ts +0 -35
  156. package/dist/extensions/forgecli/review-plan.js +0 -200
  157. package/dist/extensions/forgecli/review-plan.js.map +0 -1
  158. package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
  159. package/dist/extensions/forgecli/run-sprint.js +0 -716
  160. package/dist/extensions/forgecli/run-sprint.js.map +0 -1
  161. package/dist/extensions/forgecli/run-task.d.ts +0 -204
  162. package/dist/extensions/forgecli/run-task.js +0 -1403
  163. package/dist/extensions/forgecli/run-task.js.map +0 -1
  164. package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
  165. package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
  166. package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
  167. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
  168. package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
  169. package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
  170. package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
  171. package/dist/extensions/forgecli/skill-retriever.js +0 -246
  172. package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
  173. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
  174. package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
  175. package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
  176. package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
  177. package/dist/extensions/forgecli/sprint-intake.js +0 -91
  178. package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
  179. package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
  180. package/dist/extensions/forgecli/sprint-plan.js +0 -122
  181. package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
  182. package/dist/extensions/forgecli/status-command.d.ts +0 -19
  183. package/dist/extensions/forgecli/status-command.js +0 -140
  184. package/dist/extensions/forgecli/status-command.js.map +0 -1
  185. package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
  186. package/dist/extensions/forgecli/store-error-remediation.js +0 -307
  187. package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
  188. package/dist/extensions/forgecli/store-query.d.ts +0 -22
  189. package/dist/extensions/forgecli/store-query.js +0 -107
  190. package/dist/extensions/forgecli/store-query.js.map +0 -1
  191. package/dist/extensions/forgecli/store-repair.d.ts +0 -17
  192. package/dist/extensions/forgecli/store-repair.js +0 -123
  193. package/dist/extensions/forgecli/store-repair.js.map +0 -1
  194. package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
  195. package/dist/extensions/forgecli/store-resolver.js +0 -263
  196. package/dist/extensions/forgecli/store-resolver.js.map +0 -1
  197. package/dist/extensions/forgecli/store-validator.d.ts +0 -16
  198. package/dist/extensions/forgecli/store-validator.js +0 -32
  199. package/dist/extensions/forgecli/store-validator.js.map +0 -1
  200. package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
  201. package/dist/extensions/forgecli/test-orchestrate.js +0 -182
  202. package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
  203. package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
  204. package/dist/extensions/forgecli/thread-switcher.js +0 -189
  205. package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
  206. package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
  207. package/dist/extensions/forgecli/transition-guard.js +0 -89
  208. package/dist/extensions/forgecli/transition-guard.js.map +0 -1
  209. package/dist/extensions/forgecli/update-check.d.ts +0 -37
  210. package/dist/extensions/forgecli/update-check.js +0 -185
  211. package/dist/extensions/forgecli/update-check.js.map +0 -1
  212. package/dist/extensions/forgecli/update-tools.d.ts +0 -23
  213. package/dist/extensions/forgecli/update-tools.js +0 -135
  214. package/dist/extensions/forgecli/update-tools.js.map +0 -1
  215. package/dist/extensions/forgecli/validate.d.ts +0 -22
  216. package/dist/extensions/forgecli/validate.js +0 -152
  217. package/dist/extensions/forgecli/validate.js.map +0 -1
  218. package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
  219. package/dist/extensions/forgecli/viewport-events.js +0 -243
  220. package/dist/extensions/forgecli/viewport-events.js.map +0 -1
  221. package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
  222. package/dist/extensions/forgecli/viewport-renderer.js +0 -233
  223. package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
  224. package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
  225. package/dist/extensions/forgecli/viewport-theme.js +0 -128
  226. package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
  227. package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
  228. package/dist/extensions/forgecli/whats-new-widget.js +0 -376
  229. package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
  230. package/dist/extensions/forgecli/whats-new.d.ts +0 -120
  231. package/dist/extensions/forgecli/whats-new.js +0 -470
  232. package/dist/extensions/forgecli/whats-new.js.map +0 -1
@@ -1,22 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- import { extractPersonaNames } from "./lib/frontmatter-parser.js";
3
- export { extractPersonaNames };
4
- import { checkMaterialization, type MaterializationCheck } from "./lib/manifest-checker.js";
5
- export { checkMaterialization, type MaterializationCheck };
6
- export type ArgMode = "empty" | "file" | "text";
7
- export interface ParsedArgs {
8
- mode: ArgMode;
9
- taskRef: string;
10
- sourceLabel: string;
11
- }
12
- export declare function parsePlanArgs(rawArgs: string, cwd: string): ParsedArgs;
13
- export interface ComposeKickoffOpts {
14
- workflowMd: string;
15
- personaIdentity: string;
16
- parsed: ParsedArgs;
17
- }
18
- export declare function composeKickoff(opts: ComposeKickoffOpts): string;
19
- export interface RegisterPlanOptions {
20
- cwd?: string;
21
- }
22
- export declare function registerPlan(pi: ExtensionAPI, options?: RegisterPlanOptions): void;
@@ -1,167 +0,0 @@
1
- // forge:plan — native kickoff handler (FORGE-S20-T05).
2
- //
3
- // Replaces the auto-generated stub previously installed by
4
- // registerAllForgeCommands (forge-commands.ts). Like S19 sprint-intake and
5
- // FORGE-S20-T04 enhance, this is a Kickoff Shim (Pack-04 + Pack-06):
6
- // 1. Reads `.forge/workflows/plan_task.md` (the materialized workflow).
7
- // 2. Verifies four Pack-06 materialization markers — refuses to dispatch on
8
- // regression and emits a per-marker `ctx.ui.notify` so a user sees the
9
- // cause.
10
- // 3. Loads the persona declared in the workflow's `deps.personas:`
11
- // frontmatter via the FORGE-S20-T02 loader (no ad-hoc fs.readFile of
12
- // `.forge/personas/`).
13
- // 4. Composes ONE kickoff message: persona identity, dispatch instructions
14
- // (read TASK_PROMPT.md, follow workflow, write PLAN.md/PLAN-SUMMARY.json,
15
- // forge_store-driven status updates), the workflow body verbatim, and
16
- // argv as @<path> file ref or free-form text.
17
- // 5. Hands control to the LLM via `sendKickoff(pi, text)` —
18
- // `deliverAs: "steer"`. Never raw `pi.sendUserMessage`.
19
- //
20
- // Per FORGE-S20 SPRINT_REQUIREMENTS Constraints and T05 AC#4: the
21
- // prompt-injection fallback is DELETED — no FORGE_LEGACY_KICKOFF flag, no
22
- // markdown-stub for this command.
23
- //
24
- // FORGE-S26-T11: pipeline step guard added. Checks task status via store-cli
25
- // before dispatching. --force flag bypasses the guard.
26
- //
27
- // Iron Laws:
28
- // IL1 — code only under forge-cli/src/extensions/forgecli/.
29
- // IL4 — no JSON.stringify-into-subagent dispatch.
30
- // IL6 — no shell-string interpolation; no spawn calls here.
31
- // IL7 — every failure path emits ctx.ui.notify and returns; no silent
32
- // continuation.
33
- import * as fs from "node:fs";
34
- import * as path from "node:path";
35
- import { assertAudience } from "./audience-gate.js";
36
- import { discoverForgeConfig } from "./forge-root.js";
37
- import { sendKickoff } from "./kickoff.js";
38
- // FORGE-S25-T16: extracted to lib modules. Re-exported here for backward compat
39
- // (plan.test.ts, bundled-base-pack-markers.test.ts, run-task.ts, run-sprint.ts,
40
- // fix-bug.ts all import checkMaterialization / extractPersonaNames from plan.js).
41
- import { extractPersonaNames } from "./lib/frontmatter-parser.js";
42
- import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
43
- import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
44
- import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
45
- export { extractPersonaNames };
46
- import { checkMaterialization } from "./lib/manifest-checker.js";
47
- export { checkMaterialization };
48
- export function parsePlanArgs(rawArgs, cwd) {
49
- const trimmed = (rawArgs ?? "").trim();
50
- if (trimmed === "") {
51
- return { mode: "empty", taskRef: "", sourceLabel: "(no input — engineer infers task from store/context)" };
52
- }
53
- if (trimmed.startsWith("@")) {
54
- const ref = trimmed.slice(1).trim();
55
- const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
56
- const seed = fs.readFileSync(filePath, "utf8");
57
- return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
58
- }
59
- return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
60
- }
61
- export function composeKickoff(opts) {
62
- const { workflowMd, personaIdentity, parsed } = opts;
63
- const sections = ["# /forge:plan", ""];
64
- if (personaIdentity.trim().length > 0) {
65
- sections.push(personaIdentity.trim(), "");
66
- }
67
- sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the task prompt at `engineering/sprints/<SPRINT_ID>/<TASK_ID>/TASK_PROMPT.md` (the source of truth).", "2. Query the store for the task and its sprint/feature context via `forge_store_query` — do NOT raw-read `.forge/store/`.", "3. Follow the workflow Algorithm verbatim: load context, research, plan, knowledge writeback, finalize.", "4. Write `PLAN.md` and `PLAN-SUMMARY.json` to the task directory using the `write` tool.", "5. Update task status by calling the `forge_store` MCP tool: `{command:'update-status', args:['task','<TASK_ID>','status','<new-status>']}`. Never raw-write `.forge/store/`. Do NOT bash-shell `forge store ...`.", "6. Honour Pack-06 Read/Write/Ask/Store discipline: writes go via the `forge_store` MCP tool (canonical 2-positional write: `args:['<entity>','<json>']`, id INSIDE json); in-conversation clarifications use `forge_ask_user`.");
68
- sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
69
- if (parsed.mode === "empty") {
70
- sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
71
- }
72
- else {
73
- sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
74
- }
75
- return sections.join("\n");
76
- }
77
- // Registration -------------------------------------------------------------
78
- const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "plan_task.md");
79
- export function registerPlan(pi, options = {}) {
80
- pi.registerCommand("forge:plan", {
81
- description: "Run the plan-task workflow for a Forge task. " +
82
- "Usage: /forge:plan [@<file> | <free-form text>]. " +
83
- "Empty args → engineer infers the task from sprint/store context.",
84
- async handler(args, ctx) {
85
- const cwd = options.cwd ?? process.cwd();
86
- const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
87
- // Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
88
- const guardParsed = parseGuardArgs(args);
89
- if (!guardParsed.force) {
90
- const forgeConfig = discoverForgeConfig(cwd);
91
- if (forgeConfig) {
92
- const guard = runPipelineGuard("plan", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
93
- if (guard.blocked) {
94
- ctx.ui.notify(guard.message, "error");
95
- return;
96
- }
97
- }
98
- }
99
- // Use cleanArgs (--force stripped) for workflow dispatch
100
- const effectiveArgs = guardParsed.cleanArgs;
101
- let workflowMd;
102
- let workflowAudience;
103
- try {
104
- const loaded = loadWorkflow(workflowPath);
105
- workflowMd = loaded.rawMarkdown;
106
- workflowAudience = loaded.audience;
107
- }
108
- catch (err) {
109
- if (err instanceof WorkflowLoaderError) {
110
- if (err.code === "missing_file") {
111
- ctx.ui.notify(`× forge:plan — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
112
- }
113
- else {
114
- ctx.ui.notify(`× forge:plan — workflow load failed (${err.code}): ${err.message}`, "error");
115
- }
116
- return;
117
- }
118
- const e = err;
119
- ctx.ui.notify(`× forge:plan — failed to read workflow: ${e.message ?? "unknown"}`, "error");
120
- return;
121
- }
122
- let parsed;
123
- try {
124
- parsed = parsePlanArgs(effectiveArgs, cwd);
125
- }
126
- catch (err) {
127
- const e = err;
128
- ctx.ui.notify(`× forge:plan — failed to read seed: ${e.message ?? "unknown"}`, "error");
129
- return;
130
- }
131
- const check = checkMaterialization(workflowPath, workflowMd);
132
- if (!check.ok) {
133
- for (const marker of check.missing) {
134
- ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
135
- }
136
- return;
137
- }
138
- const personas = extractPersonaNames(workflowMd);
139
- let personaIdentity = "";
140
- if (personas.length > 0) {
141
- try {
142
- const persona = loadPersona(personas[0], { cwd });
143
- personaIdentity = persona.identity;
144
- }
145
- catch (err) {
146
- if (err instanceof PersonaSkillLoaderError) {
147
- ctx.ui.notify(`× forge:plan — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
148
- return;
149
- }
150
- const e = err;
151
- ctx.ui.notify(`× forge:plan — persona load error: ${e.message ?? "unknown"}`, "error");
152
- return;
153
- }
154
- }
155
- if (!assertAudience({ workflowName: "plan_task", audience: workflowAudience }, ctx)) {
156
- return;
157
- }
158
- const kickoff = composeKickoff({
159
- workflowMd,
160
- personaIdentity,
161
- parsed,
162
- });
163
- sendKickoff(pi, kickoff);
164
- },
165
- });
166
- }
167
- //# sourceMappingURL=plan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/plan.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,2DAA2D;AAC3D,2EAA2E;AAC3E,qEAAqE;AACrE,0EAA0E;AAC1E,8EAA8E;AAC9E,4EAA4E;AAC5E,cAAc;AACd,qEAAqE;AACrE,0EAA0E;AAC1E,4BAA4B;AAC5B,6EAA6E;AAC7E,+EAA+E;AAC/E,2EAA2E;AAC3E,mDAAmD;AACnD,8DAA8D;AAC9D,6DAA6D;AAC7D,EAAE;AACF,kEAAkE;AAClE,0EAA0E;AAC1E,kCAAkC;AAClC,EAAE;AACF,6EAA6E;AAC7E,uDAAuD;AACvD,EAAE;AACF,aAAa;AACb,8DAA8D;AAC9D,oDAAoD;AACpD,8DAA8D;AAC9D,wEAAwE;AACxE,wBAAwB;AAExB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,gFAAgF;AAChF,gFAAgF;AAChF,kFAAkF;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAA6B,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,oBAAoB,EAA6B,CAAC;AAY3D,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,GAAW;IACzD,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;IAC5G,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,GAAG,GAAG,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;AACnF,CAAC;AAUD,MAAM,UAAU,cAAc,CAAC,IAAwB;IACtD,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,QAAQ,GAAa,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ,CAAC,IAAI,CACZ,aAAa,EACb,EAAE,EACF,uCAAuC,EACvC,EAAE,EACF,8GAA8G,EAC9G,2HAA2H,EAC3H,yGAAyG,EACzG,0FAA0F,EAC1F,oNAAoN,EACpN,gOAAgO,CAChO,CAAC;IAEF,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAE9E,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,sDAAsD,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAE7E,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAM3E,MAAM,UAAU,YAAY,CAAC,EAAgB,EAAE,UAA+B,EAAE;IAC/E,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE;QAChC,WAAW,EACV,+CAA+C;YAC/C,mDAAmD;YACnD,kEAAkE;QACnE,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,GAA4B;YACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAEvD,4EAA4E;YAC5E,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,WAAW,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;oBAC3F,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACtC,OAAO;oBACR,CAAC;gBACF,CAAC;YACF,CAAC;YACD,yDAAyD;YACzD,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,CAAC;YAE5C,IAAI,UAAkB,CAAC;YACvB,IAAI,gBAAsE,CAAC;YAC3E,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC1C,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;gBAChC,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YACpC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;oBACxC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBACjC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,wCAAwC,iBAAiB,4CAA4C,EACrG,OAAO,CACP,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACP,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wCAAwC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;oBAC7F,CAAC;oBACD,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC5F,OAAO;YACR,CAAC;YAED,IAAI,MAAkB,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,GAAG,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,GAA2B,CAAC;gBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;gBACxF,OAAO;YACR,CAAC;YAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACf,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACpC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0BAA0B,MAAM,iBAAiB,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;gBACzF,CAAC;gBACD,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,eAAe,GAAG,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACJ,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBAClD,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;gBACpC,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACvB,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;wBAC5C,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,2BAA2B,QAAQ,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EACnF,OAAO,CACP,CAAC;wBACF,OAAO;oBACR,CAAC;oBACD,MAAM,CAAC,GAAG,GAA2B,CAAC;oBACtC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,OAAO,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;oBACvF,OAAO;gBACR,CAAC;YACF,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;gBACrF,OAAO;YACR,CAAC;YAED,MAAM,OAAO,GAAG,cAAc,CAAC;gBAC9B,UAAU;gBACV,eAAe;gBACf,MAAM;aACN,CAAC,CAAC;YAEH,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1B,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -1,17 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export interface ParsedQuizAgentArgs {
3
- mode: "empty" | "file" | "text";
4
- topicSeed: string;
5
- sourceLabel: string;
6
- }
7
- export declare function parseQuizAgentArgs(rawArgs: string, cwd: string): ParsedQuizAgentArgs;
8
- export interface ComposeQuizAgentKickoffOpts {
9
- commandMd: string;
10
- parsed: ParsedQuizAgentArgs;
11
- }
12
- export declare function composeQuizAgentKickoff(opts: ComposeQuizAgentKickoffOpts): string;
13
- export interface RegisterQuizAgentOptions {
14
- forgeRoot: string | null;
15
- cwd?: string;
16
- }
17
- export declare function registerQuizAgent(pi: ExtensionAPI, options: RegisterQuizAgentOptions): void;
@@ -1,98 +0,0 @@
1
- // forge:quiz-agent — 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
- // Ultra-thin shim: reads commands/quiz-agent.md and dispatches.
8
- // Optional topic seed or @<file> narrows the quiz scope.
9
- //
10
- // Workflow source: <forgeRoot>/commands/quiz-agent.md (command file).
11
- // Note: quiz_agent.md also exists in .forge/workflows/ but lacks 3 of
12
- // 4 Pack-06 markers. Using the command file for consistency with the
13
- // other 5 handlers in this batch. Follow-up task can upgrade to read
14
- // from .forge/workflows/quiz_agent.md when it has all markers.
15
- //
16
- // File-existence check only — command files lack Pack-06 workflow markers.
17
- //
18
- // Iron Laws:
19
- // IL1 — code only under forge-cli/src/extensions/forgecli/.
20
- // IL4 — no JSON.stringify-into-subagent dispatch.
21
- // IL6 — no shell-string interpolation; no spawn calls here.
22
- // IL7 — every failure path emits ctx.ui.notify and returns; no silent
23
- // continuation.
24
- import * as fs from "node:fs";
25
- import * as path from "node:path";
26
- import { sendKickoff } from "./kickoff.js";
27
- export function parseQuizAgentArgs(rawArgs, cwd) {
28
- const trimmed = (rawArgs ?? "").trim();
29
- if (!trimmed) {
30
- return { mode: "empty", topicSeed: "", sourceLabel: "(no topic — full KB quiz)" };
31
- }
32
- if (trimmed.startsWith("@")) {
33
- const ref = trimmed.slice(1).trim();
34
- const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
35
- const topicSeed = fs.readFileSync(filePath, "utf8");
36
- return { mode: "file", topicSeed, sourceLabel: `(topic from file: ${ref})` };
37
- }
38
- return { mode: "text", topicSeed: trimmed, sourceLabel: "(topic from inline text)" };
39
- }
40
- export function composeQuizAgentKickoff(opts) {
41
- const { commandMd, parsed } = opts;
42
- const sections = ["# /forge:check-agent", ""];
43
- sections.push("## Dispatch", "");
44
- sections.push("Run the quiz-agent workflow below to verify this agent has read and understood the project knowledge base. " +
45
- "Ask factual questions about the project's architecture, entity model, and sprint conventions — do not accept vague answers. " +
46
- "Report pass/fail with specific evidence.");
47
- sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
48
- if (parsed.mode === "empty") {
49
- sections.push("", "## Topic", "", "(no topic specified — quiz the full KB scope)");
50
- }
51
- else {
52
- sections.push("", `## Topic — ${parsed.sourceLabel}`, "", parsed.topicSeed.trim());
53
- }
54
- return sections.join("\n");
55
- }
56
- // ── Registration ──────────────────────────────────────────────────────────
57
- const COMMAND_NAME = "quiz-agent";
58
- export function registerQuizAgent(pi, options) {
59
- pi.registerCommand("forge:check-agent", {
60
- description: "Verify an agent has loaded and understood the project knowledge base — run a short factual quiz. " +
61
- "Usage: /forge:check-agent [@<file> | <topic>]. Empty args run a full KB quiz.",
62
- async handler(args, ctx) {
63
- const { forgeRoot } = options;
64
- const cwd = options.cwd ?? process.cwd();
65
- if (!forgeRoot) {
66
- ctx.ui.notify("× forge:check-agent — no Forge project at cwd; run /forge:init to bootstrap", "warning");
67
- return;
68
- }
69
- const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
70
- let commandMd;
71
- try {
72
- commandMd = fs.readFileSync(commandPath, "utf8");
73
- }
74
- catch (err) {
75
- const e = err;
76
- if (e.code === "ENOENT") {
77
- ctx.ui.notify(`× forge:check-agent — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
78
- }
79
- else {
80
- ctx.ui.notify(`× forge:check-agent — failed to read command file: ${e.message ?? "unknown error"}`, "error");
81
- }
82
- return;
83
- }
84
- let parsed;
85
- try {
86
- parsed = parseQuizAgentArgs(args, cwd);
87
- }
88
- catch (err) {
89
- const e = err;
90
- ctx.ui.notify(`× forge:check-agent — failed to parse args: ${e.message ?? "unknown"}`, "error");
91
- return;
92
- }
93
- const kickoff = composeQuizAgentKickoff({ commandMd, parsed });
94
- sendKickoff(pi, kickoff);
95
- },
96
- });
97
- }
98
- //# sourceMappingURL=quiz-agent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quiz-agent.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/quiz-agent.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export declare function registerReadCommand(pi: ExtensionAPI, forgeRoot: string | null): void;
@@ -1,100 +0,0 @@
1
- import * as fs from "node:fs/promises";
2
- import * as path from "node:path";
3
- import { startReviewServer } from "./review-server.js";
4
- import { resolveEntityRef, resolveToolDir } from "./store-resolver.js";
5
- function isNonInteractive() {
6
- return process.env.FORGE_YES === "1" || process.env.FORGE_NON_INTERACTIVE === "1";
7
- }
8
- export function registerReadCommand(pi, forgeRoot) {
9
- pi.registerCommand("forge:read", {
10
- description: "Review a Forge artifact in the browser and provide inline feedback",
11
- async handler(args, ctx) {
12
- if (!forgeRoot) {
13
- ctx.ui.notify("forge:read — no Forge project at cwd; run /forge:init to bootstrap", "warning");
14
- return;
15
- }
16
- if (isNonInteractive()) {
17
- ctx.ui.notify("forge:read requires interactive mode (browser review). Unset FORGE_YES/FORGE_NON_INTERACTIVE.", "error");
18
- return;
19
- }
20
- const arg = args.trim();
21
- if (!arg) {
22
- ctx.ui.notify("Usage: /forge:read <task-id|sprint-id|@path|natural language>\n" +
23
- "Examples: /forge:read S01-T01 | /forge:read S01 | " +
24
- "/forge:read @engineering/sprints/HELLO-S01/HELLO-S01-T01 | " +
25
- "/forge:read the i18n task", "error");
26
- return;
27
- }
28
- const toolDir = resolveToolDir(forgeRoot);
29
- const resolved = await resolveEntityRef(arg, toolDir, ctx.cwd, {
30
- ctx,
31
- statusLabel: "forge:read",
32
- }).catch((err) => {
33
- ctx.ui.setStatus("forge:read", undefined);
34
- ctx.ui.notify(`Store query failed: ${err.message}`, "error");
35
- return null;
36
- });
37
- if (!resolved)
38
- return;
39
- let taskDir;
40
- let label;
41
- if ("dir" in resolved) {
42
- taskDir = resolved.dir;
43
- label = path.basename(taskDir);
44
- }
45
- else {
46
- const item = resolved.item;
47
- if (!item.fileRefs?.md) {
48
- ctx.ui.notify(`No markdown index found for ${item.id}`, "error");
49
- return;
50
- }
51
- taskDir = path.dirname(path.join(ctx.cwd, item.fileRefs.md));
52
- label = `${item.id} — ${item.title}`;
53
- ctx.ui.notify(`Resolved to ${item.type}: ${item.id} (${item.title})`, "info");
54
- }
55
- let files;
56
- try {
57
- files = await fs.readdir(taskDir);
58
- }
59
- catch {
60
- ctx.ui.notify(`No artifacts found at ${taskDir}`, "warning");
61
- return;
62
- }
63
- const mdFiles = files.filter((f) => f.endsWith(".md"));
64
- if (mdFiles.length === 0) {
65
- ctx.ui.notify(`No markdown artifacts found at ${taskDir}`, "info");
66
- return;
67
- }
68
- const selectedFile = await ctx.ui.select(`Select artifact to review for ${label}:`, mdFiles);
69
- if (!selectedFile)
70
- return;
71
- const artifactPath = path.join(taskDir, selectedFile);
72
- ctx.ui.notify(`Starting local review server for ${selectedFile}…`, "info");
73
- ctx.ui.setStatus("forge:read", "Waiting for browser review…");
74
- try {
75
- const feedback = await startReviewServer(artifactPath, `${label} — ${selectedFile}`);
76
- ctx.ui.setStatus("forge:read", undefined);
77
- if (feedback && feedback.length > 0) {
78
- ctx.ui.notify(`Received ${feedback.length} feedback item(s). Sending to Forge…`, "info");
79
- const itemType = "item" in resolved ? resolved.item.type : "artifact";
80
- const itemId = "item" in resolved ? resolved.item.id : label;
81
- let promptText = `I have reviewed the artifact \`${selectedFile}\` for ${itemType} ${itemId}. Here is my inline feedback:\n\n`;
82
- for (const fb of feedback) {
83
- promptText += `> **Text:** "${fb.selectedText}"\n`;
84
- promptText += `> **Feedback:** ${fb.comment}\n\n`;
85
- }
86
- promptText += `Please process this feedback and update the artifact accordingly.`;
87
- pi.sendUserMessage(promptText, { deliverAs: "steer" });
88
- }
89
- else {
90
- ctx.ui.notify("Review completed with no feedback submitted.", "info");
91
- }
92
- }
93
- catch (err) {
94
- ctx.ui.setStatus("forge:read", undefined);
95
- ctx.ui.notify(`forge:read error: ${err.message}`, "error");
96
- }
97
- },
98
- });
99
- }
100
- //# sourceMappingURL=read-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"read-command.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/read-command.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export interface ModifiedFile {
3
- category: string;
4
- relativePath: string;
5
- /** "modified" = manifest hash mismatch; "untracked" = no manifest entry (file exists but never recorded). */
6
- state: "modified" | "untracked";
7
- }
8
- /**
9
- * Enumerate files in .forge/{personas,skills,workflows,templates}/ and return
10
- * those whose state diverges from the manifest baseline. Two divergence states
11
- * are surfaced (both warrant a prompt before overwrite):
12
- *
13
- * - "modified": file content differs from the recorded manifest hash. Typically
14
- * caused by /forge:enhance Phase 2 applying edits in-place.
15
- * - "untracked": file exists on disk but has NO manifest entry. Caused by a
16
- * prior regenerate that ran `clear-namespace` without re-recording. A fresh
17
- * /forge:init records hashes for every generated file, so "untracked" should
18
- * never appear in a clean install — its presence signals user content that's
19
- * been disconnected from the tracking system. See forge-cli#30.
20
- *
21
- * Pure function (no I/O beyond fs reads + manifest tool spawns).
22
- */
23
- export declare function findModifiedStructuralFiles(cwd: string, toolsRoot: string): ModifiedFile[];
24
- /**
25
- * Copy bundled tools (*.cjs, *.js, lib/) from bundleToolsRoot into cwd/.forge/tools/.
26
- *
27
- * Atomic handler pattern: no LLM in the loop, errors surfaced via returned messages[],
28
- * not throw. Accepts _testBundleToolsRoot for test isolation (defaults to getBundledToolsRoot()).
29
- *
30
- * When singleTool is provided (e.g. "store-cli"), only that file is copied (both .cjs
31
- * variant checked first). Used by the `forge:rebuild tools <name>` sub-target.
32
- *
33
- * @param cwd Project root directory (must contain .forge/)
34
- * @param _testBundleToolsRoot Override bundle tools root for tests; omit to use getBundledToolsRoot()
35
- * @param singleTool Optional: copy only this one tool by stem name (without extension)
36
- */
37
- export declare function runRebuildTools(cwd: string, _testBundleToolsRoot?: string, singleTool?: string): {
38
- messages: string[];
39
- };
40
- export declare function registerRegenerate(pi: ExtensionAPI): void;