heyspex 0.1.0 → 0.2.1
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.
- package/.claude-plugin/marketplace.json +14 -0
- package/README.md +21 -0
- package/bin/hs.mjs +1089 -104
- package/bin/spexcode.mjs +262 -0
- package/dev-factory/engine/worktree.mjs +740 -0
- package/dev-factory/lib/code-repo-root.mjs +67 -0
- package/dev-factory/lib/context-budget.mjs +84 -0
- package/dev-factory/lib/epic-detect.mjs +190 -0
- package/dev-factory/lib/fleet-queue-file.mjs +846 -0
- package/dev-factory/lib/fleet-queue.mjs +426 -0
- package/dev-factory/lib/fleet-state.mjs +14 -18
- package/dev-factory/lib/model-catalog.mjs +338 -0
- package/dev-factory/lib/seat-context.mjs +199 -0
- package/dev-factory/lib/spec-io.mjs +93 -0
- package/dev-factory/lib/sufficiency-score.mjs +8 -2
- package/dev-factory/lib/worktree-allocator.mjs +744 -0
- package/dev-factory/model-catalog.json +222 -0
- package/dist/cli/hs-check.mjs +1127 -103
- package/dist/cli/hs-claim.mjs +981 -63
- package/dist/cli/hs-connect.mjs +10059 -1729
- package/dist/cli/hs-defer.mjs +5507 -3072
- package/dist/cli/hs-dev.mjs +576 -0
- package/dist/cli/hs-env.mjs +416 -302
- package/dist/cli/hs-index-rebuild.mjs +7334 -0
- package/dist/cli/hs-index-reconcile.mjs +8138 -0
- package/dist/cli/hs-init.mjs +2840 -149
- package/dist/cli/hs-install.mjs +7214 -594
- package/dist/cli/hs-join.mjs +10640 -2421
- package/dist/cli/hs-vault-pull.mjs +8157 -6370
- package/dist/cli/hs-vault-push.mjs +6433 -0
- package/dist/cli/hs-vault.mjs +4029 -1555
- package/dist/cli/hs-workspace.mjs +2702 -538
- package/dist/cli-templates/customer-vault/specs/entity-model.md +594 -601
- package/dist/cli-templates/customer-vault/specs/protocols/canonical-frontmatter-templates.md +110 -177
- package/dist/cli-templates/customer-vault/specs/protocols/destructive-action-checklist.md +122 -0
- package/dist/cli-templates/customer-vault/specs/protocols/memory-protocol.md +13 -15
- package/dist/cli-templates/customer-vault/specs/protocols/session-close-protocol.md +91 -0
- package/dist/cli-templates/customer-vault/specs/protocols/spec-hierarchy.md +150 -168
- package/dist/cli-templates/customer-vault/specs/protocols/spec-summary-authoring.md +83 -0
- package/dist/cli-templates/harness-commands/claude/hs-auto.md +36 -0
- package/dist/cli-templates/harness-commands/claude/hs-backfill.md +28 -0
- package/dist/cli-templates/harness-commands/claude/hs-capture.md +62 -0
- package/dist/cli-templates/harness-commands/claude/hs-defer.md +29 -0
- package/dist/cli-templates/harness-commands/claude/hs-dev.md +20 -0
- package/dist/cli-templates/harness-commands/claude/hs-doctor.md +32 -0
- package/dist/cli-templates/harness-commands/claude/hs-ground.md +30 -0
- package/dist/cli-templates/harness-commands/claude/hs-handoff.md +33 -0
- package/dist/cli-templates/harness-commands/claude/hs-log.md +27 -0
- package/dist/cli-templates/harness-commands/claude/hs-next.md +29 -0
- package/dist/cli-templates/harness-commands/claude/hs-promote.md +70 -0
- package/dist/cli-templates/harness-commands/claude/hs-push.md +35 -0
- package/dist/cli-templates/harness-commands/claude/hs-qc.md +27 -0
- package/dist/cli-templates/harness-commands/claude/hs-res.md +63 -0
- package/dist/cli-templates/harness-commands/claude/hs-resolve.md +23 -0
- package/dist/cli-templates/harness-commands/claude/hs-review.md +23 -0
- package/dist/cli-templates/harness-commands/claude/hs-view.md +28 -0
- package/dist/cli-templates/harness-commands/claude/kill-ports.md +32 -0
- package/dist/cli-templates/harness-commands/claude/prototype.md +91 -0
- package/dist/cli-templates/harness-commands/cursor/hs-auto.md +40 -0
- package/dist/cli-templates/harness-commands/cursor/hs-backfill.md +31 -0
- package/dist/cli-templates/harness-commands/cursor/hs-capture.md +65 -0
- package/dist/cli-templates/harness-commands/cursor/hs-defer.md +32 -0
- package/dist/cli-templates/harness-commands/cursor/hs-dev.md +24 -0
- package/dist/cli-templates/harness-commands/cursor/hs-doctor.md +36 -0
- package/dist/cli-templates/harness-commands/cursor/hs-ground.md +33 -0
- package/dist/cli-templates/harness-commands/cursor/hs-handoff.md +37 -0
- package/dist/cli-templates/harness-commands/cursor/hs-log.md +31 -0
- package/dist/cli-templates/harness-commands/cursor/hs-next.md +32 -0
- package/dist/cli-templates/harness-commands/cursor/hs-promote.md +73 -0
- package/dist/cli-templates/harness-commands/cursor/hs-push.md +38 -0
- package/dist/cli-templates/harness-commands/cursor/hs-qc.md +30 -0
- package/dist/cli-templates/harness-commands/cursor/hs-res.md +67 -0
- package/dist/cli-templates/harness-commands/cursor/hs-resolve.md +26 -0
- package/dist/cli-templates/harness-commands/cursor/hs-review.md +26 -0
- package/dist/cli-templates/harness-commands/cursor/hs-view.md +32 -0
- package/dist/cli-templates/harness-commands/cursor/kill-ports.md +35 -0
- package/dist/cli-templates/harness-commands/cursor/prototype.md +95 -0
- package/docs/copilot-plugin-install.md +162 -0
- package/docs/driving-heyspex-from-copilot.md +165 -0
- package/docs/mcp-client-config.md +259 -6
- package/package.json +249 -124
- package/plugins/heyspex/.claude-plugin/plugin.json +12 -0
- package/plugins/heyspex/.cursor-plugin/plugin.json +15 -0
- package/plugins/heyspex/.mcp.json +12 -0
- package/plugins/heyspex/README.md +309 -0
- package/plugins/heyspex/bin/launch-mcp.mjs +95 -0
- package/plugins/heyspex/bin/run-hook.mjs +80 -0
- package/plugins/heyspex/hooks/cursor-hooks.json +308 -0
- package/plugins/heyspex/hooks/hooks.json +418 -0
- package/plugins/heyspex/mcp.json +13 -0
- package/scripts/check-mcp-freshness.mjs +17 -9
- package/scripts/claude-hooks/_env-vault-events.mjs +68 -0
- package/scripts/claude-hooks/_guardrail-events.mjs +96 -0
- package/scripts/claude-hooks/_guardrail-loader.mjs +494 -0
- package/scripts/claude-hooks/_intent-classifier-router.mjs +456 -0
- package/scripts/claude-hooks/_intent-classifier-semantic.mjs +356 -0
- package/scripts/claude-hooks/_run.mjs +413 -0
- package/scripts/claude-hooks/_transcript-text.mjs +60 -0
- package/scripts/claude-hooks/_vault-retrieval.mjs +322 -0
- package/scripts/claude-hooks/agent-spawn-delegation-gate.mjs +133 -0
- package/scripts/claude-hooks/capture-execution-gate.mjs +51 -0
- package/scripts/claude-hooks/capture-workflow-gate.mjs +11 -0
- package/scripts/claude-hooks/check-auto-memory-budget.mjs +396 -0
- package/scripts/claude-hooks/check-claude-md-budget.mjs +327 -0
- package/scripts/claude-hooks/check-mcp-freshness-hook.mjs +14 -0
- package/scripts/claude-hooks/claim-before-code-gate.mjs +11 -0
- package/scripts/claude-hooks/claim-liveness-shared.mjs +577 -0
- package/scripts/claude-hooks/close-terminal-on-ship.mjs +64 -0
- package/scripts/claude-hooks/coo-denylist-gate.mjs +11 -0
- package/scripts/claude-hooks/coo-guard-check.mjs +11 -0
- package/scripts/claude-hooks/deep-research-cost-gate.mjs +11 -0
- package/scripts/claude-hooks/dev-server-task-reminder.mjs +15 -0
- package/scripts/claude-hooks/diagnose-capture-reminder.mjs +11 -0
- package/scripts/claude-hooks/directive-obligation-gate.mjs +11 -0
- package/scripts/claude-hooks/emit-claim-status.mjs +41 -0
- package/scripts/claude-hooks/enforce-session-sequence.mjs +11 -0
- package/scripts/claude-hooks/enforce-vault-naming.mjs +11 -0
- package/scripts/claude-hooks/env-vault-guard.mjs +11 -0
- package/scripts/claude-hooks/epic-milestone-phrasing-gate.mjs +11 -0
- package/scripts/claude-hooks/git-identity-guard.mjs +11 -0
- package/scripts/claude-hooks/git-reflog-audit.mjs +15 -0
- package/scripts/claude-hooks/git-stash-gate.mjs +11 -0
- package/scripts/claude-hooks/guard-auto-memory-writes.mjs +137 -0
- package/scripts/claude-hooks/id-display-format-gate.mjs +11 -0
- package/scripts/claude-hooks/inject-communication-style.mjs +86 -0
- package/scripts/claude-hooks/inject-coo-seat.mjs +78 -0
- package/scripts/claude-hooks/inject-dev-server-awareness.mjs +11 -0
- package/scripts/claude-hooks/inject-doctrine.mjs +13 -0
- package/scripts/claude-hooks/inject-vault-context.mjs +14 -0
- package/scripts/claude-hooks/intent-classifier-trigger.mjs +279 -0
- package/scripts/claude-hooks/log-session-activity.mjs +341 -0
- package/scripts/claude-hooks/naughty-list-gate.mjs +11 -0
- package/scripts/claude-hooks/notify-status-flip.mjs +72 -0
- package/scripts/claude-hooks/plan-exit-ingest-gate.mjs +170 -0
- package/scripts/claude-hooks/plan-ingest-close-reminder.mjs +66 -0
- package/scripts/claude-hooks/plan-review-gate.mjs +11 -0
- package/scripts/claude-hooks/preflight-reminder.mjs +262 -0
- package/scripts/claude-hooks/protected-action-intent.mjs +221 -0
- package/scripts/claude-hooks/research-method-guard.mjs +398 -0
- package/scripts/claude-hooks/research-protocol-gate.mjs +11 -0
- package/scripts/claude-hooks/session-end.mjs +451 -0
- package/scripts/claude-hooks/settings-write-gate.mjs +11 -0
- package/scripts/claude-hooks/settlement-check-gate.mjs +39 -0
- package/scripts/claude-hooks/status-flip-detect.mjs +17 -0
- package/scripts/claude-hooks/terminal-close-shared.mjs +426 -0
- package/scripts/claude-hooks/terminal-close-watcher.mjs +122 -0
- package/scripts/claude-hooks/vault-mirror-catchup.mjs +11 -0
- package/scripts/claude-hooks/vault-write-tier-guard.mjs +11 -0
- package/scripts/claude-hooks/wip-checkpoint.mjs +302 -0
- package/scripts/cursor-hooks/manifest.mjs +281 -0
- package/scripts/dev-server-status.mjs +34 -13
- package/scripts/dev-server-stop.mjs +313 -0
- package/scripts/heyspex-mode.mjs +288 -0
- package/scripts/hs-auto-resolve.mjs +240 -0
- package/scripts/hs-auto-source.mjs +398 -0
- package/scripts/hs-auto.mjs +134 -0
- package/scripts/hs-capture-cli.mjs +326 -0
- package/scripts/hs-classifier.mjs +136 -0
- package/scripts/hs-companion.mjs +88 -0
- package/scripts/hs-gateway.mjs +115 -0
- package/scripts/hs-mode.mjs +125 -0
- package/scripts/hs-next.mjs +441 -0
- package/scripts/hs-settings.mjs +338 -0
- package/scripts/hs-view.mjs +496 -0
- package/scripts/hs-worktree.mjs +201 -0
- package/scripts/install-claude-code-hooks.mjs +272 -0
- package/scripts/install-cursor-hooks.mjs +471 -0
- package/scripts/lib/agent-env-markers.mjs +38 -0
- package/scripts/lib/console-url-resolver.mjs +199 -61
- package/scripts/lib/customer-kit.mjs +1203 -0
- package/scripts/lib/dev-mode.mjs +249 -32
- package/scripts/lib/directive-obligations.mjs +349 -0
- package/scripts/lib/heyspex-home.mjs +72 -0
- package/scripts/lib/hook-dispositions.mjs +210 -0
- package/scripts/lib/hook-vault-header.mjs +30 -0
- package/scripts/lib/hs-command.mjs +277 -0
- package/scripts/lib/hs-companion-settings.mjs +472 -0
- package/scripts/lib/hs-source-branch.mjs +196 -0
- package/scripts/lib/hs-source-commit.mjs +59 -5
- package/scripts/lib/hs-source-identity.mjs +526 -0
- package/scripts/lib/hs-source-log.mjs +13 -22
- package/scripts/lib/hs-source-preflight.mjs +18 -4
- package/scripts/lib/hs-source-push.mjs +386 -307
- package/scripts/lib/hs-worktree-args.mjs +115 -0
- package/scripts/lib/shared-path-helpers.mjs +134 -0
- package/scripts/lib/standalone-doctor.mjs +540 -3
- package/scripts/lib/subagent-git-lock.mjs +109 -0
- package/scripts/lib/template-pin.mjs +34 -0
- package/scripts/lib/window-placement.mjs +109 -0
- package/scripts/provenance-lib.mjs +91 -0
- package/scripts/stamp-provenance-on-edit.mjs +222 -0
- package/scripts/wip-ledger-health.mjs +653 -0
- package/spexharness/doctrine/baseline/SPEXCODE-DOCTRINE.baseline.json +29 -0
- package/spexharness/src/adapters/audit.mjs +197 -0
- package/spexharness/src/adapters/claude-code.mjs +449 -0
- package/spexharness/src/adapters/copilot.mjs +236 -0
- package/spexharness/src/adapters/detect-harness.mjs +34 -0
- package/spexharness/src/chat/tui/ansi.mjs +448 -0
- package/spexharness/src/chat/tui/palette.mjs +22 -0
- package/spexharness/src/chat/tui/select.mjs +208 -0
- package/spexharness/src/config-root.mjs +54 -0
- package/spexharness/src/context-budget.mjs +141 -0
- package/spexharness/src/dev-server-control.mjs +389 -0
- package/spexharness/src/doctrine/behaviour.mjs +371 -0
- package/spexharness/src/doctrine/corpus.mjs +733 -0
- package/spexharness/src/doctrine/inject.mjs +338 -0
- package/spexharness/src/doctrine/merge.mjs +184 -0
- package/spexharness/src/doctrine/sources.mjs +252 -0
- package/spexharness/src/doctrine/synthesize.mjs +401 -0
- package/spexharness/src/doctrine/vault-source.mjs +574 -0
- package/spexharness/src/doctrine/writer.mjs +176 -0
- package/spexharness/src/events.mjs +84 -0
- package/spexharness/src/gates/_shell-write-targets.mjs +77 -0
- package/spexharness/src/gates/capture-workflow-gate.mjs +202 -0
- package/spexharness/src/gates/claim-before-code-gate.decide.mjs +33 -0
- package/spexharness/src/gates/claim-before-code-gate.mjs +129 -0
- package/spexharness/src/gates/deep-research-cost-gate.mjs +275 -0
- package/spexharness/src/gates/diagnose-capture-reminder.mjs +112 -0
- package/spexharness/src/gates/directive-obligation-gate.decide.mjs +132 -0
- package/spexharness/src/gates/directive-obligation-gate.mjs +183 -0
- package/spexharness/src/gates/enforce-session-sequence.mjs +895 -0
- package/spexharness/src/gates/enforce-vault-naming.mjs +215 -0
- package/spexharness/src/gates/epic-milestone-phrasing-gate.mjs +233 -0
- package/spexharness/src/gates/git-identity-guard.decide.mjs +436 -0
- package/spexharness/src/gates/git-identity-guard.mjs +61 -0
- package/spexharness/src/gates/git-reflog-audit.mjs +151 -0
- package/spexharness/src/gates/git-stash-gate.decide.mjs +361 -0
- package/spexharness/src/gates/git-stash-gate.mjs +159 -0
- package/spexharness/src/gates/id-display-format-gate.mjs +190 -0
- package/spexharness/src/gates/inject-doctrine-gate.mjs +89 -0
- package/spexharness/src/gates/inject-vault-context.mjs +239 -0
- package/spexharness/src/gates/naughty-list-gate.mjs +213 -0
- package/spexharness/src/gates/plan-review-gate.mjs +233 -0
- package/spexharness/src/gates/preflight-reminder-gate.mjs +265 -0
- package/spexharness/src/gates/research-protocol-gate.mjs +175 -0
- package/spexharness/src/gates/settings-write-gate.decide.mjs +96 -0
- package/spexharness/src/gates/settings-write-gate.mjs +104 -0
- package/spexharness/src/gates/vault-mirror-catchup.mjs +124 -0
- package/spexharness/src/gates/vault-write-tier-guard.decide.mjs +125 -0
- package/spexharness/src/gates/vault-write-tier-guard.mjs +42 -0
- package/spexharness/src/git-reflog-audit.mjs +294 -0
- package/spexharness/src/intent-classifier.mjs +196 -0
- package/spexharness/src/intent-directive.mjs +626 -0
- package/spexharness/src/profile/learn.mjs +551 -0
- package/spexharness/src/profile/proposals.mjs +357 -0
- package/spexharness/src/profile/vault-inclusion.mjs +386 -0
- package/spexharness/src/redact.mjs +151 -0
- package/spexharness/src/rule-table.mjs +849 -0
- package/spexharness/src/seat-context.mjs +122 -0
- package/spexharness/src/session-bootstrap.mjs +512 -0
- package/spexharness/src/session-record.mjs +815 -0
- package/spexharness/src/token-inventory.mjs +207 -0
- package/vendor/heyspex-mcp/account-switch.mjs +96 -0
- package/vendor/heyspex-mcp/alignment-gate.mjs +315 -1
- package/vendor/heyspex-mcp/blocker-resolver.mjs +37 -2
- package/vendor/heyspex-mcp/breakdown-ladder.mjs +119 -4
- package/vendor/heyspex-mcp/breakdown-source.mjs +271 -0
- package/vendor/heyspex-mcp/breakdown-writer.mjs +23 -3
- package/vendor/heyspex-mcp/capture-buffer-patches.mjs +77 -8
- package/vendor/heyspex-mcp/capture-channel.mjs +55 -5
- package/vendor/heyspex-mcp/capture-console-client.mjs +117 -3
- package/vendor/heyspex-mcp/capture-focus.mjs +1061 -31
- package/vendor/heyspex-mcp/capture-outbox.mjs +15 -5
- package/vendor/heyspex-mcp/capture-sources.mjs +195 -0
- package/vendor/heyspex-mcp/capture-tools.mjs +1264 -0
- package/vendor/heyspex-mcp/claim-tools.mjs +1147 -0
- package/vendor/heyspex-mcp/cli-verbs.mjs +2074 -0
- package/vendor/heyspex-mcp/cli.mjs +207 -15524
- package/vendor/heyspex-mcp/close-branch-report.mjs +102 -0
- package/vendor/heyspex-mcp/cloud-tool-surface.mjs +128 -0
- package/vendor/heyspex-mcp/cloud-vault-writes.mjs +602 -0
- package/vendor/heyspex-mcp/config-seed.yaml +15 -0
- package/vendor/heyspex-mcp/config-settings.mjs +290 -7
- package/vendor/heyspex-mcp/console-fetch.mjs +822 -17
- package/vendor/heyspex-mcp/console-transport.mjs +172 -0
- package/vendor/heyspex-mcp/credentials.mjs +585 -0
- package/vendor/heyspex-mcp/defer-spec.mjs +44 -4
- package/vendor/heyspex-mcp/deferred-reclaim.mjs +29 -3
- package/vendor/heyspex-mcp/design-handlers.mjs +31 -0
- package/vendor/heyspex-mcp/design-tools.mjs +4 -1
- package/vendor/heyspex-mcp/dev-factory-bridge.mjs +4 -4
- package/vendor/heyspex-mcp/dev-mode-core.mjs +45 -0
- package/vendor/heyspex-mcp/dev-tools.mjs +131 -0
- package/vendor/heyspex-mcp/diagnose-handlers.mjs +54 -0
- package/vendor/heyspex-mcp/events-tools.mjs +207 -0
- package/vendor/heyspex-mcp/filing-tools.mjs +723 -0
- package/vendor/heyspex-mcp/fleet-handlers.mjs +37 -0
- package/vendor/heyspex-mcp/fleet-queue-tools.mjs +71 -15
- package/vendor/heyspex-mcp/focus-tools.mjs +190 -0
- package/vendor/heyspex-mcp/folder-trust-store.mjs +60 -0
- package/vendor/heyspex-mcp/http-transport.mjs +302 -0
- package/vendor/heyspex-mcp/list-tools.mjs +257 -0
- package/vendor/heyspex-mcp/login-handoff.mjs +15 -1
- package/vendor/heyspex-mcp/mcp-config.mjs +107 -0
- package/vendor/heyspex-mcp/memory-tools.mjs +523 -0
- package/vendor/heyspex-mcp/mvp-mode.mjs +53 -6
- package/vendor/heyspex-mcp/obligation-backstop.mjs +103 -0
- package/vendor/heyspex-mcp/occupied-keys.mjs +142 -0
- package/vendor/heyspex-mcp/on-deck-brief.mjs +3377 -0
- package/vendor/heyspex-mcp/on-deck-scheduler.mjs +1708 -0
- package/vendor/heyspex-mcp/package-root.mjs +32 -0
- package/vendor/heyspex-mcp/peer-presence.mjs +8 -1
- package/vendor/heyspex-mcp/plan-ground.mjs +621 -652
- package/vendor/heyspex-mcp/plan-push.mjs +908 -22
- package/vendor/heyspex-mcp/plan-review.mjs +124 -30
- package/vendor/heyspex-mcp/preflight-gate.mjs +0 -0
- package/vendor/heyspex-mcp/procedure-handlers.mjs +327 -0
- package/vendor/heyspex-mcp/procedure-tools.mjs +1181 -970
- package/vendor/heyspex-mcp/promote-capture.mjs +388 -69
- package/vendor/heyspex-mcp/promote-diagnose.mjs +74 -0
- package/vendor/heyspex-mcp/promote-research-to-diagnose.mjs +9 -2
- package/vendor/heyspex-mcp/promote-research.mjs +666 -53
- package/vendor/heyspex-mcp/promotion-helpers.mjs +251 -0
- package/vendor/heyspex-mcp/prompts.mjs +1460 -0
- package/vendor/heyspex-mcp/read-path.mjs +191 -15
- package/vendor/heyspex-mcp/receipt-shape.mjs +146 -0
- package/vendor/heyspex-mcp/recipe-handlers.mjs +117 -0
- package/vendor/heyspex-mcp/regen-tasks.mjs +210 -3
- package/vendor/heyspex-mcp/register-spec.mjs +266 -54
- package/vendor/heyspex-mcp/request-context.mjs +83 -0
- package/vendor/heyspex-mcp/research-focus.mjs +207 -4
- package/vendor/heyspex-mcp/research-handlers.mjs +625 -0
- package/vendor/heyspex-mcp/research-tools.mjs +4 -4
- package/vendor/heyspex-mcp/response-budget.mjs +348 -0
- package/vendor/heyspex-mcp/review-focus.mjs +25 -1
- package/vendor/heyspex-mcp/roadmap-default.mjs +70 -0
- package/vendor/heyspex-mcp/search-specs.mjs +280 -0
- package/vendor/heyspex-mcp/seat-block-ledger.mjs +113 -0
- package/vendor/heyspex-mcp/seat-identity.mjs +2 -6
- package/vendor/heyspex-mcp/session-owner.mjs +109 -0
- package/vendor/heyspex-mcp/session-tools.mjs +162 -0
- package/vendor/heyspex-mcp/settings-registry.mjs +232 -0
- package/vendor/heyspex-mcp/settings-tools.mjs +85 -12
- package/vendor/heyspex-mcp/spec-edit-tools.mjs +453 -0
- package/vendor/heyspex-mcp/spec-id-lib.mjs +93 -17
- package/vendor/heyspex-mcp/split-research.mjs +304 -56
- package/vendor/heyspex-mcp/stdio-rpc.mjs +22 -0
- package/vendor/heyspex-mcp/submit-for-review.mjs +150 -7
- package/vendor/heyspex-mcp/summary-contract.mjs +105 -0
- package/vendor/heyspex-mcp/summary-write-tools.mjs +228 -0
- package/vendor/heyspex-mcp/symptom-query.mjs +146 -0
- package/vendor/heyspex-mcp/test-helpers.mjs +123 -1
- package/vendor/heyspex-mcp/tool-catalog.mjs +2819 -0
- package/vendor/heyspex-mcp/tool-dispatch.mjs +657 -0
- package/vendor/heyspex-mcp/tool-helpers.mjs +325 -0
- package/vendor/heyspex-mcp/validate-linkage.mjs +414 -27
- package/vendor/heyspex-mcp/vault-io.mjs +720 -0
- package/vendor/heyspex-mcp/vault-less-endpoints.mjs +52 -0
- package/vendor/heyspex-mcp/vault-resolve.mjs +554 -68
- package/vendor/heyspex-mcp/verify-reproduction.mjs +270 -30
- package/vendor/heyspex-mcp/whoami.mjs +92 -0
- package/vendor/heyspex-mcp/write-outbox.mjs +512 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-close branch report
|
|
3
|
+
* ([[HS-PPX7-CWPX-TASK-session-close-names-the-branch-each]], epic
|
|
4
|
+
* [[HS-B8CY-CWPX-EPIC-one-session-one-reviewable-change]] AC5).
|
|
5
|
+
*
|
|
6
|
+
* At close-out, names the branch each half of the session landed on — the
|
|
7
|
+
* CODE half (the checked-out git branch of the session's code repo) and the
|
|
8
|
+
* SPEC half (branches the cloud drain committed this session's specs to, read
|
|
9
|
+
* from `GET /api/source/session-branch`) — and says plainly whether they are
|
|
10
|
+
* the same branch. Pure core (`buildCloseBranchReport`) + a thin gatherer
|
|
11
|
+
* (`gatherCloseBranchReport`) with injected `consoleFetch` / `runGit`.
|
|
12
|
+
*
|
|
13
|
+
* Honesty rule: a half that could not be read is reported UNKNOWN, and an
|
|
14
|
+
* unknown half never yields a "same branch" claim.
|
|
15
|
+
*/
|
|
16
|
+
import { spawnSync } from 'node:child_process';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The written rule for a drain commit that landed on a different branch than
|
|
20
|
+
* the code (mid-session drain while the working tree is on another branch).
|
|
21
|
+
* Mirrored verbatim into the live-proof runbook.
|
|
22
|
+
*/
|
|
23
|
+
export const MID_SESSION_DRAIN_RULE =
|
|
24
|
+
'The cloud drain commits spec files on its own branch without touching your working tree. ' +
|
|
25
|
+
'To join the halves: `git fetch origin <spec-branch>`, then on your code branch run ' +
|
|
26
|
+
'`git merge --no-ff origin/<spec-branch>` (or `git cherry-pick <commit>` for one commit). ' +
|
|
27
|
+
'Never rebase-merge; a dirty working tree is fine because the merge only adds spec files. ' +
|
|
28
|
+
'Next time run `hs source branch declare` before cloud writes so both halves land on one branch.';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param {{ codeBranch: string | null, specBranches: string[] | null, declared?: string | null }} input
|
|
32
|
+
* codeBranch / specBranches are null when that half could not be read.
|
|
33
|
+
* @returns {{ status: 'same'|'differ'|'none'|'unknown', matches: boolean, lines: string[] }}
|
|
34
|
+
*/
|
|
35
|
+
export function buildCloseBranchReport({ codeBranch, specBranches, declared = null }) {
|
|
36
|
+
const lines = [];
|
|
37
|
+
lines.push(`Code branch: ${codeBranch ?? 'unknown (no checked-out branch / git unavailable)'}`);
|
|
38
|
+
if (specBranches === null) {
|
|
39
|
+
lines.push('Spec branch(es): unknown (console unreachable)');
|
|
40
|
+
} else if (specBranches.length === 0) {
|
|
41
|
+
lines.push('Spec branch(es): none — no cloud spec commits this session');
|
|
42
|
+
} else {
|
|
43
|
+
lines.push(`Spec branch(es): ${specBranches.join(', ')}`);
|
|
44
|
+
}
|
|
45
|
+
if (declared) lines.push(`Declared session branch: ${declared}`);
|
|
46
|
+
|
|
47
|
+
if (codeBranch === null || specBranches === null) {
|
|
48
|
+
const which = [codeBranch === null ? 'code' : null, specBranches === null ? 'spec' : null]
|
|
49
|
+
.filter(Boolean)
|
|
50
|
+
.join(' and ');
|
|
51
|
+
lines.push(`Match: unknown — the ${which} half could not be read.`);
|
|
52
|
+
return { status: 'unknown', matches: false, lines };
|
|
53
|
+
}
|
|
54
|
+
if (specBranches.length === 0) {
|
|
55
|
+
lines.push('Match: nothing to compare — the cloud drain made no spec commits for this session.');
|
|
56
|
+
return { status: 'none', matches: false, lines };
|
|
57
|
+
}
|
|
58
|
+
const differing = specBranches.filter((b) => b !== codeBranch);
|
|
59
|
+
if (differing.length === 0) {
|
|
60
|
+
lines.push('Match: yes — same branch, the code and the spec files can be reviewed together.');
|
|
61
|
+
return { status: 'same', matches: true, lines };
|
|
62
|
+
}
|
|
63
|
+
lines.push(`Match: NO — spec commits are on ${differing.join(', ')}, code is on ${codeBranch}.`);
|
|
64
|
+
lines.push(MID_SESSION_DRAIN_RULE);
|
|
65
|
+
return { status: 'differ', matches: false, lines };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function defaultRunGit(args, cwd) {
|
|
69
|
+
return spawnSync('git', args, { cwd, encoding: 'utf8' });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Current checked-out branch of `cwd`, or null. */
|
|
73
|
+
export function readCodeBranch({ cwd = process.cwd(), runGit = defaultRunGit } = {}) {
|
|
74
|
+
try {
|
|
75
|
+
const r = runGit(['rev-parse', '--abbrev-ref', 'HEAD'], cwd);
|
|
76
|
+
const out = String(r?.stdout ?? '').trim();
|
|
77
|
+
if (r?.status !== 0 || !out || out === 'HEAD') return null;
|
|
78
|
+
return out;
|
|
79
|
+
} catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Gather both halves and build the report. Never throws.
|
|
86
|
+
* `consoleFetch(path)` is the MCP's console client (`{ ok, body }`).
|
|
87
|
+
*/
|
|
88
|
+
export async function gatherCloseBranchReport({ consoleFetch, cwd = process.cwd(), runGit } = {}) {
|
|
89
|
+
const codeBranch = readCodeBranch({ cwd, runGit });
|
|
90
|
+
let specBranches = null;
|
|
91
|
+
let declared = null;
|
|
92
|
+
try {
|
|
93
|
+
const res = await consoleFetch('/api/source/session-branch');
|
|
94
|
+
if (res?.ok && Array.isArray(res.body?.drainCommits)) {
|
|
95
|
+
specBranches = [...new Set(res.body.drainCommits.map((c) => c.branch).filter(Boolean))];
|
|
96
|
+
declared = res.body.declaration?.branch ?? null;
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
specBranches = null;
|
|
100
|
+
}
|
|
101
|
+
return buildCloseBranchReport({ codeBranch, specBranches, declared });
|
|
102
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloud-tool-surface.mjs — the tools the REMOTE MCP endpoint serves.
|
|
3
|
+
*
|
|
4
|
+
* `POST /api/mcp` on the console runs `dispatchHeySpexTool` in-process on a
|
|
5
|
+
* shared serverless runtime with NO vault checkout: `vaultRoot` points at a
|
|
6
|
+
* directory that does not exist, there is no git, and `~/.heyspex/*` is the
|
|
7
|
+
* lambda's own (empty) home. Only handlers that do their work through the
|
|
8
|
+
* console HTTP API in the neon read tier are correct there. This module is
|
|
9
|
+
* the explicit allowlist; `tools/list` on the remote endpoint returns exactly
|
|
10
|
+
* these, and `tools/call` on anything else answers "needs the local server".
|
|
11
|
+
*
|
|
12
|
+
* Every entry was verified by reading its handler (audit 2026-09-14, WP6):
|
|
13
|
+
*
|
|
14
|
+
* PURE console-API handlers (no vault disk, no git, no home):
|
|
15
|
+
* recall_memories (memory-tools.mjs neon branch), list_procedures
|
|
16
|
+
* (procedure-handlers.mjs loadCatalogViaTier), handoff_record/load
|
|
17
|
+
* (session-tools.mjs), claim_spec / release_spec / report_progress /
|
|
18
|
+
* record_wip / defer_spec / claim_list / claim_acquire / claim_release
|
|
19
|
+
* (claim-tools.mjs, all postClaimEndpoint/consoleFetch), pin_get / pin_set
|
|
20
|
+
* / get_focus_areas / set_focus_areas (focus-tools.mjs), milestone_show /
|
|
21
|
+
* events_show (events-tools.mjs), list_known_tags (spec-edit-tools.mjs).
|
|
22
|
+
*
|
|
23
|
+
* Console-API handlers whose optional disk touches are read-only or fail
|
|
24
|
+
* open (result still correct, some enrichment degrades):
|
|
25
|
+
* get_procedure (marker write try/catch'd), preflight (marker write →
|
|
26
|
+
* `marker_warning`; recipes readdir guarded → []), submit_for_review
|
|
27
|
+
* (`.heyspex/config.yaml` review grain → default), file_spec (POST
|
|
28
|
+
* /api/specs; landing probe defaults expectTier=cloud in neon),
|
|
29
|
+
* next_on_deck (scheduler cohort + direct spec are tier-split to the
|
|
30
|
+
* console; the synchronous enrichers — plans, amendments, WIP fallback,
|
|
31
|
+
* memory scoring — are existsSync-guarded and silently empty),
|
|
32
|
+
* active_capture (DB-first via the console; disk fallbacks guarded).
|
|
33
|
+
*
|
|
34
|
+
* Deliberately EXCLUDED (disk/git-bound or process-global in a shared runtime):
|
|
35
|
+
* heyspex_update_capture – stashes to `<vaultRoot>/.heyspex/capture-outbox`
|
|
36
|
+
* on transport failure with no try/catch
|
|
37
|
+
* (capture-outbox.mjs) — a lambda outbox is a
|
|
38
|
+
* false "your words will sync" promise.
|
|
39
|
+
* heyspex_validate_linkage – full readdir walk of `<vaultRoot>/specs` (validate-linkage.mjs).
|
|
40
|
+
* heyspex_next_review – `git status`/`git show` via execSync + disk-only queue (next-review.mjs).
|
|
41
|
+
* heyspex_dev_mode – `set` writes `~/.heyspex/dev-mode.json` + credentials.yaml;
|
|
42
|
+
* `get` would report the LAMBDA's mode, not the caller's.
|
|
43
|
+
* heyspex_load_tools – mutates the process-global `loadedToolNames`
|
|
44
|
+
* (tool-catalog.mjs) shared by every tenant in the
|
|
45
|
+
* container; the remote surface is fixed anyway.
|
|
46
|
+
* heyspex_settings_list/get – read `<vaultRoot>/.heyspex/config.yaml` → misleading defaults.
|
|
47
|
+
* heyspex_design_* – read `<vaultRoot>/spex-console/public/design-system/*` and DESIGN.md.
|
|
48
|
+
* heyspex_list_recipes – readdir `<vaultRoot>/specs/recipes`.
|
|
49
|
+
* save_research, push_plan, backfill_epic, promote_*, register_spec,
|
|
50
|
+
* edit_file, record_alignment (git shelling), regen_*, ground_plan,
|
|
51
|
+
* plan_review/plan_qc, canvas_inbox, session_end/hooks_*, dev_server_status,
|
|
52
|
+
* fleet_queue_*, firecrawl/research-plan, import_agent, start_recipe,
|
|
53
|
+
* verify_reproduction, split_research, active/complete_research, pin_capture,
|
|
54
|
+
* suggest_pillar, validate_user_skills, next_resolution, resolve_*,
|
|
55
|
+
* claim_file/release_file_claim, evidence_show/export_events, propose_metadata
|
|
56
|
+
* – vault-disk, git, or local-process bound per
|
|
57
|
+
* the cloud-first audit; not re-verified here.
|
|
58
|
+
*/
|
|
59
|
+
import { TOOLS } from './tool-catalog.mjs';
|
|
60
|
+
|
|
61
|
+
/** Ordered allowlist — order is the order `tools/list` advertises them. */
|
|
62
|
+
export const CLOUD_TOOL_NAMES = Object.freeze([
|
|
63
|
+
// session + procedure discovery
|
|
64
|
+
'heyspex_recall_memories',
|
|
65
|
+
'heyspex_list_procedures',
|
|
66
|
+
'heyspex_get_procedure',
|
|
67
|
+
'heyspex_preflight',
|
|
68
|
+
'heyspex_handoff_load',
|
|
69
|
+
'heyspex_handoff_record',
|
|
70
|
+
// the claim contract
|
|
71
|
+
'heyspex_next_on_deck',
|
|
72
|
+
'heyspex_claim_spec',
|
|
73
|
+
'heyspex_release_spec',
|
|
74
|
+
'heyspex_report_progress',
|
|
75
|
+
'heyspex_submit_for_review',
|
|
76
|
+
'heyspex_record_wip',
|
|
77
|
+
// author_summary_then_claim completion ([[HS-T41O-NZ8S-DIAG]]): in cloud
|
|
78
|
+
// write mode the handler is GET + PUT /api/specs/:id only — no disk. The
|
|
79
|
+
// lambda's own home resolves to prod/cloud, so the local branch never runs.
|
|
80
|
+
'heyspex_author_summary',
|
|
81
|
+
'heyspex_defer_spec',
|
|
82
|
+
'heyspex_claim_list',
|
|
83
|
+
'heyspex_claim_acquire',
|
|
84
|
+
'heyspex_claim_release',
|
|
85
|
+
// filing + read-side context
|
|
86
|
+
'heyspex_file_spec',
|
|
87
|
+
'heyspex_active_capture',
|
|
88
|
+
'heyspex_milestone_show',
|
|
89
|
+
'heyspex_events_show',
|
|
90
|
+
// [[HS-YFLS]] fix 2: the duplicate check before filing. `handleSearchSpecs`
|
|
91
|
+
// is PURE consoleFetch (GET /api/search only) — no vault disk, no git, no
|
|
92
|
+
// home — so it is correct on the shared runtime, and it is exactly the tool a
|
|
93
|
+
// remote agent needs before POST /api/specs.
|
|
94
|
+
'heyspex_search_specs',
|
|
95
|
+
'heyspex_list_known_tags',
|
|
96
|
+
// focus / pin control plane
|
|
97
|
+
'heyspex_pin_get',
|
|
98
|
+
'heyspex_pin_set',
|
|
99
|
+
'heyspex_get_focus_areas',
|
|
100
|
+
'heyspex_set_focus_areas',
|
|
101
|
+
]);
|
|
102
|
+
|
|
103
|
+
const CLOUD_TOOL_NAME_SET = new Set(CLOUD_TOOL_NAMES);
|
|
104
|
+
const CATALOG_BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));
|
|
105
|
+
|
|
106
|
+
/** True when `name` is served by the remote endpoint. */
|
|
107
|
+
export function isCloudSafeTool(name) {
|
|
108
|
+
return CLOUD_TOOL_NAME_SET.has(name);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** True when `name` exists in the full catalog (local server surface). */
|
|
112
|
+
export function isCatalogTool(name) {
|
|
113
|
+
return CATALOG_BY_NAME.has(name);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The catalog entries for the remote surface, in allowlist order. A name the
|
|
118
|
+
* catalog no longer carries is dropped (never a hole in `tools/list`); the
|
|
119
|
+
* unit test asserts the two stay in sync so a drift fails CI, not a client.
|
|
120
|
+
*/
|
|
121
|
+
export function cloudToolSurface() {
|
|
122
|
+
return CLOUD_TOOL_NAMES.map((name) => CATALOG_BY_NAME.get(name)).filter(Boolean);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Allowlisted names missing from the catalog — expected empty; surfaced for the test + doctor. */
|
|
126
|
+
export function cloudSurfaceDrift() {
|
|
127
|
+
return CLOUD_TOOL_NAMES.filter((name) => !CATALOG_BY_NAME.has(name));
|
|
128
|
+
}
|