@opengsd/gsd-pi 1.4.0-dev.5fc22c6f → 1.4.0-dev.c18009cd

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 (135) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +58 -4
  3. package/dist/resources/extensions/gsd/artifact-verification.js +17 -5
  4. package/dist/resources/extensions/gsd/auto/closeout.js +45 -42
  5. package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
  7. package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
  8. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
  9. package/dist/resources/extensions/gsd/auto.js +10 -3
  10. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
  11. package/dist/resources/extensions/gsd/doctor-engine-checks.js +174 -16
  12. package/dist/resources/extensions/gsd/gsd-db.js +52 -0
  13. package/dist/resources/extensions/gsd/migrate-external.js +13 -4
  14. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +3 -3
  15. package/dist/resources/extensions/gsd/repo-identity.js +16 -0
  16. package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
  17. package/dist/resources/extensions/gsd/unit-registry.js +27 -2
  18. package/dist/resources/extensions/gsd/worktree-lifecycle.js +67 -5
  19. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  20. package/dist/web/standalone/.next/BUILD_ID +1 -1
  21. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  22. package/dist/web/standalone/.next/build-manifest.json +2 -2
  23. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  24. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  25. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  33. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/index.html +1 -1
  41. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  48. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  50. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  51. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  52. package/integrations/hermes/CONTEXT.md +47 -0
  53. package/integrations/hermes/README.md +21 -0
  54. package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
  55. package/integrations/hermes/docs/setup.md +4 -0
  56. package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
  57. package/integrations/hermes/open_gsd_hermes/config.py +2 -0
  58. package/integrations/hermes/open_gsd_hermes/gsd_client.py +594 -31
  59. package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
  60. package/integrations/hermes/plugin.yaml +4 -0
  61. package/integrations/hermes/tests/test_config.py +6 -0
  62. package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
  63. package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
  64. package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
  65. package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
  66. package/integrations/hermes/tests/test_milestone_client.py +447 -0
  67. package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
  68. package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
  69. package/package.json +1 -1
  70. package/packages/cloud-mcp-gateway/package.json +2 -2
  71. package/packages/contracts/package.json +1 -1
  72. package/packages/daemon/dist/session-manager.js +1 -1
  73. package/packages/daemon/dist/session-manager.js.map +1 -1
  74. package/packages/daemon/package.json +4 -4
  75. package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
  76. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
  77. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
  78. package/packages/gsd-agent-core/package.json +5 -5
  79. package/packages/gsd-agent-modes/package.json +7 -7
  80. package/packages/mcp-server/dist/server.d.ts +18 -5
  81. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  82. package/packages/mcp-server/dist/server.js +46 -5
  83. package/packages/mcp-server/dist/server.js.map +1 -1
  84. package/packages/mcp-server/dist/session-manager.js +1 -1
  85. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  86. package/packages/mcp-server/package.json +4 -4
  87. package/packages/native/package.json +1 -1
  88. package/packages/pi-agent-core/package.json +1 -1
  89. package/packages/pi-ai/package.json +1 -1
  90. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
  91. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
  92. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
  93. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  94. package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
  95. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  96. package/packages/pi-coding-agent/package.json +7 -7
  97. package/packages/pi-tui/package.json +2 -2
  98. package/packages/rpc-client/package.json +2 -2
  99. package/pkg/package.json +1 -1
  100. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +64 -3
  101. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +212 -39
  102. package/src/resources/extensions/gsd/artifact-verification.ts +16 -4
  103. package/src/resources/extensions/gsd/auto/closeout.ts +54 -56
  104. package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
  105. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  106. package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
  107. package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
  108. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
  109. package/src/resources/extensions/gsd/auto.ts +9 -3
  110. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
  111. package/src/resources/extensions/gsd/doctor-engine-checks.ts +230 -21
  112. package/src/resources/extensions/gsd/gsd-db.ts +72 -0
  113. package/src/resources/extensions/gsd/migrate-external.ts +14 -4
  114. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +4 -4
  115. package/src/resources/extensions/gsd/repo-identity.ts +17 -0
  116. package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
  117. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
  118. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
  119. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
  120. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +335 -0
  121. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
  122. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
  123. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +152 -22
  124. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +1 -1
  125. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
  126. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
  127. package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
  128. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
  129. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +56 -0
  130. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
  131. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  132. package/src/resources/extensions/gsd/unit-registry.ts +34 -2
  133. package/src/resources/extensions/gsd/worktree-lifecycle.ts +135 -11
  134. /package/dist/web/standalone/.next/static/{kIEFsCryyGy6RzifULbJl → L2UMqXELiDH3oz-7yguXp}/_buildManifest.js +0 -0
  135. /package/dist/web/standalone/.next/static/{kIEFsCryyGy6RzifULbJl → L2UMqXELiDH3oz-7yguXp}/_ssgManifest.js +0 -0
@@ -102,6 +102,51 @@ class UserNotifiedError extends Error {
102
102
  function isSamePathPhysical(a, b) {
103
103
  return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
104
104
  }
105
+ function preflightBlockedMergeReason(blockedReason) {
106
+ if (blockedReason?.startsWith("unmerged-conflicts")) {
107
+ return "preflight-unmerged-conflicts";
108
+ }
109
+ return "preflight-dirty-overlap";
110
+ }
111
+ /**
112
+ * Run a milestone merge behind the Worktree Lifecycle seam with the root-clean
113
+ * stash guard that protects user changes around merge.
114
+ *
115
+ * The helper owns the invariant ordering (preflight -> merge callback ->
116
+ * postflight on every attempted merge path) and returns the same typed result
117
+ * shape as `exitMilestone`. Auto closeout remains responsible for translating
118
+ * that result into loop policy (pause vs. stop, visible transcript
119
+ * preservation, projection rebuild).
120
+ */
121
+ function runGuardedMilestoneMerge(request) {
122
+ const { merge, guard, milestoneId, notify } = request;
123
+ const preflight = guard.preflightCleanRoot(guard.projectRoot, milestoneId, notify);
124
+ if (preflight.blocked) {
125
+ return {
126
+ ok: false,
127
+ reason: preflightBlockedMergeReason(preflight.blockedReason),
128
+ };
129
+ }
130
+ let mergeError = null;
131
+ const exitResult = merge();
132
+ if (!exitResult.ok) {
133
+ mergeError = exitResult.cause ?? new Error(`exit ${exitResult.reason}`);
134
+ }
135
+ let postflight;
136
+ if (preflight.stashPushed) {
137
+ postflight = guard.postflightPopStash(guard.projectRoot, milestoneId, preflight.stashMarker, notify);
138
+ }
139
+ if (mergeError instanceof MergeConflictError) {
140
+ return { ok: false, reason: "merge-conflict", cause: mergeError, postflight };
141
+ }
142
+ if (mergeError) {
143
+ return { ok: false, reason: "merge-failed", cause: mergeError, postflight };
144
+ }
145
+ if (postflight?.needsManualRecovery) {
146
+ return { ok: false, reason: "postflight-stash-restore-failed", postflight };
147
+ }
148
+ return exitResult;
149
+ }
105
150
  // ─── Validation ──────────────────────────────────────────────────────────
106
151
  function isValidMilestoneId(milestoneId) {
107
152
  return !/[\/\\]|\.\./.test(milestoneId);
@@ -645,7 +690,7 @@ function _mergeWorktreeModeImpl(deps, mctx) {
645
690
  pushed: false,
646
691
  };
647
692
  }
648
- const mergeResult = deps.mergeMilestoneToMain(originalBasePath, milestoneId, roadmapResolution.content);
693
+ const mergeResult = deps.mergeMilestone(originalBasePath, milestoneId, roadmapResolution.content);
649
694
  // #2945 Bug 3: mergeMilestoneToMain performs best-effort worktree
650
695
  // cleanup internally (step 12), but it can silently fail on Windows
651
696
  // or when the worktree directory is locked. Perform a secondary
@@ -780,7 +825,7 @@ function _mergeBranchModeImpl(deps, mctx) {
780
825
  pushed: false,
781
826
  };
782
827
  }
783
- const mergeResult = deps.mergeMilestoneToMain(worktreeBasePath, milestoneId, roadmapResolution.content);
828
+ const mergeResult = deps.mergeMilestone(worktreeBasePath, milestoneId, roadmapResolution.content);
784
829
  if (mergeResult.codeFilesChanged) {
785
830
  notify(`Milestone ${milestoneId} merged (branch mode).${mergeResult.pushed ? " Pushed to remote." : ""}`, "info");
786
831
  }
@@ -983,14 +1028,31 @@ export class WorktreeLifecycle {
983
1028
  * With `opts.merge === false`, runs auto-commit and teardown without
984
1029
  * merging to main.
985
1030
  *
1031
+ * When `opts.guardedMerge` is present with `opts.merge === true`, the
1032
+ * lifecycle verb also owns the root-clean guard around the merge: preflight
1033
+ * runs before the inner merge, postflight stash restore runs after every
1034
+ * attempted merge path, and guard failures are returned as typed
1035
+ * `ExitResult` reasons.
1036
+ *
986
1037
  * Returns a typed `ExitResult`. `MergeConflictError` is surfaced as
987
1038
  * `{ ok: false, reason: "merge-conflict", cause }` instead of thrown,
988
- * giving callers a typed branch for the expected failure path.
989
- * Unexpected failures (filesystem, git permissions, etc.) are wrapped
990
- * as `{ ok: false, reason: "teardown-failed", cause }` so callers always
1039
+ * giving callers a typed branch for the expected failure path. Guarded merge
1040
+ * failures surface as `preflight-dirty-overlap`,
1041
+ * `preflight-unmerged-conflicts`, `merge-failed`, or
1042
+ * `postflight-stash-restore-failed`. Unexpected failures (filesystem, git
1043
+ * permissions, etc.) are wrapped as
1044
+ * `{ ok: false, reason: "teardown-failed", cause }` so callers always
991
1045
  * receive a discriminated union — no exceptions for any expected outcome.
992
1046
  */
993
1047
  exitMilestone(milestoneId, opts, ctx) {
1048
+ if (opts.merge && opts.guardedMerge) {
1049
+ return runGuardedMilestoneMerge({
1050
+ merge: () => this.exitMilestone(milestoneId, { merge: true }, ctx),
1051
+ guard: opts.guardedMerge,
1052
+ milestoneId,
1053
+ notify: ctx.notify,
1054
+ });
1055
+ }
994
1056
  if (opts.merge) {
995
1057
  try {
996
1058
  const merged = this._mergeAndExit(milestoneId, ctx);