@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,159 +0,0 @@
1
- // forge:report-bug — 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
- // Pre-flights: gh auth status (spawnSync, argv-array, IL6). On failure,
8
- // notifies and returns — no kickoff sent.
9
- //
10
- // Bug repo is configurable (AC#5):
11
- // 1. FORGE_BUG_REPO env var
12
- // 2. config.json bugs.repo field (if present)
13
- // 3. default: "Entelligentsia/forge"
14
- //
15
- // Workflow source: <forgeRoot>/commands/report-bug.md (command file).
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; spawnSync uses argv arrays.
22
- // IL7 — every failure path emits ctx.ui.notify and returns; no silent
23
- // continuation.
24
- import { spawnSync } from "node:child_process";
25
- import * as fs from "node:fs";
26
- import * as path from "node:path";
27
- import { sendKickoff } from "./kickoff.js";
28
- // ── Repo resolution ───────────────────────────────────────────────────────
29
- const DEFAULT_BUG_REPO = "Entelligentsia/forge";
30
- export function resolveBugRepo(cwd) {
31
- // 1. FORGE_BUG_REPO env var
32
- const fromEnv = process.env["FORGE_BUG_REPO"];
33
- if (fromEnv?.trim())
34
- return fromEnv.trim();
35
- // 2. config.json bugs.repo field
36
- try {
37
- const configPath = path.join(cwd, ".forge", "config.json");
38
- const raw = fs.readFileSync(configPath, "utf8");
39
- const config = JSON.parse(raw);
40
- const bugs = config["bugs"];
41
- const repo = bugs?.["repo"];
42
- if (typeof repo === "string" && repo.trim())
43
- return repo.trim();
44
- }
45
- catch {
46
- // config absent or unreadable — fall through to default
47
- }
48
- // 3. default
49
- return DEFAULT_BUG_REPO;
50
- }
51
- export function parseReportBugArgs(rawArgs, cwd) {
52
- const trimmed = (rawArgs ?? "").trim();
53
- if (!trimmed) {
54
- return { mode: "empty", symptomText: "", sourceLabel: "(no symptom — LLM will ask)" };
55
- }
56
- if (trimmed.startsWith("@")) {
57
- const ref = trimmed.slice(1).trim();
58
- const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
59
- const symptomText = fs.readFileSync(filePath, "utf8");
60
- return { mode: "file", symptomText, sourceLabel: `(symptom from file: ${ref})` };
61
- }
62
- return { mode: "text", symptomText: trimmed, sourceLabel: "(symptom from inline text)" };
63
- }
64
- export function checkGhAuth() {
65
- // IL6: argv-array, no shell interpolation
66
- const result = spawnSync("gh", ["auth", "status"], {
67
- encoding: "utf8",
68
- timeout: 10_000,
69
- });
70
- const ok = result.status === 0 && !result.error;
71
- const output = ((result.stdout ?? "") + (result.stderr ?? "")).trim();
72
- return { ok, output: output.slice(0, 300) }; // cap for kickoff body
73
- }
74
- export function composeReportBugKickoff(opts) {
75
- const { commandMd, parsed, bugRepo, ghAuthOutput } = opts;
76
- const sections = ["# /forge:report-bug", ""];
77
- sections.push("## Dispatch", "");
78
- sections.push("File a bug report against Forge (not your project). Follow the command steps below. Specifically:");
79
- sections.push("");
80
- sections.push(`1. File the issue to: \`${bugRepo}\` (override via \`FORGE_BUG_REPO\` env or \`config.json\` \`bugs.repo\` field).`);
81
- sections.push("2. `gh` is authenticated (pre-flight passed). Use it to file the issue.");
82
- if (ghAuthOutput) {
83
- sections.push(`3. Auth context: \`${ghAuthOutput.replace(/\n/g, " ").slice(0, 200)}\``);
84
- }
85
- sections.push("4. Gather automatic context (forge version, node version, OS) per Step 2 in the command.");
86
- sections.push("5. Draft the issue body, show it to the user for review, then file with `gh issue create`.");
87
- sections.push("", "---", "", "## Command", "", commandMd.trim(), "", "---");
88
- if (parsed.mode === "empty") {
89
- sections.push("", "## Input", "", "(no symptom provided — ask the user to describe the bug)");
90
- }
91
- else {
92
- sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.symptomText.trim());
93
- }
94
- return sections.join("\n");
95
- }
96
- // ── Registration ──────────────────────────────────────────────────────────
97
- const COMMAND_NAME = "report-bug";
98
- export function registerReportBug(pi, options) {
99
- pi.registerCommand("forge:report-bug", {
100
- description: "File a bug against Forge itself as a GitHub issue. " +
101
- "Usage: /forge:report-bug [@<file> | <symptom description>]. " +
102
- "Requires `gh` to be installed and authenticated. " +
103
- "Target repo: FORGE_BUG_REPO env | config.json bugs.repo | Entelligentsia/forge.",
104
- async handler(args, ctx) {
105
- const { forgeRoot } = options;
106
- const cwd = options.cwd ?? process.cwd();
107
- // gh auth pre-flight (IL6: argv-array)
108
- const ghAuth = checkGhAuth();
109
- if (!ghAuth.ok) {
110
- ctx.ui.notify("× forge:report-bug — gh is not authenticated. Install gh (https://cli.github.com) and run `gh auth login` first.", "error");
111
- return;
112
- }
113
- if (!forgeRoot) {
114
- // report-bug works outside a Forge project (reporting bugs in Forge itself)
115
- // but we still need the command file from the bundled payload
116
- }
117
- // Resolve command file from forgeRoot (bundled payload) or fall back to graceful error
118
- let commandMd;
119
- if (forgeRoot) {
120
- const commandPath = path.join(forgeRoot, "commands", `${COMMAND_NAME}.md`);
121
- try {
122
- commandMd = fs.readFileSync(commandPath, "utf8");
123
- }
124
- catch (err) {
125
- const e = err;
126
- if (e.code === "ENOENT") {
127
- ctx.ui.notify(`× forge:report-bug — command file not found at commands/${COMMAND_NAME}.md; run /forge:init or /forge:rebuild first.`, "error");
128
- }
129
- else {
130
- ctx.ui.notify(`× forge:report-bug — failed to read command file: ${e.message ?? "unknown error"}`, "error");
131
- }
132
- return;
133
- }
134
- }
135
- else {
136
- ctx.ui.notify("× forge:report-bug — no Forge project at cwd; run /forge:init to bootstrap before reporting bugs.", "warning");
137
- return;
138
- }
139
- let parsed;
140
- try {
141
- parsed = parseReportBugArgs(args, cwd);
142
- }
143
- catch (err) {
144
- const e = err;
145
- ctx.ui.notify(`× forge:report-bug — failed to parse args: ${e.message ?? "unknown"}`, "error");
146
- return;
147
- }
148
- const bugRepo = resolveBugRepo(cwd);
149
- const kickoff = composeReportBugKickoff({
150
- commandMd,
151
- parsed,
152
- bugRepo,
153
- ghAuthOutput: ghAuth.output,
154
- });
155
- sendKickoff(pi, kickoff);
156
- },
157
- });
158
- }
159
- //# sourceMappingURL=report-bug.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"report-bug.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/report-bug.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- import { extractPersonaNames } from "./lib/frontmatter-parser.js";
3
- export { extractPersonaNames };
4
- export type ArgMode = "empty" | "file" | "text";
5
- export interface ParsedArgs {
6
- mode: ArgMode;
7
- sprintRef: string;
8
- sourceLabel: string;
9
- }
10
- export declare function parseRetroArgs(rawArgs: string, cwd: string): ParsedArgs;
11
- export interface ComposeKickoffOpts {
12
- workflowMd: string;
13
- personaIdentity: string;
14
- parsed: ParsedArgs;
15
- }
16
- export declare function composeKickoff(opts: ComposeKickoffOpts): string;
17
- export interface RegisterRetrospectiveOptions {
18
- cwd?: string;
19
- }
20
- export declare function registerRetrospective(pi: ExtensionAPI, options?: RegisterRetrospectiveOptions): void;
@@ -1,126 +0,0 @@
1
- // forge:retrospective — native kickoff handler (FORGE-S23-T06).
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
- // The retrospective workflow (sprint_retrospective.md) is LLM-driven:
8
- // the handler reads the materialized workflow, composes a kickoff message
9
- // citing the persona path and workflow path, then dispatches via
10
- // pi.sendUserMessage with { deliverAs: "steer" }.
11
- //
12
- // Iron Laws:
13
- // IL1 — code only under forge-cli/src/extensions/forgecli/.
14
- // IL4 — no JSON.stringify-into-subagent dispatch.
15
- // IL6 — no shell-string interpolation; no spawn calls here.
16
- // IL7 — every failure path emits ctx.ui.notify and returns; no silent
17
- // continuation.
18
- import * as fs from "node:fs";
19
- import * as path from "node:path";
20
- import { assertAudience } from "./audience-gate.js";
21
- import { sendKickoff } from "./kickoff.js";
22
- // FORGE-S25-T16: extracted to lib module (H-1). Re-exported here for
23
- // backward compatibility with existing test and consumer imports.
24
- import { extractPersonaNames } from "./lib/frontmatter-parser.js";
25
- import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
26
- import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
27
- export { extractPersonaNames };
28
- export function parseRetroArgs(rawArgs, cwd) {
29
- const trimmed = (rawArgs ?? "").trim();
30
- if (trimmed === "") {
31
- return { mode: "empty", sprintRef: "", sourceLabel: "(no sprint specified — will prompt)" };
32
- }
33
- if (trimmed.startsWith("@")) {
34
- const ref = trimmed.slice(1).trim();
35
- const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
36
- const seed = fs.readFileSync(filePath, "utf8");
37
- return { mode: "file", sprintRef: seed, sourceLabel: `(seed from file: ${ref})` };
38
- }
39
- return { mode: "text", sprintRef: trimmed, sourceLabel: "(seed from inline text)" };
40
- }
41
- export function composeKickoff(opts) {
42
- const { workflowMd, personaIdentity, parsed } = opts;
43
- const sections = ["# /forge:retro", ""];
44
- if (personaIdentity.trim().length > 0) {
45
- sections.push(personaIdentity.trim(), "");
46
- }
47
- sections.push("## Dispatch", "", "Run the retrospective workflow below. Specifically:", "", "1. Identify the sprint to retrospect: if a sprint ID was provided (e.g. FORGE-SNN) use it directly; otherwise ask the user which sprint to retrospect before proceeding.", "2. Load the architect persona from `.forge/personas/architect.md` for full identity context.", "3. Follow the workflow at `.forge/workflows/sprint_retrospective.md` verbatim: load all sprint task manifests, event logs, and retrospective notes; compute cost and bottlenecks; write RETROSPECTIVE.md.", "4. Use `forge_store_query` for all store reads — do NOT raw-read `.forge/store/`.", "5. Write retrospective artifacts using the `write` tool.", "6. Honour Pack-06 Read/Write/Ask/Store discipline: in-conversation clarifications use `forge_ask_user`.");
48
- sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
49
- if (parsed.mode === "empty") {
50
- sections.push("", "## Input", "", "(no sprint specified — ask the user which sprint to retrospect before proceeding)");
51
- }
52
- else {
53
- sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.sprintRef.trim());
54
- }
55
- return sections.join("\n");
56
- }
57
- // Registration -------------------------------------------------------------
58
- const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "sprint_retrospective.md");
59
- export function registerRetrospective(pi, options = {}) {
60
- pi.registerCommand("forge:retro", {
61
- description: "Run the retrospective workflow for a Forge sprint. " +
62
- "Usage: /forge:retro [FORGE-SNN | @<file> | <free-form text>]. " +
63
- "Empty args — the LLM will prompt you for the sprint to retrospect.",
64
- async handler(args, ctx) {
65
- const cwd = options.cwd ?? process.cwd();
66
- const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
67
- let workflowMd;
68
- let workflowAudience;
69
- try {
70
- const loaded = loadWorkflow(workflowPath);
71
- workflowMd = loaded.rawMarkdown;
72
- workflowAudience = loaded.audience;
73
- }
74
- catch (err) {
75
- if (err instanceof WorkflowLoaderError) {
76
- if (err.code === "missing_file") {
77
- ctx.ui.notify(`× forge:retro — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
78
- }
79
- else {
80
- ctx.ui.notify(`× forge:retro — workflow load failed (${err.code}): ${err.message}`, "error");
81
- }
82
- return;
83
- }
84
- const e = err;
85
- ctx.ui.notify(`× forge:retro — failed to read workflow: ${e.message ?? "unknown"}`, "error");
86
- return;
87
- }
88
- let parsed;
89
- try {
90
- parsed = parseRetroArgs(args, cwd);
91
- }
92
- catch (err) {
93
- const e = err;
94
- ctx.ui.notify(`× forge:retro — failed to read seed: ${e.message ?? "unknown"}`, "error");
95
- return;
96
- }
97
- const personas = extractPersonaNames(workflowMd);
98
- let personaIdentity = "";
99
- if (personas.length > 0) {
100
- try {
101
- const persona = loadPersona(personas[0], { cwd });
102
- personaIdentity = persona.identity;
103
- }
104
- catch (err) {
105
- if (err instanceof PersonaSkillLoaderError) {
106
- ctx.ui.notify(`× forge:retro — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
107
- return;
108
- }
109
- const e = err;
110
- ctx.ui.notify(`× forge:retro — persona load error: ${e.message ?? "unknown"}`, "error");
111
- return;
112
- }
113
- }
114
- if (!assertAudience({ workflowName: "sprint_retrospective", audience: workflowAudience }, ctx)) {
115
- return;
116
- }
117
- const kickoff = composeKickoff({
118
- workflowMd,
119
- personaIdentity,
120
- parsed,
121
- });
122
- sendKickoff(pi, kickoff);
123
- },
124
- });
125
- }
126
- //# sourceMappingURL=retrospective.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retrospective.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/retrospective.ts"],"names":[],"mappings":"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"}
@@ -1,35 +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 parseReviewCodeArgs(rawArgs: string, cwd: string): ParsedArgs;
13
- export interface ComposeKickoffOpts {
14
- workflowMd: string;
15
- personaIdentity: string;
16
- parsed: ParsedArgs;
17
- /** Revision loop context block (FORGE-S26-T11). Injected before the workflow body. */
18
- reviewLoopContext?: string;
19
- }
20
- export declare function composeKickoff(opts: ComposeKickoffOpts): string;
21
- /**
22
- * Build the `### Review Loop Context` block for user-invoked (non-orchestrated)
23
- * review-code calls. Matches the T07 graceful-fallback spec:
24
- * "iteration 1 of M" where M is config.maxReviewIterations (default 3).
25
- */
26
- export declare function buildReviewLoopContext(maxIterations: number): string;
27
- /**
28
- * Read maxReviewIterations from .forge/config.json. Returns default 3 on any
29
- * error (missing file, missing field, non-integer value).
30
- */
31
- export declare function readMaxReviewIterations(cwd: string): number;
32
- export interface RegisterReviewCodeOptions {
33
- cwd?: string;
34
- }
35
- export declare function registerReviewCode(pi: ExtensionAPI, options?: RegisterReviewCodeOptions): void;
@@ -1,196 +0,0 @@
1
- // forge:review-code — native kickoff handler (FORGE-S21-T10).
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
- // Note: The materialized workflow (review_code.md) declares
8
- // `audience: subagent` — advisory only. Users may invoke this command
9
- // manually from the CLI; assertAudience never refuses subagent-audience
10
- // workflows. Orchestrator chains still dispatch via runForgeSubagent
11
- // directly and do NOT route through this handler.
12
- //
13
- // FORGE-S26-T11:
14
- // - Pipeline step guard added (checks task state via store-cli; --force bypasses).
15
- // - Revision loop context injected into kickoff: `### Review Loop Context` block
16
- // with `Iteration: 1 of M` (user-invoked default).
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 { assertAudience } from "./audience-gate.js";
27
- import { discoverForgeConfig } from "./forge-root.js";
28
- import { sendKickoff } from "./kickoff.js";
29
- // FORGE-S25-T16: extracted to lib modules (H-1, H-2). Re-exported here for
30
- // backward compatibility with existing test and consumer imports.
31
- import { extractPersonaNames } from "./lib/frontmatter-parser.js";
32
- import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
33
- import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
34
- import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
35
- export { extractPersonaNames };
36
- import { checkMaterialization } from "./lib/manifest-checker.js";
37
- export { checkMaterialization };
38
- export function parseReviewCodeArgs(rawArgs, cwd) {
39
- const trimmed = (rawArgs ?? "").trim();
40
- if (trimmed === "") {
41
- return { mode: "empty", taskRef: "", sourceLabel: "(no input — supervisor infers task from store/context)" };
42
- }
43
- if (trimmed.startsWith("@")) {
44
- const ref = trimmed.slice(1).trim();
45
- const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
46
- const seed = fs.readFileSync(filePath, "utf8");
47
- return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
48
- }
49
- return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
50
- }
51
- export function composeKickoff(opts) {
52
- const { workflowMd, personaIdentity, parsed, reviewLoopContext } = opts;
53
- const sections = ["# /forge:review-code", ""];
54
- if (personaIdentity.trim().length > 0) {
55
- sections.push(personaIdentity.trim(), "");
56
- }
57
- // Inject review loop context before workflow body (FORGE-S26-T11 / T07).
58
- if (reviewLoopContext) {
59
- sections.push(reviewLoopContext.trim(), "");
60
- }
61
- sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the implementation diff and PROGRESS.md for `engineering/sprints/<SPRINT_ID>/<TASK_ID>/` (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: review code for correctness, test coverage, security, and architecture compliance.", "4. Write `CODE_REVIEW.md` and `CODE-REVIEW-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; in-conversation clarifications use `forge_ask_user`.");
62
- sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
63
- if (parsed.mode === "empty") {
64
- sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
65
- }
66
- else {
67
- sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
68
- }
69
- return sections.join("\n");
70
- }
71
- // Iteration context builder (FORGE-S26-T11) ------------------------------------
72
- /**
73
- * Build the `### Review Loop Context` block for user-invoked (non-orchestrated)
74
- * review-code calls. Matches the T07 graceful-fallback spec:
75
- * "iteration 1 of M" where M is config.maxReviewIterations (default 3).
76
- */
77
- export function buildReviewLoopContext(maxIterations) {
78
- return [
79
- "### Review Loop Context",
80
- `- Iteration: 1 of ${maxIterations}`,
81
- `- Is final iteration: ${maxIterations === 1 ? "true" : "false"}`,
82
- ].join("\n");
83
- }
84
- /**
85
- * Read maxReviewIterations from .forge/config.json. Returns default 3 on any
86
- * error (missing file, missing field, non-integer value).
87
- */
88
- export function readMaxReviewIterations(cwd) {
89
- const configPath = path.join(cwd, ".forge", "config.json");
90
- try {
91
- const raw = fs.readFileSync(configPath, "utf8");
92
- const cfg = JSON.parse(raw);
93
- const v = cfg["maxReviewIterations"];
94
- if (typeof v === "number" && Number.isInteger(v) && v >= 1)
95
- return v;
96
- }
97
- catch {
98
- // fail-open
99
- }
100
- return 3;
101
- }
102
- // Registration -------------------------------------------------------------
103
- const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "review_code.md");
104
- export function registerReviewCode(pi, options = {}) {
105
- pi.registerCommand("forge:review-code", {
106
- description: "Run the review-code workflow for a Forge task. " +
107
- "Usage: /forge:review-code [@<file> | <free-form text>]. " +
108
- "Note: this workflow is subagent-only; standalone invocations are refused. " +
109
- "Orchestrator chains dispatch directly via runForgeSubagent.",
110
- async handler(args, ctx) {
111
- const cwd = options.cwd ?? process.cwd();
112
- const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
113
- // Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
114
- const guardParsed = parseGuardArgs(args);
115
- if (!guardParsed.force) {
116
- const forgeConfig = discoverForgeConfig(cwd);
117
- if (forgeConfig) {
118
- const guard = runPipelineGuard("review-code", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
119
- if (guard.blocked) {
120
- ctx.ui.notify(guard.message, "error");
121
- return;
122
- }
123
- }
124
- }
125
- const effectiveArgs = guardParsed.cleanArgs;
126
- let workflowMd;
127
- let workflowAudience;
128
- try {
129
- const loaded = loadWorkflow(workflowPath);
130
- workflowMd = loaded.rawMarkdown;
131
- workflowAudience = loaded.audience;
132
- }
133
- catch (err) {
134
- if (err instanceof WorkflowLoaderError) {
135
- if (err.code === "missing_file") {
136
- ctx.ui.notify(`× forge:review-code — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
137
- }
138
- else {
139
- ctx.ui.notify(`× forge:review-code — workflow load failed (${err.code}): ${err.message}`, "error");
140
- }
141
- return;
142
- }
143
- const e = err;
144
- ctx.ui.notify(`× forge:review-code — failed to read workflow: ${e.message ?? "unknown"}`, "error");
145
- return;
146
- }
147
- let parsed;
148
- try {
149
- parsed = parseReviewCodeArgs(effectiveArgs, cwd);
150
- }
151
- catch (err) {
152
- const e = err;
153
- ctx.ui.notify(`× forge:review-code — failed to read seed: ${e.message ?? "unknown"}`, "error");
154
- return;
155
- }
156
- // Build revision loop context (FORGE-S26-T11 / T07)
157
- const maxIter = readMaxReviewIterations(cwd);
158
- const reviewLoopContext = buildReviewLoopContext(maxIter);
159
- const check = checkMaterialization(workflowPath, workflowMd);
160
- if (!check.ok) {
161
- for (const marker of check.missing) {
162
- ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
163
- }
164
- return;
165
- }
166
- const personas = extractPersonaNames(workflowMd);
167
- let personaIdentity = "";
168
- if (personas.length > 0) {
169
- try {
170
- const persona = loadPersona(personas[0], { cwd });
171
- personaIdentity = persona.identity;
172
- }
173
- catch (err) {
174
- if (err instanceof PersonaSkillLoaderError) {
175
- ctx.ui.notify(`× forge:review-code — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
176
- return;
177
- }
178
- const e = err;
179
- ctx.ui.notify(`× forge:review-code — persona load error: ${e.message ?? "unknown"}`, "error");
180
- return;
181
- }
182
- }
183
- if (!assertAudience({ workflowName: "review_code", audience: workflowAudience }, ctx)) {
184
- return;
185
- }
186
- const kickoff = composeKickoff({
187
- workflowMd,
188
- personaIdentity,
189
- parsed,
190
- reviewLoopContext,
191
- });
192
- sendKickoff(pi, kickoff);
193
- },
194
- });
195
- }
196
- //# sourceMappingURL=review-code.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-code.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/review-code.ts"],"names":[],"mappings":"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"}
@@ -1,35 +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 parseReviewPlanArgs(rawArgs: string, cwd: string): ParsedArgs;
13
- export interface ComposeKickoffOpts {
14
- workflowMd: string;
15
- personaIdentity: string;
16
- parsed: ParsedArgs;
17
- /** Revision loop context block (FORGE-S26-T11). Injected before the workflow body. */
18
- reviewLoopContext?: string;
19
- }
20
- export declare function composeKickoff(opts: ComposeKickoffOpts): string;
21
- /**
22
- * Build the `### Review Loop Context` block for user-invoked (non-orchestrated)
23
- * review-plan calls. Matches the T07 graceful-fallback spec:
24
- * "iteration 1 of M" where M is config.maxReviewIterations (default 3).
25
- */
26
- export declare function buildReviewLoopContext(maxIterations: number): string;
27
- /**
28
- * Read maxReviewIterations from .forge/config.json. Returns default 3 on any
29
- * error (missing file, missing field, non-integer value).
30
- */
31
- export declare function readMaxReviewIterations(cwd: string): number;
32
- export interface RegisterReviewPlanOptions {
33
- cwd?: string;
34
- }
35
- export declare function registerReviewPlan(pi: ExtensionAPI, options?: RegisterReviewPlanOptions): void;