@entelligentsia/forgecli 0.10.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +21 -3
  3. package/dist/CHANGELOG-forge-plugin.md +90 -0
  4. package/dist/bin/config.js +6 -0
  5. package/dist/bin/config.js.map +1 -1
  6. package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
  7. package/dist/extensions/forgecli/add-pipeline.js +143 -0
  8. package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
  9. package/dist/extensions/forgecli/add-task.d.ts +20 -0
  10. package/dist/extensions/forgecli/add-task.js +154 -0
  11. package/dist/extensions/forgecli/add-task.js.map +1 -0
  12. package/dist/extensions/forgecli/calibrate.d.ts +61 -0
  13. package/dist/extensions/forgecli/calibrate.js +488 -0
  14. package/dist/extensions/forgecli/calibrate.js.map +1 -0
  15. package/dist/extensions/forgecli/fix-bug.d.ts +9 -1
  16. package/dist/extensions/forgecli/fix-bug.js +155 -45
  17. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  18. package/dist/extensions/forgecli/forge-commands.js +15 -22
  19. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  20. package/dist/extensions/forgecli/forge-subagent.d.ts +16 -1
  21. package/dist/extensions/forgecli/forge-subagent.js +45 -8
  22. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  23. package/dist/extensions/forgecli/forge-update-command.d.ts +9 -0
  24. package/dist/extensions/forgecli/forge-update-command.js +106 -7
  25. package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
  26. package/dist/extensions/forgecli/health-check.d.ts +22 -1
  27. package/dist/extensions/forgecli/health-check.js +177 -4
  28. package/dist/extensions/forgecli/health-check.js.map +1 -1
  29. package/dist/extensions/forgecli/hook-dispatcher.d.ts +25 -1
  30. package/dist/extensions/forgecli/hook-dispatcher.js +104 -9
  31. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  32. package/dist/extensions/forgecli/hooks/check-update.d.ts +81 -0
  33. package/dist/extensions/forgecli/hooks/check-update.js +308 -0
  34. package/dist/extensions/forgecli/hooks/check-update.js.map +1 -0
  35. package/dist/extensions/forgecli/hooks/forge-permissions.d.ts +32 -0
  36. package/dist/extensions/forgecli/hooks/forge-permissions.js +119 -0
  37. package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -0
  38. package/dist/extensions/forgecli/hooks/triage-error.d.ts +23 -0
  39. package/dist/extensions/forgecli/hooks/triage-error.js +62 -0
  40. package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -0
  41. package/dist/extensions/forgecli/hooks/write-guard.d.ts +28 -0
  42. package/dist/extensions/forgecli/hooks/write-guard.js +225 -0
  43. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -0
  44. package/dist/extensions/forgecli/index.js +60 -0
  45. package/dist/extensions/forgecli/index.js.map +1 -1
  46. package/dist/extensions/forgecli/init-context.d.ts +1 -1
  47. package/dist/extensions/forgecli/init-context.js +21 -6
  48. package/dist/extensions/forgecli/init-context.js.map +1 -1
  49. package/dist/extensions/forgecli/materialize.d.ts +16 -0
  50. package/dist/extensions/forgecli/materialize.js +195 -0
  51. package/dist/extensions/forgecli/materialize.js.map +1 -0
  52. package/dist/extensions/forgecli/migrate.d.ts +19 -0
  53. package/dist/extensions/forgecli/migrate.js +258 -0
  54. package/dist/extensions/forgecli/migrate.js.map +1 -0
  55. package/dist/extensions/forgecli/migration-engine.d.ts +111 -0
  56. package/dist/extensions/forgecli/migration-engine.js +533 -0
  57. package/dist/extensions/forgecli/migration-engine.js.map +1 -0
  58. package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
  59. package/dist/extensions/forgecli/quiz-agent.js +98 -0
  60. package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
  61. package/dist/extensions/forgecli/remove-command.d.ts +17 -0
  62. package/dist/extensions/forgecli/remove-command.js +124 -0
  63. package/dist/extensions/forgecli/remove-command.js.map +1 -0
  64. package/dist/extensions/forgecli/report-bug.d.ts +25 -0
  65. package/dist/extensions/forgecli/report-bug.js +159 -0
  66. package/dist/extensions/forgecli/report-bug.js.map +1 -0
  67. package/dist/extensions/forgecli/retrospective.d.ts +19 -0
  68. package/dist/extensions/forgecli/retrospective.js +156 -0
  69. package/dist/extensions/forgecli/retrospective.js.map +1 -0
  70. package/dist/extensions/forgecli/run-sprint.js +36 -3
  71. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  72. package/dist/extensions/forgecli/run-task.d.ts +9 -1
  73. package/dist/extensions/forgecli/run-task.js +66 -13
  74. package/dist/extensions/forgecli/run-task.js.map +1 -1
  75. package/dist/extensions/forgecli/session-registry.d.ts +40 -2
  76. package/dist/extensions/forgecli/session-registry.js +71 -1
  77. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  78. package/dist/extensions/forgecli/status-command.d.ts +19 -0
  79. package/dist/extensions/forgecli/status-command.js +140 -0
  80. package/dist/extensions/forgecli/status-command.js.map +1 -0
  81. package/dist/extensions/forgecli/store-query.d.ts +22 -0
  82. package/dist/extensions/forgecli/store-query.js +107 -0
  83. package/dist/extensions/forgecli/store-query.js.map +1 -0
  84. package/dist/extensions/forgecli/store-repair.d.ts +17 -0
  85. package/dist/extensions/forgecli/store-repair.js +123 -0
  86. package/dist/extensions/forgecli/store-repair.js.map +1 -0
  87. package/dist/extensions/forgecli/test-orchestrate.js +1 -0
  88. package/dist/extensions/forgecli/test-orchestrate.js.map +1 -1
  89. package/dist/extensions/forgecli/thread-switcher.js +286 -41
  90. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  91. package/dist/extensions/forgecli/transition-guard.js +7 -2
  92. package/dist/extensions/forgecli/transition-guard.js.map +1 -1
  93. package/dist/extensions/forgecli/update-tools.d.ts +23 -0
  94. package/dist/extensions/forgecli/update-tools.js +136 -0
  95. package/dist/extensions/forgecli/update-tools.js.map +1 -0
  96. package/dist/extensions/forgecli/viewport-events.js +10 -0
  97. package/dist/extensions/forgecli/viewport-events.js.map +1 -1
  98. package/dist/extensions/forgecli/viewport-renderer.d.ts +18 -0
  99. package/dist/extensions/forgecli/viewport-renderer.js +27 -0
  100. package/dist/extensions/forgecli/viewport-renderer.js.map +1 -1
  101. package/dist/extensions/forgecli/viewport-theme.js +4 -0
  102. package/dist/extensions/forgecli/viewport-theme.js.map +1 -1
  103. package/dist/extensions/forgecli/whats-new-widget.d.ts +13 -8
  104. package/dist/extensions/forgecli/whats-new-widget.js +111 -42
  105. package/dist/extensions/forgecli/whats-new-widget.js.map +1 -1
  106. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +29 -3
  107. package/dist/forge-payload/.base-pack/workflows/commit_task.md +15 -8
  108. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +327 -185
  109. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +18 -10
  110. package/dist/forge-payload/.base-pack/workflows/plan_task.md +15 -9
  111. package/dist/forge-payload/.base-pack/workflows/review_code.md +14 -6
  112. package/dist/forge-payload/.base-pack/workflows/review_plan.md +18 -10
  113. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  114. package/dist/forge-payload/.schemas/bug.schema.json +3 -2
  115. package/dist/forge-payload/.schemas/config.schema.json +83 -0
  116. package/dist/forge-payload/.schemas/migrations.json +2049 -0
  117. package/dist/forge-payload/commands/regenerate.md +17 -1
  118. package/dist/forge-payload/meta/personas/README.md +16 -0
  119. package/dist/forge-payload/meta/personas/meta-architect.md +70 -0
  120. package/dist/forge-payload/meta/personas/meta-bug-fixer.md +73 -0
  121. package/dist/forge-payload/meta/personas/meta-collator.md +72 -0
  122. package/dist/forge-payload/meta/personas/meta-engineer.md +70 -0
  123. package/dist/forge-payload/meta/personas/meta-orchestrator.md +71 -0
  124. package/dist/forge-payload/meta/personas/meta-product-manager.md +82 -0
  125. package/dist/forge-payload/meta/personas/meta-qa-engineer.md +91 -0
  126. package/dist/forge-payload/meta/personas/meta-supervisor.md +92 -0
  127. package/dist/forge-payload/meta/skill-recommendations.md +154 -0
  128. package/dist/forge-payload/meta/skills/meta-architect-skills.md +43 -0
  129. package/dist/forge-payload/meta/skills/meta-bug-fixer-skills.md +43 -0
  130. package/dist/forge-payload/meta/skills/meta-collator-skills.md +41 -0
  131. package/dist/forge-payload/meta/skills/meta-engineer-skills.md +43 -0
  132. package/dist/forge-payload/meta/skills/meta-generic-skills.md +58 -0
  133. package/dist/forge-payload/meta/skills/meta-qa-engineer-skills.md +46 -0
  134. package/dist/forge-payload/meta/skills/meta-supervisor-skills.md +43 -0
  135. package/dist/forge-payload/meta/store-schema/bug.schema.md +71 -0
  136. package/dist/forge-payload/meta/store-schema/event.schema.md +76 -0
  137. package/dist/forge-payload/meta/store-schema/feature.schema.md +65 -0
  138. package/dist/forge-payload/meta/store-schema/sprint.schema.md +64 -0
  139. package/dist/forge-payload/meta/store-schema/task.schema.md +78 -0
  140. package/dist/forge-payload/meta/templates/meta-code-review.md +26 -0
  141. package/dist/forge-payload/meta/templates/meta-plan-review.md +28 -0
  142. package/dist/forge-payload/meta/templates/meta-plan.md +28 -0
  143. package/dist/forge-payload/meta/templates/meta-progress.md +25 -0
  144. package/dist/forge-payload/meta/templates/meta-retrospective.md +28 -0
  145. package/dist/forge-payload/meta/templates/meta-sprint-manifest.md +26 -0
  146. package/dist/forge-payload/meta/templates/meta-sprint-requirements.md +91 -0
  147. package/dist/forge-payload/meta/templates/meta-task-prompt.md +26 -0
  148. package/dist/forge-payload/meta/tool-specs/collate.spec.md +88 -0
  149. package/dist/forge-payload/meta/tool-specs/generation-manifest.spec.md +139 -0
  150. package/dist/forge-payload/meta/tool-specs/manage-config.spec.md +143 -0
  151. package/dist/forge-payload/meta/tool-specs/seed-store.spec.md +91 -0
  152. package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +328 -0
  153. package/dist/forge-payload/meta/tool-specs/validate-store.spec.md +191 -0
  154. package/dist/forge-payload/meta/workflows/_fragments/context-injection.md +75 -0
  155. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +73 -0
  156. package/dist/forge-payload/meta/workflows/_fragments/finalize.md +13 -0
  157. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +73 -0
  158. package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +38 -0
  159. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +39 -0
  160. package/dist/forge-payload/meta/workflows/meta-approve.md +119 -0
  161. package/dist/forge-payload/meta/workflows/meta-collate.md +89 -0
  162. package/dist/forge-payload/meta/workflows/meta-commit.md +93 -0
  163. package/dist/forge-payload/meta/workflows/meta-enhance.md +286 -0
  164. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +501 -0
  165. package/dist/forge-payload/meta/workflows/meta-implement.md +132 -0
  166. package/dist/forge-payload/meta/workflows/meta-migrate.md +455 -0
  167. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +993 -0
  168. package/dist/forge-payload/meta/workflows/meta-plan-task.md +133 -0
  169. package/dist/forge-payload/meta/workflows/meta-quiz-agent.md +135 -0
  170. package/dist/forge-payload/meta/workflows/meta-retrospective.md +65 -0
  171. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +119 -0
  172. package/dist/forge-payload/meta/workflows/meta-review-plan.md +108 -0
  173. package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +65 -0
  174. package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +76 -0
  175. package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +147 -0
  176. package/dist/forge-payload/meta/workflows/meta-update-implementation.md +76 -0
  177. package/dist/forge-payload/meta/workflows/meta-update-plan.md +76 -0
  178. package/dist/forge-payload/meta/workflows/meta-validate.md +111 -0
  179. package/dist/forge-payload/tools/check-structure.cjs +344 -0
  180. package/dist/forge-payload/tools/collate.cjs +34 -9
  181. package/dist/forge-payload/tools/list-skills.js +76 -0
  182. package/dist/forge-payload/tools/parse-gates.cjs +8 -2
  183. package/dist/forge-payload/tools/store-cli.cjs +56 -11
  184. package/dist/forge-payload/tools/store.cjs +61 -0
  185. package/dist/forge-payload/tools/substitute-placeholders.cjs +60 -8
  186. package/dist/forge-payload/tools/validate-store.cjs +6 -2
  187. package/dist/forge-payload/tools/verify-integrity.cjs +86 -0
  188. package/package.json +2 -2
@@ -0,0 +1,533 @@
1
+ // migration-engine.ts — Deterministic migration apply engine (FORGE-S23-T01)
2
+ //
3
+ // Reads migrations.json from the bundled payload, walks version entries between
4
+ // the given bounds using semver comparison [from, to) semantics, applies
5
+ // regeneration actions against the project's .forge/ directory, and maintains
6
+ // an idempotency ledger at .forge/applied-migrations.json.
7
+ //
8
+ // Design: pure engine — no pi runtime context, no UI calls, no event emission.
9
+ // The calling command handler (forge-update-command.ts) is responsible for
10
+ // event emission after this engine returns a MigrationResult.
11
+ //
12
+ // Layer: Layer 1 of the two-layer split (pure engine / command handler).
13
+ import { createRequire } from "node:module";
14
+ import * as fs from "node:fs";
15
+ import * as path from "node:path";
16
+ // ── semverCompare ─────────────────────────────────────────────────────────────
17
+ /**
18
+ * Compare two version strings using semver integer-component comparison.
19
+ * Returns: negative if a < b, 0 if a === b, positive if a > b.
20
+ *
21
+ * Unlike string comparison, this correctly handles 0.9.x vs 0.10.x boundaries.
22
+ * Strips leading "v" prefix (matches parseTriple() behavior in forge-update-command.ts:118).
23
+ * Falls back to localeCompare for invalid/non-semver inputs.
24
+ */
25
+ export function semverCompare(a, b) {
26
+ const parse = (v) => {
27
+ const cleaned = v.startsWith("v") ? v.slice(1) : v; // Strip "v" prefix (parity with parseTriple())
28
+ const parts = cleaned.split(".");
29
+ if (parts.length !== 3)
30
+ return null;
31
+ const [major, minor, patch] = parts.map(Number);
32
+ if ([major, minor, patch].some((n) => Number.isNaN(n)))
33
+ return null;
34
+ return [major, minor, patch];
35
+ };
36
+ const pa = parse(a);
37
+ const pb = parse(b);
38
+ if (!pa || !pb)
39
+ return a.localeCompare(b); // Fallback for invalid format
40
+ for (let i = 0; i < 3; i++) {
41
+ if (pa[i] !== pb[i])
42
+ return pa[i] - pb[i];
43
+ }
44
+ return 0;
45
+ }
46
+ // ── filterMigrationEntries ────────────────────────────────────────────────────
47
+ /**
48
+ * Filter migrations.json entries using [fromVersion, toVersion) semantics on keys.
49
+ *
50
+ * - fromVersion entry IS included: it represents the transition AWAY from that version.
51
+ * - toVersion entry is EXCLUDED: it would be a further transition past the target.
52
+ * - Results are sorted ascending by semver (oldest first).
53
+ *
54
+ * No first-run special case — this same filter applies for both first-run
55
+ * (empty ledger) and subsequent runs. The idempotency ledger handles re-run protection.
56
+ */
57
+ export function filterMigrationEntries(migrations, fromVersion, toVersion) {
58
+ return Object.entries(migrations)
59
+ .filter(([key]) => {
60
+ return (semverCompare(key, fromVersion) >= 0 &&
61
+ semverCompare(key, toVersion) < 0);
62
+ })
63
+ .map(([key, entry]) => ({ key, entry }))
64
+ .sort((a, b) => semverCompare(a.key, b.key));
65
+ }
66
+ // ── resolveCategory ────────────────────────────────────────────────────────────
67
+ /**
68
+ * Resolve a migration category string to one or more WriteDescriptors.
69
+ * Pure function — does not write files; appends to the provided writes array.
70
+ *
71
+ * ENOENT trap rule: if source doesn't exist, skip silently (never throw on ENOENT).
72
+ * Non-ENOENT IO errors propagate.
73
+ *
74
+ * Path-traversal defense: all output paths are validated against
75
+ * path.join(projectRoot, '.forge') before being added to writes.
76
+ */
77
+ export function resolveCategory(category, bundleRoot, projectRoot, writes) {
78
+ const forgeDir = path.join(projectRoot, ".forge");
79
+ const basePack = path.join(bundleRoot, ".base-pack");
80
+ const schemas = path.join(bundleRoot, ".schemas");
81
+ function safeDest(rel) {
82
+ const resolved = path.join(forgeDir, rel);
83
+ const safePrefix = forgeDir + path.sep;
84
+ if (!resolved.startsWith(safePrefix)) {
85
+ throw new Error(`Path traversal attempt: resolved output path '${resolved}' is outside .forge/`);
86
+ }
87
+ return resolved;
88
+ }
89
+ function tryAdd(src, dest) {
90
+ try {
91
+ const stat = fs.statSync(src);
92
+ if (stat.isFile()) {
93
+ writes.push({ src, dest });
94
+ }
95
+ }
96
+ catch (err) {
97
+ if (err.code !== "ENOENT")
98
+ throw err;
99
+ // ENOENT — skip silently
100
+ }
101
+ }
102
+ // ── Schema categories ───────────────────────────────────────────────────
103
+ if (category === "schemas") {
104
+ // Bare schemas — copy all *.schema.json from bundle/.schemas/
105
+ try {
106
+ const files = fs.readdirSync(schemas).filter((f) => f.endsWith(".schema.json"));
107
+ for (const f of files) {
108
+ writes.push({
109
+ src: path.join(schemas, f),
110
+ dest: safeDest(path.join("schemas", f)),
111
+ });
112
+ }
113
+ }
114
+ catch (err) {
115
+ if (err.code !== "ENOENT")
116
+ throw err;
117
+ }
118
+ return;
119
+ }
120
+ if (category.startsWith("schemas:")) {
121
+ const name = category.slice("schemas:".length);
122
+ // Path-traversal defense on the name itself
123
+ if (name.includes("..") || name.includes("/") || name.includes("\\")) {
124
+ // Validate safe destination will catch it — but throw explicitly for clarity
125
+ const dest = path.join(forgeDir, "schemas", `${name}.schema.json`);
126
+ const safePrefix = forgeDir + path.sep;
127
+ if (!dest.startsWith(safePrefix)) {
128
+ throw new Error(`Path traversal attempt: schemas category '${category}'`);
129
+ }
130
+ }
131
+ // Special case: structure-manifest (non-.schema.json file)
132
+ if (name === "structure-manifest") {
133
+ // Probe .schema.json first, fall back to .json
134
+ const srcSchema = path.join(schemas, `${name}.schema.json`);
135
+ const srcJson = path.join(schemas, `${name}.json`);
136
+ const dest = safeDest(path.join("schemas", `${name}.json`));
137
+ if (fs.existsSync(srcSchema)) {
138
+ writes.push({ src: srcSchema, dest });
139
+ }
140
+ else {
141
+ tryAdd(srcJson, dest);
142
+ }
143
+ return;
144
+ }
145
+ // Standard schema: <name>.schema.json
146
+ tryAdd(path.join(schemas, `${name}.schema.json`), safeDest(path.join("schemas", `${name}.schema.json`)));
147
+ return;
148
+ }
149
+ // ── hooks:* short-circuit ───────────────────────────────────────────────
150
+ if (category === "hooks" || category.startsWith("hooks:")) {
151
+ // No source directory in bundle; short-circuit before any fs call
152
+ return;
153
+ }
154
+ // ── tools:* short-circuit (excluding tools:lib:*) ──────────────────────
155
+ if (category === "tools" || (category.startsWith("tools:") && !category.startsWith("tools:lib"))) {
156
+ // paths.forgeRoot is updated by substitute-placeholders, not by this engine directly.
157
+ // No file operations for tools:* categories.
158
+ return;
159
+ }
160
+ // ── tools:lib/<name> and tools:lib:<name> ──────────────────────────────
161
+ if (category.startsWith("tools:lib")) {
162
+ const rest = category.slice("tools:lib".length);
163
+ // Normalize separator: tools:lib/forge-root or tools:lib:validate → name
164
+ const name = rest.startsWith("/") ? rest.slice(1) : rest.startsWith(":") ? rest.slice(1) : rest;
165
+ const libSrc = path.join(bundleRoot, "tools", "lib");
166
+ // tools:lib files are forge-cli internal tools (bundled in dist/forge-payload/tools/lib/).
167
+ // They serve the forge-cli extension itself, not the user's .forge/ project tree.
168
+ // This engine can only write to projectRoot/.forge/ — it cannot update the installed
169
+ // forge-cli tools. The migration engine records which source files exist (for tracking),
170
+ // but cannot write them to a meaningful location within .forge/.
171
+ //
172
+ // Probe .cjs first, then .js (matching LIB_ALLOWLIST entry patterns).
173
+ // For default-payload installs: forge-root.cjs, paths.cjs, validate.js ARE present.
174
+ // ENOENT on both: graceful skip (no throw).
175
+ const srcCjs = path.join(libSrc, `${name}.cjs`);
176
+ const srcJs = path.join(libSrc, `${name}.js`);
177
+ const resolvedSrc = fs.existsSync(srcCjs) ? srcCjs : fs.existsSync(srcJs) ? srcJs : null;
178
+ if (resolvedSrc) {
179
+ // Record as informational write to a .forge/schemas/ tracking file.
180
+ // This is a best-effort record — the actual lib file update requires npm reinstall.
181
+ writes.push({
182
+ src: resolvedSrc,
183
+ dest: safeDest(path.join("schemas", `.tools-lib-${name}.marker`)),
184
+ });
185
+ }
186
+ // ENOENT on both: graceful skip
187
+ return;
188
+ }
189
+ // ── fragments:* and events:* (convention aliases) ──────────────────────
190
+ if (category.startsWith("fragments:") || category.startsWith("events:")) {
191
+ const prefix = category.startsWith("fragments:") ? "fragments:" : "events:";
192
+ const name = category.slice(prefix.length);
193
+ tryAdd(path.join(basePack, "workflows", "_fragments", `${name}.md`), safeDest(path.join("workflows", "_fragments", `${name}.md`)));
194
+ return;
195
+ }
196
+ // ── workflows:_fragments (bare-directory token) ─────────────────────────
197
+ if (category === "workflows:_fragments") {
198
+ const fragDir = path.join(basePack, "workflows", "_fragments");
199
+ try {
200
+ const entries = fs.readdirSync(fragDir);
201
+ for (const entry of entries) {
202
+ // Nesting guard: do NOT recurse into a subdirectory named _fragments/
203
+ if (entry === "_fragments")
204
+ continue;
205
+ const fullSrc = path.join(fragDir, entry);
206
+ try {
207
+ const st = fs.statSync(fullSrc);
208
+ if (st.isFile()) {
209
+ writes.push({
210
+ src: fullSrc,
211
+ dest: safeDest(path.join("workflows", "_fragments", entry)),
212
+ });
213
+ }
214
+ // Skip subdirectories (nesting guard above handles _fragments/)
215
+ }
216
+ catch (err) {
217
+ if (err.code !== "ENOENT")
218
+ throw err;
219
+ }
220
+ }
221
+ }
222
+ catch (err) {
223
+ if (err.code !== "ENOENT")
224
+ throw err;
225
+ }
226
+ return;
227
+ }
228
+ // ── workflows:_fragments_<name> (underscore compound) ──────────────────
229
+ if (category.startsWith("workflows:_fragments_")) {
230
+ const name = category.slice("workflows:_fragments_".length);
231
+ tryAdd(path.join(basePack, "workflows", "_fragments", `${name}.md`), safeDest(path.join("workflows", "_fragments", `${name}.md`)));
232
+ return;
233
+ }
234
+ // ── Base-pack categories ────────────────────────────────────────────────
235
+ const VALID_BASE_PACK_TYPES = ["personas", "workflows", "skills", "templates", "commands"];
236
+ const colonIdx = category.indexOf(":");
237
+ const typeStr = colonIdx >= 0 ? category.slice(0, colonIdx) : category;
238
+ const subTarget = colonIdx >= 0 ? category.slice(colonIdx + 1) : null;
239
+ if (!VALID_BASE_PACK_TYPES.includes(typeStr)) {
240
+ // Unknown category — log at debug level and skip
241
+ return;
242
+ }
243
+ const type = typeStr;
244
+ if (subTarget === null) {
245
+ // Bare category — walk the entire subdirectory
246
+ const srcDir = path.join(basePack, type);
247
+ try {
248
+ const files = fs.readdirSync(srcDir).filter((f) => f.endsWith(".md"));
249
+ for (const f of files) {
250
+ const dest = type === "skills"
251
+ ? safeDest(path.join(type, f)) // skills files already have -skills.md suffix
252
+ : type === "commands"
253
+ ? safeDest(path.join("commands", "forge", f))
254
+ : safeDest(path.join(type, f));
255
+ tryAdd(path.join(srcDir, f), dest);
256
+ }
257
+ }
258
+ catch (err) {
259
+ if (err.code !== "ENOENT")
260
+ throw err;
261
+ }
262
+ return;
263
+ }
264
+ // Special case: workflows:base-pack-store-cli-form — explicit no-op
265
+ if (type === "workflows" && subTarget === "base-pack-store-cli-form") {
266
+ // Sub-target doesn't exist in base-pack; debug-logged no-op
267
+ return;
268
+ }
269
+ // Sub-target category: <type>:<name>
270
+ const filename = type === "skills"
271
+ ? `${subTarget}-skills.md` // skills:<name> → <name>-skills.md
272
+ : `${subTarget}.md`;
273
+ const dest = type === "commands"
274
+ ? safeDest(path.join("commands", "forge", filename))
275
+ : safeDest(path.join(type, filename));
276
+ tryAdd(path.join(basePack, type, filename), dest);
277
+ }
278
+ // ── executeFileOps ─────────────────────────────────────────────────────────────
279
+ function executeFileOps(fileOps, projectRoot, dryRun) {
280
+ const forgeDir = path.join(projectRoot, ".forge");
281
+ const safePrefix = forgeDir + path.sep;
282
+ const categories = [];
283
+ for (const op of fileOps) {
284
+ const dest = path.resolve(projectRoot, op.path);
285
+ if (!dest.startsWith(safePrefix) && !dest.startsWith(forgeDir)) {
286
+ throw new Error(`Path traversal attempt in fileOps: '${op.path}'`);
287
+ }
288
+ categories.push(`fileOps:${op.op}`);
289
+ if (dryRun)
290
+ continue;
291
+ switch (op.op) {
292
+ case "mkdir":
293
+ fs.mkdirSync(dest, { recursive: true });
294
+ break;
295
+ case "copy":
296
+ if (op.src) {
297
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
298
+ try {
299
+ fs.copyFileSync(op.src, dest);
300
+ }
301
+ catch (err) {
302
+ if (err.code !== "ENOENT")
303
+ throw err;
304
+ }
305
+ }
306
+ break;
307
+ case "delete":
308
+ try {
309
+ fs.rmSync(dest, { force: true });
310
+ }
311
+ catch (err) {
312
+ if (err.code !== "ENOENT")
313
+ throw err;
314
+ }
315
+ break;
316
+ case "substitute-placeholder":
317
+ // Forward-compat: just copy for now (no ctx available in engine)
318
+ if (op.src) {
319
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
320
+ try {
321
+ fs.copyFileSync(op.src, dest);
322
+ }
323
+ catch (err) {
324
+ if (err.code !== "ENOENT")
325
+ throw err;
326
+ }
327
+ }
328
+ break;
329
+ }
330
+ }
331
+ return categories;
332
+ }
333
+ // ── Ledger helpers ────────────────────────────────────────────────────────────
334
+ function readLedger(projectRoot) {
335
+ const ledgerPath = path.join(projectRoot, ".forge", "applied-migrations.json");
336
+ try {
337
+ const raw = fs.readFileSync(ledgerPath, "utf8");
338
+ return JSON.parse(raw);
339
+ }
340
+ catch {
341
+ return { schemaVersion: 1, appliedVersions: [] };
342
+ }
343
+ }
344
+ function writeLedger(projectRoot, ledger) {
345
+ const ledgerPath = path.join(projectRoot, ".forge", "applied-migrations.json");
346
+ fs.writeFileSync(ledgerPath, JSON.stringify(ledger, null, 2), "utf8");
347
+ }
348
+ // ── runMigrations ─────────────────────────────────────────────────────────────
349
+ /**
350
+ * Execute all migration entries between [fromVersion, toVersion) from the
351
+ * bundled migrations.json against the project's .forge/ directory.
352
+ *
353
+ * Design constraints:
354
+ * - No UI context (no ctx.ui calls).
355
+ * - No event emission (caller is responsible).
356
+ * - Pure deterministic engine: reads from bundleRoot, writes to projectRoot/.forge/.
357
+ * - Idempotent: already-applied versions (from .forge/applied-migrations.json) are skipped.
358
+ *
359
+ * Forward-compat: entries with non-empty fileOps[] use fileOps; otherwise regenerate.
360
+ * NOTE: 0 of 158 current entries use fileOps — the executor is dead code on day 1.
361
+ * Once a real fileOps entry lands, an integration test against that entry MUST be added.
362
+ */
363
+ export async function runMigrations(opts) {
364
+ const { bundleRoot, projectRoot, fromVersion, toVersion, dryRun = false } = opts;
365
+ const result = {
366
+ applied: [],
367
+ skippedBreaking: [],
368
+ manualSteps: [],
369
+ dryRun,
370
+ schemasRefreshed: [],
371
+ forgeRootUpdated: false,
372
+ };
373
+ // Read migrations.json from bundle
374
+ const migrationsPath = path.join(bundleRoot, ".schemas", "migrations.json");
375
+ let migrations;
376
+ try {
377
+ const raw = fs.readFileSync(migrationsPath, "utf8");
378
+ migrations = JSON.parse(raw);
379
+ }
380
+ catch (err) {
381
+ if (err.code === "ENOENT") {
382
+ // migrations.json not in bundle — no migrations to apply
383
+ return result;
384
+ }
385
+ throw err;
386
+ }
387
+ // Filter entries using [from, to) semantics
388
+ const entries = filterMigrationEntries(migrations, fromVersion, toVersion);
389
+ if (entries.length === 0) {
390
+ // No-op: empty range (from == to) or no entries in range
391
+ return result;
392
+ }
393
+ // Read idempotency ledger
394
+ const ledger = readLedger(projectRoot);
395
+ // Build substitution map ONCE using config from .forge/config.json
396
+ let buildSubstitutionMap = null;
397
+ let substituteFile = null;
398
+ try {
399
+ const substPath = path.join(bundleRoot, "tools", "substitute-placeholders.cjs");
400
+ const _require = createRequire(import.meta.url);
401
+ const substModule = _require(substPath);
402
+ buildSubstitutionMap = substModule.buildSubstitutionMap;
403
+ substituteFile = substModule.substituteFile;
404
+ }
405
+ catch {
406
+ // substitute-placeholders not available (testing or minimal bundle)
407
+ // Fall back to identity substitution
408
+ }
409
+ let substitutionMap = null;
410
+ if (buildSubstitutionMap) {
411
+ try {
412
+ const configPath = path.join(projectRoot, ".forge", "config.json");
413
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
414
+ substitutionMap = buildSubstitutionMap(config);
415
+ }
416
+ catch {
417
+ // Config unreadable — proceed without substitution
418
+ }
419
+ }
420
+ // Process each entry in ascending semver order
421
+ for (const { key, entry } of entries) {
422
+ // Skip if already applied (idempotency)
423
+ if (ledger.appliedVersions.includes(key)) {
424
+ continue;
425
+ }
426
+ // Skip breaking entries
427
+ if (entry.breaking) {
428
+ result.skippedBreaking.push({
429
+ fromVersion: key,
430
+ toVersion: entry.version,
431
+ reason: `breaking: true — manual intervention required. Notes: ${entry.notes}`,
432
+ });
433
+ continue;
434
+ }
435
+ // Collect manual steps
436
+ if (entry.manual && entry.manual.length > 0) {
437
+ result.manualSteps.push({
438
+ fromVersion: key,
439
+ toVersion: entry.version,
440
+ steps: entry.manual,
441
+ });
442
+ }
443
+ let appliedCategories = [];
444
+ // fileOps takes priority over regenerate when non-empty
445
+ // NOTE: 0 of 158 current entries use fileOps (dead code on day 1).
446
+ // When a real fileOps entry lands, add an integration test against it.
447
+ if (entry.fileOps && entry.fileOps.length > 0) {
448
+ appliedCategories = executeFileOps(entry.fileOps, projectRoot, dryRun);
449
+ }
450
+ else if (entry.regenerate && entry.regenerate.length > 0) {
451
+ // Resolve categories to write descriptors
452
+ const writes = [];
453
+ for (const category of entry.regenerate) {
454
+ resolveCategory(category, bundleRoot, projectRoot, writes);
455
+ }
456
+ // Execute writes (unless dry-run)
457
+ if (!dryRun) {
458
+ for (const { src, dest } of writes) {
459
+ try {
460
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
461
+ // Apply placeholder substitution for base-pack files
462
+ if (substituteFile &&
463
+ substitutionMap &&
464
+ src.includes(path.join(".base-pack")) &&
465
+ dest.endsWith(".md")) {
466
+ const content = fs.readFileSync(src, "utf8");
467
+ const substituted = substituteFile(content, substitutionMap);
468
+ fs.writeFileSync(dest, substituted, "utf8");
469
+ }
470
+ else {
471
+ fs.copyFileSync(src, dest);
472
+ }
473
+ }
474
+ catch (err) {
475
+ if (err.code !== "ENOENT")
476
+ throw err;
477
+ // ENOENT on source — skip silently (source may be absent in this build)
478
+ }
479
+ }
480
+ }
481
+ appliedCategories = entry.regenerate;
482
+ }
483
+ result.applied.push({
484
+ fromVersion: key,
485
+ toVersion: entry.version,
486
+ categories: appliedCategories,
487
+ });
488
+ // Update ledger after successful application
489
+ if (!dryRun) {
490
+ ledger.appliedVersions.push(key);
491
+ }
492
+ }
493
+ // Write updated ledger
494
+ if (!dryRun && result.applied.length > 0) {
495
+ writeLedger(projectRoot, ledger);
496
+ }
497
+ // Always-on schema refresh post-pass: copy all *.schema.json to .forge/schemas/
498
+ // Runs regardless of whether any entry had a schemas category.
499
+ // This is an always-overwrite safety net (schemas are not user-edited).
500
+ const schemasDir = path.join(bundleRoot, ".schemas");
501
+ const forgeSchemasDir = path.join(projectRoot, ".forge", "schemas");
502
+ try {
503
+ const schemaFiles = fs.readdirSync(schemasDir).filter((f) => f.endsWith(".schema.json"));
504
+ if (!dryRun) {
505
+ fs.mkdirSync(forgeSchemasDir, { recursive: true });
506
+ for (const f of schemaFiles) {
507
+ try {
508
+ fs.copyFileSync(path.join(schemasDir, f), path.join(forgeSchemasDir, f));
509
+ result.schemasRefreshed.push(f);
510
+ }
511
+ catch (err) {
512
+ if (err.code !== "ENOENT")
513
+ throw err;
514
+ }
515
+ }
516
+ }
517
+ else {
518
+ result.schemasRefreshed = schemaFiles;
519
+ }
520
+ }
521
+ catch (err) {
522
+ if (err.code !== "ENOENT")
523
+ throw err;
524
+ }
525
+ return result;
526
+ }
527
+ // ── Test helpers (exported for test access) ───────────────────────────────────
528
+ export const __test__ = {
529
+ semverCompare,
530
+ filterMigrationEntries,
531
+ resolveCategory,
532
+ };
533
+ //# sourceMappingURL=migration-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-engine.js","sourceRoot":"","sources":["../../../src/extensions/forgecli/migration-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export interface ParsedQuizAgentArgs {
3
+ mode: "empty" | "file" | "text";
4
+ topicSeed: string;
5
+ sourceLabel: string;
6
+ }
7
+ export declare function parseQuizAgentArgs(rawArgs: string, cwd: string): ParsedQuizAgentArgs;
8
+ export interface ComposeQuizAgentKickoffOpts {
9
+ commandMd: string;
10
+ parsed: ParsedQuizAgentArgs;
11
+ }
12
+ export declare function composeQuizAgentKickoff(opts: ComposeQuizAgentKickoffOpts): string;
13
+ export interface RegisterQuizAgentOptions {
14
+ forgeRoot: string | null;
15
+ cwd?: string;
16
+ }
17
+ export declare function registerQuizAgent(pi: ExtensionAPI, options: RegisterQuizAgentOptions): void;