@specship/specship-darwin-arm64 0.28.0 → 0.30.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/bin/specship +1 -1
- package/lib/dist/.claude-plugin/plugin.json +15 -3
- package/lib/dist/activation/cheatsheet.d.ts +10 -7
- package/lib/dist/activation/cheatsheet.d.ts.map +1 -1
- package/lib/dist/activation/cheatsheet.js +21 -5
- package/lib/dist/activation/cheatsheet.js.map +1 -1
- package/lib/dist/activation/hook-output.d.ts +75 -2
- package/lib/dist/activation/hook-output.d.ts.map +1 -1
- package/lib/dist/activation/hook-output.js +114 -3
- package/lib/dist/activation/hook-output.js.map +1 -1
- package/lib/dist/activation/search-intercept.d.ts +20 -7
- package/lib/dist/activation/search-intercept.d.ts.map +1 -1
- package/lib/dist/activation/search-intercept.js +27 -5
- package/lib/dist/activation/search-intercept.js.map +1 -1
- package/lib/dist/activation/steering.d.ts +7 -4
- package/lib/dist/activation/steering.d.ts.map +1 -1
- package/lib/dist/activation/steering.js +10 -8
- package/lib/dist/activation/steering.js.map +1 -1
- package/lib/dist/agents/detect.d.ts +32 -0
- package/lib/dist/agents/detect.d.ts.map +1 -0
- package/lib/dist/agents/detect.js +54 -0
- package/lib/dist/agents/detect.js.map +1 -0
- package/lib/dist/agents/recent-project.d.ts +18 -0
- package/lib/dist/agents/recent-project.d.ts.map +1 -0
- package/lib/dist/agents/recent-project.js +92 -0
- package/lib/dist/agents/recent-project.js.map +1 -0
- package/lib/dist/analytics/canonical-tools.d.ts +23 -0
- package/lib/dist/analytics/canonical-tools.d.ts.map +1 -0
- package/lib/dist/analytics/canonical-tools.js +36 -0
- package/lib/dist/analytics/canonical-tools.js.map +1 -0
- package/lib/dist/analytics/canonical-tools.json +16 -0
- package/lib/dist/analytics/specship-impact.d.ts +3 -2
- package/lib/dist/analytics/specship-impact.d.ts.map +1 -1
- package/lib/dist/analytics/specship-impact.js +6 -4
- package/lib/dist/analytics/specship-impact.js.map +1 -1
- package/lib/dist/bin/specship.js +252 -170
- package/lib/dist/bin/specship.js.map +1 -1
- package/lib/dist/bin/uninstall.js +2 -2
- package/lib/dist/bin/uninstall.js.map +1 -1
- package/lib/dist/claudemd/audit.d.ts +12 -3
- package/lib/dist/claudemd/audit.d.ts.map +1 -1
- package/lib/dist/claudemd/audit.js +65 -22
- package/lib/dist/claudemd/audit.js.map +1 -1
- package/lib/dist/commands/specship/spec.md +16 -1
- package/lib/dist/db/migrations.d.ts +1 -1
- package/lib/dist/db/migrations.d.ts.map +1 -1
- package/lib/dist/db/migrations.js +18 -4
- package/lib/dist/db/migrations.js.map +1 -1
- package/lib/dist/db/schema.sql +8 -0
- package/lib/dist/db/spec-queries.d.ts +13 -1
- package/lib/dist/db/spec-queries.d.ts.map +1 -1
- package/lib/dist/db/spec-queries.js +21 -0
- package/lib/dist/db/spec-queries.js.map +1 -1
- package/lib/dist/design-md/check.d.ts +51 -0
- package/lib/dist/design-md/check.d.ts.map +1 -0
- package/lib/dist/design-md/check.js +335 -0
- package/lib/dist/design-md/check.js.map +1 -0
- package/lib/dist/design-md/css.d.ts +40 -0
- package/lib/dist/design-md/css.d.ts.map +1 -0
- package/lib/dist/design-md/css.js +224 -0
- package/lib/dist/design-md/css.js.map +1 -0
- package/lib/dist/design-md/extract.d.ts +84 -0
- package/lib/dist/design-md/extract.d.ts.map +1 -0
- package/lib/dist/design-md/extract.js +595 -0
- package/lib/dist/design-md/extract.js.map +1 -0
- package/lib/dist/design-md/maintain.d.ts +45 -0
- package/lib/dist/design-md/maintain.d.ts.map +1 -0
- package/lib/dist/design-md/maintain.js +127 -0
- package/lib/dist/design-md/maintain.js.map +1 -0
- package/lib/dist/design-md/render.d.ts +28 -0
- package/lib/dist/design-md/render.d.ts.map +1 -0
- package/lib/dist/design-md/render.js +178 -0
- package/lib/dist/design-md/render.js.map +1 -0
- package/lib/dist/design-md/upkeep.d.ts +48 -0
- package/lib/dist/design-md/upkeep.d.ts.map +1 -0
- package/lib/dist/design-md/upkeep.js +169 -0
- package/lib/dist/design-md/upkeep.js.map +1 -0
- package/lib/dist/design-md/verify.d.ts +65 -0
- package/lib/dist/design-md/verify.d.ts.map +1 -0
- package/lib/dist/design-md/verify.js +311 -0
- package/lib/dist/design-md/verify.js.map +1 -0
- package/lib/dist/enforce/changed-files.d.ts +7 -0
- package/lib/dist/enforce/changed-files.d.ts.map +1 -1
- package/lib/dist/enforce/changed-files.js +17 -0
- package/lib/dist/enforce/changed-files.js.map +1 -1
- package/lib/dist/enforce/enforce.d.ts +35 -1
- package/lib/dist/enforce/enforce.d.ts.map +1 -1
- package/lib/dist/enforce/enforce.js +66 -2
- package/lib/dist/enforce/enforce.js.map +1 -1
- package/lib/dist/extraction/index.d.ts +50 -4
- package/lib/dist/extraction/index.d.ts.map +1 -1
- package/lib/dist/extraction/index.js +105 -13
- package/lib/dist/extraction/index.js.map +1 -1
- package/lib/dist/extraction/parse-warnings.d.ts +16 -0
- package/lib/dist/extraction/parse-warnings.d.ts.map +1 -0
- package/lib/dist/extraction/parse-warnings.js +30 -0
- package/lib/dist/extraction/parse-warnings.js.map +1 -0
- package/lib/dist/extraction/tree-sitter.d.ts +27 -0
- package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/lib/dist/extraction/tree-sitter.js +168 -1
- package/lib/dist/extraction/tree-sitter.js.map +1 -1
- package/lib/dist/health/smoke-check.js +1 -1
- package/lib/dist/health/smoke-check.js.map +1 -1
- package/lib/dist/hooks/hooks.json +16 -1
- package/lib/dist/index.d.ts +63 -3
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +235 -9
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/agent-record.d.ts +80 -0
- package/lib/dist/installer/agent-record.d.ts.map +1 -0
- package/lib/dist/installer/agent-record.js +351 -0
- package/lib/dist/installer/agent-record.js.map +1 -0
- package/lib/dist/installer/auto-migrate.d.ts +56 -0
- package/lib/dist/installer/auto-migrate.d.ts.map +1 -0
- package/lib/dist/installer/auto-migrate.js +328 -0
- package/lib/dist/installer/auto-migrate.js.map +1 -0
- package/lib/dist/installer/index.d.ts +37 -8
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +156 -46
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/installer/install-defaults.d.ts +4 -3
- package/lib/dist/installer/install-defaults.d.ts.map +1 -1
- package/lib/dist/installer/install-defaults.js +6 -5
- package/lib/dist/installer/install-defaults.js.map +1 -1
- package/lib/dist/installer/{config-writer.d.ts → targets/claude-config-writer.d.ts} +1 -1
- package/lib/dist/installer/targets/claude-config-writer.d.ts.map +1 -0
- package/lib/dist/installer/{config-writer.js → targets/claude-config-writer.js} +7 -6
- package/lib/dist/installer/targets/claude-config-writer.js.map +1 -0
- package/lib/dist/installer/targets/claude-projects.d.ts +9 -0
- package/lib/dist/installer/targets/claude-projects.d.ts.map +1 -0
- package/lib/dist/installer/targets/claude-projects.js +151 -0
- package/lib/dist/installer/targets/claude-projects.js.map +1 -0
- package/lib/dist/installer/targets/claude.d.ts +29 -2
- package/lib/dist/installer/targets/claude.d.ts.map +1 -1
- package/lib/dist/installer/targets/claude.js +44 -20
- package/lib/dist/installer/targets/claude.js.map +1 -1
- package/lib/dist/installer/targets/feature-parity.d.ts +28 -0
- package/lib/dist/installer/targets/feature-parity.d.ts.map +1 -0
- package/lib/dist/installer/targets/feature-parity.js +32 -0
- package/lib/dist/installer/targets/feature-parity.js.map +1 -0
- package/lib/dist/installer/{gemini-commands.d.ts → targets/gemini-commands.d.ts} +7 -3
- package/lib/dist/installer/targets/gemini-commands.d.ts.map +1 -0
- package/lib/dist/installer/{gemini-commands.js → targets/gemini-commands.js} +37 -9
- package/lib/dist/installer/targets/gemini-commands.js.map +1 -0
- package/lib/dist/installer/targets/gemini-projects.d.ts +11 -0
- package/lib/dist/installer/targets/gemini-projects.d.ts.map +1 -0
- package/lib/dist/installer/targets/gemini-projects.js +84 -0
- package/lib/dist/installer/targets/gemini-projects.js.map +1 -0
- package/lib/dist/installer/targets/gemini.d.ts +94 -8
- package/lib/dist/installer/targets/gemini.d.ts.map +1 -1
- package/lib/dist/installer/targets/gemini.js +392 -33
- package/lib/dist/installer/targets/gemini.js.map +1 -1
- package/lib/dist/installer/targets/registry.d.ts +8 -1
- package/lib/dist/installer/targets/registry.d.ts.map +1 -1
- package/lib/dist/installer/targets/registry.js +14 -5
- package/lib/dist/installer/targets/registry.js.map +1 -1
- package/lib/dist/installer/targets/shared.d.ts +44 -1
- package/lib/dist/installer/targets/shared.d.ts.map +1 -1
- package/lib/dist/installer/targets/shared.js +130 -3
- package/lib/dist/installer/targets/shared.js.map +1 -1
- package/lib/dist/installer/targets/types.d.ts +23 -1
- package/lib/dist/installer/targets/types.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.d.ts +22 -2
- package/lib/dist/jira/auto-publish.d.ts.map +1 -1
- package/lib/dist/jira/auto-publish.js +54 -9
- package/lib/dist/jira/auto-publish.js.map +1 -1
- package/lib/dist/jira/board-first.d.ts +15 -2
- package/lib/dist/jira/board-first.d.ts.map +1 -1
- package/lib/dist/jira/board-first.js +16 -0
- package/lib/dist/jira/board-first.js.map +1 -1
- package/lib/dist/jira/ci-publish.d.ts +72 -0
- package/lib/dist/jira/ci-publish.d.ts.map +1 -0
- package/lib/dist/jira/ci-publish.js +162 -0
- package/lib/dist/jira/ci-publish.js.map +1 -0
- package/lib/dist/jira/publish.d.ts +23 -0
- package/lib/dist/jira/publish.d.ts.map +1 -1
- package/lib/dist/jira/publish.js +0 -0
- package/lib/dist/jira/publish.js.map +1 -1
- package/lib/dist/jira/regression-pack.d.ts.map +1 -1
- package/lib/dist/jira/regression-pack.js +7 -1
- package/lib/dist/jira/regression-pack.js.map +1 -1
- package/lib/dist/jira/repo-config.d.ts.map +1 -1
- package/lib/dist/jira/repo-config.js +8 -0
- package/lib/dist/jira/repo-config.js.map +1 -1
- package/lib/dist/jira/types.d.ts +8 -0
- package/lib/dist/jira/types.d.ts.map +1 -1
- package/lib/dist/jira/types.js.map +1 -1
- package/lib/dist/knowledge/enforce.d.ts.map +1 -1
- package/lib/dist/knowledge/enforce.js +6 -1
- package/lib/dist/knowledge/enforce.js.map +1 -1
- package/lib/dist/mcp/jira-tools.d.ts +5 -0
- package/lib/dist/mcp/jira-tools.d.ts.map +1 -1
- package/lib/dist/mcp/jira-tools.js +59 -4
- package/lib/dist/mcp/jira-tools.js.map +1 -1
- package/lib/dist/mcp/proxy.d.ts.map +1 -1
- package/lib/dist/mcp/proxy.js +2 -1
- package/lib/dist/mcp/proxy.js.map +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +16 -10
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +69 -20
- package/lib/dist/mcp/server-instructions.js.map +1 -1
- package/lib/dist/mcp/session.d.ts +11 -0
- package/lib/dist/mcp/session.d.ts.map +1 -1
- package/lib/dist/mcp/session.js +43 -1
- package/lib/dist/mcp/session.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +8 -0
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/reflect/apply.d.ts +2 -2
- package/lib/dist/reflect/apply.d.ts.map +1 -1
- package/lib/dist/reflect/apply.js +6 -5
- package/lib/dist/reflect/apply.js.map +1 -1
- package/lib/dist/reflect/miner.d.ts.map +1 -1
- package/lib/dist/reflect/miner.js +28 -15
- package/lib/dist/reflect/miner.js.map +1 -1
- package/lib/dist/reflect/session-outcomes.d.ts.map +1 -1
- package/lib/dist/reflect/session-outcomes.js +8 -3
- package/lib/dist/reflect/session-outcomes.js.map +1 -1
- package/lib/dist/reflect/targets.d.ts.map +1 -1
- package/lib/dist/reflect/targets.js +25 -5
- package/lib/dist/reflect/targets.js.map +1 -1
- package/lib/dist/reflect/types.d.ts +7 -0
- package/lib/dist/reflect/types.d.ts.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.d.ts +14 -2
- package/lib/dist/resolution/spec-link-resolver.d.ts.map +1 -1
- package/lib/dist/resolution/spec-link-resolver.js +13 -3
- package/lib/dist/resolution/spec-link-resolver.js.map +1 -1
- package/lib/dist/server/canonical-tools.js +50 -0
- package/lib/dist/server/cli.js +2 -2
- package/lib/dist/server/host-profiles.js +39 -0
- package/lib/dist/server/ingest/index.js +2 -1
- package/lib/dist/server/ingest/ingestor.js +195 -76
- package/lib/dist/server/ingest/project-paths.js +8 -2
- package/lib/dist/server/ingest/recorded-projects.js +43 -0
- package/lib/dist/server/ingest/specship-classify.js +7 -2
- package/lib/dist/server/ingest/transcripts/claude-jsonl.js +54 -0
- package/lib/dist/server/ingest/transcripts/claude.js +64 -0
- package/lib/dist/server/ingest/transcripts/gemini.js +469 -0
- package/lib/dist/server/ingest/transcripts/index.js +14 -0
- package/lib/dist/server/ingest/{parser.js → transcripts/shared.js} +3 -49
- package/lib/dist/server/ingest/transcripts/types.js +4 -0
- package/lib/dist/server/ingest/watcher.js +31 -30
- package/lib/dist/server/routes/claude.js +27 -10
- package/lib/dist/server/routes/graph.js +64 -3
- package/lib/dist/server/routes/mcp.js +57 -15
- package/lib/dist/server/routes/memory.js +54 -35
- package/lib/dist/server/routes/projects.js +78 -7
- package/lib/dist/server/routes/spec.js +125 -0
- package/lib/dist/server/server.js +8 -2
- package/lib/dist/skills/design-md/SKILL.md +172 -0
- package/lib/dist/skills/design-md/references/authored-sections.md +90 -0
- package/lib/dist/skills/design-md/references/sources.md +71 -0
- package/lib/dist/skills/spec-author/SKILL.md +1 -1
- package/lib/dist/skills/spec-author/references/gap-questions.md +1 -1
- package/lib/dist/spec-lint/lint.d.ts +26 -1
- package/lib/dist/spec-lint/lint.d.ts.map +1 -1
- package/lib/dist/spec-lint/lint.js +96 -7
- package/lib/dist/spec-lint/lint.js.map +1 -1
- package/lib/dist/spec-quality/postcheck.d.ts +7 -1
- package/lib/dist/spec-quality/postcheck.d.ts.map +1 -1
- package/lib/dist/spec-quality/postcheck.js +31 -0
- package/lib/dist/spec-quality/postcheck.js.map +1 -1
- package/lib/dist/sync/worktree.d.ts +48 -0
- package/lib/dist/sync/worktree.d.ts.map +1 -1
- package/lib/dist/sync/worktree.js +109 -0
- package/lib/dist/sync/worktree.js.map +1 -1
- package/lib/dist/ui/assets/bricolage-latin-C23fTOVi.woff2 +0 -0
- package/lib/dist/ui/assets/bricolage-latin-ext-B82pxkPf.woff2 +0 -0
- package/lib/dist/ui/assets/index-54vorjyq.css +1 -0
- package/lib/dist/ui/assets/index-BZQonCVb.js +52 -0
- package/lib/dist/ui/assets/space-grotesk-latin-DPT1xrvW.woff2 +0 -0
- package/lib/dist/ui/assets/space-grotesk-latin-ext-wJGaI8U0.woff2 +0 -0
- package/lib/dist/ui/index.html +2 -2
- package/lib/dist/update/updater.d.ts +6 -0
- package/lib/dist/update/updater.d.ts.map +1 -1
- package/lib/dist/update/updater.js +13 -1
- package/lib/dist/update/updater.js.map +1 -1
- package/lib/dist/workflows/agents/claude.d.ts +9 -0
- package/lib/dist/workflows/agents/claude.d.ts.map +1 -1
- package/lib/dist/workflows/agents/claude.js +22 -3
- package/lib/dist/workflows/agents/claude.js.map +1 -1
- package/lib/dist/workflows/agents/gemini-version.d.ts +18 -0
- package/lib/dist/workflows/agents/gemini-version.d.ts.map +1 -0
- package/lib/dist/workflows/agents/gemini-version.js +81 -0
- package/lib/dist/workflows/agents/gemini-version.js.map +1 -0
- package/lib/dist/workflows/agents/gemini.d.ts +1 -1
- package/lib/dist/workflows/agents/gemini.d.ts.map +1 -1
- package/lib/dist/workflows/agents/gemini.js +12 -2
- package/lib/dist/workflows/agents/gemini.js.map +1 -1
- package/lib/dist/workflows/agents/index.d.ts +2 -0
- package/lib/dist/workflows/agents/index.d.ts.map +1 -1
- package/lib/dist/workflows/agents/index.js +5 -0
- package/lib/dist/workflows/agents/index.js.map +1 -1
- package/lib/dist/workflows/agents/types.d.ts +13 -0
- package/lib/dist/workflows/agents/types.d.ts.map +1 -1
- package/lib/dist/workflows/agents/types.js.map +1 -1
- package/lib/dist/workflows/condition-evaluator.d.ts +8 -0
- package/lib/dist/workflows/condition-evaluator.d.ts.map +1 -1
- package/lib/dist/workflows/condition-evaluator.js +7 -0
- package/lib/dist/workflows/condition-evaluator.js.map +1 -1
- package/lib/dist/workflows/defaults/claude-design-implement.yaml +44 -15
- package/lib/dist/workflows/defaults/spec-author.yaml +9 -9
- package/lib/dist/workflows/defaults/spec-fix.yaml +8 -8
- package/lib/dist/workflows/defaults/spec-implement.yaml +54 -23
- package/lib/dist/workflows/defaults/spec-relink.yaml +5 -5
- package/lib/dist/workflows/defaults/spec-verify.yaml +3 -3
- package/lib/dist/workflows/executor.d.ts +7 -0
- package/lib/dist/workflows/executor.d.ts.map +1 -1
- package/lib/dist/workflows/executor.js +22 -5
- package/lib/dist/workflows/executor.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +3 -2
- package/package.json +1 -1
- package/lib/dist/installer/config-writer.d.ts.map +0 -1
- package/lib/dist/installer/config-writer.js.map +0 -1
- package/lib/dist/installer/gemini-commands.d.ts.map +0 -1
- package/lib/dist/installer/gemini-commands.js.map +0 -1
- package/lib/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/lib/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/lib/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/lib/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/lib/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/lib/dist/ui/assets/index-BzuUWUAE.js +0 -50
- package/lib/dist/ui/assets/index-ezwX2EfG.css +0 -1
package/bin/specship
CHANGED
|
@@ -11,7 +11,7 @@ while [ -L "$SELF" ]; do
|
|
|
11
11
|
done
|
|
12
12
|
DIR="$(cd "$(dirname "$SELF")/.." && pwd)"
|
|
13
13
|
|
|
14
|
-
# Resolve the machine's Node and gate its version (REQ-
|
|
14
|
+
# Resolve the machine's Node and gate its version (REQ-OFFINSTALL-006): the
|
|
15
15
|
# bundle ships no runtime, so a missing or unsupported node must fail loudly
|
|
16
16
|
# rather than crash deep inside the app.
|
|
17
17
|
NODE="$(command -v node 2>/dev/null || true)"
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specship",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": {
|
|
3
|
+
"version": "0.30.0",
|
|
4
|
+
"description": "SpecShip for Claude Code — local code intelligence (search, flow tracing, impact) over a SQLite knowledge graph, spec-driven development, and the same hooks `specship install` wires. Requires the specship CLI on PATH.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "selvakumarEsra"
|
|
7
|
+
},
|
|
8
|
+
"mcpServers": {
|
|
9
|
+
"specship": {
|
|
10
|
+
"type": "stdio",
|
|
11
|
+
"command": "specship",
|
|
12
|
+
"args": [
|
|
13
|
+
"serve",
|
|
14
|
+
"--mcp"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
6
18
|
}
|
|
@@ -13,21 +13,24 @@
|
|
|
13
13
|
* the spec's scope note. Noise is bounded by the hook matcher (startup only)
|
|
14
14
|
* and the `SPECSHIP_NO_CHEATSHEET` opt-out below, not by this module.
|
|
15
15
|
*/
|
|
16
|
+
import { type HostTraits } from './hook-output';
|
|
17
|
+
/** The cheat-sheet as shown when no host is known — today's text. */
|
|
18
|
+
export declare const CHEATSHEET_TEXT: string;
|
|
16
19
|
/**
|
|
17
|
-
* The cheat-sheet
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* notes.
|
|
20
|
+
* The cheat-sheet for a host profile (REQ-AGENTSWITCH-002): the default host
|
|
21
|
+
* (or none) gets {@link CHEATSHEET_TEXT} unchanged; another host sees its own
|
|
22
|
+
* read and search tool names.
|
|
21
23
|
*/
|
|
22
|
-
export declare
|
|
24
|
+
export declare function cheatsheetText(traits?: HostTraits): string;
|
|
23
25
|
/**
|
|
24
26
|
* Build the `SessionStart`-hook payload the `specship cheatsheet` command
|
|
25
27
|
* prints. Returns `{ systemMessage }` (user-visible only — never
|
|
26
28
|
* `additionalContext`, REQ-CHEAT-001.A2), or `null` when the user has opted
|
|
27
29
|
* out via `SPECSHIP_NO_CHEATSHEET` (REQ-CHEAT-004.A1). An unset or empty
|
|
28
|
-
* variable prints normally (REQ-CHEAT-004.A2).
|
|
30
|
+
* variable prints normally (REQ-CHEAT-004.A2). `traits` is the running host's
|
|
31
|
+
* profile; omitted (no known host), the text is today's (REQ-AGENTSWITCH-002).
|
|
29
32
|
*/
|
|
30
|
-
export declare function buildCheatsheetPayload(env?: NodeJS.ProcessEnv, extras?: CheatsheetExtras): {
|
|
33
|
+
export declare function buildCheatsheetPayload(env?: NodeJS.ProcessEnv, extras?: CheatsheetExtras, traits?: HostTraits): {
|
|
31
34
|
systemMessage: string;
|
|
32
35
|
} | null;
|
|
33
36
|
/** Optional learned-state extras the CLI resolves before rendering. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cheatsheet.d.ts","sourceRoot":"","sources":["../../src/activation/cheatsheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH
|
|
1
|
+
{"version":3,"file":"cheatsheet.d.ts","sourceRoot":"","sources":["../../src/activation/cheatsheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AA+BrE,qEAAqE;AACrE,eAAO,MAAM,eAAe,QAAmD,CAAC;AAEhF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAI1D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,MAAM,GAAE,gBAAqB,EAC7B,MAAM,CAAC,EAAE,UAAU,GAClB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkBlC;AAED,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBhF"}
|
|
@@ -16,15 +16,17 @@
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.CONVENTIONS_BUDGET_LINES = exports.CHEATSHEET_TEXT = void 0;
|
|
19
|
+
exports.cheatsheetText = cheatsheetText;
|
|
19
20
|
exports.buildCheatsheetPayload = buildCheatsheetPayload;
|
|
20
21
|
exports.renderConventionsSection = renderConventionsSection;
|
|
22
|
+
const hook_output_1 = require("./hook-output");
|
|
21
23
|
/**
|
|
22
24
|
* The cheat-sheet rendered to the user. Names only user-facing commands, tools,
|
|
23
25
|
* and env vars — no internal file paths, symbol names, or benchmark figures
|
|
24
26
|
* (REQ-CHEAT-002.A3), so it reads as a product map rather than engineering
|
|
25
27
|
* notes.
|
|
26
28
|
*/
|
|
27
|
-
|
|
29
|
+
const cheatsheetLines = (explorePrefer) => [
|
|
28
30
|
'📦 SpecShip — code intelligence + spec-driven flow over the indexed graph',
|
|
29
31
|
'',
|
|
30
32
|
'The four doors (slash commands):',
|
|
@@ -33,7 +35,7 @@ exports.CHEATSHEET_TEXT = [
|
|
|
33
35
|
'• /specship:check — gate & health door (drift queue, fix, relink, health).',
|
|
34
36
|
'• /specship:learn — lessons door. crystallize what worked into a skill proposal.',
|
|
35
37
|
'',
|
|
36
|
-
|
|
38
|
+
explorePrefer,
|
|
37
39
|
'• specship_explore is PRIMARY — one call returns verbatim source grouped by file.',
|
|
38
40
|
'• Flow: name both ends (e.g. "mutateElement renderScene") to trace the call path.',
|
|
39
41
|
'• Locate → specship_search · impact → specship_impact · callers/callees too.',
|
|
@@ -46,17 +48,31 @@ exports.CHEATSHEET_TEXT = [
|
|
|
46
48
|
'',
|
|
47
49
|
'Silence this with SPECSHIP_NO_CHEATSHEET=1. specship_status shows index freshness.',
|
|
48
50
|
].join('\n');
|
|
51
|
+
/** The cheat-sheet as shown when no host is known — today's text. */
|
|
52
|
+
exports.CHEATSHEET_TEXT = cheatsheetLines('Explore before you Read/Grep:');
|
|
53
|
+
/**
|
|
54
|
+
* The cheat-sheet for a host profile (REQ-AGENTSWITCH-002): the default host
|
|
55
|
+
* (or none) gets {@link CHEATSHEET_TEXT} unchanged; another host sees its own
|
|
56
|
+
* read and search tool names.
|
|
57
|
+
*/
|
|
58
|
+
function cheatsheetText(traits) {
|
|
59
|
+
if (!traits || traits.id === hook_output_1.DEFAULT_HOST_TRAITS.id)
|
|
60
|
+
return exports.CHEATSHEET_TEXT;
|
|
61
|
+
const tools = [traits.readTools[0], traits.searchTools[0]].filter(Boolean).join('/');
|
|
62
|
+
return cheatsheetLines(`Explore before you ${tools}:`);
|
|
63
|
+
}
|
|
49
64
|
/**
|
|
50
65
|
* Build the `SessionStart`-hook payload the `specship cheatsheet` command
|
|
51
66
|
* prints. Returns `{ systemMessage }` (user-visible only — never
|
|
52
67
|
* `additionalContext`, REQ-CHEAT-001.A2), or `null` when the user has opted
|
|
53
68
|
* out via `SPECSHIP_NO_CHEATSHEET` (REQ-CHEAT-004.A1). An unset or empty
|
|
54
|
-
* variable prints normally (REQ-CHEAT-004.A2).
|
|
69
|
+
* variable prints normally (REQ-CHEAT-004.A2). `traits` is the running host's
|
|
70
|
+
* profile; omitted (no known host), the text is today's (REQ-AGENTSWITCH-002).
|
|
55
71
|
*/
|
|
56
|
-
function buildCheatsheetPayload(env = process.env, extras = {}) {
|
|
72
|
+
function buildCheatsheetPayload(env = process.env, extras = {}, traits) {
|
|
57
73
|
if (env.SPECSHIP_NO_CHEATSHEET)
|
|
58
74
|
return null;
|
|
59
|
-
const parts = [
|
|
75
|
+
const parts = [cheatsheetText(traits)];
|
|
60
76
|
// Learned project conventions (REQ-ALEARN-002): absent/empty file → output
|
|
61
77
|
// is byte-identical to the base cheatsheet (A1).
|
|
62
78
|
if (extras.conventions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cheatsheet.js","sourceRoot":"","sources":["../../src/activation/cheatsheet.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;
|
|
1
|
+
{"version":3,"file":"cheatsheet.js","sourceRoot":"","sources":["../../src/activation/cheatsheet.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* `BeforeTool`) — the installer wires them to the same binaries and the
|
|
10
10
|
* payload tells the command which host called it (REQ-GEMINI-010).
|
|
11
11
|
*/
|
|
12
|
+
import { type DetectedAgent } from '../agents/detect';
|
|
12
13
|
export interface HookPayload {
|
|
13
14
|
prompt: string;
|
|
14
15
|
cwd: string | null;
|
|
@@ -42,16 +43,43 @@ export declare function buildHookDenyDecision(reason: string): string;
|
|
|
42
43
|
* - `specshipToolMarkers` — substrings naming a specship tool_use record.
|
|
43
44
|
* Claude exposes our server as `mcp__specship__<tool>`; Gemini shows
|
|
44
45
|
* the model the bare tool name (`specship_explore`), qualifying it as
|
|
45
|
-
* `specship__<tool>` only on a name collision.
|
|
46
|
+
* `specship__<tool>` only on a name collision; from 0.33.0 the name is
|
|
47
|
+
* `mcp_specship_<tool>`.
|
|
46
48
|
* - `transcriptFormat` — Claude writes JSONL (one record per line); Gemini's
|
|
47
49
|
* `ChatRecordingService` writes one pretty-printed JSON doc with
|
|
48
|
-
* `messages[].toolCalls[].name
|
|
50
|
+
* `messages[].toolCalls[].name` (JSON Lines from 0.33.0, which the
|
|
51
|
+
* single-json scan also reads).
|
|
49
52
|
* - `supportsBeforeToolDeny` — whether the host reads a top-level
|
|
50
53
|
* `{decision:'deny'}` on its BeforeTool-equivalent. Gemini 0.28.0+
|
|
51
54
|
* `BeforeToolHookOutput.isBlockingDecision` does; Claude's PreToolUse
|
|
52
55
|
* uses a different shape so we never emit deny for Claude.
|
|
53
56
|
*/
|
|
54
57
|
export interface HostTraits {
|
|
58
|
+
/** Adapter id — the same ids as the install record and `--target` (REQ-AGENTSWITCH-001). */
|
|
59
|
+
id: 'claude' | 'gemini';
|
|
60
|
+
/** Human-readable product name for agent- and user-facing text. */
|
|
61
|
+
displayName: string;
|
|
62
|
+
/**
|
|
63
|
+
* Whether `specship install` auto-allows SpecShip's read-only tools by
|
|
64
|
+
* default. Claude Code's permission allowlist is local and reversible;
|
|
65
|
+
* Gemini CLI's equivalent is a policy file, strictly opt-in via `--trust`
|
|
66
|
+
* (REQ-GEMINI-009, REQ-AGENTSWITCH-019.A4).
|
|
67
|
+
*/
|
|
68
|
+
autoAllowByDefault: boolean;
|
|
69
|
+
/** Whether the host has a status line SpecShip can wire (REQ-AGENTSWITCH-010). */
|
|
70
|
+
hasStatusLine: boolean;
|
|
71
|
+
/** The project/user memory file the host reads (`<root>/<memoryFile>`). */
|
|
72
|
+
memoryFile: string;
|
|
73
|
+
/** The host's per-project and per-user config directory name. */
|
|
74
|
+
configDir: string;
|
|
75
|
+
/** User-wide config file holding MCP server entries, relative to the home dir. */
|
|
76
|
+
userConfigFile: string;
|
|
77
|
+
/** Session transcript root, relative to the home dir. */
|
|
78
|
+
transcriptDir: string;
|
|
79
|
+
/** The host's built-in file-read tools. */
|
|
80
|
+
readTools: readonly string[];
|
|
81
|
+
/** The host's built-in code-search tools. */
|
|
82
|
+
searchTools: readonly string[];
|
|
55
83
|
specshipToolMarkers: string[];
|
|
56
84
|
transcriptFormat: 'jsonl' | 'single-json';
|
|
57
85
|
supportsBeforeToolDeny: boolean;
|
|
@@ -68,6 +96,19 @@ export interface HostTraits {
|
|
|
68
96
|
denyEligibleTools: readonly string[];
|
|
69
97
|
/** The host's shell tool, whose `command` the interceptor classifies. */
|
|
70
98
|
shellTool: string | null;
|
|
99
|
+
/** Project settings file holding hook entries, relative to the project root (REQ-AGENTSWITCH-003). */
|
|
100
|
+
projectSettingsFile: string;
|
|
101
|
+
/** The host's after-tool hook event a post-edit hook registers under. */
|
|
102
|
+
postEditEvent: string;
|
|
103
|
+
/** Hook matcher naming the host's built-in file-write tools. */
|
|
104
|
+
writeToolMatcher: string;
|
|
105
|
+
/**
|
|
106
|
+
* User-wide memory-notes directory, relative to the home dir; `null` when
|
|
107
|
+
* the host has none (portable memory rules then go to {@link userMemoryFile}).
|
|
108
|
+
*/
|
|
109
|
+
memoryNotesDir: string | null;
|
|
110
|
+
/** User-wide memory file, relative to the home dir. */
|
|
111
|
+
userMemoryFile: string;
|
|
71
112
|
}
|
|
72
113
|
/**
|
|
73
114
|
* Claude Code — also the legacy default for payloads that name no event, so
|
|
@@ -76,5 +117,37 @@ export interface HostTraits {
|
|
|
76
117
|
export declare const CLAUDE_CODE_TRAITS: HostTraits;
|
|
77
118
|
/** Gemini CLI (verified against 0.28.0). */
|
|
78
119
|
export declare const GEMINI_CLI_TRAITS: HostTraits;
|
|
120
|
+
/**
|
|
121
|
+
* The profile code uses when no host is known (REQ-AGENTSWITCH-001): Claude
|
|
122
|
+
* Code, so every pre-adapter caller keeps its exact output.
|
|
123
|
+
*/
|
|
124
|
+
export declare const DEFAULT_HOST_TRAITS: HostTraits;
|
|
125
|
+
/** Every host profile, in registry order. */
|
|
126
|
+
export declare const ALL_HOST_TRAITS: readonly HostTraits[];
|
|
127
|
+
/**
|
|
128
|
+
* The profile for an agent id (`claude`, `gemini`); {@link DEFAULT_HOST_TRAITS}
|
|
129
|
+
* for an unknown or missing id, e.g. the detection result `unknown`.
|
|
130
|
+
*/
|
|
131
|
+
export declare function hostTraitsFor(id: string | null | undefined): HostTraits;
|
|
132
|
+
/**
|
|
133
|
+
* The agents a project is set up for (REQ-AGENTSWITCH-003): every host whose
|
|
134
|
+
* root memory file or project config directory exists at `projectRoot`, in
|
|
135
|
+
* registry order. A project carrying neither is treated as Claude Code's, the
|
|
136
|
+
* default host, so pre-adapter projects keep their exact behaviour.
|
|
137
|
+
*/
|
|
138
|
+
export declare function agentsInProject(projectRoot: string): HostTraits[];
|
|
139
|
+
/**
|
|
140
|
+
* How to FORMAT the reply to a hook payload. Falls back to Claude Code traits
|
|
141
|
+
* for payloads naming no (or a shared) event — the backward-compatibility
|
|
142
|
+
* contract of REQ-AGENTADAPT-002.A2. That fallback is a formatting default,
|
|
143
|
+
* not evidence: use {@link detectHookAgent} to ask which agent sent it.
|
|
144
|
+
*/
|
|
79
145
|
export declare function deriveHostTraits(payload: HookPayload): HostTraits;
|
|
146
|
+
/**
|
|
147
|
+
* Which agent SENT a hook payload (REQ-AGENTSWITCH-007). Only an event name a
|
|
148
|
+
* single agent sends counts as proof; a shared event such as `SessionStart`,
|
|
149
|
+
* or a payload naming no event, is `unknown` — unlike {@link deriveHostTraits},
|
|
150
|
+
* which still picks a formatting default for those.
|
|
151
|
+
*/
|
|
152
|
+
export declare function detectHookAgent(payload: HookPayload): DetectedAgent;
|
|
80
153
|
//# sourceMappingURL=hook-output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-output.d.ts","sourceRoot":"","sources":["../../src/activation/hook-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"hook-output.d.ts","sourceRoot":"","sources":["../../src/activation/hook-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,12 +10,51 @@
|
|
|
10
10
|
* `BeforeTool`) — the installer wires them to the same binaries and the
|
|
11
11
|
* payload tells the command which host called it (REQ-GEMINI-010).
|
|
12
12
|
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
13
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.GEMINI_CLI_TRAITS = exports.CLAUDE_CODE_TRAITS = void 0;
|
|
47
|
+
exports.ALL_HOST_TRAITS = exports.DEFAULT_HOST_TRAITS = exports.GEMINI_CLI_TRAITS = exports.CLAUDE_CODE_TRAITS = void 0;
|
|
15
48
|
exports.parseHookPayload = parseHookPayload;
|
|
16
49
|
exports.buildHookAdditionalContext = buildHookAdditionalContext;
|
|
17
50
|
exports.buildHookDenyDecision = buildHookDenyDecision;
|
|
51
|
+
exports.hostTraitsFor = hostTraitsFor;
|
|
52
|
+
exports.agentsInProject = agentsInProject;
|
|
18
53
|
exports.deriveHostTraits = deriveHostTraits;
|
|
54
|
+
exports.detectHookAgent = detectHookAgent;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const detect_1 = require("../agents/detect");
|
|
19
58
|
function parseHookPayload(raw) {
|
|
20
59
|
const empty = {
|
|
21
60
|
prompt: '',
|
|
@@ -73,6 +112,16 @@ function buildHookDenyDecision(reason) {
|
|
|
73
112
|
* every pre-adapter install keeps its exact behaviour (REQ-AGENTADAPT-002.A2).
|
|
74
113
|
*/
|
|
75
114
|
exports.CLAUDE_CODE_TRAITS = {
|
|
115
|
+
id: 'claude',
|
|
116
|
+
displayName: 'Claude Code',
|
|
117
|
+
autoAllowByDefault: true,
|
|
118
|
+
hasStatusLine: true,
|
|
119
|
+
memoryFile: 'CLAUDE.md',
|
|
120
|
+
configDir: '.claude',
|
|
121
|
+
userConfigFile: '.claude.json',
|
|
122
|
+
transcriptDir: '.claude/projects',
|
|
123
|
+
readTools: ['Read'],
|
|
124
|
+
searchTools: ['Grep', 'Glob'],
|
|
76
125
|
specshipToolMarkers: ['"name":"mcp__specship__'],
|
|
77
126
|
transcriptFormat: 'jsonl',
|
|
78
127
|
supportsBeforeToolDeny: false,
|
|
@@ -81,10 +130,26 @@ exports.CLAUDE_CODE_TRAITS = {
|
|
|
81
130
|
fallbackToolEvent: 'PreToolUse',
|
|
82
131
|
denyEligibleTools: [],
|
|
83
132
|
shellTool: null,
|
|
133
|
+
projectSettingsFile: '.claude/settings.json',
|
|
134
|
+
postEditEvent: 'PostToolUse',
|
|
135
|
+
writeToolMatcher: 'Edit|Write',
|
|
136
|
+
memoryNotesDir: '.claude/memory',
|
|
137
|
+
userMemoryFile: '.claude/CLAUDE.md',
|
|
84
138
|
};
|
|
85
139
|
/** Gemini CLI (verified against 0.28.0). */
|
|
86
140
|
exports.GEMINI_CLI_TRAITS = {
|
|
87
|
-
|
|
141
|
+
id: 'gemini',
|
|
142
|
+
displayName: 'Gemini CLI',
|
|
143
|
+
autoAllowByDefault: false,
|
|
144
|
+
hasStatusLine: false,
|
|
145
|
+
memoryFile: 'GEMINI.md',
|
|
146
|
+
configDir: '.gemini',
|
|
147
|
+
userConfigFile: '.gemini/settings.json',
|
|
148
|
+
transcriptDir: '.gemini/tmp',
|
|
149
|
+
readTools: ['read_file', 'read_many_files'],
|
|
150
|
+
searchTools: ['grep_search', 'glob'],
|
|
151
|
+
// Bare names before 0.33.0, `mcp_specship_<tool>` from 0.33.0 (REQ-AGENTSWITCH-018).
|
|
152
|
+
specshipToolMarkers: ['"name":"specship_', '"name": "specship_', '"name":"mcp_specship_', '"name": "mcp_specship_'],
|
|
88
153
|
transcriptFormat: 'single-json',
|
|
89
154
|
supportsBeforeToolDeny: true,
|
|
90
155
|
toolPrefix: '',
|
|
@@ -92,12 +157,58 @@ exports.GEMINI_CLI_TRAITS = {
|
|
|
92
157
|
fallbackToolEvent: 'BeforeTool',
|
|
93
158
|
denyEligibleTools: ['grep_search', 'glob'],
|
|
94
159
|
shellTool: 'run_shell_command',
|
|
160
|
+
projectSettingsFile: '.gemini/settings.json',
|
|
161
|
+
postEditEvent: 'AfterTool',
|
|
162
|
+
// Same matcher the installer's post-edit sync hook uses (targets/gemini.ts).
|
|
163
|
+
writeToolMatcher: 'write_file|replace',
|
|
164
|
+
memoryNotesDir: null,
|
|
165
|
+
userMemoryFile: '.gemini/GEMINI.md',
|
|
95
166
|
};
|
|
167
|
+
/**
|
|
168
|
+
* The profile code uses when no host is known (REQ-AGENTSWITCH-001): Claude
|
|
169
|
+
* Code, so every pre-adapter caller keeps its exact output.
|
|
170
|
+
*/
|
|
171
|
+
exports.DEFAULT_HOST_TRAITS = exports.CLAUDE_CODE_TRAITS;
|
|
172
|
+
/** Every host profile, in registry order. */
|
|
173
|
+
exports.ALL_HOST_TRAITS = [exports.CLAUDE_CODE_TRAITS, exports.GEMINI_CLI_TRAITS];
|
|
174
|
+
/**
|
|
175
|
+
* The profile for an agent id (`claude`, `gemini`); {@link DEFAULT_HOST_TRAITS}
|
|
176
|
+
* for an unknown or missing id, e.g. the detection result `unknown`.
|
|
177
|
+
*/
|
|
178
|
+
function hostTraitsFor(id) {
|
|
179
|
+
return exports.ALL_HOST_TRAITS.find((t) => t.id === id) ?? exports.DEFAULT_HOST_TRAITS;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The agents a project is set up for (REQ-AGENTSWITCH-003): every host whose
|
|
183
|
+
* root memory file or project config directory exists at `projectRoot`, in
|
|
184
|
+
* registry order. A project carrying neither is treated as Claude Code's, the
|
|
185
|
+
* default host, so pre-adapter projects keep their exact behaviour.
|
|
186
|
+
*/
|
|
187
|
+
function agentsInProject(projectRoot) {
|
|
188
|
+
const present = exports.ALL_HOST_TRAITS.filter((t) => fs.existsSync(path.join(projectRoot, t.memoryFile)) ||
|
|
189
|
+
fs.existsSync(path.join(projectRoot, t.configDir)));
|
|
190
|
+
return present.length > 0 ? [...present] : [exports.DEFAULT_HOST_TRAITS];
|
|
191
|
+
}
|
|
96
192
|
const GEMINI_EVENTS = new Set(['BeforeAgent', 'BeforeTool', 'AfterTool']);
|
|
193
|
+
/**
|
|
194
|
+
* How to FORMAT the reply to a hook payload. Falls back to Claude Code traits
|
|
195
|
+
* for payloads naming no (or a shared) event — the backward-compatibility
|
|
196
|
+
* contract of REQ-AGENTADAPT-002.A2. That fallback is a formatting default,
|
|
197
|
+
* not evidence: use {@link detectHookAgent} to ask which agent sent it.
|
|
198
|
+
*/
|
|
97
199
|
function deriveHostTraits(payload) {
|
|
98
200
|
if (payload.hookEventName && GEMINI_EVENTS.has(payload.hookEventName)) {
|
|
99
201
|
return exports.GEMINI_CLI_TRAITS;
|
|
100
202
|
}
|
|
101
|
-
return exports.
|
|
203
|
+
return exports.DEFAULT_HOST_TRAITS;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Which agent SENT a hook payload (REQ-AGENTSWITCH-007). Only an event name a
|
|
207
|
+
* single agent sends counts as proof; a shared event such as `SessionStart`,
|
|
208
|
+
* or a payload naming no event, is `unknown` — unlike {@link deriveHostTraits},
|
|
209
|
+
* which still picks a formatting default for those.
|
|
210
|
+
*/
|
|
211
|
+
function detectHookAgent(payload) {
|
|
212
|
+
return (0, detect_1.agentFromHookEvent)(payload.hookEventName);
|
|
102
213
|
}
|
|
103
214
|
//# sourceMappingURL=hook-output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-output.js","sourceRoot":"","sources":["../../src/activation/hook-output.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG
|
|
1
|
+
{"version":3,"file":"hook-output.js","sourceRoot":"","sources":["../../src/activation/hook-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* or tool-name prefixes. The caller (bin/specship) hands in host traits
|
|
28
28
|
* derived in the hook I/O adapter (`activation/hook-output.ts`).
|
|
29
29
|
*/
|
|
30
|
+
import { type HostTraits } from './hook-output';
|
|
30
31
|
/**
|
|
31
32
|
* The one redirect line. Explicitly advisory ("your search still runs") so
|
|
32
33
|
* the model doesn't treat it as a rejection of the call it just made.
|
|
@@ -54,15 +55,27 @@ export interface SearchInterceptInput {
|
|
|
54
55
|
homedir?: string;
|
|
55
56
|
/** Injectable clock for tests. */
|
|
56
57
|
now?: Date;
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
/**
|
|
59
|
+
* The calling host's profile (REQ-AGENTSWITCH-001.A3) — required. Supplies
|
|
60
|
+
* the transcript format and specship tool markers, the deny-eligible
|
|
61
|
+
* search tools, the shell tool and whether a deny is honoured at all.
|
|
62
|
+
*/
|
|
63
|
+
traits: HostTraits;
|
|
64
|
+
/** The intercepted tool's name, from the hook payload. */
|
|
65
|
+
toolName?: string | null;
|
|
66
|
+
/** The intercepted tool's input, from the hook payload. */
|
|
67
|
+
toolInput?: Record<string, unknown>;
|
|
68
|
+
/** Strict mode requested (applied only when the host supports a BeforeTool deny). */
|
|
62
69
|
strict?: boolean;
|
|
63
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Whether the intercepted tool is a built-in search eligible for deny.
|
|
72
|
+
* Default: `toolName` is one of the profile's `denyEligibleTools`.
|
|
73
|
+
*/
|
|
64
74
|
denyEligible?: boolean;
|
|
65
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* When the intercepted tool is a shell runner, the raw command string.
|
|
77
|
+
* Default: `toolInput.command` when `toolName` is the profile's `shellTool`.
|
|
78
|
+
*/
|
|
66
79
|
shellCommand?: string | null;
|
|
67
80
|
/** Search pattern/needle to echo in the deny reason, when known. */
|
|
68
81
|
searchPattern?: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-intercept.d.ts","sourceRoot":"","sources":["../../src/activation/search-intercept.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;
|
|
1
|
+
{"version":3,"file":"search-intercept.d.ts","sourceRoot":"","sources":["../../src/activation/search-intercept.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAIX,CAAC;AAExB,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAwHD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAUpE;AAqBD,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IAEX;;;;OAIG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,qFAAqF;IACrF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC,IAAI,CAAC;AAYT;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAoEvF"}
|
|
@@ -117,13 +117,17 @@ function writeState(file, state, now) {
|
|
|
117
117
|
}
|
|
118
118
|
function scanTranscript(transcriptPath, markers, format) {
|
|
119
119
|
const MAX_SCAN_BYTES = 4 * 1024 * 1024;
|
|
120
|
+
// A host that moved from one JSON document to JSON Lines (Gemini CLI
|
|
121
|
+
// 0.33.0, REQ-AGENTSWITCH-018) is scanned line by line; the file's own
|
|
122
|
+
// extension says which it wrote.
|
|
123
|
+
const lineRecords = format === 'jsonl' || transcriptPath.toLowerCase().endsWith('.jsonl');
|
|
120
124
|
let text;
|
|
121
125
|
try {
|
|
122
126
|
const stat = fs.statSync(transcriptPath);
|
|
123
127
|
if (stat.size <= MAX_SCAN_BYTES) {
|
|
124
128
|
text = fs.readFileSync(transcriptPath, 'utf-8');
|
|
125
129
|
}
|
|
126
|
-
else if (
|
|
130
|
+
else if (lineRecords) {
|
|
127
131
|
const fd = fs.openSync(transcriptPath, 'r');
|
|
128
132
|
try {
|
|
129
133
|
const buf = Buffer.alloc(MAX_SCAN_BYTES);
|
|
@@ -143,6 +147,13 @@ function scanTranscript(transcriptPath, markers, format) {
|
|
|
143
147
|
catch {
|
|
144
148
|
return format === 'single-json' ? 'parse-failure' : 'not-used';
|
|
145
149
|
}
|
|
150
|
+
if (format === 'single-json' && lineRecords) {
|
|
151
|
+
for (const line of text.split('\n')) {
|
|
152
|
+
if (line.includes('"toolCalls"') && markers.some((m) => line.includes(m)))
|
|
153
|
+
return 'used';
|
|
154
|
+
}
|
|
155
|
+
return 'not-used';
|
|
156
|
+
}
|
|
146
157
|
if (format === 'jsonl') {
|
|
147
158
|
for (const line of text.split('\n')) {
|
|
148
159
|
if (line.includes('"type":"tool_use"') && markers.some((m) => line.includes(m))) {
|
|
@@ -163,6 +174,8 @@ function scanTranscript(transcriptPath, markers, format) {
|
|
|
163
174
|
const messages = doc?.messages;
|
|
164
175
|
if (!Array.isArray(messages))
|
|
165
176
|
return 'not-used';
|
|
177
|
+
// The host's tool-name prefixes, read off its `"name":"<prefix>` markers.
|
|
178
|
+
const namePrefixes = [...new Set(markers.map((m) => m.replace(/^"name":\s*"/, '')))];
|
|
166
179
|
for (const m of messages) {
|
|
167
180
|
const calls = m?.toolCalls;
|
|
168
181
|
if (!Array.isArray(calls))
|
|
@@ -173,9 +186,10 @@ function scanTranscript(transcriptPath, markers, format) {
|
|
|
173
186
|
// Gemini records the function name the model called, which for an
|
|
174
187
|
// MCP tool is its bare name (`specship_explore`); the composite
|
|
175
188
|
// `specship__<tool>` form appears only when a name collision forces
|
|
176
|
-
// qualification (verified in 0.28.0 DiscoveredMCPTool).
|
|
177
|
-
//
|
|
178
|
-
if
|
|
189
|
+
// qualification (verified in 0.28.0 DiscoveredMCPTool); from 0.33.0 it
|
|
190
|
+
// is `mcp_specship_<tool>`. The host markers cover every form;
|
|
191
|
+
// tolerate the Claude form if a transcript carries it.
|
|
192
|
+
if (namePrefixes.some((p) => name.startsWith(p)) || name.startsWith(hook_output_1.CLAUDE_CODE_TRAITS.toolPrefix)) {
|
|
179
193
|
return 'used';
|
|
180
194
|
}
|
|
181
195
|
}
|
|
@@ -247,7 +261,15 @@ function denyReason(pattern) {
|
|
|
247
261
|
* specship (REQ-STEER-005).
|
|
248
262
|
*/
|
|
249
263
|
function buildSearchIntercept(input) {
|
|
250
|
-
const { cwd, sessionId, transcriptPath,
|
|
264
|
+
const { cwd, sessionId, transcriptPath, traits, toolName = null, toolInput = {}, env = process.env, homedir, now = new Date(), searchPattern = null, } = input;
|
|
265
|
+
const { specshipToolMarkers, transcriptFormat } = traits;
|
|
266
|
+
const strict = (input.strict ?? false) && traits.supportsBeforeToolDeny;
|
|
267
|
+
const denyEligible = input.denyEligible ?? (toolName !== null && traits.denyEligibleTools.includes(toolName));
|
|
268
|
+
const shellCommand = input.shellCommand !== undefined
|
|
269
|
+
? input.shellCommand
|
|
270
|
+
: traits.shellTool !== null && toolName === traits.shellTool && typeof toolInput.command === 'string'
|
|
271
|
+
? toolInput.command
|
|
272
|
+
: null;
|
|
251
273
|
if ((0, runtime_settings_1.resolveSetting)('SPECSHIP_NO_STEERING', cwd, env, homedir) === '1')
|
|
252
274
|
return null;
|
|
253
275
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-intercept.js","sourceRoot":"","sources":["../../src/activation/search-intercept.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBH,gDAEC;
|
|
1
|
+
{"version":3,"file":"search-intercept.js","sourceRoot":"","sources":["../../src/activation/search-intercept.ts"],"names":[],"mappings":"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"}
|