@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
|
@@ -16,8 +16,8 @@ try {
|
|
|
16
16
|
// Lazy require so any module-level error in the registry can't
|
|
17
17
|
// bubble out and abort the npm uninstall.
|
|
18
18
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
19
|
-
const {
|
|
20
|
-
for (const target of
|
|
19
|
+
const { allTargets } = require('../installer/targets/registry');
|
|
20
|
+
for (const target of allTargets()) {
|
|
21
21
|
if (!target.supportsLocation('global'))
|
|
22
22
|
continue;
|
|
23
23
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/bin/uninstall.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;GAWG;AAEH,IAAI,CAAC;IACH,+DAA+D;IAC/D,0CAA0C;IAC1C,iEAAiE;IACjE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/bin/uninstall.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;GAWG;AAEH,IAAI,CAAC;IACH,+DAA+D;IAC/D,0CAA0C;IAC1C,iEAAiE;IACjE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,+BAA+B,CACd,CAAC;IAEjD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAAE,SAAS;QACjD,IAAI,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;YAChE,0BAA0B;QAC5B,CAAC;IACH,CAAC;AACH,CAAC;AAAC,MAAM,CAAC;IACP,iEAAiE;IACjE,uDAAuD;AACzD,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLAUDE.md governance audit (CLAUDEMD-DOC).
|
|
3
3
|
*
|
|
4
|
-
* Deterministic structure/reference checks over a project's
|
|
5
|
-
*
|
|
4
|
+
* Deterministic structure/reference checks over a project's agent memory-file
|
|
5
|
+
* hierarchies — root router + nested module files — one per agent the project
|
|
6
|
+
* is set up for (REQ-AGENTSWITCH-003: CLAUDE.md, GEMINI.md). Detection only: rewrites
|
|
6
7
|
* are drafted in-session through the check door and human-gated
|
|
7
8
|
* (REQ-CLAUDEMD-004); nothing in this module writes to a CLAUDE.md.
|
|
8
9
|
*
|
|
@@ -22,7 +23,7 @@ export interface ClaudeMdAudit {
|
|
|
22
23
|
at: number;
|
|
23
24
|
/** Fingerprint of the inputs that produced this audit (REQ-CLAUDEMD-001.A2). */
|
|
24
25
|
hash: string;
|
|
25
|
-
/** Project-relative paths of every
|
|
26
|
+
/** Project-relative paths of every agent memory file discovered. */
|
|
26
27
|
files: string[];
|
|
27
28
|
findings: ClaudeMdFinding[];
|
|
28
29
|
}
|
|
@@ -36,6 +37,14 @@ export declare function auditClaudeMd(projectRoot: string): ClaudeMdAudit;
|
|
|
36
37
|
* Returns the current audit (fresh or cached) or null on any failure.
|
|
37
38
|
*/
|
|
38
39
|
export declare function runClaudeMdAudit(projectRoot: string): ClaudeMdAudit | null;
|
|
40
|
+
/**
|
|
41
|
+
* The memory file a finding is about (REQ-AGENTSWITCH-003): the finding's own
|
|
42
|
+
* file when it is one, else the memory file its detail names (a
|
|
43
|
+
* module-candidate finding points at a directory).
|
|
44
|
+
*/
|
|
45
|
+
export declare function findingMemoryFile(f: ClaudeMdFinding): string;
|
|
46
|
+
/** The distinct memory files an audit's findings are about, in registry order. */
|
|
47
|
+
export declare function auditMemoryFiles(audit: ClaudeMdAudit): string[];
|
|
39
48
|
/** Reader for surfacing (sync --drift-summary, check door, status). */
|
|
40
49
|
export declare function readClaudeMdAudit(projectRoot: string): ClaudeMdAudit | null;
|
|
41
50
|
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/claudemd/audit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/claudemd/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,YAAY,GACZ,kBAAkB,CAAC;AAEvB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,CAAC,CAAC;IACL,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAgID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAwBhE;AA8FD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAa1E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAK5D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAG/D;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAG3E"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* CLAUDE.md governance audit (CLAUDEMD-DOC).
|
|
4
4
|
*
|
|
5
|
-
* Deterministic structure/reference checks over a project's
|
|
6
|
-
*
|
|
5
|
+
* Deterministic structure/reference checks over a project's agent memory-file
|
|
6
|
+
* hierarchies — root router + nested module files — one per agent the project
|
|
7
|
+
* is set up for (REQ-AGENTSWITCH-003: CLAUDE.md, GEMINI.md). Detection only: rewrites
|
|
7
8
|
* are drafted in-session through the check door and human-gated
|
|
8
9
|
* (REQ-CLAUDEMD-004); nothing in this module writes to a CLAUDE.md.
|
|
9
10
|
*
|
|
@@ -47,11 +48,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
47
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
49
|
exports.auditClaudeMd = auditClaudeMd;
|
|
49
50
|
exports.runClaudeMdAudit = runClaudeMdAudit;
|
|
51
|
+
exports.findingMemoryFile = findingMemoryFile;
|
|
52
|
+
exports.auditMemoryFiles = auditMemoryFiles;
|
|
50
53
|
exports.readClaudeMdAudit = readClaudeMdAudit;
|
|
51
54
|
const fs = __importStar(require("fs"));
|
|
52
55
|
const path = __importStar(require("path"));
|
|
53
56
|
const paths_1 = require("../statusline/paths");
|
|
54
57
|
const directory_1 = require("../directory");
|
|
58
|
+
const hook_output_1 = require("../activation/hook-output");
|
|
55
59
|
/** Router bar for the root file; matches the claude-md-architect template. */
|
|
56
60
|
const ROOT_MAX_LINES = 200;
|
|
57
61
|
/** Cap for nested module files. */
|
|
@@ -60,7 +64,9 @@ const NESTED_MAX_LINES = 100;
|
|
|
60
64
|
const DUP_MIN_CHARS = 30;
|
|
61
65
|
const SKIP_DIRS = new Set([
|
|
62
66
|
'node_modules', '.git', 'dist', 'build', 'out', 'coverage',
|
|
63
|
-
'.specship', '
|
|
67
|
+
'.specship', 'vendor', 'target', '__pycache__',
|
|
68
|
+
// Every agent's config dir is tool state, not project docs.
|
|
69
|
+
...hook_output_1.ALL_HOST_TRAITS.map((t) => t.configDir),
|
|
64
70
|
]);
|
|
65
71
|
/** Directory depth cap for discovery — CLAUDE.md nests are shallow by design. */
|
|
66
72
|
const MAX_DEPTH = 4;
|
|
@@ -72,7 +78,8 @@ function auditPath(projectRoot) {
|
|
|
72
78
|
* files and per-directory package-manifest presence for the
|
|
73
79
|
* module-candidate check. Never throws — unreadable dirs are skipped.
|
|
74
80
|
*/
|
|
75
|
-
function discover(projectRoot) {
|
|
81
|
+
function discover(projectRoot, hosts) {
|
|
82
|
+
const memoryFiles = new Set(hosts.map((h) => h.memoryFile));
|
|
76
83
|
const claudeMds = [];
|
|
77
84
|
const manifestDirs = [];
|
|
78
85
|
const walk = (dir, depth) => {
|
|
@@ -93,7 +100,7 @@ function discover(projectRoot) {
|
|
|
93
100
|
continue;
|
|
94
101
|
walk(abs, depth + 1);
|
|
95
102
|
}
|
|
96
|
-
else if (e.name
|
|
103
|
+
else if (memoryFiles.has(e.name)) {
|
|
97
104
|
claudeMds.push(rel);
|
|
98
105
|
}
|
|
99
106
|
else if (depth > 0 && (e.name === 'package.json' || e.name === 'pyproject.toml' || e.name === 'Cargo.toml' || e.name === 'go.mod')) {
|
|
@@ -105,7 +112,7 @@ function discover(projectRoot) {
|
|
|
105
112
|
return { claudeMds: claudeMds.sort(), manifestDirs: [...new Set(manifestDirs)].sort() };
|
|
106
113
|
}
|
|
107
114
|
/** Cheap non-crypto fingerprint over discovery + file stats (FNV-1a). */
|
|
108
|
-
function fingerprint(projectRoot, claudeMds, manifestDirs) {
|
|
115
|
+
function fingerprint(projectRoot, claudeMds, manifestDirs, hosts) {
|
|
109
116
|
let h = 0x811c9dc5;
|
|
110
117
|
const mix = (s) => {
|
|
111
118
|
for (let i = 0; i < s.length; i++) {
|
|
@@ -113,6 +120,13 @@ function fingerprint(projectRoot, claudeMds, manifestDirs) {
|
|
|
113
120
|
h = Math.imul(h, 0x01000193);
|
|
114
121
|
}
|
|
115
122
|
};
|
|
123
|
+
// Which agents are audited changes the findings (a newly installed agent's
|
|
124
|
+
// missing root file), so it is part of the input. The default-host-only
|
|
125
|
+
// case mixes nothing, keeping pre-adapter fingerprints unchanged.
|
|
126
|
+
if (!(hosts.length === 1 && hosts[0] === hook_output_1.DEFAULT_HOST_TRAITS)) {
|
|
127
|
+
for (const host of hosts)
|
|
128
|
+
mix(`h:${host.id}`);
|
|
129
|
+
}
|
|
116
130
|
for (const rel of claudeMds) {
|
|
117
131
|
mix(rel);
|
|
118
132
|
try {
|
|
@@ -170,9 +184,10 @@ function dupCandidates(body) {
|
|
|
170
184
|
* Pure given the filesystem; never throws.
|
|
171
185
|
*/
|
|
172
186
|
function auditClaudeMd(projectRoot) {
|
|
173
|
-
const
|
|
187
|
+
const hosts = (0, hook_output_1.agentsInProject)(projectRoot);
|
|
188
|
+
const { claudeMds, manifestDirs } = discover(projectRoot, hosts);
|
|
174
189
|
const findings = [];
|
|
175
|
-
const hash = fingerprint(projectRoot, claudeMds, manifestDirs);
|
|
190
|
+
const hash = fingerprint(projectRoot, claudeMds, manifestDirs, hosts);
|
|
176
191
|
const bodies = new Map();
|
|
177
192
|
for (const rel of claudeMds) {
|
|
178
193
|
try {
|
|
@@ -182,16 +197,27 @@ function auditClaudeMd(projectRoot) {
|
|
|
182
197
|
/* unreadable — skip its content checks (REQ-CLAUDEMD-001.A3) */
|
|
183
198
|
}
|
|
184
199
|
}
|
|
185
|
-
|
|
200
|
+
// Each agent's memory files form their own hierarchy (REQ-AGENTSWITCH-003):
|
|
201
|
+
// the root/nested, duplication and coverage checks never mix agents.
|
|
202
|
+
for (const host of hosts) {
|
|
203
|
+
const name = host.memoryFile;
|
|
204
|
+
const files = claudeMds.filter((p) => path.posix.basename(p) === name);
|
|
205
|
+
auditHierarchy(projectRoot, name, files, bodies, manifestDirs, findings);
|
|
206
|
+
}
|
|
207
|
+
return { v: 1, at: Date.now(), hash, files: claudeMds, findings };
|
|
208
|
+
}
|
|
209
|
+
/** The deterministic checks over one agent's memory-file hierarchy. */
|
|
210
|
+
function auditHierarchy(projectRoot, name, files, bodies, manifestDirs, findings) {
|
|
211
|
+
const rootRel = files.find((p) => p === name) ?? null;
|
|
186
212
|
if (!rootRel) {
|
|
187
213
|
findings.push({
|
|
188
214
|
kind: 'missing-root',
|
|
189
|
-
file:
|
|
190
|
-
detail:
|
|
215
|
+
file: name,
|
|
216
|
+
detail: `no root ${name} — sessions start without project grounding`,
|
|
191
217
|
});
|
|
192
218
|
}
|
|
193
219
|
// Size caps (root router bar / nested cap).
|
|
194
|
-
for (const rel of
|
|
220
|
+
for (const rel of files) {
|
|
195
221
|
const body = bodies.get(rel);
|
|
196
222
|
if (body === undefined)
|
|
197
223
|
continue;
|
|
@@ -200,7 +226,7 @@ function auditClaudeMd(projectRoot) {
|
|
|
200
226
|
findings.push({
|
|
201
227
|
kind: 'root-too-long',
|
|
202
228
|
file: rel,
|
|
203
|
-
detail: `${lines} lines (router bar is ${ROOT_MAX_LINES}) — split module content into nested
|
|
229
|
+
detail: `${lines} lines (router bar is ${ROOT_MAX_LINES}) — split module content into nested ${name} files`,
|
|
204
230
|
});
|
|
205
231
|
}
|
|
206
232
|
else if (rel !== rootRel && lines > NESTED_MAX_LINES) {
|
|
@@ -214,7 +240,7 @@ function auditClaudeMd(projectRoot) {
|
|
|
214
240
|
// Verbatim duplication root ↔ nested.
|
|
215
241
|
if (rootRel) {
|
|
216
242
|
const rootLines = dupCandidates(bodies.get(rootRel) ?? '');
|
|
217
|
-
for (const rel of
|
|
243
|
+
for (const rel of files) {
|
|
218
244
|
if (rel === rootRel)
|
|
219
245
|
continue;
|
|
220
246
|
const body = bodies.get(rel);
|
|
@@ -231,10 +257,10 @@ function auditClaudeMd(projectRoot) {
|
|
|
231
257
|
}
|
|
232
258
|
}
|
|
233
259
|
}
|
|
234
|
-
// Stale path references. A mention resolves relative to the
|
|
260
|
+
// Stale path references. A mention resolves relative to the memory file's
|
|
235
261
|
// own directory first (nested files naturally use module-relative paths),
|
|
236
262
|
// then the project root.
|
|
237
|
-
for (const rel of
|
|
263
|
+
for (const rel of files) {
|
|
238
264
|
const body = bodies.get(rel);
|
|
239
265
|
if (body === undefined)
|
|
240
266
|
continue;
|
|
@@ -249,20 +275,19 @@ function auditClaudeMd(projectRoot) {
|
|
|
249
275
|
}
|
|
250
276
|
}
|
|
251
277
|
}
|
|
252
|
-
// Module candidates: own manifest, no own
|
|
278
|
+
// Module candidates: own manifest, no own memory file (and none in a parent
|
|
253
279
|
// BELOW root — root coverage alone is what makes it a candidate).
|
|
254
|
-
const nestedDirs = new Set(
|
|
280
|
+
const nestedDirs = new Set(files.filter((p) => p !== name).map((p) => path.dirname(p).split(path.sep).join('/')));
|
|
255
281
|
for (const dir of manifestDirs) {
|
|
256
282
|
const covered = [...nestedDirs].some((n) => dir === n || dir.startsWith(`${n}/`));
|
|
257
283
|
if (!covered) {
|
|
258
284
|
findings.push({
|
|
259
285
|
kind: 'module-candidate',
|
|
260
286
|
file: dir,
|
|
261
|
-
detail:
|
|
287
|
+
detail: `has its own package manifest but no ${name} — consider a nested file if it carries distinct invariants or verification`,
|
|
262
288
|
});
|
|
263
289
|
}
|
|
264
290
|
}
|
|
265
|
-
return { v: 1, at: Date.now(), hash, files: claudeMds, findings };
|
|
266
291
|
}
|
|
267
292
|
/**
|
|
268
293
|
* Sync-pass entry (REQ-CLAUDEMD-001): fingerprint-guarded, best-effort.
|
|
@@ -271,8 +296,9 @@ function auditClaudeMd(projectRoot) {
|
|
|
271
296
|
function runClaudeMdAudit(projectRoot) {
|
|
272
297
|
try {
|
|
273
298
|
const stored = (0, paths_1.readJsonSafe)(auditPath(projectRoot));
|
|
274
|
-
const
|
|
275
|
-
const
|
|
299
|
+
const hosts = (0, hook_output_1.agentsInProject)(projectRoot);
|
|
300
|
+
const { claudeMds, manifestDirs } = discover(projectRoot, hosts);
|
|
301
|
+
const hash = fingerprint(projectRoot, claudeMds, manifestDirs, hosts);
|
|
276
302
|
if (stored?.v === 1 && stored.hash === hash)
|
|
277
303
|
return stored;
|
|
278
304
|
const audit = auditClaudeMd(projectRoot);
|
|
@@ -283,6 +309,23 @@ function runClaudeMdAudit(projectRoot) {
|
|
|
283
309
|
return null; // a governance pass must never affect the sync
|
|
284
310
|
}
|
|
285
311
|
}
|
|
312
|
+
/**
|
|
313
|
+
* The memory file a finding is about (REQ-AGENTSWITCH-003): the finding's own
|
|
314
|
+
* file when it is one, else the memory file its detail names (a
|
|
315
|
+
* module-candidate finding points at a directory).
|
|
316
|
+
*/
|
|
317
|
+
function findingMemoryFile(f) {
|
|
318
|
+
const names = hook_output_1.ALL_HOST_TRAITS.map((h) => h.memoryFile);
|
|
319
|
+
const base = path.posix.basename(f.file);
|
|
320
|
+
if (names.includes(base))
|
|
321
|
+
return base;
|
|
322
|
+
return names.find((n) => f.detail.includes(n)) ?? hook_output_1.DEFAULT_HOST_TRAITS.memoryFile;
|
|
323
|
+
}
|
|
324
|
+
/** The distinct memory files an audit's findings are about, in registry order. */
|
|
325
|
+
function auditMemoryFiles(audit) {
|
|
326
|
+
const hit = new Set(audit.findings.map(findingMemoryFile));
|
|
327
|
+
return hook_output_1.ALL_HOST_TRAITS.map((h) => h.memoryFile).filter((n) => hit.has(n));
|
|
328
|
+
}
|
|
286
329
|
/** Reader for surfacing (sync --drift-summary, check door, status). */
|
|
287
330
|
function readClaudeMdAudit(projectRoot) {
|
|
288
331
|
const a = (0, paths_1.readJsonSafe)(auditPath(projectRoot));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/claudemd/audit.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/claudemd/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -397,8 +397,14 @@ workflow and the `designer-loop` skill rather than re-explaining either.
|
|
|
397
397
|
--input SLUG="<slug>"
|
|
398
398
|
```
|
|
399
399
|
|
|
400
|
+
Every path also writes `specs/<slug>/design.md` — the pixel-exact design
|
|
401
|
+
reference (every value verbatim, extracted by `specship design extract`, checked
|
|
402
|
+
by `specship design check`; follow the **`design-md` skill**). To capture or
|
|
403
|
+
refresh a design reference without authoring a spec, use that skill directly.
|
|
404
|
+
|
|
400
405
|
When the workflow finishes it hands off with `/specship:spec implement <first REQ ID>`;
|
|
401
|
-
the implementer
|
|
406
|
+
the implementer builds the UI from `specs/<slug>/design.md` (the spec's `design:`
|
|
407
|
+
frontmatter), with `snapshot.html` as the raw source. After the
|
|
402
408
|
spec is written and synced, the shared **Post-write review** (above) runs like any
|
|
403
409
|
other authoring path.
|
|
404
410
|
|
|
@@ -478,6 +484,15 @@ Steps for the gate:
|
|
|
478
484
|
`specship workflow run`. The fix is named (either `jira.epicKey` in
|
|
479
485
|
`specship.config.json` or a `specship_jira_pick <KEY>`).
|
|
480
486
|
|
|
487
|
+
**CI-publish repos (REQ-MULTIDEV-005).** When `specship.config.json` sets
|
|
488
|
+
`jira.publishFrom: "ci"`, JIRA issues are created only by CI on the publish
|
|
489
|
+
branch (`jira.publishBranch`, default `main`) after merge. Pass the spec's
|
|
490
|
+
frontmatter `epicKey` as `epic_key` to `specship_jira_anchor`: an epic-only
|
|
491
|
+
anchor (spec `epicKey` or the binding's `jira.epicKey`) then returns
|
|
492
|
+
`anchored` with source `epic-pending-ci` and no issue key — proceed with the
|
|
493
|
+
workflow, do not write a `jira:` key, and tell the user the spec stays
|
|
494
|
+
pending CI publication. With no epic anchor at all it is still refused.
|
|
495
|
+
|
|
481
496
|
Note: `explore`, `search`, `callers`, `callees`, `impact`, `status`,
|
|
482
497
|
`coverage`, and `track` are read-only retrieval and are NOT gated.
|
|
483
498
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;GAEG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;GAEG;AACH,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAC;CAClC;AA0cD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAU5D;AAWD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAiB3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAG1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,EAAE,CAKpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,GACjB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAU3E"}
|
|
@@ -11,10 +11,11 @@ exports.runMigrations = runMigrations;
|
|
|
11
11
|
exports.needsMigration = needsMigration;
|
|
12
12
|
exports.getPendingMigrations = getPendingMigrations;
|
|
13
13
|
exports.getMigrationHistory = getMigrationHistory;
|
|
14
|
+
const canonical_tools_1 = require("../analytics/canonical-tools");
|
|
14
15
|
/**
|
|
15
16
|
* Current schema version
|
|
16
17
|
*/
|
|
17
|
-
exports.CURRENT_SCHEMA_VERSION =
|
|
18
|
+
exports.CURRENT_SCHEMA_VERSION = 12;
|
|
18
19
|
/**
|
|
19
20
|
* All migrations in order
|
|
20
21
|
*
|
|
@@ -247,7 +248,7 @@ const migrations = [
|
|
|
247
248
|
},
|
|
248
249
|
{
|
|
249
250
|
version: 6,
|
|
250
|
-
description: 'Add
|
|
251
|
+
description: 'Add transcript ingest tables (claude_projects/sessions/prompts/tool_calls/ingest_state/pricing) for analytics over the coding agent\'s local session transcripts',
|
|
251
252
|
up: (db) => {
|
|
252
253
|
db.exec(`
|
|
253
254
|
CREATE TABLE IF NOT EXISTS claude_projects (
|
|
@@ -378,7 +379,7 @@ const migrations = [
|
|
|
378
379
|
},
|
|
379
380
|
{
|
|
380
381
|
version: 8,
|
|
381
|
-
description: 'Backfill claude_sessions.prompt_count from actual claude_prompts rows. The ingestor was bumping prompt_count once per user-type JSONL entry, but Claude
|
|
382
|
+
description: 'Backfill claude_sessions.prompt_count from actual claude_prompts rows. The ingestor was bumping prompt_count once per user-type JSONL entry, but the Claude transcript format emits one user entry per tool_result follow-up — all sharing the original promptId. A typical 50-prompt session landed with 800+ in prompt_count, making the Sessions list show inflated numbers vs. the actual rows visible in Session Detail. Re-run-safe.',
|
|
382
383
|
up: (db) => {
|
|
383
384
|
// No schema change — purely a data correction. Idempotent because
|
|
384
385
|
// the source-of-truth is COUNT(*) over claude_prompts, so running
|
|
@@ -401,7 +402,8 @@ const migrations = [
|
|
|
401
402
|
db.exec(`ALTER TABLE claude_tool_calls ADD COLUMN displaced_files TEXT;`); // JSON [[path,size],…] | NULL
|
|
402
403
|
if (!hasColumn(db, 'claude_tool_calls', 'resolution'))
|
|
403
404
|
db.exec(`ALTER TABLE claude_tool_calls ADD COLUMN resolution TEXT;`);
|
|
404
|
-
|
|
405
|
+
// tool_name holds the SHARED tool name (REQ-AGENTSWITCH-004), whose SpecShip prefix is canonical.
|
|
406
|
+
db.prepare(`UPDATE claude_tool_calls SET is_specship = 1 WHERE tool_name LIKE ?;`).run(`${canonical_tools_1.specshipToolPrefix}%`);
|
|
405
407
|
db.exec(`CREATE INDEX IF NOT EXISTS idx_claude_tool_calls_specship ON claude_tool_calls(is_specship);`);
|
|
406
408
|
},
|
|
407
409
|
},
|
|
@@ -447,6 +449,18 @@ const migrations = [
|
|
|
447
449
|
`);
|
|
448
450
|
},
|
|
449
451
|
},
|
|
452
|
+
{
|
|
453
|
+
version: 12,
|
|
454
|
+
description: 'Per-agent transcript adapters (REQ-AGENTSWITCH-004): host column on claude_sessions and claude_tool_calls, raw_tool_name on claude_tool_calls. Existing rows are sessions ingested before this change, whose tool names are already the shared names, so they keep host = claude and need no data change.',
|
|
455
|
+
up: (db) => {
|
|
456
|
+
if (!hasColumn(db, 'claude_sessions', 'host'))
|
|
457
|
+
db.exec(`ALTER TABLE claude_sessions ADD COLUMN host TEXT NOT NULL DEFAULT 'claude';`);
|
|
458
|
+
if (!hasColumn(db, 'claude_tool_calls', 'host'))
|
|
459
|
+
db.exec(`ALTER TABLE claude_tool_calls ADD COLUMN host TEXT NOT NULL DEFAULT 'claude';`);
|
|
460
|
+
if (!hasColumn(db, 'claude_tool_calls', 'raw_tool_name'))
|
|
461
|
+
db.exec(`ALTER TABLE claude_tool_calls ADD COLUMN raw_tool_name TEXT;`);
|
|
462
|
+
},
|
|
463
|
+
},
|
|
450
464
|
];
|
|
451
465
|
/**
|
|
452
466
|
* Get the current schema version from the database
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"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"}
|
package/lib/dist/db/schema.sql
CHANGED
|
@@ -347,6 +347,9 @@ CREATE TABLE IF NOT EXISTS claude_sessions (
|
|
|
347
347
|
total_cache_read_tokens INTEGER DEFAULT 0,
|
|
348
348
|
total_cost_usd REAL DEFAULT 0,
|
|
349
349
|
last_model TEXT,
|
|
350
|
+
-- Added in schema v12 (REQ-AGENTSWITCH-004): the agent whose transcript
|
|
351
|
+
-- the session came from ('claude' | 'gemini'). Tables keep their names.
|
|
352
|
+
host TEXT NOT NULL DEFAULT 'claude',
|
|
350
353
|
FOREIGN KEY (project_path) REFERENCES claude_projects(path) ON DELETE CASCADE
|
|
351
354
|
);
|
|
352
355
|
|
|
@@ -399,6 +402,11 @@ CREATE TABLE IF NOT EXISTS claude_tool_calls (
|
|
|
399
402
|
is_specship INTEGER NOT NULL DEFAULT 0,
|
|
400
403
|
displaced_files TEXT,
|
|
401
404
|
resolution TEXT,
|
|
405
|
+
-- Added in schema v12 (REQ-AGENTSWITCH-004): tool_name holds the SHARED
|
|
406
|
+
-- tool name every transcript adapter normalises to; raw_tool_name keeps
|
|
407
|
+
-- the agent's own name, and host names the agent.
|
|
408
|
+
host TEXT NOT NULL DEFAULT 'claude',
|
|
409
|
+
raw_tool_name TEXT,
|
|
402
410
|
FOREIGN KEY (prompt_id) REFERENCES claude_prompts(id) ON DELETE CASCADE,
|
|
403
411
|
FOREIGN KEY (session_id) REFERENCES claude_sessions(id) ON DELETE CASCADE
|
|
404
412
|
);
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* it's already ~1900 lines.
|
|
10
10
|
*/
|
|
11
11
|
import { SqliteDatabase } from './sqlite-adapter';
|
|
12
|
-
import { Spec, SpecFile, SpecLink, SpecLinkState, SpecLinkKind, SpecLinkDriftAxis, WorkflowRun, WorkflowRunStatus, WorkflowEvent, IsolationEnvironment } from '../types';
|
|
12
|
+
import { Spec, SpecFile, SpecLink, SpecLinkState, SpecLinkKind, SpecLinkProvenance, SpecLinkDriftAxis, WorkflowRun, WorkflowRunStatus, WorkflowEvent, IsolationEnvironment } from '../types';
|
|
13
13
|
/**
|
|
14
14
|
* One ranked hit from {@link SpecQueries.searchSpecs}. Carries enough to act on
|
|
15
15
|
* without a follow-up fetch (REQ-TRIAGE-001.A1): the spec, a relevance score,
|
|
@@ -176,6 +176,18 @@ export declare class SpecQueries {
|
|
|
176
176
|
getLinkById(id: number): SpecLink | null;
|
|
177
177
|
/** All links for a spec (e.g., for specship_spec response). */
|
|
178
178
|
getLinksBySpec(specId: string): SpecLink[];
|
|
179
|
+
/**
|
|
180
|
+
* Every link with the given provenance — used to reconcile code-derived
|
|
181
|
+
* (`code-comment`) links against the markers that still exist
|
|
182
|
+
* (REQ-MULTIDEV-006).
|
|
183
|
+
*/
|
|
184
|
+
getLinksByProvenance(provenance: SpecLinkProvenance): SpecLink[];
|
|
185
|
+
/**
|
|
186
|
+
* Re-label a link's provenance and confidence without touching its state or
|
|
187
|
+
* evidence — a code-comment link whose marker is gone but whose spec still
|
|
188
|
+
* declares it becomes a declared link again (REQ-MULTIDEV-006.A4).
|
|
189
|
+
*/
|
|
190
|
+
setSpecLinkProvenance(id: number, provenance: SpecLinkProvenance, confidence: number, updatedAt?: number): void;
|
|
179
191
|
/** All links pointing at a given resolved node (e.g., for specship_node response). */
|
|
180
192
|
getLinksByNode(nodeId: string): SpecLink[];
|
|
181
193
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-queries.d.ts","sourceRoot":"","sources":["../../src/db/spec-queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,IAAI,EACJ,QAAQ,EAGR,QAAQ,EACR,aAAa,EAEb,YAAY,
|
|
1
|
+
{"version":3,"file":"spec-queries.d.ts","sourceRoot":"","sources":["../../src/db/spec-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -659,6 +659,27 @@ class SpecQueries {
|
|
|
659
659
|
const rows = this.stmts.getLinksBySpec.all(specId);
|
|
660
660
|
return rows.map(rowToSpecLink);
|
|
661
661
|
}
|
|
662
|
+
/**
|
|
663
|
+
* Every link with the given provenance — used to reconcile code-derived
|
|
664
|
+
* (`code-comment`) links against the markers that still exist
|
|
665
|
+
* (REQ-MULTIDEV-006).
|
|
666
|
+
*/
|
|
667
|
+
getLinksByProvenance(provenance) {
|
|
668
|
+
const rows = this.db
|
|
669
|
+
.prepare(`SELECT * FROM spec_links WHERE provenance = ?`)
|
|
670
|
+
.all(provenance);
|
|
671
|
+
return rows.map(rowToSpecLink);
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Re-label a link's provenance and confidence without touching its state or
|
|
675
|
+
* evidence — a code-comment link whose marker is gone but whose spec still
|
|
676
|
+
* declares it becomes a declared link again (REQ-MULTIDEV-006.A4).
|
|
677
|
+
*/
|
|
678
|
+
setSpecLinkProvenance(id, provenance, confidence, updatedAt = Date.now()) {
|
|
679
|
+
this.db
|
|
680
|
+
.prepare(`UPDATE spec_links SET provenance = ?, confidence = ?, updated_at = ? WHERE id = ?`)
|
|
681
|
+
.run(provenance, confidence, updatedAt, id);
|
|
682
|
+
}
|
|
662
683
|
/** All links pointing at a given resolved node (e.g., for specship_node response). */
|
|
663
684
|
getLinksByNode(nodeId) {
|
|
664
685
|
if (!this.stmts.getLinksByNode) {
|