@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
|
@@ -51,6 +51,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
51
51
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
52
|
exports.ALL_CHECKS = exports.ENFORCE_CONFIG_FILE = void 0;
|
|
53
53
|
exports.normalizePath = normalizePath;
|
|
54
|
+
exports.undeclaredLinkFindings = undeclaredLinkFindings;
|
|
55
|
+
exports.branchBrokenFindings = branchBrokenFindings;
|
|
54
56
|
exports.evaluateEnforcement = evaluateEnforcement;
|
|
55
57
|
exports.loadEnforceConfig = loadEnforceConfig;
|
|
56
58
|
exports.strictEnforceConfig = strictEnforceConfig;
|
|
@@ -59,6 +61,7 @@ const fs = __importStar(require("fs"));
|
|
|
59
61
|
const path = __importStar(require("path"));
|
|
60
62
|
const maintainability_1 = require("../graph/maintainability");
|
|
61
63
|
const suppressions_1 = require("./suppressions");
|
|
64
|
+
const spec_link_resolver_1 = require("../resolution/spec-link-resolver");
|
|
62
65
|
/**
|
|
63
66
|
* Project-relative, forward-slashed, no `./` prefix. Link target paths, spec
|
|
64
67
|
* source paths and git's output all have to compare in one shape before
|
|
@@ -67,6 +70,48 @@ const suppressions_1 = require("./suppressions");
|
|
|
67
70
|
function normalizePath(p) {
|
|
68
71
|
return p.replace(/\\/g, '/').replace(/^\.\//, '').replace(/^\/+/, '');
|
|
69
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Provenances a fresh clone re-derives from the checked-out files: the spec
|
|
75
|
+
* file's `implementations:` / `verifies:` blocks and `@implements` /
|
|
76
|
+
* `@verifies` code comments.
|
|
77
|
+
*/
|
|
78
|
+
const DECLARED_PROVENANCES = new Set(['spec-declaration', 'code-comment']);
|
|
79
|
+
function linkKey(l) {
|
|
80
|
+
// Canonical dotted qname (REQ-LINKFIX-002) so `Class.method` and
|
|
81
|
+
// `Class::method` rows count as one logical link.
|
|
82
|
+
return [l.specId, normalizePath(l.targetFilePath), (0, spec_link_resolver_1.canonicalQualifiedName)(l.targetQualifiedName), l.kind].join('\u0000');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Undeclared links (REQ-MULTIDEV-002.A1): an `agent-asserted` row with no
|
|
86
|
+
* declared twin — no `spec-declaration` or `code-comment` row for the same
|
|
87
|
+
* spec, target and kind. A fresh clone never sees it.
|
|
88
|
+
*/
|
|
89
|
+
function undeclaredLinkFindings(links) {
|
|
90
|
+
const declared = new Set(links.filter((l) => DECLARED_PROVENANCES.has(l.provenance)).map(linkKey));
|
|
91
|
+
const seen = new Set();
|
|
92
|
+
const findings = [];
|
|
93
|
+
for (const l of links) {
|
|
94
|
+
if (l.provenance !== 'agent-asserted')
|
|
95
|
+
continue;
|
|
96
|
+
const key = linkKey(l);
|
|
97
|
+
if (declared.has(key) || seen.has(key))
|
|
98
|
+
continue;
|
|
99
|
+
seen.add(key);
|
|
100
|
+
findings.push(`${l.specId} → ${l.targetFilePath}:${l.targetQualifiedName} — undeclared (${l.provenance}): ` +
|
|
101
|
+
'add it to implementations:/verifies: or an @implements comment');
|
|
102
|
+
}
|
|
103
|
+
return findings;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Branch-broken links (REQ-MULTIDEV-002.A2/A3): orphaned/broken now, but the
|
|
107
|
+
* target resolved at the ref — so this branch broke it. A link already
|
|
108
|
+
* unresolved at the ref is not reported.
|
|
109
|
+
*/
|
|
110
|
+
function branchBrokenFindings(entries) {
|
|
111
|
+
return entries
|
|
112
|
+
.filter((e) => e.resolvedAtRef)
|
|
113
|
+
.map((e) => `${e.link.specId} → ${e.link.targetFilePath}:${e.link.targetQualifiedName} — ${e.link.state} on this branch, resolved at ${e.ref}`);
|
|
114
|
+
}
|
|
70
115
|
function evaluateEnforcement(deps, config = {}, scope) {
|
|
71
116
|
const gate = config.gate ?? {};
|
|
72
117
|
const exclude = new Set(config.behaviour?.exclude ?? []);
|
|
@@ -190,6 +235,18 @@ function evaluateEnforcement(deps, config = {}, scope) {
|
|
|
190
235
|
});
|
|
191
236
|
}
|
|
192
237
|
}
|
|
238
|
+
// --- undeclared links (REQ-MULTIDEV-002) ---
|
|
239
|
+
if (deps.links !== undefined) {
|
|
240
|
+
const findings = undeclaredLinkFindings(deps.links);
|
|
241
|
+
checks.push({ check: 'undeclaredLinks', gating: gate.undeclaredLinks === true, passed: findings.length === 0, findings });
|
|
242
|
+
}
|
|
243
|
+
// --- branch-broken links (REQ-MULTIDEV-002) — only for a `--since` run ---
|
|
244
|
+
if (deps.brokenAtRef !== undefined) {
|
|
245
|
+
const findings = branchBrokenFindings(deps.brokenAtRef);
|
|
246
|
+
checks.push({
|
|
247
|
+
check: 'branchBroken', gating: gate.branchBroken === true, passed: findings.length === 0, findings, scoped: true,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
193
250
|
const gatedFailures = checks.filter((c) => c.gating && !c.passed && !c.skipped).map((c) => c.check);
|
|
194
251
|
return { checks, gatedFailures, passed: gatedFailures.length === 0 };
|
|
195
252
|
}
|
|
@@ -212,13 +269,20 @@ function loadEnforceConfig(projectRoot) {
|
|
|
212
269
|
return {};
|
|
213
270
|
}
|
|
214
271
|
/** All check names, for `--strict` / `--enable-gate` validation. */
|
|
215
|
-
exports.ALL_CHECKS = [
|
|
272
|
+
exports.ALL_CHECKS = [
|
|
273
|
+
'drift', 'fitness', 'maintainability', 'behaviour', 'suppressions', 'mutation', 'undeclaredLinks', 'branchBroken',
|
|
274
|
+
];
|
|
216
275
|
/**
|
|
217
276
|
* The `--strict` override (REQ-ENFORCE-004.A2): every check gates for this
|
|
218
277
|
* run only. Nothing is read from or written to the project config.
|
|
219
278
|
*/
|
|
220
279
|
function strictEnforceConfig() {
|
|
221
|
-
return {
|
|
280
|
+
return {
|
|
281
|
+
gate: {
|
|
282
|
+
drift: true, fitness: true, maintainability: true, behaviour: true, suppressions: true, mutation: true,
|
|
283
|
+
undeclaredLinks: true, branchBroken: true,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
222
286
|
}
|
|
223
287
|
/**
|
|
224
288
|
* Persist gating for the named checks into `specship.config.json`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/enforce/enforce.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,19 @@ import * as fs from 'fs';
|
|
|
7
7
|
import { ExtractionResult, ExtractionError } from '../types';
|
|
8
8
|
import { QueryBuilder } from '../db/queries';
|
|
9
9
|
import { Ignore } from 'ignore';
|
|
10
|
+
/**
|
|
11
|
+
* Version of the extractor's output. Bump it whenever an extraction fix
|
|
12
|
+
* changes what an UNCHANGED file produces (REQ-HTMLLEX-002): a stored index
|
|
13
|
+
* stamped with an older version is stale, and the next full sync / indexAll
|
|
14
|
+
* re-extracts every tracked file in {@link EXTRACTION_STALE_LANGUAGES} even
|
|
15
|
+
* though its content hash still matches.
|
|
16
|
+
*
|
|
17
|
+
* - 1 (implicit / missing): pre-HTMLLEX extraction.
|
|
18
|
+
* - 2: declarations survive `<!--` / `-->` inside JS/TS literals (HTMLLEX-DOC).
|
|
19
|
+
*/
|
|
20
|
+
export declare const EXTRACTION_VERSION = 2;
|
|
21
|
+
/** `project_metadata` key holding the extraction version of the stored index. */
|
|
22
|
+
export declare const EXTRACTION_VERSION_KEY = "extraction_version";
|
|
10
23
|
/**
|
|
11
24
|
* Progress callback for indexing operations
|
|
12
25
|
*/
|
|
@@ -28,6 +41,12 @@ export interface IndexResult {
|
|
|
28
41
|
edgesCreated: number;
|
|
29
42
|
errors: ExtractionError[];
|
|
30
43
|
durationMs: number;
|
|
44
|
+
/**
|
|
45
|
+
* Files whose parse tree held an error region that may have swallowed
|
|
46
|
+
* declarations (`parse_error_region` warnings, REQ-HTMLLEX-003). Reported in
|
|
47
|
+
* the completion summary only; never persisted as a stat.
|
|
48
|
+
*/
|
|
49
|
+
filesWithParseWarnings?: number;
|
|
31
50
|
}
|
|
32
51
|
/**
|
|
33
52
|
* Result of a sync operation
|
|
@@ -40,6 +59,8 @@ export interface SyncResult {
|
|
|
40
59
|
nodesUpdated: number;
|
|
41
60
|
durationMs: number;
|
|
42
61
|
changedFilePaths?: string[];
|
|
62
|
+
/** Changed files carrying `parse_error_region` warnings (REQ-HTMLLEX-003). */
|
|
63
|
+
filesWithParseWarnings?: number;
|
|
43
64
|
/**
|
|
44
65
|
* Spec links that transitioned into `drifted` during this sync's spec
|
|
45
66
|
* pass (DRIFT-PUSH-DOC). Populated by SpecShip.sync(); absent when no
|
|
@@ -112,6 +133,22 @@ export declare class ExtractionOrchestrator {
|
|
|
112
133
|
* inside a single run don't re-scan.
|
|
113
134
|
*/
|
|
114
135
|
private ensureDetectedFrameworks;
|
|
136
|
+
/**
|
|
137
|
+
* True when the stored index was produced by an older extractor than
|
|
138
|
+
* {@link EXTRACTION_VERSION} (a missing stamp counts as stale), so files
|
|
139
|
+
* whose content hash still matches may hold dropped declarations
|
|
140
|
+
* (REQ-HTMLLEX-002).
|
|
141
|
+
*/
|
|
142
|
+
private isExtractionStale;
|
|
143
|
+
/**
|
|
144
|
+
* Record that every stale file has been re-extracted by the current
|
|
145
|
+
* extractor. Called ONLY at the end of a complete full pass (sync /
|
|
146
|
+
* indexAll) — never from a file-scoped index, or a single-file auto-sync
|
|
147
|
+
* would mark recovery done while other files still miss declarations.
|
|
148
|
+
*/
|
|
149
|
+
private stampExtractionVersion;
|
|
150
|
+
/** Whether a stored file must be re-extracted while the index is stale. */
|
|
151
|
+
private isStaleLanguage;
|
|
115
152
|
/**
|
|
116
153
|
* Index all files in the project
|
|
117
154
|
*/
|
|
@@ -121,16 +158,25 @@ export declare class ExtractionOrchestrator {
|
|
|
121
158
|
*/
|
|
122
159
|
indexFiles(filePaths: string[]): Promise<IndexResult>;
|
|
123
160
|
/**
|
|
124
|
-
* Index a single file
|
|
161
|
+
* Index a single file.
|
|
162
|
+
*
|
|
163
|
+
* `force` re-stores the extraction even when the content hash matches the
|
|
164
|
+
* stored file (stale-extraction recovery, REQ-HTMLLEX-002).
|
|
125
165
|
*/
|
|
126
|
-
indexFile(relativePath: string
|
|
166
|
+
indexFile(relativePath: string, options?: {
|
|
167
|
+
force?: boolean;
|
|
168
|
+
}): Promise<ExtractionResult>;
|
|
127
169
|
/**
|
|
128
170
|
* Index a single file with pre-read content and stats.
|
|
129
171
|
* Used by the parallel batch reader to avoid redundant file I/O.
|
|
130
172
|
*/
|
|
131
|
-
indexFileWithContent(relativePath: string, content: string, stats: fs.Stats): Promise<ExtractionResult>;
|
|
173
|
+
indexFileWithContent(relativePath: string, content: string, stats: fs.Stats, force?: boolean): Promise<ExtractionResult>;
|
|
132
174
|
/**
|
|
133
|
-
* Store extraction result in database
|
|
175
|
+
* Store extraction result in database.
|
|
176
|
+
*
|
|
177
|
+
* An unchanged content hash short-circuits the write unless `force` is set —
|
|
178
|
+
* the stale-extraction recovery (REQ-HTMLLEX-002) must replace a stored
|
|
179
|
+
* extraction whose hash is current but whose declarations were dropped.
|
|
134
180
|
*/
|
|
135
181
|
private storeExtractionResult;
|
|
136
182
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,OAAO,EAGL,gBAAgB,EAChB,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extraction/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,7 +41,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
41
41
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
42
|
};
|
|
43
43
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.loadAllGrammars = exports.loadGrammarsForLanguages = exports.initGrammars = exports.getSupportedLanguages = exports.isGrammarLoaded = exports.isLanguageSupported = exports.isSourceFile = exports.detectLanguage = exports.extractFromSource = exports.ExtractionOrchestrator = void 0;
|
|
44
|
+
exports.loadAllGrammars = exports.loadGrammarsForLanguages = exports.initGrammars = exports.getSupportedLanguages = exports.isGrammarLoaded = exports.isLanguageSupported = exports.isSourceFile = exports.detectLanguage = exports.extractFromSource = exports.ExtractionOrchestrator = exports.EXTRACTION_VERSION_KEY = exports.EXTRACTION_VERSION = void 0;
|
|
45
45
|
exports.hashContent = hashContent;
|
|
46
46
|
exports.buildDefaultIgnore = buildDefaultIgnore;
|
|
47
47
|
exports.scanDirectory = scanDirectory;
|
|
@@ -52,6 +52,7 @@ const path = __importStar(require("path"));
|
|
|
52
52
|
const crypto = __importStar(require("crypto"));
|
|
53
53
|
const child_process_1 = require("child_process");
|
|
54
54
|
const tree_sitter_1 = require("./tree-sitter");
|
|
55
|
+
const parse_warnings_1 = require("./parse-warnings");
|
|
55
56
|
const grammars_1 = require("./grammars");
|
|
56
57
|
const errors_1 = require("../errors");
|
|
57
58
|
const utils_1 = require("../utils");
|
|
@@ -77,6 +78,29 @@ const PARSE_TIMEOUT_MS = 10_000;
|
|
|
77
78
|
* This interval balances memory usage against the cost of reloading grammars.
|
|
78
79
|
*/
|
|
79
80
|
const WORKER_RECYCLE_INTERVAL = 250;
|
|
81
|
+
/**
|
|
82
|
+
* Version of the extractor's output. Bump it whenever an extraction fix
|
|
83
|
+
* changes what an UNCHANGED file produces (REQ-HTMLLEX-002): a stored index
|
|
84
|
+
* stamped with an older version is stale, and the next full sync / indexAll
|
|
85
|
+
* re-extracts every tracked file in {@link EXTRACTION_STALE_LANGUAGES} even
|
|
86
|
+
* though its content hash still matches.
|
|
87
|
+
*
|
|
88
|
+
* - 1 (implicit / missing): pre-HTMLLEX extraction.
|
|
89
|
+
* - 2: declarations survive `<!--` / `-->` inside JS/TS literals (HTMLLEX-DOC).
|
|
90
|
+
*/
|
|
91
|
+
exports.EXTRACTION_VERSION = 2;
|
|
92
|
+
/** `project_metadata` key holding the extraction version of the stored index. */
|
|
93
|
+
exports.EXTRACTION_VERSION_KEY = 'extraction_version';
|
|
94
|
+
/**
|
|
95
|
+
* Languages whose stored extraction is invalidated by a version bump. Limited
|
|
96
|
+
* to the family the HTMLLEX fix touched to keep the one-off recovery cheap.
|
|
97
|
+
*/
|
|
98
|
+
const EXTRACTION_STALE_LANGUAGES = new Set([
|
|
99
|
+
'typescript',
|
|
100
|
+
'tsx',
|
|
101
|
+
'javascript',
|
|
102
|
+
'jsx',
|
|
103
|
+
]);
|
|
80
104
|
/**
|
|
81
105
|
* Calculate SHA256 hash of file contents
|
|
82
106
|
*/
|
|
@@ -528,6 +552,29 @@ class ExtractionOrchestrator {
|
|
|
528
552
|
this.detectedFrameworkNames = (0, frameworks_1.detectFrameworks)(context).map((r) => r.name);
|
|
529
553
|
return this.detectedFrameworkNames;
|
|
530
554
|
}
|
|
555
|
+
/**
|
|
556
|
+
* True when the stored index was produced by an older extractor than
|
|
557
|
+
* {@link EXTRACTION_VERSION} (a missing stamp counts as stale), so files
|
|
558
|
+
* whose content hash still matches may hold dropped declarations
|
|
559
|
+
* (REQ-HTMLLEX-002).
|
|
560
|
+
*/
|
|
561
|
+
isExtractionStale() {
|
|
562
|
+
const stored = Number.parseInt(this.queries.getMetadata(exports.EXTRACTION_VERSION_KEY) ?? '', 10);
|
|
563
|
+
return !Number.isFinite(stored) || stored < exports.EXTRACTION_VERSION;
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Record that every stale file has been re-extracted by the current
|
|
567
|
+
* extractor. Called ONLY at the end of a complete full pass (sync /
|
|
568
|
+
* indexAll) — never from a file-scoped index, or a single-file auto-sync
|
|
569
|
+
* would mark recovery done while other files still miss declarations.
|
|
570
|
+
*/
|
|
571
|
+
stampExtractionVersion() {
|
|
572
|
+
this.queries.setMetadata(exports.EXTRACTION_VERSION_KEY, String(exports.EXTRACTION_VERSION));
|
|
573
|
+
}
|
|
574
|
+
/** Whether a stored file must be re-extracted while the index is stale. */
|
|
575
|
+
isStaleLanguage(language) {
|
|
576
|
+
return language !== undefined && EXTRACTION_STALE_LANGUAGES.has(language);
|
|
577
|
+
}
|
|
531
578
|
/**
|
|
532
579
|
* Index all files in the project
|
|
533
580
|
*/
|
|
@@ -564,6 +611,10 @@ class ExtractionOrchestrator {
|
|
|
564
611
|
// between runs is picked up without restarting the process.
|
|
565
612
|
this.detectedFrameworkNames = null;
|
|
566
613
|
const frameworkNames = this.ensureDetectedFrameworks(files);
|
|
614
|
+
// REQ-HTMLLEX-002: a stored index from an older extractor holds files whose
|
|
615
|
+
// hash is current but whose declarations were dropped. Force re-extraction
|
|
616
|
+
// of the affected languages, then stamp once the pass completes.
|
|
617
|
+
const stale = this.isExtractionStale();
|
|
567
618
|
if (signal?.aborted) {
|
|
568
619
|
return {
|
|
569
620
|
success: false,
|
|
@@ -822,7 +873,7 @@ class ExtractionOrchestrator {
|
|
|
822
873
|
// Store in database on main thread (SQLite is not thread-safe)
|
|
823
874
|
if (result.nodes.length > 0 || result.errors.length === 0) {
|
|
824
875
|
const language = (0, grammars_1.detectLanguage)(filePath, content);
|
|
825
|
-
this.storeExtractionResult(filePath, content, language, stats, result);
|
|
876
|
+
this.storeExtractionResult(filePath, content, language, stats, result, stale && this.isStaleLanguage(language));
|
|
826
877
|
}
|
|
827
878
|
if (result.errors.length > 0) {
|
|
828
879
|
for (const err of result.errors) {
|
|
@@ -898,7 +949,7 @@ class ExtractionOrchestrator {
|
|
|
898
949
|
if (result.nodes.length > 0 || result.errors.length === 0) {
|
|
899
950
|
const language = (0, grammars_1.detectLanguage)(filePath, content);
|
|
900
951
|
const stats = await fsp.stat(path.join(this.rootDir, filePath));
|
|
901
|
-
this.storeExtractionResult(filePath, content, language, stats, result);
|
|
952
|
+
this.storeExtractionResult(filePath, content, language, stats, result, stale && this.isStaleLanguage(language));
|
|
902
953
|
const idx = errors.indexOf(errEntry);
|
|
903
954
|
if (idx >= 0)
|
|
904
955
|
errors.splice(idx, 1);
|
|
@@ -946,7 +997,7 @@ class ExtractionOrchestrator {
|
|
|
946
997
|
if (result.nodes.length > 0 || result.errors.length === 0) {
|
|
947
998
|
const language = (0, grammars_1.detectLanguage)(filePath, fullContent);
|
|
948
999
|
const stats = await fsp.stat(path.join(this.rootDir, filePath));
|
|
949
|
-
this.storeExtractionResult(filePath, fullContent, language, stats, result);
|
|
1000
|
+
this.storeExtractionResult(filePath, fullContent, language, stats, result, stale && this.isStaleLanguage(language));
|
|
950
1001
|
const idx = errors.indexOf(errEntry);
|
|
951
1002
|
if (idx >= 0)
|
|
952
1003
|
errors.splice(idx, 1);
|
|
@@ -964,6 +1015,14 @@ class ExtractionOrchestrator {
|
|
|
964
1015
|
if (parseWorker) {
|
|
965
1016
|
parseWorker.terminate().catch(() => { });
|
|
966
1017
|
}
|
|
1018
|
+
// This complete pass (aborts return early above) re-extracted every stale
|
|
1019
|
+
// file. A file that failed to read or parse is already reported in
|
|
1020
|
+
// `errors`; parsing is deterministic, so retrying it on every sync would
|
|
1021
|
+
// only re-extract the whole JS/TS tree forever (REQ-HTMLLEX-002.A2). It is
|
|
1022
|
+
// re-extracted as soon as its content changes.
|
|
1023
|
+
if (stale) {
|
|
1024
|
+
this.stampExtractionVersion();
|
|
1025
|
+
}
|
|
967
1026
|
return {
|
|
968
1027
|
success: filesIndexed > 0 || errors.filter((e) => e.severity === 'error').length === 0,
|
|
969
1028
|
filesIndexed,
|
|
@@ -973,6 +1032,7 @@ class ExtractionOrchestrator {
|
|
|
973
1032
|
edgesCreated: totalEdges,
|
|
974
1033
|
errors,
|
|
975
1034
|
durationMs: Date.now() - startTime,
|
|
1035
|
+
filesWithParseWarnings: (0, parse_warnings_1.countParseWarningFiles)(errors),
|
|
976
1036
|
};
|
|
977
1037
|
}
|
|
978
1038
|
/**
|
|
@@ -1018,12 +1078,16 @@ class ExtractionOrchestrator {
|
|
|
1018
1078
|
edgesCreated: totalEdges,
|
|
1019
1079
|
errors,
|
|
1020
1080
|
durationMs: Date.now() - startTime,
|
|
1081
|
+
filesWithParseWarnings: (0, parse_warnings_1.countParseWarningFiles)(errors),
|
|
1021
1082
|
};
|
|
1022
1083
|
}
|
|
1023
1084
|
/**
|
|
1024
|
-
* Index a single file
|
|
1085
|
+
* Index a single file.
|
|
1086
|
+
*
|
|
1087
|
+
* `force` re-stores the extraction even when the content hash matches the
|
|
1088
|
+
* stored file (stale-extraction recovery, REQ-HTMLLEX-002).
|
|
1025
1089
|
*/
|
|
1026
|
-
async indexFile(relativePath) {
|
|
1090
|
+
async indexFile(relativePath, options = {}) {
|
|
1027
1091
|
const fullPath = (0, utils_1.validatePathWithinRoot)(this.rootDir, relativePath);
|
|
1028
1092
|
if (!fullPath) {
|
|
1029
1093
|
return {
|
|
@@ -1057,13 +1121,13 @@ class ExtractionOrchestrator {
|
|
|
1057
1121
|
durationMs: 0,
|
|
1058
1122
|
};
|
|
1059
1123
|
}
|
|
1060
|
-
return this.indexFileWithContent(relativePath, content, stats);
|
|
1124
|
+
return this.indexFileWithContent(relativePath, content, stats, options.force ?? false);
|
|
1061
1125
|
}
|
|
1062
1126
|
/**
|
|
1063
1127
|
* Index a single file with pre-read content and stats.
|
|
1064
1128
|
* Used by the parallel batch reader to avoid redundant file I/O.
|
|
1065
1129
|
*/
|
|
1066
|
-
async indexFileWithContent(relativePath, content, stats) {
|
|
1130
|
+
async indexFileWithContent(relativePath, content, stats, force = false) {
|
|
1067
1131
|
// Prevent path traversal
|
|
1068
1132
|
const fullPath = (0, utils_1.validatePathWithinRoot)(this.rootDir, relativePath);
|
|
1069
1133
|
if (!fullPath) {
|
|
@@ -1111,18 +1175,22 @@ class ExtractionOrchestrator {
|
|
|
1111
1175
|
const result = (0, tree_sitter_1.extractFromSource)(relativePath, content, language, frameworkNames);
|
|
1112
1176
|
// Store in database
|
|
1113
1177
|
if (result.nodes.length > 0 || result.errors.length === 0) {
|
|
1114
|
-
this.storeExtractionResult(relativePath, content, language, stats, result);
|
|
1178
|
+
this.storeExtractionResult(relativePath, content, language, stats, result, force);
|
|
1115
1179
|
}
|
|
1116
1180
|
return result;
|
|
1117
1181
|
}
|
|
1118
1182
|
/**
|
|
1119
|
-
* Store extraction result in database
|
|
1183
|
+
* Store extraction result in database.
|
|
1184
|
+
*
|
|
1185
|
+
* An unchanged content hash short-circuits the write unless `force` is set —
|
|
1186
|
+
* the stale-extraction recovery (REQ-HTMLLEX-002) must replace a stored
|
|
1187
|
+
* extraction whose hash is current but whose declarations were dropped.
|
|
1120
1188
|
*/
|
|
1121
|
-
storeExtractionResult(filePath, content, language, stats, result) {
|
|
1189
|
+
storeExtractionResult(filePath, content, language, stats, result, force = false) {
|
|
1122
1190
|
const contentHash = hashContent(content);
|
|
1123
1191
|
// Check if file already exists and hasn't changed
|
|
1124
1192
|
const existingFile = this.queries.getFileByPath(filePath);
|
|
1125
|
-
if (existingFile && existingFile.contentHash === contentHash) {
|
|
1193
|
+
if (!force && existingFile && existingFile.contentHash === contentHash) {
|
|
1126
1194
|
return; // No changes
|
|
1127
1195
|
}
|
|
1128
1196
|
// Delete existing data for this file
|
|
@@ -1186,6 +1254,7 @@ class ExtractionOrchestrator {
|
|
|
1186
1254
|
let filesChecked = 0;
|
|
1187
1255
|
let filesAdded = 0;
|
|
1188
1256
|
let filesModified = 0;
|
|
1257
|
+
let filesWithParseWarnings = 0;
|
|
1189
1258
|
let filesRemoved = 0;
|
|
1190
1259
|
let nodesUpdated = 0;
|
|
1191
1260
|
const changedFilePaths = [];
|
|
@@ -1195,6 +1264,10 @@ class ExtractionOrchestrator {
|
|
|
1195
1264
|
total: 0,
|
|
1196
1265
|
});
|
|
1197
1266
|
const filesToIndex = [];
|
|
1267
|
+
// REQ-HTMLLEX-002: files stored by an older extractor are re-extracted even
|
|
1268
|
+
// though their size/mtime/hash still match. Computed once per pass.
|
|
1269
|
+
const stale = this.isExtractionStale();
|
|
1270
|
+
const forced = new Set();
|
|
1198
1271
|
// === Filesystem reconcile (git-independent) ===
|
|
1199
1272
|
// The source of truth for "what changed" is the filesystem vs the indexed
|
|
1200
1273
|
// state — never git. We enumerate the current source files and reconcile
|
|
@@ -1225,6 +1298,15 @@ class ExtractionOrchestrator {
|
|
|
1225
1298
|
for (const filePath of currentFiles) {
|
|
1226
1299
|
const fullPath = path.join(this.rootDir, filePath);
|
|
1227
1300
|
const tracked = trackedMap.get(filePath);
|
|
1301
|
+
// (The existsSync guard skips files deleted on disk but still listed by
|
|
1302
|
+
// `git ls-files` — the removal loop above already dropped them.)
|
|
1303
|
+
if (stale && tracked && this.isStaleLanguage(tracked.language) && fs.existsSync(fullPath)) {
|
|
1304
|
+
filesToIndex.push(filePath);
|
|
1305
|
+
changedFilePaths.push(filePath);
|
|
1306
|
+
forced.add(filePath);
|
|
1307
|
+
filesModified++;
|
|
1308
|
+
continue;
|
|
1309
|
+
}
|
|
1228
1310
|
// Cheap pre-filter: an already-indexed file whose size AND mtime both match
|
|
1229
1311
|
// the DB is unchanged — skip it without reading or hashing. (A content
|
|
1230
1312
|
// change that preserves both exactly is the blind spot every mtime-based
|
|
@@ -1282,11 +1364,21 @@ class ExtractionOrchestrator {
|
|
|
1282
1364
|
total,
|
|
1283
1365
|
currentFile: filePath,
|
|
1284
1366
|
});
|
|
1285
|
-
const
|
|
1367
|
+
const force = forced.has(filePath);
|
|
1368
|
+
const result = await this.indexFile(filePath, { force });
|
|
1286
1369
|
nodesUpdated += result.nodes.length;
|
|
1370
|
+
if ((0, parse_warnings_1.countParseWarningFiles)(result.errors) > 0)
|
|
1371
|
+
filesWithParseWarnings++;
|
|
1372
|
+
}
|
|
1373
|
+
// Stamp once this full pass has re-extracted every stale file; a file that
|
|
1374
|
+
// failed is reported in its result and is not retried on every sync
|
|
1375
|
+
// (REQ-HTMLLEX-002.A2). File-scoped paths (indexFiles / indexFile) never stamp.
|
|
1376
|
+
if (stale) {
|
|
1377
|
+
this.stampExtractionVersion();
|
|
1287
1378
|
}
|
|
1288
1379
|
return {
|
|
1289
1380
|
filesChecked,
|
|
1381
|
+
filesWithParseWarnings,
|
|
1290
1382
|
filesAdded,
|
|
1291
1383
|
filesModified,
|
|
1292
1384
|
filesRemoved,
|