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.
- package/README.md +21 -0
- package/bin/hs.mjs +931 -98
- 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 +1085 -103
- package/dist/cli/hs-claim.mjs +936 -63
- package/dist/cli/hs-connect.mjs +9786 -1910
- package/dist/cli/hs-defer.mjs +5267 -3053
- package/dist/cli/hs-dev.mjs +564 -0
- package/dist/cli/hs-env.mjs +385 -299
- package/dist/cli/hs-index-rebuild.mjs +7129 -0
- package/dist/cli/hs-index-reconcile.mjs +7852 -0
- package/dist/cli/hs-init.mjs +777 -138
- package/dist/cli/hs-install.mjs +6583 -485
- package/dist/cli/hs-join.mjs +10137 -2368
- package/dist/cli/hs-vault-pull.mjs +4659 -5882
- package/dist/cli/hs-vault.mjs +3793 -1537
- package/dist/cli/hs-workspace.mjs +2550 -524
- 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 +28 -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 +26 -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 +31 -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 +30 -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/mcp-client-config.md +259 -6
- package/package.json +231 -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/bin/launch-mcp.mjs +95 -0
- package/plugins/heyspex/bin/run-hook.mjs +62 -0
- package/plugins/heyspex/hooks/cursor-hooks.json +227 -0
- package/plugins/heyspex/hooks/hooks.json +361 -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 +410 -0
- package/scripts/claude-hooks/_intent-classifier-semantic.mjs +351 -0
- package/scripts/claude-hooks/_run.mjs +120 -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-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 +575 -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/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 +66 -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 +247 -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 +449 -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/wip-checkpoint.mjs +298 -0
- package/scripts/cursor-hooks/manifest.mjs +235 -0
- package/scripts/dev-server-status.mjs +34 -13
- package/scripts/dev-server-stop.mjs +313 -0
- package/scripts/heyspex-mode.mjs +268 -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 +333 -0
- package/scripts/hs-worktree.mjs +201 -0
- package/scripts/install-claude-code-hooks.mjs +270 -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 +197 -60
- package/scripts/lib/customer-kit.mjs +886 -0
- package/scripts/lib/dev-mode.mjs +244 -28
- package/scripts/lib/heyspex-home.mjs +72 -0
- package/scripts/lib/hs-command.mjs +277 -0
- package/scripts/lib/hs-companion-settings.mjs +472 -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 +11 -21
- package/scripts/lib/hs-source-push.mjs +107 -58
- 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/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 +441 -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/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 +274 -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/git-reflog-audit.mjs +294 -0
- package/spexharness/src/intent-classifier.mjs +194 -0
- package/spexharness/src/intent-directive.mjs +541 -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 +819 -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 +95 -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 +46 -5
- package/vendor/heyspex-mcp/capture-channel.mjs +55 -5
- package/vendor/heyspex-mcp/capture-console-client.mjs +80 -1
- package/vendor/heyspex-mcp/capture-focus.mjs +1035 -29
- package/vendor/heyspex-mcp/capture-outbox.mjs +5 -1
- package/vendor/heyspex-mcp/capture-tools.mjs +1219 -0
- package/vendor/heyspex-mcp/claim-tools.mjs +1124 -0
- package/vendor/heyspex-mcp/cli-verbs.mjs +2076 -0
- package/vendor/heyspex-mcp/cli.mjs +201 -15524
- package/vendor/heyspex-mcp/cloud-tool-surface.mjs +128 -0
- package/vendor/heyspex-mcp/cloud-vault-writes.mjs +412 -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 +657 -16
- package/vendor/heyspex-mcp/console-transport.mjs +166 -0
- package/vendor/heyspex-mcp/credentials.mjs +584 -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 +124 -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 +688 -0
- package/vendor/heyspex-mcp/fleet-handlers.mjs +37 -0
- package/vendor/heyspex-mcp/fleet-queue-tools.mjs +69 -14
- package/vendor/heyspex-mcp/focus-tools.mjs +190 -0
- package/vendor/heyspex-mcp/folder-trust-store.mjs +59 -0
- package/vendor/heyspex-mcp/http-transport.mjs +300 -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 +94 -0
- package/vendor/heyspex-mcp/memory-tools.mjs +523 -0
- package/vendor/heyspex-mcp/mvp-mode.mjs +53 -6
- package/vendor/heyspex-mcp/occupied-keys.mjs +141 -0
- package/vendor/heyspex-mcp/on-deck-brief.mjs +3360 -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 +906 -21
- 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 +325 -0
- package/vendor/heyspex-mcp/procedure-tools.mjs +540 -351
- package/vendor/heyspex-mcp/promote-capture.mjs +386 -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 +660 -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 +29 -9
- 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 +59 -0
- package/vendor/heyspex-mcp/research-focus.mjs +207 -4
- package/vendor/heyspex-mcp/research-handlers.mjs +623 -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/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 +108 -0
- package/vendor/heyspex-mcp/session-tools.mjs +152 -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 +446 -0
- package/vendor/heyspex-mcp/spec-id-lib.mjs +93 -17
- package/vendor/heyspex-mcp/split-research.mjs +301 -56
- package/vendor/heyspex-mcp/stdio-rpc.mjs +22 -0
- package/vendor/heyspex-mcp/submit-for-review.mjs +132 -6
- package/vendor/heyspex-mcp/summary-contract.mjs +105 -0
- package/vendor/heyspex-mcp/summary-write-tools.mjs +224 -0
- package/vendor/heyspex-mcp/symptom-query.mjs +146 -0
- package/vendor/heyspex-mcp/test-helpers.mjs +108 -1
- package/vendor/heyspex-mcp/tool-catalog.mjs +2813 -0
- package/vendor/heyspex-mcp/tool-dispatch.mjs +639 -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 +724 -0
- package/vendor/heyspex-mcp/vault-less-endpoints.mjs +52 -0
- package/vendor/heyspex-mcp/vault-resolve.mjs +366 -68
- package/vendor/heyspex-mcp/verify-reproduction.mjs +270 -30
- package/vendor/heyspex-mcp/whoami.mjs +91 -0
|
@@ -13,6 +13,12 @@ points at `node ${CLAUDE_PROJECT_DIR}/vendor/heyspex-mcp/cli.mjs` — a path tha
|
|
|
13
13
|
exists inside a clone of the HeySpex source repository** and is therefore useless to
|
|
14
14
|
anyone who installed the package.
|
|
15
15
|
|
|
16
|
+
**Working from a clone of this repo instead?** `heyspex` is not published on the
|
|
17
|
+
public npm registry yet, so `npm install -g heyspex` below 404s. Skip to
|
|
18
|
+
[§1b — clone + `npm link`](#1b-clone--npm-link-working-from-source), and see
|
|
19
|
+
[Working from a clone](#working-from-a-clone-of-this-repo) below for how to sign in
|
|
20
|
+
once linked.
|
|
21
|
+
|
|
16
22
|
## 1a. Install the package (customers)
|
|
17
23
|
|
|
18
24
|
```sh
|
|
@@ -36,6 +42,16 @@ name, which is unambiguous:
|
|
|
36
42
|
npx --yes --package heyspex heyspex-mcp
|
|
37
43
|
```
|
|
38
44
|
|
|
45
|
+
**What the agent kit injects at session start.** With the kit hooks installed (`hs install` /
|
|
46
|
+
`hs connect`, or the plugin), the `inject-doctrine` SessionStart hook adds the **baseline
|
|
47
|
+
edition of SpexCode Doctrine** to each session: a short list of general working principles
|
|
48
|
+
(verify before claiming done, report what failed, ask before irreversible writes, stay in scope),
|
|
49
|
+
read from `spexharness/doctrine/baseline/SPEXCODE-DOCTRINE.baseline.json` inside the installed
|
|
50
|
+
package. That is all it injects. It does not inject anything about how HeySpex itself is built
|
|
51
|
+
(no dev-server, database, or build-fleet rules), any learned principles from HeySpex's own
|
|
52
|
+
development sessions, or anything read from your repo, and it does not include a SpexCode Profile.
|
|
53
|
+
If the baseline file is missing, the hook injects nothing. Set `HEYSPEX_DOCTRINE_OFF=1` to turn it off.
|
|
54
|
+
|
|
39
55
|
## 1b. Clone + `npm link` (working from source)
|
|
40
56
|
|
|
41
57
|
`npm install` in a clone does **not** put `hs` on your PATH. Nothing does, except
|
|
@@ -153,18 +169,131 @@ heyspex mcp pair <code>
|
|
|
153
169
|
> clone has no `hs` at all. Run `npm run doctor` — its **`hs` on PATH → this
|
|
154
170
|
> checkout** check names the cause.
|
|
155
171
|
|
|
172
|
+
## Working from a clone of this repo
|
|
173
|
+
|
|
174
|
+
`npm install -g heyspex` above needs the package published on the public npm
|
|
175
|
+
registry, and it is not yet — that command 404s today. Until it ships, a machine
|
|
176
|
+
working from a clone of this repo signs in through the repo's own dispatcher instead
|
|
177
|
+
of a global `hs`/`heyspex` command:
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
node bin/hs.mjs login
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Run that from the repo root (or pass an absolute path to `bin/hs.mjs` from any
|
|
184
|
+
folder). It opens the console, mints a pairing code, and writes the token to
|
|
185
|
+
`~/.heyspex/credentials.yaml` — the same file `heyspex login` writes once the package
|
|
186
|
+
is installed globally.
|
|
187
|
+
|
|
188
|
+
**Do not run `hs login` or `npx hs login` on a fresh clone.** Nothing in `npm install`
|
|
189
|
+
links the `hs` binary onto PATH, so a bare `hs login` fails with "command not found."
|
|
190
|
+
`npx hs login` fails worse: `hs` is the name of an unrelated package already on the
|
|
191
|
+
public registry, so `npx hs login` silently installs and runs *that* package instead
|
|
192
|
+
of this repo's — no error, just the wrong tool. `npm run doctor` reports which form of
|
|
193
|
+
the command actually runs on your machine (the `hs command form` check) — trust that
|
|
194
|
+
line over guessing.
|
|
195
|
+
|
|
196
|
+
Linking `hs` globally (`npm link` from the repo root) is available if you want the
|
|
197
|
+
bare `hs` command on this one machine, but it is not required and not the default —
|
|
198
|
+
it points `hs` at whatever branch happens to be checked out, so a machine that
|
|
199
|
+
switches branches often is better served by the dispatcher form above. See
|
|
200
|
+
[[HS-I6HT-EKYU-DIAG-every-message-tells-the-user-to-run-hs]] for why linking isn't the
|
|
201
|
+
shipped fix.
|
|
202
|
+
|
|
156
203
|
## Which vault the server reads
|
|
157
204
|
|
|
158
|
-
Resolution order, highest first
|
|
205
|
+
Resolution order, highest first. The directory the process actually started
|
|
206
|
+
in outranks the machine-wide active pointer: a server started inside one vault
|
|
207
|
+
must never write its bookkeeping into whichever vault another terminal last
|
|
208
|
+
marked active.
|
|
159
209
|
|
|
160
210
|
| # | Source | Notes |
|
|
161
211
|
|---|---|---|
|
|
162
|
-
| 1 | An explicit vault id | `hs vault use <id>` |
|
|
163
|
-
| 2 | `
|
|
164
|
-
| 3 |
|
|
165
|
-
| 4 | `
|
|
166
|
-
| 5 | The working directory |
|
|
212
|
+
| 1 | An explicit vault id | `hs vault use <id>`, or `hs --vault <id> <cmd>` |
|
|
213
|
+
| 2 | `HEYSPEX_VAULT_ROOT` / `HEYSPEX_VAULT_DIR` | the repository root / the `specs/` directory itself; what the config above sets |
|
|
214
|
+
| 3 | A vault or a satellite attachment at or above the working directory | walks up from the working directory; the nearest match wins, and an attachment beats a `heyspex.yaml` / `specs/` marker found at the same or a higher level |
|
|
215
|
+
| 4 | `active_vault_id` in `~/.heyspex/registry.json` | the offline active-vault pointer — reached only when the working directory sits inside no vault at all |
|
|
216
|
+
| 5 | The working directory | last resort, when nothing above matched |
|
|
217
|
+
|
|
218
|
+
Tier 3 is what makes [satellite repos](#satellite-repos-code-here-specs-elsewhere)
|
|
219
|
+
work, and why they do not depend on the active pointer.
|
|
220
|
+
|
|
221
|
+
## Satellite repos: code here, specs elsewhere
|
|
222
|
+
|
|
223
|
+
A **satellite** is a code repo that gets the full agent tooling while its specs
|
|
224
|
+
live in a different, already-registered vault. It owns no `specs/` and no
|
|
225
|
+
`heyspex.yaml` — it is not a vault, it is attached to one. Use it whenever the
|
|
226
|
+
code and the vault are separate checkouts.
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
cd /path/to/your-code-repo
|
|
230
|
+
hs install --attach-vault <vault-id> # `hs vault list` shows the ids
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The target is the repo you are standing in. `--attach-vault` also accepts the
|
|
234
|
+
vault repo's path (absolute or relative) instead of its id.
|
|
235
|
+
|
|
236
|
+
This writes the same MCP manifests and agent contract as a normal install, with
|
|
237
|
+
one difference: `HEYSPEX_VAULT_ROOT` is pinned to the **attached** vault's
|
|
238
|
+
absolute path instead of the client placeholder.
|
|
239
|
+
|
|
240
|
+
```jsonc
|
|
241
|
+
{
|
|
242
|
+
"mcpServers": {
|
|
243
|
+
"heyspex": {
|
|
244
|
+
"type": "stdio",
|
|
245
|
+
"command": "node",
|
|
246
|
+
"args": ["/abs/path/to/heyspex/vendor/heyspex-mcp/cli.mjs"],
|
|
247
|
+
"env": {
|
|
248
|
+
// a normal install writes "${CLAUDE_PROJECT_DIR:-.}" here
|
|
249
|
+
"HEYSPEX_VAULT_ROOT": "/abs/path/to/the-vault-repo"
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
That pin **is** the attachment — there is no marker file, so there is nothing to
|
|
257
|
+
drift. Every surface reads it: the MCP server resolves the vault through it,
|
|
258
|
+
and `hs connect --check`, `hs doctor` and `hs` itself use it to recognize the
|
|
259
|
+
repo as a satellite.
|
|
260
|
+
|
|
261
|
+
### What the tooling does differently
|
|
262
|
+
|
|
263
|
+
- `hs connect --check` reports **Connected (satellite)** and evaluates the four
|
|
264
|
+
vault rows (marker, `specs/`, vault registered, workspace registered) against
|
|
265
|
+
the **attached** vault, plus a `satellite_attachment` row. A satellite never
|
|
266
|
+
reads as "missing heyspex.yaml".
|
|
267
|
+
- `hs connect` (full run) skips every vault-creating step, so it will not
|
|
268
|
+
scaffold a second vault into your code repo. It still installs plugin
|
|
269
|
+
surfaces and git hooks, and it needs no sign-in (it performs no cloud write).
|
|
270
|
+
- `hs doctor` audits the **attached vault**, because `hs` resolves the pin into
|
|
271
|
+
`HS_VAULT_ROOT` before doctor runs. It does not report the satellite's own
|
|
272
|
+
connection rows — use `hs connect --check` in the repo for those.
|
|
273
|
+
|
|
274
|
+
### Rules and refusals
|
|
275
|
+
|
|
276
|
+
Every refusal happens before anything is written.
|
|
167
277
|
|
|
278
|
+
| Situation | Result |
|
|
279
|
+
|---|---|
|
|
280
|
+
| Vault id unknown, or a path with no registry row | exit 11 — register it first with `hs vault register --path <dir>` |
|
|
281
|
+
| The registered vault is missing from this machine | exit 11 |
|
|
282
|
+
| Attaching a vault to itself | exit 11 |
|
|
283
|
+
| A manifest already pins a **different** vault, or carries no pin | exit 11 — re-run with `--force` to re-pin |
|
|
284
|
+
| Both manifests already pin this vault | no-op, exit 0 |
|
|
285
|
+
| `--register-vault` or `--workspace` | exit 1 — a satellite never registers a vault of its own |
|
|
286
|
+
| `--no-cursor --no-claude` | exit 1 — nowhere to record the pin |
|
|
287
|
+
| `--remote` | exit 1 — the cloud endpoint resolves the vault from your **account**, not a local pin, so Claude Code and Cursor could read different vaults with nothing reporting the split |
|
|
288
|
+
|
|
289
|
+
### Known limitation: the attachment does not survive a fresh clone
|
|
290
|
+
|
|
291
|
+
The pin is an absolute, machine-local path, so the manifests carrying it are
|
|
292
|
+
not committed. A teammate cloning a satellite gets a repo with no `specs/`, no
|
|
293
|
+
marker and no pin — indistinguishable from an unwired code repo, and `hs
|
|
294
|
+
connect` there would scaffold a vault into it. `hs connect` prints a
|
|
295
|
+
non-blocking warning when it can recognize the shape, but it cannot always
|
|
296
|
+
tell. Re-run `hs install --attach-vault <id>` after cloning.
|
|
168
297
|
## Which console the server calls
|
|
169
298
|
|
|
170
299
|
Resolution order, highest first:
|
|
@@ -198,3 +327,127 @@ The real check is in the client: after restarting it, the `heyspex_*` tools shou
|
|
|
198
327
|
listed. If they are not, the client did not restart, or the command is not on your
|
|
199
328
|
`PATH` — from a clone run `npm link` (§1b); from an install, try the
|
|
200
329
|
`npx --package heyspex heyspex-mcp` form.
|
|
330
|
+
|
|
331
|
+
## Remote (cloud) MCP — no local server
|
|
332
|
+
|
|
333
|
+
The console also serves MCP directly over HTTPS at `https://app.heyspex.com/api/mcp`
|
|
334
|
+
(MCP Streamable HTTP, JSON-response mode). A customer machine needs no `heyspex-mcp`
|
|
335
|
+
process, no checkout and no `HEYSPEX_VAULT_ROOT` — only a token.
|
|
336
|
+
|
|
337
|
+
### Get a token
|
|
338
|
+
|
|
339
|
+
The endpoint accepts the same `hsmcp_…` bearer the local server uses. Either command
|
|
340
|
+
writes it as `mcp_token:` in `~/.heyspex/credentials.yaml`:
|
|
341
|
+
|
|
342
|
+
```sh
|
|
343
|
+
heyspex login # opens the console, mints a pairing code, redeems it
|
|
344
|
+
heyspex mcp pair <code> # redeem a code minted elsewhere (no browser needed)
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
Read `mcp_token` out of that file (or mint one from the console's MCP pairing page)
|
|
348
|
+
and pass it as `HEYSPEX_MCP_TOKEN` below. Treat it like a password.
|
|
349
|
+
|
|
350
|
+
### Claude Code
|
|
351
|
+
|
|
352
|
+
```sh
|
|
353
|
+
claude mcp add --transport http heyspex https://app.heyspex.com/api/mcp \
|
|
354
|
+
--header "Authorization: Bearer ${HEYSPEX_MCP_TOKEN}"
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
or, project scope, in `.mcp.json`:
|
|
358
|
+
|
|
359
|
+
```json
|
|
360
|
+
{
|
|
361
|
+
"mcpServers": {
|
|
362
|
+
"heyspex": {
|
|
363
|
+
"type": "http",
|
|
364
|
+
"url": "https://app.heyspex.com/api/mcp",
|
|
365
|
+
"headers": {
|
|
366
|
+
"Authorization": "Bearer ${HEYSPEX_MCP_TOKEN}"
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Claude Code expands `${HEYSPEX_MCP_TOKEN}` from your environment at startup, so the
|
|
374
|
+
token never sits in the checked-in file. Any other Streamable-HTTP MCP client works
|
|
375
|
+
the same way: POST JSON-RPC to the URL with that `Authorization` header.
|
|
376
|
+
|
|
377
|
+
### Let the CLI write it
|
|
378
|
+
|
|
379
|
+
Either verb generates exactly the block above — always with the **env reference**,
|
|
380
|
+
never the literal token:
|
|
381
|
+
|
|
382
|
+
```sh
|
|
383
|
+
hs install --remote # full bootstrap; .mcp.json gets the http form
|
|
384
|
+
hs install --remote=https://my-preview.example.dev # a preview deployment
|
|
385
|
+
hs mcp install --remote # print only (no vault bootstrap)
|
|
386
|
+
hs mcp install --remote --write # …and write .mcp.json into the vault root
|
|
387
|
+
hs mcp install --remote --json # { url, mcp_json, claude_command, wrote }
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Both print the equivalent `claude mcp add --transport http …` one-liner. A bare
|
|
391
|
+
origin is normalized (`https://host` → `https://host/api/mcp`). `hs install --remote`
|
|
392
|
+
changes only the Claude Code `.mcp.json`; `.cursor/mcp.json` keeps the stdio form,
|
|
393
|
+
so a project can run local-first in Cursor and cloud in Claude Code.
|
|
394
|
+
|
|
395
|
+
### Transport details
|
|
396
|
+
|
|
397
|
+
- **POST** — JSON-RPC in, one JSON reply out. `initialize` mints an `Mcp-Session-Id`
|
|
398
|
+
that later requests echo back. `initialize`'s `serverInfo.version` reports the
|
|
399
|
+
deployed package version (baked at build time, so it is real, not `0.0.0-unknown`).
|
|
400
|
+
- **GET** with `Accept: text/event-stream` — opens the Streamable-HTTP event stream.
|
|
401
|
+
It is deliberately **silent**: one opening comment, then a `: keepalive` comment
|
|
402
|
+
every 15 s, closed when the client aborts. No server-initiated messages are ever
|
|
403
|
+
sent on it, so a conforming client parses zero messages; it exists so clients that
|
|
404
|
+
open the channel are not met with a 405. A GET without that `Accept` is still 405.
|
|
405
|
+
- **DELETE** — acknowledges a session end with `200` and a small JSON body
|
|
406
|
+
(`{ ok, session_id, note }`). Sessions are stateless, so there is nothing to free.
|
|
407
|
+
|
|
408
|
+
### What it serves, and what it does not
|
|
409
|
+
|
|
410
|
+
The remote endpoint runs the very same tool handlers as the local server, acting as
|
|
411
|
+
the account the token belongs to, but only the **cloud-safe subset** — the tools that
|
|
412
|
+
work entirely through the console API:
|
|
413
|
+
|
|
414
|
+
- session + procedures: `heyspex_recall_memories`, `heyspex_list_procedures`,
|
|
415
|
+
`heyspex_get_procedure`, `heyspex_preflight`, `heyspex_handoff_load`,
|
|
416
|
+
`heyspex_handoff_record`
|
|
417
|
+
- the claim contract: `heyspex_next_on_deck`, `heyspex_claim_spec`,
|
|
418
|
+
`heyspex_release_spec`, `heyspex_report_progress`, `heyspex_submit_for_review`,
|
|
419
|
+
`heyspex_record_wip`, `heyspex_defer_spec`, `heyspex_claim_list`,
|
|
420
|
+
`heyspex_claim_acquire`, `heyspex_claim_release`
|
|
421
|
+
- filing + context: `heyspex_file_spec`, `heyspex_active_capture`,
|
|
422
|
+
`heyspex_milestone_show`, `heyspex_events_show`, `heyspex_list_known_tags`
|
|
423
|
+
- focus / pin: `heyspex_pin_get`, `heyspex_pin_set`, `heyspex_get_focus_areas`,
|
|
424
|
+
`heyspex_set_focus_areas`
|
|
425
|
+
|
|
426
|
+
The authoritative list is `vendor/heyspex-mcp/cloud-tool-surface.mjs`. Calling any
|
|
427
|
+
other `heyspex_*` tool returns a JSON-RPC error saying it needs the local server —
|
|
428
|
+
those tools read or write the vault checkout on disk (research capture and
|
|
429
|
+
promotion, `push_plan`, `backfill_epic`, spec edits, alignment recording, the design
|
|
430
|
+
system, `dev_mode` switching, `update_capture`'s offline outbox). Keep the local
|
|
431
|
+
stdio server for those; the two can be registered side by side under different names.
|
|
432
|
+
|
|
433
|
+
Current limitations:
|
|
434
|
+
|
|
435
|
+
- **No server-initiated messages.** POST always answers with JSON (never an SSE
|
|
436
|
+
body), and the GET stream carries only keepalive comments — no notifications, no
|
|
437
|
+
progress, no server-side requests, no sampling/elicitation.
|
|
438
|
+
- **Stateless sessions.** `initialize` returns an `Mcp-Session-Id`; later calls echo it
|
|
439
|
+
and `DELETE` acknowledges it, but nothing is kept server-side, so there is no
|
|
440
|
+
`heyspex_load_tools` progressive surface (the list above is the whole list) and the
|
|
441
|
+
local server's PreToolUse/PostToolUse hooks and on-disk preflight proof-of-use gate
|
|
442
|
+
do not run remotely.
|
|
443
|
+
- **Enrichment degrades.** `heyspex_next_on_deck`'s core brief (scheduler cohort,
|
|
444
|
+
the spec itself, its task graph) is served from the cloud, and so is the previous
|
|
445
|
+
session's WIP block when the hand-off landed in the Neon `wip_ledger`. Extras the
|
|
446
|
+
local server reads from the checkout — plan amendments, memory scoring, the
|
|
447
|
+
file-based `.heyspex/wip-state.json` fallback — stay empty on the remote path,
|
|
448
|
+
because a serverless runtime has no vault checkout to read them from.
|
|
449
|
+
- **`heyspex_file_spec`'s landing probe reports the cloud verdict only.** It cannot
|
|
450
|
+
stat a local file (there is none), so `local_file_exists` is `null` and the verdict
|
|
451
|
+
rests on the console's own write response.
|
|
452
|
+
- **Cursor is stdio-only here.** `hs install --remote` rewrites the Claude Code
|
|
453
|
+
`.mcp.json`; point Cursor at the same URL by hand if you want it cloud-backed.
|