@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,178 +0,0 @@
1
- // init-context.ts — project-name discovery, project-context.json construction,
2
- // and calibration baseline computation for /forge:init.
3
- //
4
- // Per INIT_PARITY_SPEC.md §9 and PLAN.md Phase C.
5
- // Iron Law 6: no shell-string interpolation.
6
- import * as crypto from "node:crypto";
7
- import * as fs from "node:fs";
8
- import * as path from "node:path";
9
- // ── Project name discovery ─────────────────────────────────────────────────
10
- /**
11
- * Discover project name from package.json:name, falling back to cwd basename.
12
- *
13
- * Tries to read <cwd>/package.json and parse the `name` field. If the file is
14
- * absent, malformed, or missing the name field, returns `path.basename(cwd)`.
15
- */
16
- export function discoverProjectName(cwd) {
17
- const pkgPath = path.join(cwd, "package.json");
18
- try {
19
- const raw = fs.readFileSync(pkgPath, "utf8");
20
- const pkg = JSON.parse(raw);
21
- if (pkg &&
22
- typeof pkg === "object" &&
23
- "name" in pkg &&
24
- typeof pkg.name === "string") {
25
- const name = pkg.name;
26
- if (name.trim())
27
- return name.trim();
28
- }
29
- }
30
- catch {
31
- // ENOENT or JSON parse error — fall through to basename
32
- }
33
- return path.basename(cwd);
34
- }
35
- /**
36
- * Build a ProjectContext from discovery results and forge config.
37
- *
38
- * Merges discoveryResults with config data. Config project.name/prefix take
39
- * precedence over discovery if both are present (config was set interactively).
40
- */
41
- export function buildProjectContext(discoveryResults, config) {
42
- const name = config.project?.name ?? discoveryResults.projectName ?? "";
43
- const prefix = config.project?.prefix ?? discoveryResults.prefix ?? "";
44
- const ctx = {
45
- project: {
46
- name,
47
- prefix,
48
- },
49
- };
50
- if (discoveryResults.description) {
51
- ctx.project.description = discoveryResults.description;
52
- }
53
- if (discoveryResults.stack && discoveryResults.stack.length > 0) {
54
- ctx.project.stack = discoveryResults.stack;
55
- }
56
- const testCmd = discoveryResults.testCommand ?? "";
57
- const buildCmd = discoveryResults.buildCommand ?? "";
58
- const lintCmd = discoveryResults.lintCommand ?? "";
59
- if (testCmd || buildCmd) {
60
- ctx.project.commands = {
61
- ...(testCmd ? { test: testCmd } : {}),
62
- ...(buildCmd ? { build: buildCmd } : {}),
63
- };
64
- }
65
- const hasArch = discoveryResults.backendFramework ??
66
- discoveryResults.frontendFramework ??
67
- discoveryResults.database ??
68
- discoveryResults.deployment ??
69
- discoveryResults.dataAccess;
70
- if (hasArch) {
71
- ctx.architecture = {};
72
- const frameworks = {};
73
- if (discoveryResults.backendFramework)
74
- frameworks.backend = discoveryResults.backendFramework;
75
- if (discoveryResults.frontendFramework)
76
- frameworks.frontend = discoveryResults.frontendFramework;
77
- if (discoveryResults.database)
78
- frameworks.database = discoveryResults.database;
79
- if (Object.keys(frameworks).length > 0)
80
- ctx.architecture.frameworks = frameworks;
81
- if (discoveryResults.dataAccess)
82
- ctx.architecture.dataAccess = discoveryResults.dataAccess;
83
- if (discoveryResults.deployment)
84
- ctx.architecture.deployment = discoveryResults.deployment;
85
- }
86
- const hasWorkflow = testCmd || lintCmd || buildCmd;
87
- if (hasWorkflow) {
88
- ctx.workflow = {
89
- ...(testCmd ? { testCommand: testCmd } : {}),
90
- ...(lintCmd ? { lintCommand: lintCmd } : {}),
91
- ...(buildCmd ? { buildCommand: buildCmd } : {}),
92
- };
93
- }
94
- const kbPath = discoveryResults.kbPath ?? config.paths?.engineering ?? "engineering";
95
- ctx.knowledgeBase = {
96
- path: kbPath,
97
- indexFile: `${kbPath}/MASTER_INDEX.md`,
98
- };
99
- return ctx;
100
- }
101
- /**
102
- * Validate a ProjectContext object structurally. Throws with a descriptive
103
- * error if required fields are missing.
104
- */
105
- export function validateProjectContext(ctx) {
106
- if (!ctx || typeof ctx !== "object") {
107
- throw new Error("project-context validation failed: not an object");
108
- }
109
- const record = ctx;
110
- if (!record.project || typeof record.project !== "object") {
111
- throw new Error("project-context validation failed: missing required field 'project'");
112
- }
113
- const project = record.project;
114
- if (typeof project.name !== "string" || !project.name.trim()) {
115
- throw new Error("project-context validation failed: project.name is missing or empty");
116
- }
117
- if (typeof project.prefix !== "string" || !project.prefix.trim()) {
118
- throw new Error("project-context validation failed: project.prefix is missing or empty");
119
- }
120
- }
121
- /**
122
- * Write project-context.json to <cwd>/.forge/project-context.json
123
- */
124
- export function writeProjectContext(cwd, ctx) {
125
- const filePath = path.join(cwd, ".forge", "project-context.json");
126
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
127
- fs.writeFileSync(filePath, JSON.stringify(ctx, null, 2) + "\n", "utf8");
128
- }
129
- /**
130
- * Compute a calibration baseline snapshot for /forge:init Phase 2.
131
- *
132
- * @param cwd - project working directory
133
- * @param kbPath - relative path to the knowledge base directory (e.g. "engineering")
134
- * @param bundledPluginVersion - version string from package.json forge.bundledVersion
135
- */
136
- export function computeCalibrationBaseline(cwd, kbPath, bundledPluginVersion) {
137
- const baseline = {
138
- lastCalibrated: new Date().toISOString(),
139
- version: bundledPluginVersion,
140
- masterIndexHash: null,
141
- sprintsCovered: [],
142
- };
143
- // Compute SHA-256 of MASTER_INDEX.md if it exists
144
- const masterIndexPath = path.join(cwd, kbPath, "MASTER_INDEX.md");
145
- try {
146
- const content = fs.readFileSync(masterIndexPath, "utf8");
147
- baseline.masterIndexHash = crypto.createHash("sha256").update(content, "utf8").digest("hex");
148
- }
149
- catch {
150
- // File not yet present — leave as null (init just started Phase 2)
151
- }
152
- // Collect completed sprint IDs from .forge/store/sprints/
153
- // Matches the algorithm used by /forge:calibrate Step 2 auto-init branch.
154
- const storeSprintsDir = path.join(cwd, ".forge", "store", "sprints");
155
- try {
156
- const files = fs.readdirSync(storeSprintsDir).filter((f) => f.endsWith(".json"));
157
- const completedIds = [];
158
- for (const f of files) {
159
- try {
160
- const raw = fs.readFileSync(path.join(storeSprintsDir, f), "utf8");
161
- const sprint = JSON.parse(raw);
162
- if (typeof sprint.sprintId === "string" &&
163
- (sprint.status === "done" || sprint.status === "retrospective-done")) {
164
- completedIds.push(sprint.sprintId);
165
- }
166
- }
167
- catch {
168
- // Skip malformed sprint file
169
- }
170
- }
171
- baseline.sprintsCovered = completedIds.sort();
172
- }
173
- catch {
174
- // Store sprints dir not yet created — leave as []
175
- }
176
- return baseline;
177
- }
178
- //# sourceMappingURL=init-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-context.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/init-context.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wDAAwD;AACxD,EAAE;AACF,kDAAkD;AAClD,6CAA6C;AAE7C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QACvC,IACC,GAAG;YACH,OAAO,GAAG,KAAK,QAAQ;YACvB,MAAM,IAAI,GAAG;YACb,OAAQ,GAA+B,CAAC,IAAI,KAAK,QAAQ,EACxD,CAAC;YACF,MAAM,IAAI,GAAI,GAA8B,CAAC,IAAI,CAAC;YAClD,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,wDAAwD;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAyED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,gBAAkC,EAAE,MAAmB;IAC1F,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,gBAAgB,CAAC,MAAM,IAAI,EAAE,CAAC;IAEvE,MAAM,GAAG,GAAmB;QAC3B,OAAO,EAAE;YACR,IAAI;YACJ,MAAM;SACN;KACD,CAAC;IAEF,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC;IACxD,CAAC;IACD,IAAI,gBAAgB,CAAC,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,IAAI,EAAE,CAAC;IACrD,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC;IACnD,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG;YACtB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GACZ,gBAAgB,CAAC,gBAAgB;QACjC,gBAAgB,CAAC,iBAAiB;QAClC,gBAAgB,CAAC,QAAQ;QACzB,gBAAgB,CAAC,UAAU;QAC3B,gBAAgB,CAAC,UAAU,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;QACtB,MAAM,UAAU,GAA6C,EAAE,CAAC;QAChE,IAAI,gBAAgB,CAAC,gBAAgB;YAAE,UAAU,CAAC,OAAO,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;QAC9F,IAAI,gBAAgB,CAAC,iBAAiB;YAAE,UAAU,CAAC,QAAQ,GAAG,gBAAgB,CAAC,iBAAiB,CAAC;QACjG,IAAI,gBAAgB,CAAC,QAAQ;YAAE,UAAU,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QAC/E,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;QACjF,IAAI,gBAAgB,CAAC,UAAU;YAAE,GAAG,CAAC,YAAY,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;QAC3F,IAAI,gBAAgB,CAAC,UAAU;YAAE,GAAG,CAAC,YAAY,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;IAC5F,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,IAAI,OAAO,IAAI,QAAQ,CAAC;IACnD,IAAI,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,QAAQ,GAAG;YACd,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,aAAa,CAAC;IACrF,GAAG,CAAC,aAAa,GAAG;QACnB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,GAAG,MAAM,kBAAkB;KACtC,CAAC;IAEF,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IAClD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAkC,CAAC;IAC1D,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC1F,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,GAAmB;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IAClE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACzE,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACzC,GAAW,EACX,MAAc,EACd,oBAA4B;IAE5B,MAAM,QAAQ,GAAwB;QACrC,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACxC,OAAO,EAAE,oBAAoB;QAC7B,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,EAAE;KAClB,CAAC;IAEF,kDAAkD;IAClD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAClE,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACzD,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACR,mEAAmE;IACpE,CAAC;IAED,0DAA0D;IAC1D,0EAA0E;IAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjF,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2C,CAAC;gBACzE,IACC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;oBACnC,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,oBAAoB,CAAC,EACnE,CAAC;oBACF,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,6BAA6B;YAC9B,CAAC;QACF,CAAC;QACD,QAAQ,CAAC,cAAc,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACR,kDAAkD;IACnD,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -1,39 +0,0 @@
1
- /** Canonical progress record written to .forge/init-progress.json */
2
- export interface InitProgress {
3
- lastPhase: 1 | 2 | 3 | 4;
4
- timestamp: string;
5
- }
6
- export type ReadProgressResult = {
7
- kind: "none";
8
- } | {
9
- kind: "stale";
10
- reason: string;
11
- } | {
12
- kind: "malformed";
13
- } | {
14
- kind: "valid";
15
- progress: InitProgress;
16
- };
17
- /**
18
- * Read the init-progress checkpoint file.
19
- *
20
- * Returns:
21
- * - `{ kind: "none" }` — file does not exist
22
- * - `{ kind: "malformed" }` — file exists but JSON parse failed
23
- * - `{ kind: "stale", reason }` — file is a legacy 12-phase checkpoint
24
- * - `{ kind: "valid", progress }` — clean 4-phase checkpoint
25
- */
26
- export declare function readInitProgress(cwd: string): ReadProgressResult;
27
- /**
28
- * Write a progress checkpoint. Called at the end of each completed phase.
29
- *
30
- * @param cwd - project working directory
31
- * @param lastPhase - completed phase number (1, 2, or 3; 4 is written then deleted)
32
- * @param timestamp - ISO 8601 timestamp; defaults to now
33
- */
34
- export declare function writeInitProgress(cwd: string, lastPhase: 1 | 2 | 3 | 4, timestamp?: string): void;
35
- /**
36
- * Delete the init-progress checkpoint. Called at the end of Phase 4
37
- * to signal successful completion.
38
- */
39
- export declare function deleteInitProgress(cwd: string): void;
@@ -1,117 +0,0 @@
1
- // init-progress.ts — read/write/delete .forge/init-progress.json
2
- //
3
- // Tracks the last completed phase of /forge:init so the command can resume
4
- // after an interrupted run. Implements stale-checkpoint detection to handle
5
- // legacy 12-phase checkpoint files from old forge plugin versions.
6
- //
7
- // Per INIT_PARITY_SPEC.md §4 and PLAN.md Phase B.
8
- import * as fs from "node:fs";
9
- import * as path from "node:path";
10
- const PROGRESS_FILENAME = ".forge/init-progress.json";
11
- function progressPath(cwd) {
12
- return path.join(cwd, PROGRESS_FILENAME);
13
- }
14
- /**
15
- * Read the init-progress checkpoint file.
16
- *
17
- * Returns:
18
- * - `{ kind: "none" }` — file does not exist
19
- * - `{ kind: "malformed" }` — file exists but JSON parse failed
20
- * - `{ kind: "stale", reason }` — file is a legacy 12-phase checkpoint
21
- * - `{ kind: "valid", progress }` — clean 4-phase checkpoint
22
- */
23
- export function readInitProgress(cwd) {
24
- const filePath = progressPath(cwd);
25
- let raw;
26
- try {
27
- raw = fs.readFileSync(filePath, "utf8");
28
- }
29
- catch (err) {
30
- const e = err;
31
- if (e.code === "ENOENT")
32
- return { kind: "none" };
33
- // Unreadable — treat as missing
34
- return { kind: "none" };
35
- }
36
- let obj;
37
- try {
38
- obj = JSON.parse(raw);
39
- }
40
- catch {
41
- return { kind: "malformed" };
42
- }
43
- if (!obj || typeof obj !== "object") {
44
- return { kind: "malformed" };
45
- }
46
- const record = obj;
47
- // Stale detection per spec §4:
48
- // - lastPhase > 4 → old 12-phase run
49
- // - contains "mode" key → old format
50
- // - contains "phase-7-substep-map" key → old format
51
- // - missing "timestamp" → corrupt / incomplete write
52
- if ("mode" in record) {
53
- return { kind: "stale", reason: 'contains "mode" field (legacy 12-phase format)' };
54
- }
55
- if ("phase-7-substep-map" in record) {
56
- return { kind: "stale", reason: 'contains "phase-7-substep-map" field (legacy 12-phase format)' };
57
- }
58
- if (!("timestamp" in record)) {
59
- return { kind: "stale", reason: 'missing "timestamp" field' };
60
- }
61
- const lastPhase = record.lastPhase;
62
- if (typeof lastPhase !== "number" || !Number.isInteger(lastPhase)) {
63
- return { kind: "malformed" };
64
- }
65
- if (lastPhase > 4) {
66
- return { kind: "stale", reason: `lastPhase=${lastPhase} > 4 (legacy 12-phase run)` };
67
- }
68
- if (lastPhase < 1) {
69
- return { kind: "malformed" };
70
- }
71
- const timestamp = record.timestamp;
72
- if (typeof timestamp !== "string") {
73
- return { kind: "malformed" };
74
- }
75
- return {
76
- kind: "valid",
77
- progress: {
78
- lastPhase: lastPhase,
79
- timestamp,
80
- },
81
- };
82
- }
83
- /**
84
- * Write a progress checkpoint. Called at the end of each completed phase.
85
- *
86
- * @param cwd - project working directory
87
- * @param lastPhase - completed phase number (1, 2, or 3; 4 is written then deleted)
88
- * @param timestamp - ISO 8601 timestamp; defaults to now
89
- */
90
- export function writeInitProgress(cwd, lastPhase, timestamp) {
91
- const record = {
92
- lastPhase,
93
- timestamp: timestamp ?? new Date().toISOString(),
94
- };
95
- const filePath = progressPath(cwd);
96
- // Ensure .forge/ dir exists before writing
97
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
98
- fs.writeFileSync(filePath, JSON.stringify(record, null, 2) + "\n", "utf8");
99
- }
100
- /**
101
- * Delete the init-progress checkpoint. Called at the end of Phase 4
102
- * to signal successful completion.
103
- */
104
- export function deleteInitProgress(cwd) {
105
- const filePath = progressPath(cwd);
106
- try {
107
- fs.unlinkSync(filePath);
108
- }
109
- catch (err) {
110
- const e = err;
111
- // ENOENT is fine — file may not exist if phase was aborted before first write
112
- if (e.code !== "ENOENT") {
113
- throw err;
114
- }
115
- }
116
- }
117
- //# sourceMappingURL=init-progress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-progress.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/init-progress.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- export type RouterResult = {
2
- consume?: boolean;
3
- data?: string;
4
- } | undefined;
5
- export type RouterListener = (data: string) => RouterResult;
6
- export interface RegisterOptions {
7
- /** Stable name for debugging and unsubscription tracking. */
8
- name: string;
9
- /** When true, this listener is bypassed while any overlay is active.
10
- * Use for keys that "activate" a widget (e.g. ↓ to open a strip) — the
11
- * overlay needs the same key for navigation. Default: false. */
12
- skipWhenOverlayActive?: boolean;
13
- }
14
- export declare class ForgeInputRouter {
15
- private listeners;
16
- private overlayDepth;
17
- register(listener: RouterListener, opts: RegisterOptions): () => void;
18
- pushOverlay(): void;
19
- popOverlay(): void;
20
- isOverlayActive(): boolean;
21
- /**
22
- * Mirrors pi's listener-chain semantics (tui.ts:544-560):
23
- * - Each listener may return { consume: true } to stop dispatch.
24
- * - Each listener may return { data: rewritten } to alter the value the
25
- * next listener (and ultimately the focused overlay) sees.
26
- * - Listeners flagged skipWhenOverlayActive=true are silently bypassed
27
- * whenever overlayDepth > 0.
28
- */
29
- dispatch(data: string): RouterResult;
30
- }
31
- export declare function getInputRouter(): ForgeInputRouter;
32
- /** Test helper — replace the singleton with a fresh router. */
33
- export declare function __resetInputRouterForTesting(): void;
@@ -1,136 +0,0 @@
1
- // Centralised onTerminalInput dispatch for forge-cli.
2
- //
3
- // Plan 16 Slice 4c. Pi-mono's `ctx.ui.onTerminalInput` lets any extension hook
4
- // raw stdin, with the first consumer winning. Pi runs listeners BEFORE
5
- // routing to the focused overlay (pi-mono/packages/tui/src/tui.ts:544-560).
6
- // That made forge-cli's two existing arrow-activator listeners
7
- // (thread-switcher, whats-new-widget) silently eat ↑/↓ when the config TUI was
8
- // mounted as an overlay.
9
- //
10
- // This router gives forge-cli a single pi listener whose dispatch is
11
- // overlay-aware: listeners flagged `skipWhenOverlayActive: true` are bypassed
12
- // whenever an overlay has been registered via `pushOverlay()`. Other listeners
13
- // (critical hotkeys, theme switchers, etc.) still run.
14
- //
15
- // Wiring:
16
- // 1. index.ts session_start: `ctx.ui.onTerminalInput((d) => router.dispatch(d))`.
17
- // 2. Each consumer: `router.register(listener, { name, skipWhenOverlayActive })`.
18
- // 3. Each overlay mounter: `router.pushOverlay()` before ctx.ui.custom,
19
- // `popOverlay()` in a finally.
20
- //
21
- // Debug logging (when FORGE_DEBUG_INPUT=1):
22
- // Each dispatch + push/pop is logged with timestamp + listener name +
23
- // overlay depth + raw byte sequence (hex-escaped). Default target:
24
- // /tmp/forge-input-router.log. Override with FORGE_DEBUG_INPUT_LOG=<path>.
25
- // Logging goes through fs.appendFileSync — synchronous so events are
26
- // captured even when the process crashes mid-render.
27
- import * as fs from "node:fs";
28
- function debugEnabled() {
29
- return process.env.FORGE_DEBUG_INPUT === "1";
30
- }
31
- function debugLogPath() {
32
- return process.env.FORGE_DEBUG_INPUT_LOG ?? "/tmp/forge-input-router.log";
33
- }
34
- function hexEscape(s) {
35
- // Render printable ASCII as-is, escape everything else as \xNN. Helps spot
36
- // arrow sequences (\x1b[A etc.) and Kitty-protocol variants at a glance.
37
- return [...s]
38
- .map((c) => {
39
- const cp = c.codePointAt(0);
40
- if (cp >= 0x20 && cp <= 0x7e)
41
- return c;
42
- return `\\x${cp.toString(16).padStart(2, "0")}`;
43
- })
44
- .join("");
45
- }
46
- function logEvent(line) {
47
- if (!debugEnabled())
48
- return;
49
- try {
50
- const ts = new Date().toISOString();
51
- fs.appendFileSync(debugLogPath(), `${ts} ${line}\n`);
52
- }
53
- catch {
54
- // Logging must never crash the host; failure to write is silently ignored.
55
- }
56
- }
57
- export class ForgeInputRouter {
58
- listeners = [];
59
- overlayDepth = 0;
60
- register(listener, opts) {
61
- const entry = { fn: listener, opts };
62
- this.listeners.push(entry);
63
- logEvent(`register name=${opts.name} skipWhenOverlayActive=${!!opts.skipWhenOverlayActive} total=${this.listeners.length}`);
64
- return () => {
65
- const i = this.listeners.indexOf(entry);
66
- if (i >= 0) {
67
- this.listeners.splice(i, 1);
68
- logEvent(`unregister name=${opts.name} remaining=${this.listeners.length}`);
69
- }
70
- };
71
- }
72
- pushOverlay() {
73
- this.overlayDepth++;
74
- logEvent(`pushOverlay depth=${this.overlayDepth}`);
75
- }
76
- popOverlay() {
77
- if (this.overlayDepth > 0)
78
- this.overlayDepth--;
79
- logEvent(`popOverlay depth=${this.overlayDepth}`);
80
- }
81
- isOverlayActive() {
82
- return this.overlayDepth > 0;
83
- }
84
- /**
85
- * Mirrors pi's listener-chain semantics (tui.ts:544-560):
86
- * - Each listener may return { consume: true } to stop dispatch.
87
- * - Each listener may return { data: rewritten } to alter the value the
88
- * next listener (and ultimately the focused overlay) sees.
89
- * - Listeners flagged skipWhenOverlayActive=true are silently bypassed
90
- * whenever overlayDepth > 0.
91
- */
92
- dispatch(data) {
93
- if (debugEnabled()) {
94
- logEvent(`dispatch IN data="${hexEscape(data)}" overlayDepth=${this.overlayDepth} listeners=${this.listeners.length}`);
95
- }
96
- let current = data;
97
- for (const entry of this.listeners) {
98
- if (this.overlayDepth > 0 && entry.opts.skipWhenOverlayActive) {
99
- logEvent(` skip name=${entry.opts.name} (overlay active)`);
100
- continue;
101
- }
102
- const result = entry.fn(current);
103
- if (debugEnabled()) {
104
- const r = result === undefined
105
- ? "passthrough"
106
- : `${result.consume ? "consume" : ""}${result.data !== undefined ? ` data="${hexEscape(result.data)}"` : ""}`.trim() ||
107
- "noop";
108
- logEvent(` call name=${entry.opts.name} → ${r}`);
109
- }
110
- if (result?.consume) {
111
- logEvent(`dispatch OUT consumed-by=${entry.opts.name}`);
112
- return { consume: true };
113
- }
114
- if (result?.data !== undefined)
115
- current = result.data;
116
- }
117
- if (current !== data) {
118
- logEvent(`dispatch OUT rewritten data="${hexEscape(current)}"`);
119
- return { data: current };
120
- }
121
- logEvent(`dispatch OUT passthrough (focused overlay should receive)`);
122
- return undefined;
123
- }
124
- }
125
- // ── Module-level singleton ───────────────────────────────────────────────────
126
- let singleton = null;
127
- export function getInputRouter() {
128
- if (!singleton)
129
- singleton = new ForgeInputRouter();
130
- return singleton;
131
- }
132
- /** Test helper — replace the singleton with a fresh router. */
133
- export function __resetInputRouterForTesting() {
134
- singleton = null;
135
- }
136
- //# sourceMappingURL=input-router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-router.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/input-router.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,+EAA+E;AAC/E,uEAAuE;AACvE,4EAA4E;AAC5E,+DAA+D;AAC/D,+EAA+E;AAC/E,yBAAyB;AACzB,EAAE;AACF,qEAAqE;AACrE,8EAA8E;AAC9E,+EAA+E;AAC/E,uDAAuD;AACvD,EAAE;AACF,UAAU;AACV,oFAAoF;AACpF,oFAAoF;AACpF,0EAA0E;AAC1E,oCAAoC;AACpC,EAAE;AACF,4CAA4C;AAC5C,wEAAwE;AACxE,qEAAqE;AACrE,6EAA6E;AAC7E,uEAAuE;AACvE,uDAAuD;AAEvD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAmB9B,SAAS,YAAY;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,6BAA6B,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC3B,2EAA2E;IAC3E,yEAAyE;IACzE,OAAO,CAAC,GAAG,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAC7B,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACvC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC7B,IAAI,CAAC,YAAY,EAAE;QAAE,OAAO;IAC5B,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACR,2EAA2E;IAC5E,CAAC;AACF,CAAC;AAED,MAAM,OAAO,gBAAgB;IACpB,SAAS,GAAY,EAAE,CAAC;IACxB,YAAY,GAAG,CAAC,CAAC;IAEzB,QAAQ,CAAC,QAAwB,EAAE,IAAqB;QACvD,MAAM,KAAK,GAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,QAAQ,CACP,iBAAiB,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC,IAAI,CAAC,qBAAqB,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CACjH,CAAC;QACF,OAAO,GAAG,EAAE;YACX,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACZ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5B,QAAQ,CAAC,mBAAmB,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC,CAAC;IACH,CAAC;IAED,WAAW;QACV,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,QAAQ,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,UAAU;QACT,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC;YAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/C,QAAQ,CAAC,oBAAoB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,eAAe;QACd,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAY;QACpB,IAAI,YAAY,EAAE,EAAE,CAAC;YACpB,QAAQ,CACP,qBAAqB,SAAS,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,YAAY,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAC5G,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC/D,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC;gBAC5D,SAAS;YACV,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,YAAY,EAAE,EAAE,CAAC;gBACpB,MAAM,CAAC,GACN,MAAM,KAAK,SAAS;oBACnB,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;wBACnH,MAAM,CAAC;gBACV,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,QAAQ,CAAC,4BAA4B,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;gBAAE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACtB,QAAQ,CAAC,gCAAgC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1B,CAAC;QACD,QAAQ,CAAC,2DAA2D,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;IAClB,CAAC;CACD;AAED,gFAAgF;AAEhF,IAAI,SAAS,GAA4B,IAAI,CAAC;AAE9C,MAAM,UAAU,cAAc;IAC7B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACnD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,4BAA4B;IAC3C,SAAS,GAAG,IAAI,CAAC;AAClB,CAAC"}
@@ -1,59 +0,0 @@
1
- import type { MergedConfig, PersonaModel } from "../config-layer.js";
2
- export interface UiLike {
3
- notify(message: string, level?: string): void;
4
- }
5
- export interface CtxLike {
6
- ui: UiLike;
7
- }
8
- export interface GateFailure {
9
- phase: string;
10
- reasonCode: string;
11
- detail: string;
12
- remediation: string;
13
- }
14
- export interface RunHaltAdvisorOptions {
15
- /** Structured failure parsed from preflight-gate.cjs stdout. */
16
- gateFailure: GateFailure;
17
- /** Resolved advisor model (from resolveAdvisorModel). If undefined, advisor is skipped. */
18
- advisorModel: PersonaModel | undefined;
19
- /** Task or bug id for context. */
20
- taskId: string;
21
- /** Working directory. */
22
- cwd: string;
23
- /** Extension command context (ui + modelRegistry). */
24
- ctx: CtxLike;
25
- /** Optional forge root path — forwarded to runForgeSubagent. */
26
- forgeRoot?: string;
27
- }
28
- /**
29
- * Resolve the advisor model for halt-recovery.
30
- *
31
- * Priority:
32
- * 1. Explicit `advisorModel` config slot from forge-cli layered config.
33
- * Contract (rev. 2026-06-04): the advisor model is the HEAVY model the runtime
34
- * resolves point-in-time. There is NO dedicated advisorModel config entry —
35
- * "heavy" is the approve/architect slot resolved through the existing routing
36
- * cascade (L4 phase override → L3/L2 project → L1 user/global → default),
37
- * exactly as the approve phase itself would resolve. When the cascade bottoms
38
- * out at inherit, the session's current model (pi default) is used. In the
39
- * Claude Code plugin route the equivalent is the opus-class session model.
40
- *
41
- * Returns undefined (advisor skipped, non-fatal) only when nothing is routed
42
- * AND no current model is available.
43
- *
44
- * (History: the original FORGE-S26-T18 implementation used a dedicated
45
- * advisorModel config slot with a blind registry fallback that produced
46
- * "anthropic/undefined" on the CART-S03-T01 halt — both retired.)
47
- */
48
- export declare function resolveAdvisorModel(merged: MergedConfig, currentModel?: {
49
- provider?: string;
50
- model?: string;
51
- id?: string;
52
- }, pipelineName?: string): PersonaModel | undefined;
53
- /**
54
- * Spawn a read-only advisor subagent to explain the gate failure and guide recovery.
55
- *
56
- * Best-effort: errors are notified via ctx.ui but do NOT propagate. The
57
- * primary halt status is the caller's responsibility to surface separately.
58
- */
59
- export declare function runHaltAdvisor(opts: RunHaltAdvisorOptions): Promise<void>;