heyspex 0.1.0 → 0.2.0

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 (322) hide show
  1. package/README.md +21 -0
  2. package/bin/hs.mjs +931 -98
  3. package/bin/spexcode.mjs +262 -0
  4. package/dev-factory/engine/worktree.mjs +740 -0
  5. package/dev-factory/lib/code-repo-root.mjs +67 -0
  6. package/dev-factory/lib/context-budget.mjs +84 -0
  7. package/dev-factory/lib/epic-detect.mjs +190 -0
  8. package/dev-factory/lib/fleet-queue-file.mjs +846 -0
  9. package/dev-factory/lib/fleet-queue.mjs +426 -0
  10. package/dev-factory/lib/fleet-state.mjs +14 -18
  11. package/dev-factory/lib/model-catalog.mjs +338 -0
  12. package/dev-factory/lib/seat-context.mjs +199 -0
  13. package/dev-factory/lib/spec-io.mjs +93 -0
  14. package/dev-factory/lib/sufficiency-score.mjs +8 -2
  15. package/dev-factory/lib/worktree-allocator.mjs +744 -0
  16. package/dev-factory/model-catalog.json +222 -0
  17. package/dist/cli/hs-check.mjs +1085 -103
  18. package/dist/cli/hs-claim.mjs +936 -63
  19. package/dist/cli/hs-connect.mjs +9786 -1910
  20. package/dist/cli/hs-defer.mjs +5267 -3053
  21. package/dist/cli/hs-dev.mjs +564 -0
  22. package/dist/cli/hs-env.mjs +385 -299
  23. package/dist/cli/hs-index-rebuild.mjs +7129 -0
  24. package/dist/cli/hs-index-reconcile.mjs +7852 -0
  25. package/dist/cli/hs-init.mjs +777 -138
  26. package/dist/cli/hs-install.mjs +6583 -485
  27. package/dist/cli/hs-join.mjs +10137 -2368
  28. package/dist/cli/hs-vault-pull.mjs +4659 -5882
  29. package/dist/cli/hs-vault.mjs +3793 -1537
  30. package/dist/cli/hs-workspace.mjs +2550 -524
  31. package/dist/cli-templates/customer-vault/specs/entity-model.md +594 -601
  32. package/dist/cli-templates/customer-vault/specs/protocols/canonical-frontmatter-templates.md +110 -177
  33. package/dist/cli-templates/customer-vault/specs/protocols/destructive-action-checklist.md +122 -0
  34. package/dist/cli-templates/customer-vault/specs/protocols/memory-protocol.md +13 -15
  35. package/dist/cli-templates/customer-vault/specs/protocols/session-close-protocol.md +91 -0
  36. package/dist/cli-templates/customer-vault/specs/protocols/spec-hierarchy.md +150 -168
  37. package/dist/cli-templates/customer-vault/specs/protocols/spec-summary-authoring.md +83 -0
  38. package/dist/cli-templates/harness-commands/claude/hs-auto.md +36 -0
  39. package/dist/cli-templates/harness-commands/claude/hs-backfill.md +28 -0
  40. package/dist/cli-templates/harness-commands/claude/hs-capture.md +62 -0
  41. package/dist/cli-templates/harness-commands/claude/hs-defer.md +29 -0
  42. package/dist/cli-templates/harness-commands/claude/hs-dev.md +20 -0
  43. package/dist/cli-templates/harness-commands/claude/hs-doctor.md +32 -0
  44. package/dist/cli-templates/harness-commands/claude/hs-ground.md +28 -0
  45. package/dist/cli-templates/harness-commands/claude/hs-handoff.md +33 -0
  46. package/dist/cli-templates/harness-commands/claude/hs-log.md +27 -0
  47. package/dist/cli-templates/harness-commands/claude/hs-next.md +29 -0
  48. package/dist/cli-templates/harness-commands/claude/hs-promote.md +70 -0
  49. package/dist/cli-templates/harness-commands/claude/hs-push.md +35 -0
  50. package/dist/cli-templates/harness-commands/claude/hs-qc.md +27 -0
  51. package/dist/cli-templates/harness-commands/claude/hs-res.md +63 -0
  52. package/dist/cli-templates/harness-commands/claude/hs-resolve.md +23 -0
  53. package/dist/cli-templates/harness-commands/claude/hs-review.md +23 -0
  54. package/dist/cli-templates/harness-commands/claude/hs-view.md +26 -0
  55. package/dist/cli-templates/harness-commands/claude/kill-ports.md +32 -0
  56. package/dist/cli-templates/harness-commands/claude/prototype.md +91 -0
  57. package/dist/cli-templates/harness-commands/cursor/hs-auto.md +40 -0
  58. package/dist/cli-templates/harness-commands/cursor/hs-backfill.md +31 -0
  59. package/dist/cli-templates/harness-commands/cursor/hs-capture.md +65 -0
  60. package/dist/cli-templates/harness-commands/cursor/hs-defer.md +32 -0
  61. package/dist/cli-templates/harness-commands/cursor/hs-dev.md +24 -0
  62. package/dist/cli-templates/harness-commands/cursor/hs-doctor.md +36 -0
  63. package/dist/cli-templates/harness-commands/cursor/hs-ground.md +31 -0
  64. package/dist/cli-templates/harness-commands/cursor/hs-handoff.md +37 -0
  65. package/dist/cli-templates/harness-commands/cursor/hs-log.md +31 -0
  66. package/dist/cli-templates/harness-commands/cursor/hs-next.md +32 -0
  67. package/dist/cli-templates/harness-commands/cursor/hs-promote.md +73 -0
  68. package/dist/cli-templates/harness-commands/cursor/hs-push.md +38 -0
  69. package/dist/cli-templates/harness-commands/cursor/hs-qc.md +30 -0
  70. package/dist/cli-templates/harness-commands/cursor/hs-res.md +67 -0
  71. package/dist/cli-templates/harness-commands/cursor/hs-resolve.md +26 -0
  72. package/dist/cli-templates/harness-commands/cursor/hs-review.md +26 -0
  73. package/dist/cli-templates/harness-commands/cursor/hs-view.md +30 -0
  74. package/dist/cli-templates/harness-commands/cursor/kill-ports.md +35 -0
  75. package/dist/cli-templates/harness-commands/cursor/prototype.md +95 -0
  76. package/docs/mcp-client-config.md +259 -6
  77. package/package.json +231 -124
  78. package/plugins/heyspex/.claude-plugin/plugin.json +12 -0
  79. package/plugins/heyspex/.cursor-plugin/plugin.json +15 -0
  80. package/plugins/heyspex/.mcp.json +12 -0
  81. package/plugins/heyspex/bin/launch-mcp.mjs +95 -0
  82. package/plugins/heyspex/bin/run-hook.mjs +62 -0
  83. package/plugins/heyspex/hooks/cursor-hooks.json +227 -0
  84. package/plugins/heyspex/hooks/hooks.json +361 -0
  85. package/plugins/heyspex/mcp.json +13 -0
  86. package/scripts/check-mcp-freshness.mjs +17 -9
  87. package/scripts/claude-hooks/_env-vault-events.mjs +68 -0
  88. package/scripts/claude-hooks/_guardrail-events.mjs +96 -0
  89. package/scripts/claude-hooks/_guardrail-loader.mjs +494 -0
  90. package/scripts/claude-hooks/_intent-classifier-router.mjs +410 -0
  91. package/scripts/claude-hooks/_intent-classifier-semantic.mjs +351 -0
  92. package/scripts/claude-hooks/_run.mjs +120 -0
  93. package/scripts/claude-hooks/_transcript-text.mjs +60 -0
  94. package/scripts/claude-hooks/_vault-retrieval.mjs +322 -0
  95. package/scripts/claude-hooks/agent-spawn-delegation-gate.mjs +133 -0
  96. package/scripts/claude-hooks/capture-workflow-gate.mjs +11 -0
  97. package/scripts/claude-hooks/check-auto-memory-budget.mjs +396 -0
  98. package/scripts/claude-hooks/check-claude-md-budget.mjs +327 -0
  99. package/scripts/claude-hooks/check-mcp-freshness-hook.mjs +14 -0
  100. package/scripts/claude-hooks/claim-before-code-gate.mjs +11 -0
  101. package/scripts/claude-hooks/claim-liveness-shared.mjs +575 -0
  102. package/scripts/claude-hooks/close-terminal-on-ship.mjs +64 -0
  103. package/scripts/claude-hooks/coo-denylist-gate.mjs +11 -0
  104. package/scripts/claude-hooks/coo-guard-check.mjs +11 -0
  105. package/scripts/claude-hooks/deep-research-cost-gate.mjs +11 -0
  106. package/scripts/claude-hooks/dev-server-task-reminder.mjs +15 -0
  107. package/scripts/claude-hooks/emit-claim-status.mjs +41 -0
  108. package/scripts/claude-hooks/enforce-session-sequence.mjs +11 -0
  109. package/scripts/claude-hooks/enforce-vault-naming.mjs +11 -0
  110. package/scripts/claude-hooks/env-vault-guard.mjs +11 -0
  111. package/scripts/claude-hooks/epic-milestone-phrasing-gate.mjs +11 -0
  112. package/scripts/claude-hooks/git-identity-guard.mjs +11 -0
  113. package/scripts/claude-hooks/git-reflog-audit.mjs +15 -0
  114. package/scripts/claude-hooks/git-stash-gate.mjs +11 -0
  115. package/scripts/claude-hooks/guard-auto-memory-writes.mjs +137 -0
  116. package/scripts/claude-hooks/id-display-format-gate.mjs +11 -0
  117. package/scripts/claude-hooks/inject-communication-style.mjs +66 -0
  118. package/scripts/claude-hooks/inject-coo-seat.mjs +78 -0
  119. package/scripts/claude-hooks/inject-dev-server-awareness.mjs +11 -0
  120. package/scripts/claude-hooks/inject-doctrine.mjs +13 -0
  121. package/scripts/claude-hooks/inject-vault-context.mjs +14 -0
  122. package/scripts/claude-hooks/intent-classifier-trigger.mjs +247 -0
  123. package/scripts/claude-hooks/log-session-activity.mjs +341 -0
  124. package/scripts/claude-hooks/naughty-list-gate.mjs +11 -0
  125. package/scripts/claude-hooks/notify-status-flip.mjs +72 -0
  126. package/scripts/claude-hooks/plan-exit-ingest-gate.mjs +170 -0
  127. package/scripts/claude-hooks/plan-ingest-close-reminder.mjs +66 -0
  128. package/scripts/claude-hooks/plan-review-gate.mjs +11 -0
  129. package/scripts/claude-hooks/preflight-reminder.mjs +262 -0
  130. package/scripts/claude-hooks/protected-action-intent.mjs +221 -0
  131. package/scripts/claude-hooks/research-method-guard.mjs +398 -0
  132. package/scripts/claude-hooks/research-protocol-gate.mjs +11 -0
  133. package/scripts/claude-hooks/session-end.mjs +449 -0
  134. package/scripts/claude-hooks/settings-write-gate.mjs +11 -0
  135. package/scripts/claude-hooks/settlement-check-gate.mjs +39 -0
  136. package/scripts/claude-hooks/status-flip-detect.mjs +17 -0
  137. package/scripts/claude-hooks/terminal-close-shared.mjs +426 -0
  138. package/scripts/claude-hooks/terminal-close-watcher.mjs +122 -0
  139. package/scripts/claude-hooks/wip-checkpoint.mjs +298 -0
  140. package/scripts/cursor-hooks/manifest.mjs +235 -0
  141. package/scripts/dev-server-status.mjs +34 -13
  142. package/scripts/dev-server-stop.mjs +313 -0
  143. package/scripts/heyspex-mode.mjs +268 -0
  144. package/scripts/hs-auto-resolve.mjs +240 -0
  145. package/scripts/hs-auto-source.mjs +398 -0
  146. package/scripts/hs-auto.mjs +134 -0
  147. package/scripts/hs-capture-cli.mjs +326 -0
  148. package/scripts/hs-classifier.mjs +136 -0
  149. package/scripts/hs-companion.mjs +88 -0
  150. package/scripts/hs-gateway.mjs +115 -0
  151. package/scripts/hs-mode.mjs +125 -0
  152. package/scripts/hs-next.mjs +441 -0
  153. package/scripts/hs-settings.mjs +338 -0
  154. package/scripts/hs-view.mjs +333 -0
  155. package/scripts/hs-worktree.mjs +201 -0
  156. package/scripts/install-claude-code-hooks.mjs +270 -0
  157. package/scripts/install-cursor-hooks.mjs +471 -0
  158. package/scripts/lib/agent-env-markers.mjs +38 -0
  159. package/scripts/lib/console-url-resolver.mjs +197 -60
  160. package/scripts/lib/customer-kit.mjs +886 -0
  161. package/scripts/lib/dev-mode.mjs +244 -28
  162. package/scripts/lib/heyspex-home.mjs +72 -0
  163. package/scripts/lib/hs-command.mjs +277 -0
  164. package/scripts/lib/hs-companion-settings.mjs +472 -0
  165. package/scripts/lib/hs-source-commit.mjs +59 -5
  166. package/scripts/lib/hs-source-identity.mjs +526 -0
  167. package/scripts/lib/hs-source-log.mjs +11 -21
  168. package/scripts/lib/hs-source-push.mjs +107 -58
  169. package/scripts/lib/hs-worktree-args.mjs +115 -0
  170. package/scripts/lib/shared-path-helpers.mjs +134 -0
  171. package/scripts/lib/standalone-doctor.mjs +540 -3
  172. package/scripts/lib/subagent-git-lock.mjs +109 -0
  173. package/scripts/lib/template-pin.mjs +34 -0
  174. package/scripts/provenance-lib.mjs +91 -0
  175. package/scripts/stamp-provenance-on-edit.mjs +222 -0
  176. package/scripts/wip-ledger-health.mjs +653 -0
  177. package/spexharness/doctrine/baseline/SPEXCODE-DOCTRINE.baseline.json +29 -0
  178. package/spexharness/src/adapters/audit.mjs +197 -0
  179. package/spexharness/src/adapters/claude-code.mjs +441 -0
  180. package/spexharness/src/chat/tui/ansi.mjs +448 -0
  181. package/spexharness/src/chat/tui/palette.mjs +22 -0
  182. package/spexharness/src/chat/tui/select.mjs +208 -0
  183. package/spexharness/src/config-root.mjs +54 -0
  184. package/spexharness/src/context-budget.mjs +141 -0
  185. package/spexharness/src/dev-server-control.mjs +389 -0
  186. package/spexharness/src/doctrine/behaviour.mjs +371 -0
  187. package/spexharness/src/doctrine/corpus.mjs +733 -0
  188. package/spexharness/src/doctrine/inject.mjs +338 -0
  189. package/spexharness/src/doctrine/merge.mjs +184 -0
  190. package/spexharness/src/doctrine/sources.mjs +252 -0
  191. package/spexharness/src/doctrine/synthesize.mjs +401 -0
  192. package/spexharness/src/doctrine/vault-source.mjs +574 -0
  193. package/spexharness/src/doctrine/writer.mjs +176 -0
  194. package/spexharness/src/events.mjs +84 -0
  195. package/spexharness/src/gates/capture-workflow-gate.mjs +202 -0
  196. package/spexharness/src/gates/claim-before-code-gate.decide.mjs +33 -0
  197. package/spexharness/src/gates/claim-before-code-gate.mjs +129 -0
  198. package/spexharness/src/gates/deep-research-cost-gate.mjs +274 -0
  199. package/spexharness/src/gates/enforce-session-sequence.mjs +895 -0
  200. package/spexharness/src/gates/enforce-vault-naming.mjs +215 -0
  201. package/spexharness/src/gates/epic-milestone-phrasing-gate.mjs +233 -0
  202. package/spexharness/src/gates/git-identity-guard.decide.mjs +436 -0
  203. package/spexharness/src/gates/git-identity-guard.mjs +61 -0
  204. package/spexharness/src/gates/git-reflog-audit.mjs +151 -0
  205. package/spexharness/src/gates/git-stash-gate.decide.mjs +361 -0
  206. package/spexharness/src/gates/git-stash-gate.mjs +159 -0
  207. package/spexharness/src/gates/id-display-format-gate.mjs +190 -0
  208. package/spexharness/src/gates/inject-doctrine-gate.mjs +89 -0
  209. package/spexharness/src/gates/inject-vault-context.mjs +239 -0
  210. package/spexharness/src/gates/naughty-list-gate.mjs +213 -0
  211. package/spexharness/src/gates/plan-review-gate.mjs +233 -0
  212. package/spexharness/src/gates/preflight-reminder-gate.mjs +265 -0
  213. package/spexharness/src/gates/research-protocol-gate.mjs +175 -0
  214. package/spexharness/src/gates/settings-write-gate.decide.mjs +96 -0
  215. package/spexharness/src/gates/settings-write-gate.mjs +104 -0
  216. package/spexharness/src/git-reflog-audit.mjs +294 -0
  217. package/spexharness/src/intent-classifier.mjs +194 -0
  218. package/spexharness/src/intent-directive.mjs +541 -0
  219. package/spexharness/src/profile/learn.mjs +551 -0
  220. package/spexharness/src/profile/proposals.mjs +357 -0
  221. package/spexharness/src/profile/vault-inclusion.mjs +386 -0
  222. package/spexharness/src/redact.mjs +151 -0
  223. package/spexharness/src/rule-table.mjs +819 -0
  224. package/spexharness/src/seat-context.mjs +122 -0
  225. package/spexharness/src/session-bootstrap.mjs +512 -0
  226. package/spexharness/src/session-record.mjs +815 -0
  227. package/spexharness/src/token-inventory.mjs +207 -0
  228. package/vendor/heyspex-mcp/account-switch.mjs +95 -0
  229. package/vendor/heyspex-mcp/alignment-gate.mjs +315 -1
  230. package/vendor/heyspex-mcp/blocker-resolver.mjs +37 -2
  231. package/vendor/heyspex-mcp/breakdown-ladder.mjs +119 -4
  232. package/vendor/heyspex-mcp/breakdown-source.mjs +271 -0
  233. package/vendor/heyspex-mcp/breakdown-writer.mjs +23 -3
  234. package/vendor/heyspex-mcp/capture-buffer-patches.mjs +46 -5
  235. package/vendor/heyspex-mcp/capture-channel.mjs +55 -5
  236. package/vendor/heyspex-mcp/capture-console-client.mjs +80 -1
  237. package/vendor/heyspex-mcp/capture-focus.mjs +1035 -29
  238. package/vendor/heyspex-mcp/capture-outbox.mjs +5 -1
  239. package/vendor/heyspex-mcp/capture-tools.mjs +1219 -0
  240. package/vendor/heyspex-mcp/claim-tools.mjs +1124 -0
  241. package/vendor/heyspex-mcp/cli-verbs.mjs +2076 -0
  242. package/vendor/heyspex-mcp/cli.mjs +201 -15524
  243. package/vendor/heyspex-mcp/cloud-tool-surface.mjs +128 -0
  244. package/vendor/heyspex-mcp/cloud-vault-writes.mjs +412 -0
  245. package/vendor/heyspex-mcp/config-seed.yaml +15 -0
  246. package/vendor/heyspex-mcp/config-settings.mjs +290 -7
  247. package/vendor/heyspex-mcp/console-fetch.mjs +657 -16
  248. package/vendor/heyspex-mcp/console-transport.mjs +166 -0
  249. package/vendor/heyspex-mcp/credentials.mjs +584 -0
  250. package/vendor/heyspex-mcp/defer-spec.mjs +44 -4
  251. package/vendor/heyspex-mcp/deferred-reclaim.mjs +29 -3
  252. package/vendor/heyspex-mcp/design-handlers.mjs +31 -0
  253. package/vendor/heyspex-mcp/design-tools.mjs +4 -1
  254. package/vendor/heyspex-mcp/dev-factory-bridge.mjs +4 -4
  255. package/vendor/heyspex-mcp/dev-mode-core.mjs +45 -0
  256. package/vendor/heyspex-mcp/dev-tools.mjs +124 -0
  257. package/vendor/heyspex-mcp/diagnose-handlers.mjs +54 -0
  258. package/vendor/heyspex-mcp/events-tools.mjs +207 -0
  259. package/vendor/heyspex-mcp/filing-tools.mjs +688 -0
  260. package/vendor/heyspex-mcp/fleet-handlers.mjs +37 -0
  261. package/vendor/heyspex-mcp/fleet-queue-tools.mjs +69 -14
  262. package/vendor/heyspex-mcp/focus-tools.mjs +190 -0
  263. package/vendor/heyspex-mcp/folder-trust-store.mjs +59 -0
  264. package/vendor/heyspex-mcp/http-transport.mjs +300 -0
  265. package/vendor/heyspex-mcp/list-tools.mjs +257 -0
  266. package/vendor/heyspex-mcp/login-handoff.mjs +15 -1
  267. package/vendor/heyspex-mcp/mcp-config.mjs +94 -0
  268. package/vendor/heyspex-mcp/memory-tools.mjs +523 -0
  269. package/vendor/heyspex-mcp/mvp-mode.mjs +53 -6
  270. package/vendor/heyspex-mcp/occupied-keys.mjs +141 -0
  271. package/vendor/heyspex-mcp/on-deck-brief.mjs +3360 -0
  272. package/vendor/heyspex-mcp/on-deck-scheduler.mjs +1708 -0
  273. package/vendor/heyspex-mcp/package-root.mjs +32 -0
  274. package/vendor/heyspex-mcp/peer-presence.mjs +8 -1
  275. package/vendor/heyspex-mcp/plan-ground.mjs +621 -652
  276. package/vendor/heyspex-mcp/plan-push.mjs +906 -21
  277. package/vendor/heyspex-mcp/plan-review.mjs +124 -30
  278. package/vendor/heyspex-mcp/preflight-gate.mjs +0 -0
  279. package/vendor/heyspex-mcp/procedure-handlers.mjs +325 -0
  280. package/vendor/heyspex-mcp/procedure-tools.mjs +540 -351
  281. package/vendor/heyspex-mcp/promote-capture.mjs +386 -69
  282. package/vendor/heyspex-mcp/promote-diagnose.mjs +74 -0
  283. package/vendor/heyspex-mcp/promote-research-to-diagnose.mjs +9 -2
  284. package/vendor/heyspex-mcp/promote-research.mjs +660 -53
  285. package/vendor/heyspex-mcp/promotion-helpers.mjs +251 -0
  286. package/vendor/heyspex-mcp/prompts.mjs +1460 -0
  287. package/vendor/heyspex-mcp/read-path.mjs +29 -9
  288. package/vendor/heyspex-mcp/receipt-shape.mjs +146 -0
  289. package/vendor/heyspex-mcp/recipe-handlers.mjs +117 -0
  290. package/vendor/heyspex-mcp/regen-tasks.mjs +210 -3
  291. package/vendor/heyspex-mcp/register-spec.mjs +266 -54
  292. package/vendor/heyspex-mcp/request-context.mjs +59 -0
  293. package/vendor/heyspex-mcp/research-focus.mjs +207 -4
  294. package/vendor/heyspex-mcp/research-handlers.mjs +623 -0
  295. package/vendor/heyspex-mcp/research-tools.mjs +4 -4
  296. package/vendor/heyspex-mcp/response-budget.mjs +348 -0
  297. package/vendor/heyspex-mcp/review-focus.mjs +25 -1
  298. package/vendor/heyspex-mcp/search-specs.mjs +280 -0
  299. package/vendor/heyspex-mcp/seat-block-ledger.mjs +113 -0
  300. package/vendor/heyspex-mcp/seat-identity.mjs +2 -6
  301. package/vendor/heyspex-mcp/session-owner.mjs +108 -0
  302. package/vendor/heyspex-mcp/session-tools.mjs +152 -0
  303. package/vendor/heyspex-mcp/settings-registry.mjs +232 -0
  304. package/vendor/heyspex-mcp/settings-tools.mjs +85 -12
  305. package/vendor/heyspex-mcp/spec-edit-tools.mjs +446 -0
  306. package/vendor/heyspex-mcp/spec-id-lib.mjs +93 -17
  307. package/vendor/heyspex-mcp/split-research.mjs +301 -56
  308. package/vendor/heyspex-mcp/stdio-rpc.mjs +22 -0
  309. package/vendor/heyspex-mcp/submit-for-review.mjs +132 -6
  310. package/vendor/heyspex-mcp/summary-contract.mjs +105 -0
  311. package/vendor/heyspex-mcp/summary-write-tools.mjs +224 -0
  312. package/vendor/heyspex-mcp/symptom-query.mjs +146 -0
  313. package/vendor/heyspex-mcp/test-helpers.mjs +108 -1
  314. package/vendor/heyspex-mcp/tool-catalog.mjs +2813 -0
  315. package/vendor/heyspex-mcp/tool-dispatch.mjs +639 -0
  316. package/vendor/heyspex-mcp/tool-helpers.mjs +325 -0
  317. package/vendor/heyspex-mcp/validate-linkage.mjs +414 -27
  318. package/vendor/heyspex-mcp/vault-io.mjs +724 -0
  319. package/vendor/heyspex-mcp/vault-less-endpoints.mjs +52 -0
  320. package/vendor/heyspex-mcp/vault-resolve.mjs +366 -68
  321. package/vendor/heyspex-mcp/verify-reproduction.mjs +270 -30
  322. package/vendor/heyspex-mcp/whoami.mjs +91 -0
@@ -0,0 +1,227 @@
1
+ {
2
+ "_comment": "GENERATED by scripts/install-cursor-hooks.mjs from scripts/cursor-hooks/manifest.mjs — do not edit by hand; run `npm run hooks:install-cursor`. Commands resolve through $CURSOR_PROJECT_DIR because the shim and hook bodies live in the host vault checkout, not the plugin cache. WARNING: enabling this plugin in a repo whose .cursor/hooks.json still registers the same hooks runs every hook twice — validate in a fresh clone, or run `node scripts/install-cursor-hooks.mjs --uninstall` there first.",
3
+ "version": 1,
4
+ "hooks": {
5
+ "sessionStart": [
6
+ {
7
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" wip-checkpoint",
8
+ "timeout": 5
9
+ },
10
+ {
11
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" inject-dev-server-awareness",
12
+ "timeout": 5
13
+ },
14
+ {
15
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" inject-coo-seat",
16
+ "timeout": 5
17
+ },
18
+ {
19
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" coo-guard-check",
20
+ "timeout": 5
21
+ },
22
+ {
23
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" check-auto-memory-budget",
24
+ "timeout": 5
25
+ },
26
+ {
27
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" check-claude-md-budget",
28
+ "timeout": 5
29
+ },
30
+ {
31
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" check-mcp-freshness-hook",
32
+ "timeout": 5
33
+ }
34
+ ],
35
+ "preCompact": [
36
+ {
37
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" wip-checkpoint --hs-claude-event=SessionStart",
38
+ "timeout": 5
39
+ }
40
+ ],
41
+ "beforeSubmitPrompt": [
42
+ {
43
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" preflight-reminder",
44
+ "timeout": 5
45
+ },
46
+ {
47
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" intent-classifier-trigger",
48
+ "timeout": 5
49
+ },
50
+ {
51
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" inject-communication-style",
52
+ "timeout": 5
53
+ }
54
+ ],
55
+ "preToolUse": [
56
+ {
57
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" emit-claim-status --event=PreToolUse",
58
+ "timeout": 5,
59
+ "matcher": ".*"
60
+ },
61
+ {
62
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" coo-denylist-gate",
63
+ "timeout": 5,
64
+ "matcher": ".*"
65
+ },
66
+ {
67
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" log-session-activity --event=PreToolUse",
68
+ "timeout": 5,
69
+ "matcher": ".*"
70
+ },
71
+ {
72
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" env-vault-guard",
73
+ "timeout": 5,
74
+ "matcher": "Write|Delete"
75
+ },
76
+ {
77
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" settings-write-gate",
78
+ "timeout": 5,
79
+ "matcher": "Write"
80
+ },
81
+ {
82
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" enforce-vault-naming",
83
+ "timeout": 5,
84
+ "matcher": "Write"
85
+ },
86
+ {
87
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" guard-auto-memory-writes",
88
+ "timeout": 5,
89
+ "matcher": "Write"
90
+ },
91
+ {
92
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" preflight-reminder",
93
+ "timeout": 5,
94
+ "matcher": "Write"
95
+ },
96
+ {
97
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" claim-before-code-gate",
98
+ "timeout": 5,
99
+ "matcher": "Write"
100
+ },
101
+ {
102
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" coo-guard-check --hs-tool=\"heyspex_claim_spec$\"",
103
+ "timeout": 5,
104
+ "matcher": ".*"
105
+ },
106
+ {
107
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" capture-workflow-gate --hs-tool=\"heyspex_file_spec$\"",
108
+ "timeout": 8,
109
+ "matcher": ".*"
110
+ },
111
+ {
112
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" settings-write-gate --hs-tool=\"heyspex_settings_set$\"",
113
+ "timeout": 5,
114
+ "matcher": ".*"
115
+ },
116
+ {
117
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" dev-server-task-reminder --hs-tool=\"[Nn]eon__(prepare_database_migration|complete_database_migration|reset_from_parent|delete_branch)$\"",
118
+ "timeout": 10,
119
+ "matcher": ".*"
120
+ },
121
+ {
122
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" deep-research-cost-gate --hs-tool=\"^(Workflow|Skill)$\"",
123
+ "timeout": 5,
124
+ "matcher": ".*"
125
+ },
126
+ {
127
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" research-protocol-gate --hs-tool=\"^(WebSearch|WebFetch|web_search|web_fetch)$|heyspex_save_research$\"",
128
+ "timeout": 5,
129
+ "matcher": ".*"
130
+ }
131
+ ],
132
+ "beforeShellExecution": [
133
+ {
134
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" env-vault-guard",
135
+ "timeout": 5
136
+ },
137
+ {
138
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" settings-write-gate",
139
+ "timeout": 5
140
+ },
141
+ {
142
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" enforce-vault-naming",
143
+ "timeout": 5
144
+ },
145
+ {
146
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" guard-auto-memory-writes",
147
+ "timeout": 5
148
+ },
149
+ {
150
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" preflight-reminder",
151
+ "timeout": 5
152
+ },
153
+ {
154
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" dev-server-task-reminder",
155
+ "timeout": 10
156
+ },
157
+ {
158
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" git-stash-gate",
159
+ "timeout": 10
160
+ }
161
+ ],
162
+ "subagentStart": [
163
+ {
164
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" agent-spawn-delegation-gate",
165
+ "timeout": 5
166
+ }
167
+ ],
168
+ "postToolUse": [
169
+ {
170
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" emit-claim-status --event=PostToolUse",
171
+ "timeout": 5,
172
+ "matcher": ".*"
173
+ },
174
+ {
175
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" log-session-activity --event=PostToolUse",
176
+ "timeout": 5,
177
+ "matcher": ".*"
178
+ },
179
+ {
180
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" close-terminal-on-ship",
181
+ "timeout": 5,
182
+ "matcher": ".*"
183
+ },
184
+ {
185
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" notify-status-flip",
186
+ "timeout": 5,
187
+ "matcher": "Write"
188
+ },
189
+ {
190
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" scripts/stamp-provenance-on-edit.mjs",
191
+ "timeout": 5,
192
+ "matcher": "Write"
193
+ }
194
+ ],
195
+ "afterFileEdit": [
196
+ {
197
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" close-terminal-on-ship",
198
+ "timeout": 5,
199
+ "matcher": ".*"
200
+ }
201
+ ],
202
+ "stop": [
203
+ {
204
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" emit-claim-status --event=Stop",
205
+ "timeout": 5
206
+ },
207
+ {
208
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" naughty-list-gate",
209
+ "timeout": 5
210
+ },
211
+ {
212
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" enforce-session-sequence",
213
+ "timeout": 5
214
+ }
215
+ ],
216
+ "sessionEnd": [
217
+ {
218
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" session-end",
219
+ "timeout": 5
220
+ },
221
+ {
222
+ "command": "node \"$CURSOR_PROJECT_DIR/scripts/cursor-hooks/_run.mjs\" close-terminal-on-ship",
223
+ "timeout": 5
224
+ }
225
+ ]
226
+ }
227
+ }
@@ -0,0 +1,361 @@
1
+ {
2
+ "_comment": "GENERATED from scripts/lib/customer-kit.mjs (customer-scoped rows only) — do not edit by hand; run `node scripts/lib/customer-kit.mjs --write-plugin-hooks`. Every command goes through bin/run-hook.mjs, which finds the hook runtime (HEYSPEX_PLATFORM_ROOT / HEYSPEX_MCP_ENTRY when set in the machine's own env, then the plugin's own location, node_modules/heyspex, $CLAUDE_PROJECT_DIR) — never $CLAUDE_PROJECT_DIR/scripts, which only exists in heyspex-app. WARNING: a repo whose .claude/settings.json already carries the hs install kit hooks runs every hook twice if this plugin is also enabled — use one or the other.",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" wip-checkpoint",
10
+ "timeout": 5
11
+ }
12
+ ]
13
+ },
14
+ {
15
+ "hooks": [
16
+ {
17
+ "type": "command",
18
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" inject-doctrine",
19
+ "timeout": 5
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "hooks": [
25
+ {
26
+ "type": "command",
27
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" check-auto-memory-budget",
28
+ "timeout": 5
29
+ }
30
+ ]
31
+ },
32
+ {
33
+ "hooks": [
34
+ {
35
+ "type": "command",
36
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" check-claude-md-budget",
37
+ "timeout": 5
38
+ }
39
+ ]
40
+ },
41
+ {
42
+ "hooks": [
43
+ {
44
+ "type": "command",
45
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" git-reflog-audit",
46
+ "timeout": 5
47
+ }
48
+ ]
49
+ }
50
+ ],
51
+ "PreCompact": [
52
+ {
53
+ "hooks": [
54
+ {
55
+ "type": "command",
56
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" wip-checkpoint",
57
+ "timeout": 5
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "UserPromptSubmit": [
63
+ {
64
+ "hooks": [
65
+ {
66
+ "type": "command",
67
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" preflight-reminder",
68
+ "timeout": 5
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ "hooks": [
74
+ {
75
+ "type": "command",
76
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" intent-classifier-trigger",
77
+ "timeout": 5
78
+ }
79
+ ]
80
+ },
81
+ {
82
+ "hooks": [
83
+ {
84
+ "type": "command",
85
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" inject-communication-style",
86
+ "timeout": 5
87
+ }
88
+ ]
89
+ },
90
+ {
91
+ "hooks": [
92
+ {
93
+ "type": "command",
94
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" inject-vault-context",
95
+ "timeout": 10
96
+ }
97
+ ]
98
+ }
99
+ ],
100
+ "PreToolUse": [
101
+ {
102
+ "matcher": "Bash|PowerShell",
103
+ "hooks": [
104
+ {
105
+ "type": "command",
106
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" git-identity-guard",
107
+ "timeout": 5
108
+ }
109
+ ]
110
+ },
111
+ {
112
+ "matcher": "Write|Edit|NotebookEdit|Bash|PowerShell|mcp__heyspex__heyspex_settings_set|mcp__plugin_heyspex_heyspex__heyspex_settings_set",
113
+ "hooks": [
114
+ {
115
+ "type": "command",
116
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" settings-write-gate",
117
+ "timeout": 5
118
+ }
119
+ ]
120
+ },
121
+ {
122
+ "matcher": ".*",
123
+ "hooks": [
124
+ {
125
+ "type": "command",
126
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" emit-claim-status --event=PreToolUse",
127
+ "timeout": 5
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ "matcher": "Write|NotebookEdit|Bash|PowerShell",
133
+ "hooks": [
134
+ {
135
+ "type": "command",
136
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" enforce-vault-naming",
137
+ "timeout": 5
138
+ }
139
+ ]
140
+ },
141
+ {
142
+ "matcher": "Write|NotebookEdit|Bash|PowerShell",
143
+ "hooks": [
144
+ {
145
+ "type": "command",
146
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" guard-auto-memory-writes",
147
+ "timeout": 5
148
+ }
149
+ ]
150
+ },
151
+ {
152
+ "matcher": "Edit|MultiEdit|Write|Bash|PowerShell",
153
+ "hooks": [
154
+ {
155
+ "type": "command",
156
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" preflight-reminder",
157
+ "timeout": 5
158
+ }
159
+ ]
160
+ },
161
+ {
162
+ "matcher": "ExitPlanMode",
163
+ "hooks": [
164
+ {
165
+ "type": "command",
166
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" plan-review-gate",
167
+ "timeout": 8
168
+ }
169
+ ]
170
+ },
171
+ {
172
+ "matcher": "ExitPlanMode",
173
+ "hooks": [
174
+ {
175
+ "type": "command",
176
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" plan-exit-ingest-gate",
177
+ "timeout": 5
178
+ }
179
+ ]
180
+ },
181
+ {
182
+ "matcher": "Edit|MultiEdit|Write",
183
+ "hooks": [
184
+ {
185
+ "type": "command",
186
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" claim-before-code-gate",
187
+ "timeout": 5
188
+ }
189
+ ]
190
+ },
191
+ {
192
+ "matcher": "mcp__heyspex__heyspex_file_spec|mcp__plugin_heyspex_heyspex__heyspex_file_spec",
193
+ "hooks": [
194
+ {
195
+ "type": "command",
196
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" capture-workflow-gate",
197
+ "timeout": 8
198
+ }
199
+ ]
200
+ },
201
+ {
202
+ "matcher": "Bash|PowerShell",
203
+ "hooks": [
204
+ {
205
+ "type": "command",
206
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" git-stash-gate",
207
+ "timeout": 10
208
+ }
209
+ ]
210
+ },
211
+ {
212
+ "matcher": "Skill|Workflow",
213
+ "hooks": [
214
+ {
215
+ "type": "command",
216
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" research-method-guard",
217
+ "timeout": 5
218
+ }
219
+ ]
220
+ },
221
+ {
222
+ "matcher": "Workflow|Skill",
223
+ "hooks": [
224
+ {
225
+ "type": "command",
226
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" deep-research-cost-gate",
227
+ "timeout": 5
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "matcher": "WebSearch|WebFetch|mcp__heyspex__heyspex_save_research|mcp__plugin_heyspex_heyspex__heyspex_save_research",
233
+ "hooks": [
234
+ {
235
+ "type": "command",
236
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" research-protocol-gate",
237
+ "timeout": 5
238
+ }
239
+ ]
240
+ }
241
+ ],
242
+ "Stop": [
243
+ {
244
+ "hooks": [
245
+ {
246
+ "type": "command",
247
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" emit-claim-status --event=Stop",
248
+ "timeout": 5
249
+ }
250
+ ]
251
+ },
252
+ {
253
+ "hooks": [
254
+ {
255
+ "type": "command",
256
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" naughty-list-gate",
257
+ "timeout": 5
258
+ }
259
+ ]
260
+ },
261
+ {
262
+ "hooks": [
263
+ {
264
+ "type": "command",
265
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" id-display-format-gate",
266
+ "timeout": 5
267
+ }
268
+ ]
269
+ },
270
+ {
271
+ "hooks": [
272
+ {
273
+ "type": "command",
274
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" epic-milestone-phrasing-gate",
275
+ "timeout": 5
276
+ }
277
+ ]
278
+ },
279
+ {
280
+ "hooks": [
281
+ {
282
+ "type": "command",
283
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" git-reflog-audit",
284
+ "timeout": 5
285
+ }
286
+ ]
287
+ },
288
+ {
289
+ "hooks": [
290
+ {
291
+ "type": "command",
292
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" enforce-session-sequence",
293
+ "timeout": 5
294
+ }
295
+ ]
296
+ }
297
+ ],
298
+ "PostToolUse": [
299
+ {
300
+ "matcher": ".*",
301
+ "hooks": [
302
+ {
303
+ "type": "command",
304
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" emit-claim-status --event=PostToolUse",
305
+ "timeout": 5
306
+ }
307
+ ]
308
+ },
309
+ {
310
+ "matcher": "Edit|Write|MultiEdit",
311
+ "hooks": [
312
+ {
313
+ "type": "command",
314
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" notify-status-flip",
315
+ "timeout": 5
316
+ }
317
+ ]
318
+ },
319
+ {
320
+ "matcher": "Edit|Write|MultiEdit",
321
+ "hooks": [
322
+ {
323
+ "type": "command",
324
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" close-terminal-on-ship",
325
+ "timeout": 5
326
+ }
327
+ ]
328
+ },
329
+ {
330
+ "matcher": "Edit|Write|MultiEdit",
331
+ "hooks": [
332
+ {
333
+ "type": "command",
334
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" scripts/stamp-provenance-on-edit.mjs",
335
+ "timeout": 5
336
+ }
337
+ ]
338
+ }
339
+ ],
340
+ "SessionEnd": [
341
+ {
342
+ "hooks": [
343
+ {
344
+ "type": "command",
345
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" session-end",
346
+ "timeout": 5
347
+ }
348
+ ]
349
+ },
350
+ {
351
+ "hooks": [
352
+ {
353
+ "type": "command",
354
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/bin/run-hook.mjs\" close-terminal-on-ship",
355
+ "timeout": 5
356
+ }
357
+ ]
358
+ }
359
+ ]
360
+ }
361
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "_comment": "Cursor plugin MCP declaration (HS-2HII). Boots through the plugin's own bin/launch-mcp.mjs, the same launcher .mcp.json uses for Claude Code. Cursor expands ${CURSOR_PLUGIN_ROOT} to the plugin's install path in command/args/env/cwd (cursor.com/docs/reference/plugins), so this works from a plain `npm install heyspex`: the launcher resolves node_modules/heyspex first, then CURSOR_PROJECT_DIR and the other source-checkout fallbacks. Never point this at vendor/heyspex-mcp/cli.mjs directly: that path exists only inside the platform checkout.",
3
+ "mcpServers": {
4
+ "heyspex": {
5
+ "type": "stdio",
6
+ "command": "node",
7
+ "args": ["${CURSOR_PLUGIN_ROOT}/bin/launch-mcp.mjs"],
8
+ "env": {
9
+ "HEYSPEX_VAULT_ROOT": "${workspaceFolder}"
10
+ }
11
+ }
12
+ }
13
+ }
@@ -181,15 +181,13 @@ export function writeBuildRecord({ vaultRoot, vendorDir, buildFile, buildsDir, p
181
181
  pid: recordPid,
182
182
  vendorDir: path.relative(root, vDir).split(path.sep).join('/'),
183
183
  };
184
- // Legacy machine-wide record — kept for back-compat readers.
185
- const dir = path.dirname(target);
186
- fs.mkdirSync(dir, { recursive: true });
187
- const tmp = `${target}.${process.pid}.tmp`;
188
- fs.writeFileSync(tmp, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
189
- fs.renameSync(tmp, target);
190
184
 
191
- // Per-process record + opportunistic dead-pid pruning. Best-effort: a
192
- // failure here must never take server startup down with it.
185
+ // Per-process record + opportunistic dead-pid pruning, computed BEFORE the
186
+ // legacy write below so the on-disk legacy file and the returned `record`
187
+ // never disagree on shape (round-trip identity relied on by
188
+ // vendor/heyspex-mcp/mcp-build-fingerprint.test.mjs and any future disk
189
+ // reader). Best-effort: a failure here must never take server startup down
190
+ // with it, and must never skip the legacy write that follows.
193
191
  try {
194
192
  fs.mkdirSync(perDir, { recursive: true });
195
193
  pruneDeadRecords(perDir, recordPid);
@@ -207,8 +205,18 @@ export function writeBuildRecord({ vaultRoot, vendorDir, buildFile, buildsDir, p
207
205
  fs.renameSync(perTmp, perTarget);
208
206
  record.perProcessRecord = perRecord;
209
207
  } catch {
210
- // legacy record already landed — per-process bookkeeping is best-effort
208
+ // per-process bookkeeping is best-effort — the legacy record below still lands
211
209
  }
210
+
211
+ // Legacy machine-wide record — kept for back-compat readers. Written last
212
+ // (after `record` has its final shape, `perProcessRecord` included when
213
+ // available) so this file and the return value are always the same object.
214
+ const dir = path.dirname(target);
215
+ fs.mkdirSync(dir, { recursive: true });
216
+ const tmp = `${target}.${process.pid}.tmp`;
217
+ fs.writeFileSync(tmp, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
218
+ fs.renameSync(tmp, target);
219
+
212
220
  return record;
213
221
  }
214
222