gsd-pi 2.44.0-dev.62b5d6c → 2.44.0-dev.a5271fc

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 (198) hide show
  1. package/README.md +30 -12
  2. package/dist/resources/extensions/gsd/auto-start.js +10 -0
  3. package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
  4. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
  5. package/dist/resources/extensions/gsd/preferences.js +9 -1
  6. package/dist/resources/extensions/gsd/state.js +19 -2
  7. package/dist/web/standalone/.next/BUILD_ID +1 -1
  8. package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -19
  9. package/dist/web/standalone/.next/build-manifest.json +2 -2
  10. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  11. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  12. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  20. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/index.html +1 -1
  28. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -19
  35. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  36. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  37. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  38. package/package.json +1 -1
  39. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
  40. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  41. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
  42. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  43. package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
  44. package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
  45. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
  46. package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
  47. package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
  48. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  49. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
  50. package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
  51. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
  52. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
  53. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
  54. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
  55. package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
  56. package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
  57. package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
  58. package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
  59. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
  60. package/src/resources/extensions/gsd/auto-start.ts +14 -0
  61. package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
  62. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
  63. package/src/resources/extensions/gsd/preferences.ts +11 -1
  64. package/src/resources/extensions/gsd/state.ts +19 -1
  65. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
  66. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
  67. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
  68. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
  69. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
  70. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
  71. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
  72. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +533 -656
  73. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
  74. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
  75. package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
  76. package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
  77. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
  78. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
  79. package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
  80. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +38 -59
  81. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
  82. package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
  83. package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
  84. package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
  85. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
  86. package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
  87. package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
  88. package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
  89. package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
  90. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
  91. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +183 -181
  92. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
  93. package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
  94. package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
  95. package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
  96. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +164 -180
  97. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
  98. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
  99. package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +27 -29
  100. package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
  101. package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
  102. package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
  103. package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
  104. package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
  105. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
  106. package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
  107. package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +54 -60
  108. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
  109. package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
  110. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
  111. package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
  112. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
  113. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
  114. package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +30 -42
  115. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
  116. package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
  117. package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
  118. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
  119. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
  120. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
  121. package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
  122. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +81 -103
  123. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
  124. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
  125. package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
  126. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -102
  127. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
  128. package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
  129. package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
  130. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
  131. package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
  132. package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
  133. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
  134. package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
  135. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
  136. package/src/resources/extensions/gsd/tests/memory-store.test.ts +80 -93
  137. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
  138. package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
  139. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
  140. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
  141. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
  142. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +87 -96
  143. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
  144. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
  145. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
  146. package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
  147. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
  148. package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
  149. package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
  150. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
  151. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
  152. package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
  153. package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
  154. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
  155. package/src/resources/extensions/gsd/tests/preferences.test.ts +27 -0
  156. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
  157. package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
  158. package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
  159. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
  160. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
  161. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
  162. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
  163. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
  164. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
  165. package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
  166. package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
  167. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
  168. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
  169. package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
  170. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
  171. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
  172. package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
  173. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
  174. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
  175. package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
  176. package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
  177. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
  178. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +9 -11
  179. package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
  180. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
  181. package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
  182. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
  183. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
  184. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
  185. package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
  186. package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
  187. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
  188. package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
  189. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
  190. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
  191. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
  192. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
  193. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
  194. package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
  195. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
  196. package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
  197. /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → JyimLR2pZuvKEzv26gI3w}/_buildManifest.js +0 -0
  198. /package/dist/web/standalone/.next/static/{fOnWQBjWXMKUs4bqTg530 → JyimLR2pZuvKEzv26gI3w}/_ssgManifest.js +0 -0
@@ -1,8 +1,9 @@
1
+ import { describe, test, afterEach } from "node:test";
2
+ import assert from "node:assert/strict";
1
3
  import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
4
  import { join, dirname } from "node:path";
3
5
  import { tmpdir } from "node:os";
4
6
  import { fileURLToPath } from "node:url";
5
- import { createTestContext } from './test-helpers.ts';
6
7
  import { invalidateAllCaches } from '../cache.ts';
7
8
 
8
9
  // loadPrompt reads from ~/.gsd/agent/extensions/gsd/prompts/ (main checkout).
@@ -11,7 +12,6 @@ import { invalidateAllCaches } from '../cache.ts';
11
12
  const __dirname = dirname(fileURLToPath(import.meta.url));
12
13
  const worktreePromptsDir = join(__dirname, "..", "prompts");
13
14
 
14
- const { assertEq, assertTrue, report } = createTestContext();
15
15
  /**
16
16
  * Load a prompt template from the worktree prompts directory
17
17
  * and apply variable substitution (mirrors loadPrompt logic).
@@ -59,11 +59,9 @@ function cleanup(base: string): void {
59
59
  // Tests
60
60
  // ═══════════════════════════════════════════════════════════════════════════
61
61
 
62
- async function main(): Promise<void> {
62
+ describe("complete-milestone", () => {
63
63
 
64
- // ─── Prompt Template Loading ───────────────────────────────────────────
65
- console.log("\n=== complete-milestone prompt template exists ===");
66
- {
64
+ test("prompt template exists and loads", () => {
67
65
  let result: string;
68
66
  let threw = false;
69
67
  try {
@@ -77,16 +75,13 @@ async function main(): Promise<void> {
77
75
  } catch (err) {
78
76
  threw = true;
79
77
  result = "";
80
- console.error(` ERROR: loadPrompt threw: ${err}`);
81
78
  }
82
79
 
83
- assertTrue(!threw, "loadPrompt does not throw for complete-milestone");
84
- assertTrue(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
85
- }
80
+ assert.ok(!threw, "loadPrompt does not throw for complete-milestone");
81
+ assert.ok(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
82
+ });
86
83
 
87
- // ─── Variable Substitution ─────────────────────────────────────────────
88
- console.log("\n=== prompt variable substitution ===");
89
- {
84
+ test("prompt variable substitution", () => {
90
85
  const prompt = loadPromptFromWorktree("complete-milestone", {
91
86
  workingDirectory: "/tmp/test-project",
92
87
  milestoneId: "M001",
@@ -95,19 +90,17 @@ async function main(): Promise<void> {
95
90
  inlinedContext: "--- inlined slice summaries and context ---",
96
91
  });
97
92
 
98
- assertTrue(prompt.includes("M001"), "prompt contains milestoneId 'M001'");
99
- assertTrue(prompt.includes("Integration Feature"), "prompt contains milestoneTitle");
100
- assertTrue(prompt.includes(".gsd/milestones/M001/M001-ROADMAP.md"), "prompt contains roadmapPath");
101
- assertTrue(prompt.includes("--- inlined slice summaries and context ---"), "prompt contains inlinedContext");
102
- assertTrue(!prompt.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
103
- assertTrue(!prompt.includes("{{milestoneTitle}}"), "no un-substituted {{milestoneTitle}}");
104
- assertTrue(!prompt.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
105
- assertTrue(!prompt.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
106
- }
107
-
108
- // ─── Prompt Content Integrity ──────────────────────────────────────────
109
- console.log("\n=== prompt content integrity ===");
110
- {
93
+ assert.ok(prompt.includes("M001"), "prompt contains milestoneId 'M001'");
94
+ assert.ok(prompt.includes("Integration Feature"), "prompt contains milestoneTitle");
95
+ assert.ok(prompt.includes(".gsd/milestones/M001/M001-ROADMAP.md"), "prompt contains roadmapPath");
96
+ assert.ok(prompt.includes("--- inlined slice summaries and context ---"), "prompt contains inlinedContext");
97
+ assert.ok(!prompt.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
98
+ assert.ok(!prompt.includes("{{milestoneTitle}}"), "no un-substituted {{milestoneTitle}}");
99
+ assert.ok(!prompt.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
100
+ assert.ok(!prompt.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
101
+ });
102
+
103
+ test("prompt content integrity", () => {
111
104
  const prompt = loadPromptFromWorktree("complete-milestone", {
112
105
  workingDirectory: "/tmp/test-project",
113
106
  milestoneId: "M002",
@@ -116,18 +109,13 @@ async function main(): Promise<void> {
116
109
  inlinedContext: "context",
117
110
  });
118
111
 
119
- assertTrue(prompt.includes("Complete Milestone"), "prompt contains 'Complete Milestone' heading");
120
- assertTrue(prompt.includes("success criter") || prompt.includes("success criteria"), "prompt mentions success criteria verification");
121
- assertTrue(prompt.includes("milestone-summary") || prompt.includes("milestoneSummary"), "prompt references milestone summary artifact");
122
- assertTrue(prompt.includes("Milestone M002 complete"), "prompt contains completion sentinel for M002");
123
- }
112
+ assert.ok(prompt.includes("Complete Milestone"), "prompt contains 'Complete Milestone' heading");
113
+ assert.ok(prompt.includes("success criter") || prompt.includes("success criteria"), "prompt mentions success criteria verification");
114
+ assert.ok(prompt.includes("milestone-summary") || prompt.includes("milestoneSummary"), "prompt references milestone summary artifact");
115
+ assert.ok(prompt.includes("Milestone M002 complete"), "prompt contains completion sentinel for M002");
116
+ });
124
117
 
125
- // ─── diagnoseExpectedArtifact behavior ─────────────────────────────────
126
- // Since diagnoseExpectedArtifact is not exported from auto.ts, we test
127
- // the same logic by reimplementing the switch case for complete-milestone
128
- // and verifying against known path patterns.
129
- console.log("\n=== diagnoseExpectedArtifact logic for complete-milestone ===");
130
- {
118
+ test("diagnoseExpectedArtifact logic for complete-milestone", async () => {
131
119
  // Import the path helpers used by diagnoseExpectedArtifact
132
120
  const { relMilestoneFile } = await import("../paths.ts");
133
121
 
@@ -144,18 +132,16 @@ async function main(): Promise<void> {
144
132
  // This is the exact logic from diagnoseExpectedArtifact for "complete-milestone"
145
133
  const result = `${relMilestoneFile(base, mid, "SUMMARY")} (milestone summary)`;
146
134
 
147
- assertTrue(typeof result === "string", "diagnose returns a string");
148
- assertTrue(result.includes("SUMMARY"), "diagnose result mentions SUMMARY");
149
- assertTrue(result.includes("milestone"), "diagnose result mentions milestone");
150
- assertTrue(result.includes("M001"), "diagnose result includes the milestone ID");
135
+ assert.ok(typeof result === "string", "diagnose returns a string");
136
+ assert.ok(result.includes("SUMMARY"), "diagnose result mentions SUMMARY");
137
+ assert.ok(result.includes("milestone"), "diagnose result mentions milestone");
138
+ assert.ok(result.includes("M001"), "diagnose result includes the milestone ID");
151
139
  } finally {
152
140
  cleanup(base);
153
141
  }
154
- }
142
+ });
155
143
 
156
- // ─── deriveState integration: completing-milestone dispatches correctly
157
- console.log("\n=== deriveState completing-milestone integration ===");
158
- {
144
+ test("deriveState completing-milestone integration", async () => {
159
145
  const { deriveState, isMilestoneComplete } = await import("../state.ts");
160
146
  const { invalidateAllCaches: invalidateAllCachesDynamic } = await import("../cache.ts");
161
147
  const { parseRoadmap } = await import("../parsers-legacy.ts");
@@ -180,30 +166,23 @@ async function main(): Promise<void> {
180
166
  const roadmapPath = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
181
167
  const roadmapContent = await loadFile(roadmapPath);
182
168
  const roadmap = parseRoadmap(roadmapContent!);
183
- assertTrue(isMilestoneComplete(roadmap), "isMilestoneComplete returns true when all slices are [x]");
169
+ assert.ok(isMilestoneComplete(roadmap), "isMilestoneComplete returns true when all slices are [x]");
184
170
 
185
171
  // Verify deriveState returns completing-milestone phase (with validation already done)
186
172
  writeMilestoneValidation(base, "M001");
187
173
  const state = await deriveState(base);
188
- assertEq(state.phase, "completing-milestone", "deriveState returns completing-milestone when all slices done, no summary");
189
- assertEq(state.activeMilestone?.id, "M001", "active milestone is M001");
190
- assertEq(state.activeSlice, null, "no active slice in completing-milestone");
174
+ assert.strictEqual(state.phase, "completing-milestone", "deriveState returns completing-milestone when all slices done, no summary");
175
+ assert.strictEqual(state.activeMilestone?.id, "M001", "active milestone is M001");
176
+ assert.strictEqual(state.activeSlice, null, "no active slice in completing-milestone");
191
177
 
192
178
  // Now add the summary and verify it transitions to complete
193
179
  writeMilestoneSummary(base, "M001", "# M001 Summary\n\nDone.");
194
180
  invalidateAllCachesDynamic();
195
181
  const stateAfter = await deriveState(base);
196
- assertEq(stateAfter.phase, "complete", "deriveState returns complete after summary exists");
197
- assertEq(stateAfter.registry[0]?.status, "complete", "registry shows complete status");
182
+ assert.strictEqual(stateAfter.phase, "complete", "deriveState returns complete after summary exists");
183
+ assert.strictEqual(stateAfter.registry[0]?.status, "complete", "registry shows complete status");
198
184
  } finally {
199
185
  cleanup(base);
200
186
  }
201
- }
202
-
203
- report();
204
- }
205
-
206
- main().catch((error) => {
207
- console.error(error);
208
- process.exit(1);
187
+ });
209
188
  });