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,183 @@
|
|
|
1
|
+
// spexharness/src/gates/directive-obligation-gate.mjs
|
|
2
|
+
//
|
|
3
|
+
// [[HS-20SW-DRSM-DIAG-heyspex-capture-on-idea-and-workflow]]. The capture_on_idea directive is advisory
|
|
4
|
+
// text; nothing recorded "a directive was issued and still owes a capture", so a model that skipped the
|
|
5
|
+
// capture met no gate (every capture gate keys on a capture that exists). This gate turns that unmet
|
|
6
|
+
// obligation into a deny. State: `.heyspex/directive-obligations.json` (../../../scripts/lib/directive-obligations.mjs),
|
|
7
|
+
// ARMED by the UserPromptSubmit verbatim stage (scripts/lib/capture-verbatim-append.mjs).
|
|
8
|
+
//
|
|
9
|
+
// ONE hook script, THREE Claude Code events (the coo-guard-gate / git-reflog-audit multi-event form):
|
|
10
|
+
// PreToolUse (before_tool) Agent|Task|Edit|Write|MultiEdit|NotebookEdit|Bash|PowerShell
|
|
11
|
+
// rule 1 `directive-obligation`: deny a sub-agent spawn, a product-code write and a build / product-write
|
|
12
|
+
// shell command while THIS session has an unsatisfied, unwaived, unexpired capture obligation.
|
|
13
|
+
// rule 2 `claim-before-build`: deny a build sub-agent spawn or a product-code Edit/Write when the session
|
|
14
|
+
// has no claimed spec, no on-deck capture and no waiver - independent of the plan-exit marker
|
|
15
|
+
// (claim-before-code-gate) and of CLAUDE_AGENT.
|
|
16
|
+
// PostToolUse (after_tool) discharges the obligation on heyspex_update_capture / heyspex_promote_capture* /
|
|
17
|
+
// heyspex_file_spec / the hs-capture Skill (suffix match: bare and mcp__*__ spellings), and tracks
|
|
18
|
+
// heyspex_claim_spec / release_spec for rule 2. Never denies.
|
|
19
|
+
// Stop (stop) blocks ONCE with a re-drive reason while the obligation is unmet, stamps
|
|
20
|
+
// `stop_blocked_at`, then never loops (and honours stop_hook_active).
|
|
21
|
+
//
|
|
22
|
+
// Always allowed: Read / Grep / Glob, git, test runs, writes under the vault container / vault root / .heyspex /
|
|
23
|
+
// .claude, and every heyspex_* MCP call.
|
|
24
|
+
//
|
|
25
|
+
// Event mapping: PreToolUse -> before_tool (tool_name -> toolName, tool_input -> toolInput); PostToolUse ->
|
|
26
|
+
// after_tool (+ tool_response -> toolResult); Stop -> stop. Decision mapping: deny -> permissionDecision deny
|
|
27
|
+
// (before_tool) or { decision: "block", reason } (stop); everything else allow. No `rewrite`/`ask` rung: a
|
|
28
|
+
// directive that can be ignored is exactly the failure this gate exists to remove.
|
|
29
|
+
//
|
|
30
|
+
// FAIL OPEN: no session id, an unreadable / foreign-session state file, any thrown error -> allow.
|
|
31
|
+
// Kill switches: env HEYSPEX_DIRECTIVE_OBLIGATION_GATE_OFF=1; config agent_behaviors.directive_obligation_gate.enabled
|
|
32
|
+
// (false = off; read from the VAULT root, PORTING.md section 3); config agent_behaviors.directive_obligation_gate.claim_before_build.enabled: false
|
|
33
|
+
// turns off rule 2 only. HEYSPEX_MODE=off mutes it (this gate is NOT always-on; scripts/claude-hooks/_run.mjs also skips it).
|
|
34
|
+
//
|
|
35
|
+
// GitHub Copilot (owner scope change 2026-10-16: must be Copilot-compatible, [[HS-0GBS-CTF8-RES-copilot-plugin-parity-with-the-spexcode]]):
|
|
36
|
+
// every decision lives in ./directive-obligation-gate.decide.mjs over a harness-agnostic shape (toolName, toolInput,
|
|
37
|
+
// sessionId, cwd); this module never builds a Claude `hookSpecificOutput` (the adapter shapes output); ANY missing or
|
|
38
|
+
// malformed field fails OPEN. The Copilot adapter + hook rows follow once the Copilot hook contract is pinned.
|
|
39
|
+
// Cursor: scripts/cursor-hooks/manifest.mjs.
|
|
40
|
+
//
|
|
41
|
+
// `ctx` (all optional): env, cwd (project root for the state files; default CLAUDE_PROJECT_DIR, else this checkout),
|
|
42
|
+
// configRoot, vaultRoot, sessionId, now, configEnabled (false = off), claimRuleEnabled (false = rule 2 off).
|
|
43
|
+
|
|
44
|
+
import path from 'node:path';
|
|
45
|
+
import { fileURLToPath } from 'node:url';
|
|
46
|
+
|
|
47
|
+
import { defaultConfigRoot } from '../config-root.mjs';
|
|
48
|
+
import { hasFreshNoClaimSignal } from '../../../scripts/claude-hooks/claim-liveness-shared.mjs';
|
|
49
|
+
import { isConfigKeyEnabled } from '../../../scripts/claude-hooks/_guardrail-loader.mjs';
|
|
50
|
+
import {
|
|
51
|
+
CLAIM_RULE_CONFIG_KEY,
|
|
52
|
+
GATE_CONFIG_KEY,
|
|
53
|
+
GATE_OFF_ENV,
|
|
54
|
+
hasRoadToCode,
|
|
55
|
+
sessionHoldsClaimOnDisk,
|
|
56
|
+
isClaimAcquireTool,
|
|
57
|
+
isClaimReleaseTool,
|
|
58
|
+
isSatisfyingTool,
|
|
59
|
+
markStopBlocked,
|
|
60
|
+
outstanding,
|
|
61
|
+
readObligations,
|
|
62
|
+
satisfyAll,
|
|
63
|
+
toolResultFailed,
|
|
64
|
+
trackClaim,
|
|
65
|
+
} from '../../../scripts/lib/directive-obligations.mjs';
|
|
66
|
+
import { classifyToolCall, decideClaimBeforeBuild, decideObligation, stopReason } from './directive-obligation-gate.decide.mjs';
|
|
67
|
+
|
|
68
|
+
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
69
|
+
|
|
70
|
+
export const id = 'directive-obligation-gate';
|
|
71
|
+
export const event = 'before_tool';
|
|
72
|
+
export const severity = 'block';
|
|
73
|
+
|
|
74
|
+
function projectRoot(ctx) {
|
|
75
|
+
if (ctx.cwd) return ctx.cwd;
|
|
76
|
+
const fromEnv = process.env.CLAUDE_PROJECT_DIR?.trim();
|
|
77
|
+
if (fromEnv) return fromEnv.replace(/[\\/]+$/, '');
|
|
78
|
+
// Installed from npm (node_modules/heyspex) with no CLAUDE_PROJECT_DIR (GitHub Copilot sets none): this
|
|
79
|
+
// checkout is the PACKAGE, not the project. The hook process runs with cwd = the repo.
|
|
80
|
+
if (/[\\/]node_modules[\\/]/.test(REPO_ROOT + path.sep)) return process.cwd();
|
|
81
|
+
return REPO_ROOT;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function enabled(ctx, key, override) {
|
|
85
|
+
if (override === false) return false;
|
|
86
|
+
try {
|
|
87
|
+
const configRoot = ctx.configRoot ?? (ctx.cwd ? ctx.cwd : defaultConfigRoot());
|
|
88
|
+
return isConfigKeyEnabled(key, configRoot);
|
|
89
|
+
} catch {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function claimedSpecId(toolInput) {
|
|
95
|
+
const v = toolInput?.spec_id ?? toolInput?.specId ?? toolInput?.id;
|
|
96
|
+
return typeof v === 'string' && v.trim() ? v.trim() : '*';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Rule 2 denies only on POSITIVE evidence of no claim (a fresh `noClaimUntil` heartbeat for this session).
|
|
101
|
+
* When a gated call is let through only because that evidence is absent (missing / stale cache, cloud claims),
|
|
102
|
+
* say so on stderr so the fail-open is visible. Never throws.
|
|
103
|
+
*/
|
|
104
|
+
function noteFailOpen(call, { root, sessionId, vaultRoot, env, stderr }) {
|
|
105
|
+
try {
|
|
106
|
+
const kind = classifyToolCall(call, { cwd: root, vaultRoot }).kind;
|
|
107
|
+
if (kind !== 'spawn' && kind !== 'code_write') return;
|
|
108
|
+
if (hasFreshNoClaimSignal(sessionId, root) || sessionHoldsClaimOnDisk(root, sessionId, env)) return;
|
|
109
|
+
(stderr ?? ((m) => process.stderr.write(m)))('HEYSPEX claim-before-build: claim liveness unconfirmed for this session; failing open (allow).\n');
|
|
110
|
+
} catch {
|
|
111
|
+
/* never throw */
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @param {{ point?: string, toolName?: string, toolInput?: object, toolResult?: object, sessionId?: string, stopHookActive?: boolean }} evt
|
|
117
|
+
* @param {object} [ctx]
|
|
118
|
+
* @returns {{ decision: 'allow'|'deny', reason?: string, rule?: string }}
|
|
119
|
+
*/
|
|
120
|
+
export function run(evt, ctx = {}) {
|
|
121
|
+
try {
|
|
122
|
+
const env = ctx.env ?? process.env;
|
|
123
|
+
if (String(env[GATE_OFF_ENV] ?? '') === '1') return { decision: 'allow' };
|
|
124
|
+
if (String(env.HEYSPEX_MODE ?? '').trim().toLowerCase() === 'off') return { decision: 'allow' };
|
|
125
|
+
const sessionId = String(evt?.sessionId ?? ctx.sessionId ?? '').trim();
|
|
126
|
+
if (!sessionId) return { decision: 'allow' };
|
|
127
|
+
if (!enabled(ctx, GATE_CONFIG_KEY, ctx.configEnabled)) return { decision: 'allow' };
|
|
128
|
+
|
|
129
|
+
const root = projectRoot(ctx);
|
|
130
|
+
const now = ctx.now ?? Date.now();
|
|
131
|
+
const point = evt?.point;
|
|
132
|
+
|
|
133
|
+
if (point === 'after_tool') {
|
|
134
|
+
const name = String(evt?.toolName ?? '');
|
|
135
|
+
if (isSatisfyingTool(name, evt?.toolInput) && !toolResultFailed(evt?.toolResult)) {
|
|
136
|
+
satisfyAll({ root, sessionId, now });
|
|
137
|
+
} else if (isClaimAcquireTool(name) && !toolResultFailed(evt?.toolResult)) {
|
|
138
|
+
trackClaim({ root, sessionId, specId: claimedSpecId(evt?.toolInput) });
|
|
139
|
+
} else if (isClaimReleaseTool(name) && !toolResultFailed(evt?.toolResult)) {
|
|
140
|
+
trackClaim({ root, sessionId, specId: claimedSpecId(evt?.toolInput), release: true });
|
|
141
|
+
}
|
|
142
|
+
return { decision: 'allow' };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const state = readObligations(root, sessionId);
|
|
146
|
+
const open = outstanding(state, sessionId, now);
|
|
147
|
+
|
|
148
|
+
if (point === 'stop') {
|
|
149
|
+
if (evt?.stopHookActive === true) return { decision: 'allow' };
|
|
150
|
+
const unspent = open.filter((o) => !o.stop_blocked_at);
|
|
151
|
+
if (!unspent.length) return { decision: 'allow' };
|
|
152
|
+
markStopBlocked({ root, sessionId, now });
|
|
153
|
+
return { decision: 'deny', rule: 'directive-obligation', reason: stopReason(unspent.length) };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (point !== 'before_tool') return { decision: 'allow' };
|
|
157
|
+
|
|
158
|
+
const call = { toolName: evt?.toolName, toolInput: evt?.toolInput ?? {} };
|
|
159
|
+
const vaultRoot = ctx.vaultRoot ?? defaultConfigRoot();
|
|
160
|
+
|
|
161
|
+
const v1 = decideObligation(call, { outstandingCount: open.length, cwd: root, vaultRoot });
|
|
162
|
+
if (v1.deny) return { decision: 'deny', reason: v1.reason, rule: v1.rule };
|
|
163
|
+
|
|
164
|
+
if (enabled(ctx, CLAIM_RULE_CONFIG_KEY, ctx.claimRuleEnabled)) {
|
|
165
|
+
const road = hasRoadToCode({ root, sessionId, state, now, env });
|
|
166
|
+
const v2 = decideClaimBeforeBuild(call, { hasRoadToCode: road, cwd: root, vaultRoot });
|
|
167
|
+
if (v2.deny) return { decision: 'deny', reason: v2.reason, rule: v2.rule };
|
|
168
|
+
if (road && !state?.claims?.length && !state?.captured_at) noteFailOpen(call, { root, sessionId, vaultRoot, env, stderr: ctx.stderr });
|
|
169
|
+
}
|
|
170
|
+
return { decision: 'allow' };
|
|
171
|
+
} catch {
|
|
172
|
+
return { decision: 'allow' }; // fail open
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export const beforeToolGate = { id: 'directive-obligation-before-tool', event: 'before_tool', severity: 'block', run };
|
|
177
|
+
export const afterToolGate = { id: 'directive-obligation-after-tool', event: 'after_tool', severity: 'warn', run };
|
|
178
|
+
export const stopGate = { id: 'directive-obligation-stop', event: 'stop', severity: 'block', run };
|
|
179
|
+
|
|
180
|
+
/** The multi-event form the Claude Code shell hands the adapter (registry.mjs registers the three rungs above). */
|
|
181
|
+
export const hookGate = { id, event: ['before_tool', 'after_tool', 'stop'], severity, run };
|
|
182
|
+
|
|
183
|
+
export default { id, event, severity, run, beforeToolGate, afterToolGate, stopGate, hookGate };
|