@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,185 +0,0 @@
1
- // Update-check probe + banner — FORGE-S16-T14 (issue #18, part 1).
2
- //
3
- // Dual-probe (npm registry + Entelligentsia/forge GitHub releases) with a
4
- // 24h TTL, per-version dismissal cache, and `FORGE_NO_UPDATE_CHECK=1`
5
- // opt-out. This is the only outbound HTTP traffic forgecli performs (Q21).
6
- // All failures are fail-silent on the user surface; debug output requires
7
- // FORGE_DEBUG_UPDATE_CHECK=1.
8
- import { promises as fs } from "node:fs";
9
- import * as path from "node:path";
10
- import { getUserCacheDir } from "./paths/paths.js";
11
- export const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
12
- const PROBE_TIMEOUT_MS = 5000;
13
- const NPM_URL = "https://registry.npmjs.org/@entelligentsia/forgecli";
14
- const GH_RELEASES_URL = "https://api.github.com/repos/Entelligentsia/forge/releases/latest";
15
- function defaultCacheDir() {
16
- return getUserCacheDir();
17
- }
18
- function cachePath(cacheDir) {
19
- return path.join(cacheDir, "update-banner.json");
20
- }
21
- async function readCache(cacheDir) {
22
- try {
23
- const raw = await fs.readFile(cachePath(cacheDir), "utf8");
24
- const parsed = JSON.parse(raw);
25
- return {
26
- lastProbeAt: typeof parsed.lastProbeAt === "number" ? parsed.lastProbeAt : 0,
27
- latestNpmVersion: typeof parsed.latestNpmVersion === "string" ? parsed.latestNpmVersion : null,
28
- latestForgeVersion: typeof parsed.latestForgeVersion === "string" ? parsed.latestForgeVersion : null,
29
- dismissedNpmVersions: Array.isArray(parsed.dismissedNpmVersions)
30
- ? parsed.dismissedNpmVersions.filter((v) => typeof v === "string")
31
- : [],
32
- dismissedForgeVersions: Array.isArray(parsed.dismissedForgeVersions)
33
- ? parsed.dismissedForgeVersions.filter((v) => typeof v === "string")
34
- : [],
35
- };
36
- }
37
- catch {
38
- return null;
39
- }
40
- }
41
- async function writeCache(cacheDir, cache) {
42
- await fs.mkdir(cacheDir, { recursive: true });
43
- const final = cachePath(cacheDir);
44
- const tmp = `${final}.${process.pid}.${Date.now()}.tmp`;
45
- await fs.writeFile(tmp, JSON.stringify(cache, null, 2), "utf8");
46
- await fs.rename(tmp, final);
47
- }
48
- function parseTriple(v) {
49
- const cleaned = v.startsWith("v") ? v.slice(1) : v;
50
- const parts = cleaned.split(".");
51
- if (parts.length !== 3)
52
- return null;
53
- const nums = [];
54
- for (const p of parts) {
55
- if (!/^\d+$/.test(p))
56
- return null;
57
- nums.push(Number.parseInt(p, 10));
58
- }
59
- return [nums[0], nums[1], nums[2]];
60
- }
61
- function semverGt(a, b) {
62
- const pa = parseTriple(a);
63
- const pb = parseTriple(b);
64
- if (!pa || !pb)
65
- return false;
66
- for (let i = 0; i < 3; i++) {
67
- if (pa[i] > pb[i])
68
- return true;
69
- if (pa[i] < pb[i])
70
- return false;
71
- }
72
- return false;
73
- }
74
- function debug(...args) {
75
- if (process.env.FORGE_DEBUG_UPDATE_CHECK === "1") {
76
- console.error("[forge-cli update-check]", ...args);
77
- }
78
- }
79
- async function probeNpm(fetchImpl) {
80
- const ctl = new AbortController();
81
- const t = setTimeout(() => ctl.abort(), PROBE_TIMEOUT_MS);
82
- try {
83
- const res = await fetchImpl(NPM_URL, { signal: ctl.signal, headers: { Accept: "application/json" } });
84
- if (!res.ok)
85
- return null;
86
- const body = (await res.json());
87
- const tag = body["dist-tags"]?.latest;
88
- return typeof tag === "string" ? tag : null;
89
- }
90
- catch (err) {
91
- debug("npm probe failed:", err);
92
- return null;
93
- }
94
- finally {
95
- clearTimeout(t);
96
- }
97
- }
98
- async function probeForge(fetchImpl) {
99
- const ctl = new AbortController();
100
- const t = setTimeout(() => ctl.abort(), PROBE_TIMEOUT_MS);
101
- try {
102
- const res = await fetchImpl(GH_RELEASES_URL, {
103
- signal: ctl.signal,
104
- headers: { Accept: "application/vnd.github+json" },
105
- });
106
- if (!res.ok)
107
- return null;
108
- const body = (await res.json());
109
- if (typeof body.tag_name !== "string")
110
- return null;
111
- return body.tag_name.startsWith("v") ? body.tag_name.slice(1) : body.tag_name;
112
- }
113
- catch (err) {
114
- debug("github releases probe failed:", err);
115
- return null;
116
- }
117
- finally {
118
- clearTimeout(t);
119
- }
120
- }
121
- function composeBanner(npm, forge) {
122
- const lines = [];
123
- if (npm) {
124
- lines.push(`forge-cli: update available — ${npm.current} → ${npm.latest} (run \`forge update\` or \`npm i -g @entelligentsia/forgecli@${npm.latest}\`)`);
125
- }
126
- if (forge) {
127
- lines.push(`forge plugin: update available — ${forge.current} → ${forge.latest} (run /forge:update for migration guide)`);
128
- }
129
- return lines.length > 0 ? lines.join("\n") : null;
130
- }
131
- export async function triggerUpdateCheck(opts) {
132
- if (process.env.FORGE_NO_UPDATE_CHECK === "1")
133
- return;
134
- const now = opts.now ?? (() => Date.now());
135
- const fetchImpl = opts.fetchImpl ?? fetch;
136
- const cacheDir = opts.cacheDir ?? defaultCacheDir();
137
- let cache = (await readCache(cacheDir)) ?? {
138
- lastProbeAt: 0,
139
- latestNpmVersion: null,
140
- latestForgeVersion: null,
141
- dismissedNpmVersions: [],
142
- dismissedForgeVersions: [],
143
- };
144
- const ts = now();
145
- const ttlFresh = ts - cache.lastProbeAt < CACHE_TTL_MS;
146
- if (!ttlFresh) {
147
- const [npmRes, forgeRes] = await Promise.allSettled([probeNpm(fetchImpl), probeForge(fetchImpl)]);
148
- const nextNpm = npmRes.status === "fulfilled" && npmRes.value !== null ? npmRes.value : cache.latestNpmVersion;
149
- const nextForge = forgeRes.status === "fulfilled" && forgeRes.value !== null ? forgeRes.value : cache.latestForgeVersion;
150
- cache = {
151
- ...cache,
152
- lastProbeAt: ts,
153
- latestNpmVersion: nextNpm,
154
- latestForgeVersion: nextForge,
155
- };
156
- try {
157
- await writeCache(cacheDir, cache);
158
- }
159
- catch (err) {
160
- debug("cache write failed:", err);
161
- }
162
- }
163
- const npmAvail = cache.latestNpmVersion &&
164
- semverGt(cache.latestNpmVersion, opts.currentCliVersion) &&
165
- !cache.dismissedNpmVersions.includes(cache.latestNpmVersion)
166
- ? { current: opts.currentCliVersion, latest: cache.latestNpmVersion }
167
- : null;
168
- const forgeAvail = cache.latestForgeVersion &&
169
- semverGt(cache.latestForgeVersion, opts.currentBundledForgeVersion) &&
170
- !cache.dismissedForgeVersions.includes(cache.latestForgeVersion)
171
- ? { current: opts.currentBundledForgeVersion, latest: cache.latestForgeVersion }
172
- : null;
173
- const banner = composeBanner(npmAvail, forgeAvail);
174
- if (banner)
175
- opts.notify(banner, "info");
176
- }
177
- export const __test__ = {
178
- CACHE_TTL_MS,
179
- cachePath,
180
- readCache,
181
- writeCache,
182
- semverGt,
183
- composeBanner,
184
- };
185
- //# sourceMappingURL=update-check.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/update-check.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export interface UpdateToolsResult {
3
- copied: number;
4
- skipped: number;
5
- validationPassed: boolean;
6
- messages: string[];
7
- }
8
- /**
9
- * Copy all *.json from bundled .schemas/ to .forge/schemas/ in cwd.
10
- * Runs validate-store --dry-run after copy.
11
- * Exported so orchestrators can call directly without going through sendUserMessage.
12
- */
13
- export declare function runUpdateTools(cwd: string, opts?: {
14
- _testBundleRoot?: string;
15
- _testToolsRoot?: string;
16
- }): Promise<UpdateToolsResult>;
17
- export interface RegisterUpdateToolsOptions {
18
- /** Override bundle root — for testing only. */
19
- _testBundleRoot?: string;
20
- /** Override tools root — for testing only. */
21
- _testToolsRoot?: string;
22
- }
23
- export declare function registerUpdateTools(pi: ExtensionAPI, opts?: RegisterUpdateToolsOptions): void;
@@ -1,135 +0,0 @@
1
- // update-tools.ts — native atomic handler for /forge:update-tools (FORGE-S23-T10)
2
- //
3
- // Copies all JSON schema files from the bundled forge payload (.schemas/) to
4
- // the project's .forge/schemas/, then runs validate-store --dry-run to verify.
5
- //
6
- // Archetype: Atomic (no LLM in loop — pack-04 §Atomic).
7
- // Iron Laws:
8
- // IL1 — new code lives in forge-cli/ only
9
- // IL6 — no shell-string interpolation (argv-array throughout)
10
- // IL7 — silent continuation past failures is never acceptable
11
- import { execFile } from "node:child_process";
12
- import * as fs from "node:fs";
13
- import * as path from "node:path";
14
- import { promisify } from "node:util";
15
- import { getBundledPayloadRoot, getBundledToolsRoot } from "./forge-init.js";
16
- const execFileAsync = promisify(execFile);
17
- // ── Core runner ──────────────────────────────────────────────────────────────
18
- /**
19
- * Copy all *.json from bundled .schemas/ to .forge/schemas/ in cwd.
20
- * Runs validate-store --dry-run after copy.
21
- * Exported so orchestrators can call directly without going through sendUserMessage.
22
- */
23
- export async function runUpdateTools(cwd, opts = {}) {
24
- const messages = [];
25
- let bundleRoot;
26
- let toolsRoot;
27
- try {
28
- bundleRoot = opts._testBundleRoot ?? getBundledPayloadRoot();
29
- toolsRoot = opts._testToolsRoot ?? getBundledToolsRoot();
30
- }
31
- catch (err) {
32
- const msg = err instanceof Error ? err.message : String(err);
33
- return {
34
- copied: 0,
35
- skipped: 0,
36
- validationPassed: false,
37
- messages: [`× forge:update-tools — could not resolve bundle root: ${msg}`],
38
- };
39
- }
40
- // Source: bundled .schemas/ directory
41
- const schemasSrc = path.join(bundleRoot, ".schemas");
42
- if (!fs.existsSync(schemasSrc)) {
43
- return {
44
- copied: 0,
45
- skipped: 0,
46
- validationPassed: false,
47
- messages: [`× forge:update-tools — bundled schemas directory not found: ${schemasSrc}`],
48
- };
49
- }
50
- // Destination: .forge/schemas/ in the project
51
- const schemasDest = path.join(cwd, ".forge", "schemas");
52
- fs.mkdirSync(schemasDest, { recursive: true });
53
- // Copy all *.json files
54
- let copied = 0;
55
- let skipped = 0;
56
- let schemaFiles;
57
- try {
58
- schemaFiles = fs.readdirSync(schemasSrc).filter((f) => f.endsWith(".json"));
59
- }
60
- catch (err) {
61
- const msg = err instanceof Error ? err.message : String(err);
62
- return {
63
- copied: 0,
64
- skipped: 0,
65
- validationPassed: false,
66
- messages: [`× forge:update-tools — could not read schemas directory: ${msg}`],
67
- };
68
- }
69
- for (const file of schemaFiles) {
70
- const srcPath = path.join(schemasSrc, file);
71
- const destPath = path.join(schemasDest, file);
72
- // src and dest are always different directories; structural skip-if-equal
73
- // is impossible in production but tested via mocks per AC requirement.
74
- if (srcPath === destPath) {
75
- skipped++;
76
- continue;
77
- }
78
- try {
79
- await fs.promises.copyFile(srcPath, destPath);
80
- copied++;
81
- }
82
- catch (err) {
83
- const msg = err instanceof Error ? err.message : String(err);
84
- messages.push(`△ forge:update-tools — could not copy ${file}: ${msg}`);
85
- }
86
- }
87
- messages.push(`〇 forge:update-tools — copied ${copied} schema file(s) to .forge/schemas/.`);
88
- if (skipped > 0) {
89
- messages.push(` (${skipped} file(s) skipped — source equals destination)`);
90
- }
91
- // Run validate-store --dry-run
92
- const validateStorePath = path.join(toolsRoot, "validate-store.cjs");
93
- let validationPassed = false;
94
- try {
95
- await execFileAsync("node", [validateStorePath, "--dry-run"], {
96
- cwd,
97
- encoding: "utf8",
98
- timeout: 15_000,
99
- });
100
- validationPassed = true;
101
- messages.push("〇 Schemas updated and store validation passed.");
102
- }
103
- catch (err) {
104
- const e = err;
105
- const detail = e.stderr || e.stdout || e.message || String(err);
106
- messages.push(`× Validation failed — ${detail.slice(0, 300)}`);
107
- }
108
- return { copied, skipped, validationPassed, messages };
109
- }
110
- export function registerUpdateTools(pi, opts = {}) {
111
- pi.registerCommand("forge:update-tools", {
112
- description: "Refresh .forge/schemas/ from the installed Forge plugin version. " +
113
- "Copies all JSON schema files from the bundled payload to your project.",
114
- async handler(_args, ctx) {
115
- const cwd = process.cwd();
116
- // Outside-project guard
117
- const configPath = path.join(cwd, ".forge", "config.json");
118
- if (!fs.existsSync(configPath)) {
119
- ctx.ui.notify("× forge:update-tools — no .forge/config.json found. " + "Run /forge:init first.", "error");
120
- return;
121
- }
122
- ctx.ui.setStatus?.("forge:update-tools", "Copying schemas…");
123
- const result = await runUpdateTools(cwd, {
124
- _testBundleRoot: opts._testBundleRoot,
125
- _testToolsRoot: opts._testToolsRoot,
126
- });
127
- ctx.ui.setStatus?.("forge:update-tools", undefined);
128
- for (const msg of result.messages) {
129
- const severity = msg.startsWith("×") ? "error" : msg.startsWith("△") ? "warning" : "info";
130
- ctx.ui.notify(msg, severity);
131
- }
132
- },
133
- });
134
- }
135
- //# sourceMappingURL=update-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-tools.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/update-tools.ts"],"names":[],"mappings":"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"}
@@ -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 parseValidateArgs(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 RegisterValidateOptions {
20
- cwd?: string;
21
- }
22
- export declare function registerValidate(pi: ExtensionAPI, options?: RegisterValidateOptions): void;
@@ -1,152 +0,0 @@
1
- // forge:validate — 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 (validate_task.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
- // Iron Laws:
14
- // IL1 — code only under forge-cli/src/extensions/forgecli/.
15
- // IL4 — no JSON.stringify-into-subagent dispatch.
16
- // IL6 — no shell-string interpolation; no spawn calls here.
17
- // IL7 — every failure path emits ctx.ui.notify and returns; no silent
18
- // continuation.
19
- import * as fs from "node:fs";
20
- import * as path from "node:path";
21
- import { assertAudience } from "./audience-gate.js";
22
- import { discoverForgeConfig } from "./forge-root.js";
23
- import { sendKickoff } from "./kickoff.js";
24
- // FORGE-S25-T16: extracted to lib modules (H-1, H-2). Re-exported here for
25
- // backward compatibility with existing test and consumer imports.
26
- import { extractPersonaNames } from "./lib/frontmatter-parser.js";
27
- import { parseGuardArgs, runPipelineGuard } from "./lib/pipeline-guard.js";
28
- import { loadPersona, PersonaSkillLoaderError } from "./parsers/persona-skill-loader.js";
29
- import { loadWorkflow, WorkflowLoaderError } from "./parsers/workflow-loader.js";
30
- export { extractPersonaNames };
31
- import { checkMaterialization } from "./lib/manifest-checker.js";
32
- export { checkMaterialization };
33
- export function parseValidateArgs(rawArgs, cwd) {
34
- const trimmed = (rawArgs ?? "").trim();
35
- if (trimmed === "") {
36
- return { mode: "empty", taskRef: "", sourceLabel: "(no input — qa-engineer infers task from store/context)" };
37
- }
38
- if (trimmed.startsWith("@")) {
39
- const ref = trimmed.slice(1).trim();
40
- const filePath = path.isAbsolute(ref) ? ref : path.resolve(cwd, ref);
41
- const seed = fs.readFileSync(filePath, "utf8");
42
- return { mode: "file", taskRef: seed, sourceLabel: `(seed from file: ${ref})` };
43
- }
44
- return { mode: "text", taskRef: trimmed, sourceLabel: "(seed from inline text)" };
45
- }
46
- export function composeKickoff(opts) {
47
- const { workflowMd, personaIdentity, parsed } = opts;
48
- const sections = ["# /forge:validate", ""];
49
- if (personaIdentity.trim().length > 0) {
50
- sections.push(personaIdentity.trim(), "");
51
- }
52
- sections.push("## Dispatch", "", "Run the workflow below. Specifically:", "", "1. Read the implementation artifacts for `engineering/sprints/<SPRINT_ID>/<TASK_ID>/` (PROGRESS.md, CODE_REVIEW.md).", "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: validate the implementation against acceptance criteria, run test commands, verify completeness.", "4. Write `VALIDATION_REPORT.md` and `VALIDATION-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`.");
53
- sections.push("", "---", "", "## Workflow", "", workflowMd.trim(), "", "---");
54
- if (parsed.mode === "empty") {
55
- sections.push("", "## Input", "", "(no seed — infer task from sprint context and store)");
56
- }
57
- else {
58
- sections.push("", `## Input — ${parsed.sourceLabel}`, "", parsed.taskRef.trim());
59
- }
60
- return sections.join("\n");
61
- }
62
- // Registration -------------------------------------------------------------
63
- const WORKFLOW_REL_PATH = path.join(".forge", "workflows", "validate_task.md");
64
- export function registerValidate(pi, options = {}) {
65
- pi.registerCommand("forge:validate", {
66
- description: "Run the validate-task workflow for a Forge task. " +
67
- "Usage: /forge:validate [@<file> | <free-form text>]. " +
68
- "Note: this workflow is subagent-only; standalone invocations are refused. " +
69
- "Orchestrator chains dispatch directly via runForgeSubagent.",
70
- async handler(args, ctx) {
71
- const cwd = options.cwd ?? process.cwd();
72
- const workflowPath = path.join(cwd, WORKFLOW_REL_PATH);
73
- // Pipeline step guard (FORGE-S26-T11): check task state before dispatching.
74
- const guardParsed = parseGuardArgs(args);
75
- if (!guardParsed.force) {
76
- const forgeConfig = discoverForgeConfig(cwd);
77
- if (forgeConfig) {
78
- const guard = runPipelineGuard("validate", guardParsed.taskIdHint, forgeConfig.forgeRoot, cwd);
79
- if (guard.blocked) {
80
- ctx.ui.notify(guard.message, "error");
81
- return;
82
- }
83
- }
84
- }
85
- const effectiveArgs = guardParsed.cleanArgs;
86
- let workflowMd;
87
- let workflowAudience;
88
- try {
89
- const loaded = loadWorkflow(workflowPath);
90
- workflowMd = loaded.rawMarkdown;
91
- workflowAudience = loaded.audience;
92
- }
93
- catch (err) {
94
- if (err instanceof WorkflowLoaderError) {
95
- if (err.code === "missing_file") {
96
- ctx.ui.notify(`× forge:validate — workflow not found at ${WORKFLOW_REL_PATH}; run /forge:init or /forge:rebuild first.`, "error");
97
- }
98
- else {
99
- ctx.ui.notify(`× forge:validate — workflow load failed (${err.code}): ${err.message}`, "error");
100
- }
101
- return;
102
- }
103
- const e = err;
104
- ctx.ui.notify(`× forge:validate — failed to read workflow: ${e.message ?? "unknown"}`, "error");
105
- return;
106
- }
107
- let parsed;
108
- try {
109
- parsed = parseValidateArgs(effectiveArgs, cwd);
110
- }
111
- catch (err) {
112
- const e = err;
113
- ctx.ui.notify(`× forge:validate — failed to read seed: ${e.message ?? "unknown"}`, "error");
114
- return;
115
- }
116
- const check = checkMaterialization(workflowPath, workflowMd);
117
- if (!check.ok) {
118
- for (const marker of check.missing) {
119
- ctx.ui.notify(`× workflow regression: ${marker} not found in ${workflowPath}`, "error");
120
- }
121
- return;
122
- }
123
- const personas = extractPersonaNames(workflowMd);
124
- let personaIdentity = "";
125
- if (personas.length > 0) {
126
- try {
127
- const persona = loadPersona(personas[0], { cwd });
128
- personaIdentity = persona.identity;
129
- }
130
- catch (err) {
131
- if (err instanceof PersonaSkillLoaderError) {
132
- ctx.ui.notify(`× forge:validate — persona '${personas[0]}' load failed (${err.code}): ${err.message}`, "error");
133
- return;
134
- }
135
- const e = err;
136
- ctx.ui.notify(`× forge:validate — persona load error: ${e.message ?? "unknown"}`, "error");
137
- return;
138
- }
139
- }
140
- if (!assertAudience({ workflowName: "validate_task", audience: workflowAudience }, ctx)) {
141
- return;
142
- }
143
- const kickoff = composeKickoff({
144
- workflowMd,
145
- personaIdentity,
146
- parsed,
147
- });
148
- sendKickoff(pi, kickoff);
149
- },
150
- });
151
- }
152
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/validate.ts"],"names":[],"mappings":"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"}
@@ -1,78 +0,0 @@
1
- import type { SessionRegistry } from "./session-registry.js";
2
- import { type UsageDelta } from "./viewport-renderer.js";
3
- /** Minimal shape of the AgentSessionEvent union we care about — kept loose
4
- * so the file doesn't pull in @earendil-works/pi-agent-core types at compile
5
- * time for callers that only consume the factory. */
6
- type SubagentEvent = {
7
- type: "turn_start";
8
- } | {
9
- type: "turn_end";
10
- message: unknown;
11
- } | {
12
- type: "tool_execution_start";
13
- toolCallId: string;
14
- toolName: string;
15
- args: unknown;
16
- } | {
17
- type: "tool_execution_end";
18
- toolCallId: string;
19
- toolName: string;
20
- result: unknown;
21
- isError: boolean;
22
- } | {
23
- type: "compaction_start";
24
- reason: string;
25
- } | {
26
- type: "auto_retry_start";
27
- attempt: number;
28
- maxAttempts: number;
29
- errorMessage?: string;
30
- } | {
31
- type: string;
32
- [k: string]: unknown;
33
- };
34
- export interface ViewportObserverOpts {
35
- registry: SessionRegistry;
36
- /** session key in the registry (taskId, bugId, or sprintId:ceremony, etc.) */
37
- sessionId: string;
38
- /** phase scope for tail buffer and per-phase usage */
39
- phaseRole: string;
40
- /** displayed in the per-line prefix `[<displayRole> HH:MM:SS tN]`. Usually same
41
- * as `phaseRole` but kept separate so callers like run-sprint ceremony can
42
- * show a friendlier role label without changing the registry key. */
43
- displayRole?: string;
44
- /** optional `─── phase X/Y begin · sessionId ───` header to emit immediately */
45
- beginHeader?: string;
46
- /** optional JSONL audit sink (the run-task debug log). */
47
- writeDebug?: (rec: Record<string, unknown>) => void;
48
- /** optional verbose status setter — only called when FORGE_VERBOSE=1.
49
- * The observer doesn't read FORGE_VERBOSE itself; caller decides whether to
50
- * wire this. */
51
- setStatusVerbose?: (key: string, msg: string) => void;
52
- /** optional toast for compaction/retry; ignore to suppress. */
53
- notify?: (msg: string, level: "info" | "warning" | "error") => void;
54
- /** keys used for `setStatusVerbose` when caller wants verbose status. */
55
- verboseKeys?: {
56
- messageKey?: string;
57
- };
58
- /** invoked after every handled event so orchestrators can refresh their own
59
- * status line (e.g. FORGE_VERBOSE status with `lastTool`, elapsed seconds). */
60
- afterEach?: () => void;
61
- }
62
- export interface AttachedObserver {
63
- onEvent: (event: SubagentEvent) => void;
64
- /** Mutable counters orchestrator can read after subagent returns. */
65
- state: {
66
- turn: number;
67
- toolCount: number;
68
- errCount: number;
69
- lastTool: string;
70
- cumUsage: UsageDelta;
71
- cumCompression: {
72
- calls: number;
73
- tokensSaved: number;
74
- };
75
- };
76
- }
77
- export declare function attachViewportObserver(opts: ViewportObserverOpts): AttachedObserver;
78
- export {};