gsd-pi 2.78.1-dev.b6a389b66 → 2.78.1-dev.d8826a445

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 (155) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/gsd/auto/phases.js +7 -2
  3. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  4. package/dist/resources/extensions/gsd/auto-dispatch.js +3 -2
  5. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
  6. package/dist/resources/extensions/gsd/auto-worktree.js +185 -40
  7. package/dist/resources/extensions/gsd/auto.js +62 -1
  8. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +1 -1
  9. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -16
  10. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -55
  11. package/dist/resources/extensions/gsd/db-writer.js +96 -16
  12. package/dist/resources/extensions/gsd/delegation-policy.js +155 -0
  13. package/dist/resources/extensions/gsd/gsd-db.js +194 -0
  14. package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
  15. package/dist/resources/extensions/gsd/guided-flow.js +117 -25
  16. package/dist/resources/extensions/gsd/metrics.js +287 -1
  17. package/dist/resources/extensions/gsd/paths.js +79 -8
  18. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  19. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  20. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
  21. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
  22. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
  23. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
  24. package/dist/resources/extensions/gsd/templates/project.md +10 -0
  25. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  26. package/dist/resources/extensions/gsd/workspace.js +59 -0
  27. package/dist/resources/extensions/gsd/worktree-resolver.js +15 -2
  28. package/dist/resources/extensions/gsd/write-intercept.js +3 -3
  29. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  30. package/dist/web/standalone/.next/BUILD_ID +1 -1
  31. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  32. package/dist/web/standalone/.next/build-manifest.json +2 -2
  33. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  34. package/dist/web/standalone/.next/required-server-files.json +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  36. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/index.html +1 -1
  52. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  56. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  58. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  59. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  60. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  61. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  62. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  63. package/dist/web/standalone/server.js +1 -1
  64. package/package.json +1 -1
  65. package/packages/mcp-server/README.md +2 -11
  66. package/packages/mcp-server/dist/remote-questions.d.ts +27 -0
  67. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  68. package/packages/mcp-server/dist/remote-questions.js +28 -0
  69. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  70. package/packages/mcp-server/dist/server.d.ts +28 -0
  71. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  72. package/packages/mcp-server/dist/server.js +94 -4
  73. package/packages/mcp-server/dist/server.js.map +1 -1
  74. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  75. package/packages/mcp-server/src/mcp-server.test.ts +226 -0
  76. package/packages/mcp-server/src/remote-questions.test.ts +103 -0
  77. package/packages/mcp-server/src/remote-questions.ts +35 -0
  78. package/packages/mcp-server/src/server.ts +129 -6
  79. package/packages/mcp-server/src/workflow-tools.ts +1 -1
  80. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  81. package/src/resources/extensions/gsd/auto/phases.ts +8 -2
  82. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  83. package/src/resources/extensions/gsd/auto-dispatch.ts +10 -2
  84. package/src/resources/extensions/gsd/auto-post-unit.ts +8 -1
  85. package/src/resources/extensions/gsd/auto-worktree.ts +225 -47
  86. package/src/resources/extensions/gsd/auto.ts +79 -1
  87. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +1 -1
  88. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -17
  89. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
  90. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +80 -55
  91. package/src/resources/extensions/gsd/db-writer.ts +113 -17
  92. package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
  93. package/src/resources/extensions/gsd/gsd-db.ts +184 -0
  94. package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
  95. package/src/resources/extensions/gsd/guided-flow.ts +154 -25
  96. package/src/resources/extensions/gsd/metrics.ts +321 -1
  97. package/src/resources/extensions/gsd/paths.ts +67 -8
  98. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  99. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  100. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
  101. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
  102. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
  103. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
  104. package/src/resources/extensions/gsd/templates/project.md +10 -0
  105. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +14 -14
  106. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +331 -0
  107. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +176 -0
  108. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
  109. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
  110. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
  111. package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
  112. package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
  113. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +3 -23
  114. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
  115. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
  116. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
  117. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
  118. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
  119. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
  120. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +68 -5
  121. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +4 -4
  122. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +371 -0
  123. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
  124. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
  125. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
  126. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
  127. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
  128. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
  129. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +329 -0
  130. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
  131. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
  132. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
  133. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +120 -0
  134. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +150 -7
  135. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +74 -0
  136. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +28 -16
  137. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
  138. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +453 -0
  139. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
  140. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +102 -0
  141. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
  142. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +1 -1
  143. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
  144. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  145. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +9 -15
  146. package/src/resources/extensions/gsd/tests/workspace.test.ts +190 -0
  147. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +35 -35
  148. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -52
  149. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +1 -1
  150. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  151. package/src/resources/extensions/gsd/workspace.ts +95 -0
  152. package/src/resources/extensions/gsd/worktree-resolver.ts +16 -2
  153. package/src/resources/extensions/gsd/write-intercept.ts +3 -3
  154. /package/dist/web/standalone/.next/static/{HahrZrc_Xn4wumj0O1Ydp → AT5qi39nKXkdmQIOIoh0f}/_buildManifest.js +0 -0
  155. /package/dist/web/standalone/.next/static/{HahrZrc_Xn4wumj0O1Ydp → AT5qi39nKXkdmQIOIoh0f}/_ssgManifest.js +0 -0
@@ -8,6 +8,13 @@ Your goal is **not** to center the discussion on tech stack trivia, naming conve
8
8
 
9
9
  ## Interview Protocol
10
10
 
11
+ ### Read project shape
12
+
13
+ Before your first question round, read `.gsd/PROJECT.md` and look for `## Project Shape` → `**Complexity:**`. The verdict is either **`simple`** or **`complex`** (default to `complex` if the section is missing or unclear).
14
+
15
+ - **`simple`** — favor 1–2 plain-text rounds, write the slice context fast. Skip parallel-research investigation.
16
+ - **`complex`** — full investigation with structured 3–4-option questions.
17
+
11
18
  ### Before your first question round
12
19
 
13
20
  Do a lightweight targeted investigation so your questions are grounded in reality:
@@ -24,7 +31,7 @@ Do **not** go deep — just enough that your questions reflect what's actually t
24
31
 
25
32
  **Never fabricate or simulate user input.** Never generate fake transcript markers like `[User]`, `[Human]`, or `User:`. Ask one question round, then wait for the user's actual response before continuing.
26
33
 
27
- **If `{{structuredQuestionsAvailable}}` is `true`:** Ask **1–3 questions per round** using `ask_user_questions`. **Call `ask_user_questions` exactly once per turn — never make multiple calls with the same or overlapping questions. Wait for the user's response before asking the next round.**
34
+ **If `{{structuredQuestionsAvailable}}` is `true`:** Ask **1–3 questions per round** using `ask_user_questions`. In **`complex`** mode, each multi-choice question MUST present **3 or 4 concrete, researched options** plus a final **"Other — let me discuss"** option; options must be grounded in the investigation above (codebase signals, library docs, prior `.gsd/` artifacts), not generic placeholders. In **`simple`** mode, 2 options is fine. Binary wrap-up gates are exempt from the 3-or-4 rule. **Call `ask_user_questions` exactly once per turn — never make multiple calls with the same or overlapping questions. Wait for the user's response before asking the next round.**
28
35
  **If `{{structuredQuestionsAvailable}}` is `false`:** Ask **1–3 questions per round** in plain text. Number them and wait for the user's response before asking the next round.
29
36
  Keep each question focused on one of:
30
37
  - **UX and user-facing behaviour** — what does the user see, click, trigger, or experience?
@@ -11,6 +11,16 @@
11
11
 
12
12
  {{theOneThingThatMustWorkEvenIfEverythingElseIsCut}}
13
13
 
14
+ ## Project Shape
15
+
16
+ <!-- Drives questioning depth in downstream stages. `simple` → short plain-text
17
+ rounds, fast PROJECT/CONTEXT/REQUIREMENTS writes. `complex` → researched
18
+ 3–4-option questions with an "Other — let me discuss" hatch.
19
+ Default to `complex` when uncertain. -->
20
+
21
+ - **Complexity:** {{simple | complex}}
22
+ - **Why:** {{one-line rationale citing the signals that decided it}}
23
+
14
24
  ## Current State
15
25
 
16
26
  {{whatHasBeenBuiltSoFar — what works, what exists, what's deployed}}
@@ -292,9 +292,9 @@ export function getRequiredWorkflowToolsForAutoUnit(unitType) {
292
292
  case "execute-task":
293
293
  case "execute-task-simple":
294
294
  case "reactive-execute":
295
- return ["gsd_complete_task"];
295
+ return ["gsd_task_complete"];
296
296
  case "complete-slice":
297
- return ["gsd_complete_slice"];
297
+ return ["gsd_slice_complete"];
298
298
  case "replan-slice":
299
299
  return ["gsd_replan_slice"];
300
300
  case "reassess-roadmap":
@@ -0,0 +1,59 @@
1
+ // GSD-2 + Workspace handle: single source of truth for path resolution per milestone
2
+ import { join, resolve } from "node:path";
3
+ import { resolveGsdPathContract, normalizeRealPath } from "./paths.js";
4
+ import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
5
+ function tryRealpath(p) {
6
+ return normalizeRealPath(p);
7
+ }
8
+ /**
9
+ * Create an immutable GsdWorkspace handle from a raw base path.
10
+ * Resolves both the project root and (when applicable) the worktree root,
11
+ * normalizes them via realpath, and freezes the result.
12
+ */
13
+ export function createWorkspace(rawBasePath) {
14
+ const resolvedBase = resolve(rawBasePath);
15
+ const isWorktree = isGsdWorktreePath(resolvedBase);
16
+ const projectRootRaw = resolveWorktreeProjectRoot(resolvedBase);
17
+ const projectRoot = tryRealpath(resolve(projectRootRaw));
18
+ const worktreeRoot = isWorktree ? tryRealpath(resolvedBase) : null;
19
+ // Derive a canonical base from the already-realpath-normalized paths so that
20
+ // resolveGsdPathContract always receives a canonical path. Using the raw
21
+ // resolvedBase here can produce a non-canonical projectGsd when the input
22
+ // path contains symlinks, causing contract.projectGsd to diverge from the
23
+ // realpath-normalized projectRoot / identityKey.
24
+ const canonicalBase = isWorktree ? (worktreeRoot ?? resolvedBase) : projectRoot;
25
+ const contract = Object.freeze(resolveGsdPathContract(canonicalBase));
26
+ const identityKey = tryRealpath(projectRoot);
27
+ const mode = isWorktree ? "worktree" : "project";
28
+ const workspace = Object.freeze({
29
+ projectRoot,
30
+ worktreeRoot,
31
+ mode,
32
+ contract,
33
+ identityKey,
34
+ lockRoot: projectRoot,
35
+ });
36
+ return workspace;
37
+ }
38
+ /**
39
+ * Bind a milestoneId to a workspace, producing an immutable MilestoneScope
40
+ * with path-returning closures that resolve via the authoritative projectGsd.
41
+ *
42
+ * All milestone-content paths route to contract.projectGsd (canonical),
43
+ * since that is the authoritative source of truth regardless of worktree mode.
44
+ */
45
+ export function scopeMilestone(workspace, milestoneId) {
46
+ const { contract } = workspace;
47
+ const gsd = contract.projectGsd;
48
+ const scope = Object.freeze({
49
+ workspace,
50
+ milestoneId,
51
+ contextFile: () => join(gsd, "milestones", milestoneId, `${milestoneId}-CONTEXT.md`),
52
+ roadmapFile: () => join(gsd, "milestones", milestoneId, `${milestoneId}-ROADMAP.md`),
53
+ stateFile: () => join(gsd, "STATE.md"),
54
+ dbPath: () => contract.projectDb,
55
+ milestoneDir: () => join(gsd, "milestones", milestoneId),
56
+ metaJson: () => join(gsd, `${milestoneId}-META.json`),
57
+ });
58
+ return scope;
59
+ }
@@ -1,3 +1,4 @@
1
+ // GSD-2 — WorktreeResolver: encapsulates worktree path state and merge/exit lifecycle.
1
2
  /**
2
3
  * WorktreeResolver — encapsulates worktree path state and merge/exit lifecycle.
3
4
  *
@@ -20,7 +21,19 @@ import { emitJournalEvent } from "./journal.js";
20
21
  import { emitWorktreeCreated, emitWorktreeMerged } from "./worktree-telemetry.js";
21
22
  import { getCollapseCadence, getMilestoneResquash, resquashMilestoneOnMain } from "./slice-cadence.js";
22
23
  import { loadEffectiveGSDPreferences } from "./preferences.js";
23
- import { resolveWorktreeProjectRoot } from "./worktree-root.js";
24
+ import { resolveWorktreeProjectRoot, normalizeWorktreePathForCompare } from "./worktree-root.js";
25
+ // ─── Path Comparison Helper ────────────────────────────────────────────────
26
+ /**
27
+ * Compare two paths for physical identity, tolerating trailing slashes,
28
+ * symlink differences, and case variations on case-insensitive volumes.
29
+ *
30
+ * Used in place of string `===` / `!==` wherever one operand may be
31
+ * realpath-normalised (e.g. from the workspace registry) and the other
32
+ * may not be (e.g. a raw caller-supplied basePath).
33
+ */
34
+ function isSamePath(a, b) {
35
+ return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
36
+ }
24
37
  // ─── Path Helpers ──────────────────────────────────────────────────────────
25
38
  /**
26
39
  * Resolve the project root from session path state.
@@ -454,7 +467,7 @@ export class WorktreeResolver {
454
467
  // roadmap triggers bare teardown which deletes the branch and orphans all
455
468
  // milestone commits (#1573).
456
469
  let roadmapPath = this.deps.resolveMilestoneFile(originalBase, milestoneId, "ROADMAP");
457
- if (!roadmapPath && this.s.basePath !== originalBase) {
470
+ if (!roadmapPath && !isSamePath(this.s.basePath, originalBase)) {
458
471
  roadmapPath = this.deps.resolveMilestoneFile(this.s.basePath, milestoneId, "ROADMAP");
459
472
  if (roadmapPath) {
460
473
  debugLog("WorktreeResolver", {
@@ -85,9 +85,9 @@ function matchesBlockedPattern(path) {
85
85
  * Directs the agent to use engine tool calls instead.
86
86
  */
87
87
  export const BLOCKED_WRITE_ERROR = `Direct writes to .gsd/STATE.md and .gsd/gsd.db are blocked. Use engine tool calls instead:
88
- - To complete a task: call gsd_complete_task(milestone_id, slice_id, task_id, summary)
89
- - To complete a slice: call gsd_complete_slice(milestone_id, slice_id, summary, uat_result)
90
- - To save a decision: call gsd_save_decision(scope, decision, choice, rationale)
88
+ - To complete a task: call gsd_task_complete(milestone_id, slice_id, task_id, summary)
89
+ - To complete a slice: call gsd_slice_complete(milestone_id, slice_id, summary, uat_result)
90
+ - To save a decision: call gsd_decision_save(scope, decision, choice, rationale)
91
91
  - To start a task: call gsd_start_task(milestone_id, slice_id, task_id)
92
92
  - To record verification: call gsd_record_verification(milestone_id, slice_id, task_id, evidence)
93
93
  - To report a blocker: call gsd_report_blocker(milestone_id, slice_id, task_id, description)`;