@stsepelin/checktrail 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +42 -0
- package/LICENSE +21 -0
- package/README.md +355 -0
- package/SECURITY.md +46 -0
- package/dist/src/actionlint-evidence.d.ts +2 -0
- package/dist/src/actionlint-evidence.js +166 -0
- package/dist/src/actionlint-inputs.d.ts +5 -0
- package/dist/src/actionlint-inputs.js +123 -0
- package/dist/src/actionlint-runner.d.ts +1 -0
- package/dist/src/actionlint-runner.js +122 -0
- package/dist/src/actionlint.d.ts +19 -0
- package/dist/src/actionlint.js +80 -0
- package/dist/src/adapters.d.ts +49 -0
- package/dist/src/adapters.js +430 -0
- package/dist/src/architecture.d.ts +107 -0
- package/dist/src/architecture.js +230 -0
- package/dist/src/clang-evidence.d.ts +2 -0
- package/dist/src/clang-evidence.js +194 -0
- package/dist/src/clang-protocol.d.ts +3 -0
- package/dist/src/clang-protocol.js +25 -0
- package/dist/src/clang-runner.d.ts +1 -0
- package/dist/src/clang-runner.js +159 -0
- package/dist/src/clang.d.ts +44 -0
- package/dist/src/clang.js +197 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +338 -0
- package/dist/src/config.d.ts +33 -0
- package/dist/src/config.js +140 -0
- package/dist/src/contract-schema.d.ts +85 -0
- package/dist/src/contract-schema.js +56 -0
- package/dist/src/contract-worker.d.ts +1 -0
- package/dist/src/contract-worker.js +123 -0
- package/dist/src/contracts.d.ts +22 -0
- package/dist/src/contracts.js +123 -0
- package/dist/src/django-evidence.d.ts +2 -0
- package/dist/src/django-evidence.js +100 -0
- package/dist/src/django-runner.d.ts +1 -0
- package/dist/src/django-runner.js +80 -0
- package/dist/src/django.d.ts +9 -0
- package/dist/src/django.js +50 -0
- package/dist/src/dotnet-compiler.d.ts +1 -0
- package/dist/src/dotnet-compiler.js +87 -0
- package/dist/src/dotnet-evidence.d.ts +2 -0
- package/dist/src/dotnet-evidence.js +127 -0
- package/dist/src/dotnet-runner.d.ts +1 -0
- package/dist/src/dotnet-runner.js +167 -0
- package/dist/src/dotnet.d.ts +65 -0
- package/dist/src/dotnet.js +120 -0
- package/dist/src/engine.d.ts +19 -0
- package/dist/src/engine.js +239 -0
- package/dist/src/environment.d.ts +6 -0
- package/dist/src/environment.js +36 -0
- package/dist/src/eslint-evidence.d.ts +2 -0
- package/dist/src/eslint-evidence.js +98 -0
- package/dist/src/eslint-runner.d.ts +1 -0
- package/dist/src/eslint-runner.js +61 -0
- package/dist/src/eslint.d.ts +2 -0
- package/dist/src/eslint.js +40 -0
- package/dist/src/evidence.d.ts +2 -0
- package/dist/src/evidence.js +313 -0
- package/dist/src/external-adapter.d.ts +164 -0
- package/dist/src/external-adapter.js +265 -0
- package/dist/src/external-evidence.d.ts +2 -0
- package/dist/src/external-evidence.js +127 -0
- package/dist/src/external-runner.d.ts +1 -0
- package/dist/src/external-runner.js +122 -0
- package/dist/src/fastapi-evidence.d.ts +2 -0
- package/dist/src/fastapi-evidence.js +126 -0
- package/dist/src/fastapi-runner.d.ts +1 -0
- package/dist/src/fastapi-runner.js +84 -0
- package/dist/src/fastapi.d.ts +10 -0
- package/dist/src/fastapi.js +52 -0
- package/dist/src/fetch-pack.d.ts +16 -0
- package/dist/src/fetch-pack.js +154 -0
- package/dist/src/finding-policy-schema.d.ts +146 -0
- package/dist/src/finding-policy-schema.js +70 -0
- package/dist/src/finding-policy.d.ts +62 -0
- package/dist/src/finding-policy.js +206 -0
- package/dist/src/git-selection.d.ts +3 -0
- package/dist/src/git-selection.js +229 -0
- package/dist/src/go-directives.d.ts +1 -0
- package/dist/src/go-directives.js +32 -0
- package/dist/src/go-scope.d.ts +11 -0
- package/dist/src/go-scope.js +122 -0
- package/dist/src/golangci-evidence.d.ts +2 -0
- package/dist/src/golangci-evidence.js +92 -0
- package/dist/src/golangci-runner.d.ts +1 -0
- package/dist/src/golangci-runner.js +124 -0
- package/dist/src/golangci.d.ts +2 -0
- package/dist/src/golangci.js +35 -0
- package/dist/src/guidance.d.ts +98 -0
- package/dist/src/guidance.js +247 -0
- package/dist/src/index.d.ts +31 -0
- package/dist/src/index.js +16 -0
- package/dist/src/inventory.d.ts +4 -0
- package/dist/src/inventory.js +94 -0
- package/dist/src/java-compiler.d.ts +1 -0
- package/dist/src/java-compiler.js +110 -0
- package/dist/src/java-evidence.d.ts +2 -0
- package/dist/src/java-evidence.js +114 -0
- package/dist/src/java-runner.d.ts +1 -0
- package/dist/src/java-runner.js +79 -0
- package/dist/src/java.d.ts +25 -0
- package/dist/src/java.js +102 -0
- package/dist/src/jest-evidence.d.ts +2 -0
- package/dist/src/jest-evidence.js +117 -0
- package/dist/src/jest-runner.d.ts +1 -0
- package/dist/src/jest-runner.js +46 -0
- package/dist/src/jest.d.ts +2 -0
- package/dist/src/jest.js +36 -0
- package/dist/src/junit.d.ts +18 -0
- package/dist/src/junit.js +157 -0
- package/dist/src/laravel-evidence.d.ts +2 -0
- package/dist/src/laravel-evidence.js +175 -0
- package/dist/src/laravel-runner.d.ts +1 -0
- package/dist/src/laravel-runner.js +168 -0
- package/dist/src/laravel.d.ts +8 -0
- package/dist/src/laravel.js +50 -0
- package/dist/src/local-tool.d.ts +1 -0
- package/dist/src/local-tool.js +19 -0
- package/dist/src/mcp.d.ts +14 -0
- package/dist/src/mcp.js +362 -0
- package/dist/src/mutation.d.ts +118 -0
- package/dist/src/mutation.js +370 -0
- package/dist/src/mypy-evidence.d.ts +2 -0
- package/dist/src/mypy-evidence.js +63 -0
- package/dist/src/mypy.d.ts +2 -0
- package/dist/src/mypy.js +59 -0
- package/dist/src/node-reporter.d.ts +1 -0
- package/dist/src/node-reporter.js +28 -0
- package/dist/src/nuxt-evidence.d.ts +2 -0
- package/dist/src/nuxt-evidence.js +160 -0
- package/dist/src/nuxt-protocol.d.ts +52 -0
- package/dist/src/nuxt-protocol.js +29 -0
- package/dist/src/nuxt-runner.d.ts +1 -0
- package/dist/src/nuxt-runner.js +165 -0
- package/dist/src/nuxt.d.ts +24 -0
- package/dist/src/nuxt.js +105 -0
- package/dist/src/output.d.ts +3 -0
- package/dist/src/output.js +48 -0
- package/dist/src/phpstan-evidence.d.ts +2 -0
- package/dist/src/phpstan-evidence.js +81 -0
- package/dist/src/phpstan.d.ts +2 -0
- package/dist/src/phpstan.js +51 -0
- package/dist/src/phpunit-evidence.d.ts +2 -0
- package/dist/src/phpunit-evidence.js +53 -0
- package/dist/src/phpunit.d.ts +2 -0
- package/dist/src/phpunit.js +58 -0
- package/dist/src/pint-evidence.d.ts +2 -0
- package/dist/src/pint-evidence.js +79 -0
- package/dist/src/pint-runner.d.ts +1 -0
- package/dist/src/pint-runner.js +53 -0
- package/dist/src/pint.d.ts +2 -0
- package/dist/src/pint.js +37 -0
- package/dist/src/playwright-evidence.d.ts +2 -0
- package/dist/src/playwright-evidence.js +127 -0
- package/dist/src/playwright-reporter.d.ts +10 -0
- package/dist/src/playwright-reporter.js +37 -0
- package/dist/src/playwright-runner.d.ts +1 -0
- package/dist/src/playwright-runner.js +61 -0
- package/dist/src/playwright.d.ts +2 -0
- package/dist/src/playwright.js +35 -0
- package/dist/src/policy-pack.d.ts +21 -0
- package/dist/src/policy-pack.js +41 -0
- package/dist/src/pytest-evidence.d.ts +2 -0
- package/dist/src/pytest-evidence.js +116 -0
- package/dist/src/pytest-runner.d.ts +1 -0
- package/dist/src/pytest-runner.js +48 -0
- package/dist/src/pytest.d.ts +2 -0
- package/dist/src/pytest.js +25 -0
- package/dist/src/report-validation.d.ts +129 -0
- package/dist/src/report-validation.js +27 -0
- package/dist/src/review.d.ts +270 -0
- package/dist/src/review.js +349 -0
- package/dist/src/ruby.d.ts +2 -0
- package/dist/src/ruby.js +25 -0
- package/dist/src/ruff-evidence.d.ts +2 -0
- package/dist/src/ruff-evidence.js +99 -0
- package/dist/src/ruff.d.ts +2 -0
- package/dist/src/ruff.js +40 -0
- package/dist/src/runner.d.ts +8 -0
- package/dist/src/runner.js +117 -0
- package/dist/src/runtime-inventory.d.ts +112 -0
- package/dist/src/runtime-inventory.js +200 -0
- package/dist/src/rust-dep-info.d.ts +1 -0
- package/dist/src/rust-dep-info.js +46 -0
- package/dist/src/rust-evidence.d.ts +2 -0
- package/dist/src/rust-evidence.js +157 -0
- package/dist/src/rust-runner.d.ts +1 -0
- package/dist/src/rust-runner.js +161 -0
- package/dist/src/rust.d.ts +7 -0
- package/dist/src/rust.js +39 -0
- package/dist/src/sarif.d.ts +86 -0
- package/dist/src/sarif.js +113 -0
- package/dist/src/schemas.d.ts +393 -0
- package/dist/src/schemas.js +222 -0
- package/dist/src/staticcheck-evidence.d.ts +2 -0
- package/dist/src/staticcheck-evidence.js +75 -0
- package/dist/src/swift.d.ts +2 -0
- package/dist/src/swift.js +20 -0
- package/dist/src/task-store.d.ts +37 -0
- package/dist/src/task-store.js +349 -0
- package/dist/src/tool-versions.d.ts +3 -0
- package/dist/src/tool-versions.js +260 -0
- package/dist/src/types.d.ts +157 -0
- package/dist/src/types.js +37 -0
- package/dist/src/typescript-build-evidence.d.ts +2 -0
- package/dist/src/typescript-build-evidence.js +86 -0
- package/dist/src/typescript-build-runner.d.ts +1 -0
- package/dist/src/typescript-build-runner.js +132 -0
- package/dist/src/typescript-build.d.ts +2 -0
- package/dist/src/typescript-build.js +41 -0
- package/dist/src/typescript.d.ts +2 -0
- package/dist/src/typescript.js +54 -0
- package/dist/src/validation-task-worker.d.ts +1 -0
- package/dist/src/validation-task-worker.js +205 -0
- package/dist/src/validation-tasks-protocol.d.ts +69 -0
- package/dist/src/validation-tasks-protocol.js +57 -0
- package/dist/src/validation-tasks.d.ts +11 -0
- package/dist/src/validation-tasks.js +144 -0
- package/dist/src/vitest-evidence.d.ts +2 -0
- package/dist/src/vitest-evidence.js +112 -0
- package/dist/src/vitest-runner.d.ts +1 -0
- package/dist/src/vitest-runner.js +48 -0
- package/dist/src/vitest.d.ts +2 -0
- package/dist/src/vitest.js +36 -0
- package/dist/src/vue-router-capture.d.ts +42 -0
- package/dist/src/vue-router-capture.js +87 -0
- package/dist/src/vue-router-evidence.d.ts +2 -0
- package/dist/src/vue-router-evidence.js +126 -0
- package/dist/src/vue-router-protocol.d.ts +63 -0
- package/dist/src/vue-router-protocol.js +44 -0
- package/dist/src/vue-router-runner.d.ts +1 -0
- package/dist/src/vue-router-runner.js +88 -0
- package/dist/src/vue-router.d.ts +23 -0
- package/dist/src/vue-router.js +108 -0
- package/dist/src/vue-tsc-runner.d.ts +1 -0
- package/dist/src/vue-tsc-runner.js +24 -0
- package/dist/src/workspace.d.ts +7 -0
- package/dist/src/workspace.js +53 -0
- package/docs/ACCEPTANCE.md +56 -0
- package/docs/ACTIONLINT.md +112 -0
- package/docs/ARCHITECTURE-POLICY.md +82 -0
- package/docs/ARCHITECTURE.md +122 -0
- package/docs/CLANG.md +113 -0
- package/docs/CLIENTS.md +109 -0
- package/docs/CONTRACTS.md +73 -0
- package/docs/DEPENDENCIES.md +42 -0
- package/docs/DJANGO.md +70 -0
- package/docs/DOTNET.md +114 -0
- package/docs/ENVIRONMENTS.md +52 -0
- package/docs/ESLINT.md +68 -0
- package/docs/EVALUATION.md +124 -0
- package/docs/EXECUTION.md +250 -0
- package/docs/EXTERNAL-ADAPTERS.md +170 -0
- package/docs/EXTERNAL-EVALUATION.md +155 -0
- package/docs/EXTERNAL-RUFF-EVALUATION.md +85 -0
- package/docs/FASTAPI.md +73 -0
- package/docs/FINDING-POLICY.md +67 -0
- package/docs/GO-RACE.md +19 -0
- package/docs/GO-SCOPE.md +63 -0
- package/docs/GOLANGCI-LINT.md +64 -0
- package/docs/GUIDANCE.md +46 -0
- package/docs/IMPACT-MEASUREMENT.md +97 -0
- package/docs/INSTALLATION.md +102 -0
- package/docs/JAVA.md +79 -0
- package/docs/JEST.md +36 -0
- package/docs/JUNIT.md +31 -0
- package/docs/LANGUAGES.md +113 -0
- package/docs/LARAVEL.md +111 -0
- package/docs/MCP-COMPATIBILITY.md +68 -0
- package/docs/MUTATIONS.md +93 -0
- package/docs/MYPY.md +37 -0
- package/docs/NATIVE-CI.md +96 -0
- package/docs/NUXT.md +123 -0
- package/docs/PACK-DISTRIBUTION.md +98 -0
- package/docs/PERFORMANCE.md +71 -0
- package/docs/PEST.md +36 -0
- package/docs/PHPSTAN.md +48 -0
- package/docs/PHPUNIT.md +32 -0
- package/docs/PINT.md +41 -0
- package/docs/PLAN.md +265 -0
- package/docs/PLAYWRIGHT.md +73 -0
- package/docs/POLICY-PACKS.md +106 -0
- package/docs/PRIOR-WORKFLOW-EVALUATION.md +116 -0
- package/docs/PUBLICATION.md +28 -0
- package/docs/PYTEST.md +51 -0
- package/docs/RELEASE.md +115 -0
- package/docs/RENAMING.md +55 -0
- package/docs/REVIEW-EXCHANGE.md +136 -0
- package/docs/RUBY.md +50 -0
- package/docs/RUFF.md +39 -0
- package/docs/RUNTIME-INVENTORY.md +56 -0
- package/docs/RUST.md +74 -0
- package/docs/SARIF.md +64 -0
- package/docs/STATUS.md +530 -0
- package/docs/SWIFT.md +48 -0
- package/docs/TASK-STORAGE.md +141 -0
- package/docs/TOOL-IDENTITY.md +30 -0
- package/docs/TYPESCRIPT-BUILD.md +55 -0
- package/docs/VALIDATION-TASKS.md +119 -0
- package/docs/VITEST.md +36 -0
- package/docs/VUE-ROUTER.md +130 -0
- package/docs/VUE-TSC.md +26 -0
- package/docs/WORKSPACES.md +81 -0
- package/docs/licenses/nodable-entities-3.0.0.txt +21 -0
- package/docs/measurements/client-claude-before-schema-fix-darwin-arm64-node26.json +60 -0
- package/docs/measurements/client-claude-darwin-arm64-node26.json +55 -0
- package/docs/measurements/client-codex-darwin-arm64-node26.json +175 -0
- package/docs/measurements/evaluation-corpus-repo-verifier.json +332 -0
- package/docs/measurements/evaluation-darwin-arm64-node26.json +1236 -0
- package/docs/measurements/evaluation-linux-arm64-node22.json +1236 -0
- package/docs/measurements/external-eslint-darwin-arm64-node26.json +11866 -0
- package/docs/measurements/external-eslint-linux-arm64-node22.json +11866 -0
- package/docs/measurements/external-eslint-preservation.json +1527 -0
- package/docs/measurements/external-ruff-darwin-arm64-node26.json +1031 -0
- package/docs/measurements/external-ruff-linux-arm64-node22.json +1031 -0
- package/docs/measurements/hosted-ci-52ba415.json +1005 -0
- package/docs/measurements/impact-darwin-arm64-node26.json +6685 -0
- package/docs/measurements/impact-linux-arm64-node22.json +6690 -0
- package/docs/measurements/performance-darwin-arm64-node26.json +845 -0
- package/docs/measurements/performance-linux-arm64-node22.json +845 -0
- package/docs/measurements/required-native-profiles.json +500 -0
- package/package.json +72 -0
- package/packs/actionlint.json +8 -0
- package/packs/cpp.json +8 -0
- package/packs/dotnet.json +8 -0
- package/packs/go.json +7 -0
- package/packs/java.json +8 -0
- package/packs/javascript-node.json +7 -0
- package/packs/nuxt.json +7 -0
- package/packs/php-pest.json +7 -0
- package/packs/php-phpunit.json +7 -0
- package/packs/python-pytest.json +7 -0
- package/packs/ruby.json +7 -0
- package/packs/rust.json +7 -0
- package/packs/swift.json +7 -0
- package/packs/vue-router.json +7 -0
- package/packs/vue.json +11 -0
- package/schemas/actionlint-config.schema.json +19 -0
- package/schemas/architecture-policy.schema.json +51 -0
- package/schemas/architecture-report.schema.json +123 -0
- package/schemas/architecture-summary.schema.json +82 -0
- package/schemas/clang-database.schema.json +23 -0
- package/schemas/config.schema.json +69 -0
- package/schemas/contract-bundle.schema.json +78 -0
- package/schemas/contract-report.schema.json +114 -0
- package/schemas/contract-summary.schema.json +72 -0
- package/schemas/dependency-graph.schema.json +65 -0
- package/schemas/django-config.schema.json +16 -0
- package/schemas/dotnet-config.schema.json +60 -0
- package/schemas/external-manifest.schema.json +97 -0
- package/schemas/external-reference.schema.json +10 -0
- package/schemas/external-request.schema.json +56 -0
- package/schemas/external-result.schema.json +111 -0
- package/schemas/fastapi-config.schema.json +27 -0
- package/schemas/finding-baseline.schema.json +92 -0
- package/schemas/finding-comparison-summary.schema.json +95 -0
- package/schemas/finding-comparison.schema.json +121 -0
- package/schemas/guidance-context.schema.json +34 -0
- package/schemas/guidance-report.schema.json +176 -0
- package/schemas/guidance-summary.schema.json +68 -0
- package/schemas/java-config.schema.json +24 -0
- package/schemas/junit.schema.json +69 -0
- package/schemas/laravel-config.schema.json +11 -0
- package/schemas/mutation-recipe.schema.json +31 -0
- package/schemas/mutation-report.schema.json +238 -0
- package/schemas/mutation-summary.schema.json +98 -0
- package/schemas/nuxt-config.schema.json +51 -0
- package/schemas/plan-summary.schema.json +63 -0
- package/schemas/plan.schema.json +244 -0
- package/schemas/policy-pack.schema.json +41 -0
- package/schemas/report-summary.schema.json +100 -0
- package/schemas/report.schema.json +463 -0
- package/schemas/review-assessment.schema.json +133 -0
- package/schemas/review-context-summary.schema.json +31 -0
- package/schemas/review-context.schema.json +254 -0
- package/schemas/review-receipt-summary.schema.json +104 -0
- package/schemas/review-receipt.schema.json +271 -0
- package/schemas/review-selection.schema.json +30 -0
- package/schemas/runtime-comparison-summary.schema.json +68 -0
- package/schemas/runtime-comparison.schema.json +127 -0
- package/schemas/runtime-inventory.schema.json +99 -0
- package/schemas/vue-router-config.schema.json +67 -0
- package/server.json +47 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Local validation task storage
|
|
2
|
+
|
|
3
|
+
`openTaskStore` is an optional library component for retaining validation results
|
|
4
|
+
on one local macOS or Linux machine. It is not connected to the CLI or MCP server.
|
|
5
|
+
The store itself does not advertise the MCP Tasks extension, execute jobs,
|
|
6
|
+
resume jobs, stop workers or act as a validation cache. The separate library
|
|
7
|
+
[validation worker](VALIDATION-TASKS.md) now connects it to native execution. See [MCP compatibility](MCP-COMPATIBILITY.md)
|
|
8
|
+
for the remaining wire and executor integration gates.
|
|
9
|
+
|
|
10
|
+
The implementation uses Node's built-in SQLite module, imported only when the
|
|
11
|
+
store is opened. Native tests cover Node 26.8.1 on macOS and Node 22.23.2 on Linux;
|
|
12
|
+
the latter reports SQLite as experimental. Earlier Node releases, Windows and
|
|
13
|
+
network filesystems are not verified storage profiles. Core imports do not load
|
|
14
|
+
SQLite, and no new npm runtime dependency is required.
|
|
15
|
+
|
|
16
|
+
## Use from the library
|
|
17
|
+
|
|
18
|
+
Choose a dedicated storage directory with an existing canonical parent, outside
|
|
19
|
+
the project's inventoried source. An existing store directory must belong to the
|
|
20
|
+
current user with mode `0700`; database files must be singly linked regular files
|
|
21
|
+
with mode `0600`. New directories and files use these modes. Symbolic links,
|
|
22
|
+
unexpected directory entries and unrelated nonempty databases are rejected.
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
import { createPlan, validate, openTaskStore } from "@stsepelin/checktrail";
|
|
26
|
+
|
|
27
|
+
const store = await openTaskStore({
|
|
28
|
+
root: projectRoot,
|
|
29
|
+
directory: privateStoreDirectory,
|
|
30
|
+
detailed: false,
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
const { plan } = await createPlan(projectRoot);
|
|
34
|
+
const task = store.create(plan.sourceFingerprint);
|
|
35
|
+
const report = await validate(projectRoot, { trusted: true });
|
|
36
|
+
const transition = store.complete(task.taskId, report);
|
|
37
|
+
if (transition !== "updated")
|
|
38
|
+
throw new Error("Task did not accept this result");
|
|
39
|
+
const retained = store.get(task.taskId);
|
|
40
|
+
// Consume retained.result.structuredContent as a report summary.
|
|
41
|
+
} finally {
|
|
42
|
+
store.close();
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Execution trust still comes from the caller. The caller must use the configured
|
|
47
|
+
root when validating; a source fingerprint is not proof of a particular root,
|
|
48
|
+
policy or environment. `complete` rejects a report whose initial source
|
|
49
|
+
fingerprint differs from the one recorded at creation. Full report shape is
|
|
50
|
+
validated, then the existing report projection is applied before serialization.
|
|
51
|
+
Summary databases never receive detailed report paths, commands or logs through
|
|
52
|
+
this API. Summary metadata can still reveal validation activity and check IDs.
|
|
53
|
+
|
|
54
|
+
Each database records a hash binding it to its canonical root and disclosure mode.
|
|
55
|
+
Reopening with a different root or mode fails, including an attempt to open a
|
|
56
|
+
detailed store as summary. Returned objects are detached snapshots. Stored
|
|
57
|
+
results remain historical evidence: reading them does not establish freshness
|
|
58
|
+
against current source, ignored dependencies or a changed toolchain.
|
|
59
|
+
|
|
60
|
+
## State and ownership
|
|
61
|
+
|
|
62
|
+
Creation commits before returning an opaque UUID. Result completion and
|
|
63
|
+
cancellation transitions use SQLite transactions. A completed result retains the
|
|
64
|
+
original validation outcome, including failed or incomplete outcomes; task
|
|
65
|
+
completion never means that checks passed.
|
|
66
|
+
|
|
67
|
+
Only one store handle may own a directory at a time, including within one process.
|
|
68
|
+
A separate SQLite database holds an exclusive lock for the handle's lifetime.
|
|
69
|
+
The operating system releases this lock when the owning process exits, including
|
|
70
|
+
SIGKILL. Contending opens fail immediately; they do not recover or replace a live
|
|
71
|
+
owner's tasks. There are no PID-reuse guesses or time-based ownership leases.
|
|
72
|
+
|
|
73
|
+
On reopening, retained terminal results remain unchanged. Unfinished tasks become
|
|
74
|
+
`completed` with a fixed `isError: true` tool result describing interruption, and
|
|
75
|
+
no structured validation report. This matches the distinction between tool errors
|
|
76
|
+
and JSON-RPC errors in the [Tasks specification](https://tasks.extensions.modelcontextprotocol.io/specification/2026-07-28/tasks).
|
|
77
|
+
Interrupted work is never resumed or reported as passing. This store does not
|
|
78
|
+
establish that child processes from a crashed executor have stopped; that requires
|
|
79
|
+
executor lifecycle integration before exposing a durable MCP handle.
|
|
80
|
+
|
|
81
|
+
Cancellation has two stages:
|
|
82
|
+
|
|
83
|
+
1. `requestCancellation(id)` reserves cancellation while status remains `working`.
|
|
84
|
+
Subsequent completion returns `cancellation-requested` and cannot store a result.
|
|
85
|
+
2. After the executor confirms workers have stopped, call `finishCancellation(id)`.
|
|
86
|
+
It changes status to `cancelled` without a report. Calling it without requesting
|
|
87
|
+
cancellation throws.
|
|
88
|
+
|
|
89
|
+
`interrupt(id)` records the fixed tool error for an execution that cannot produce
|
|
90
|
+
a retained report; it also respects terminal states and cancellation reservations.
|
|
91
|
+
All terminal states are immutable through the API. A late transition returns
|
|
92
|
+
`terminal`; missing or expired IDs throw. Repeated cancellation requests return
|
|
93
|
+
`cancellation-requested`. A restart during cancellation produces an interruption
|
|
94
|
+
error, not an unverified claim that worker termination succeeded. This profile
|
|
95
|
+
has no interactive input or JSON-RPC error state.
|
|
96
|
+
|
|
97
|
+
## Bounds and failure behavior
|
|
98
|
+
|
|
99
|
+
- At most 32 retained tasks per directory. Capacity exhaustion rejects creation;
|
|
100
|
+
unexpired tasks are never silently evicted.
|
|
101
|
+
- TTL defaults to 24 hours, measured from creation, and accepts integer milliseconds
|
|
102
|
+
from 1 through seven days. Wall-clock changes affect expiration. Expired IDs are
|
|
103
|
+
inaccessible; rows are pruned on creation or reopening.
|
|
104
|
+
- Each serialized tool result is limited to 256 KiB of UTF-8, including both text
|
|
105
|
+
and structured representations. Oversized completion throws and leaves the
|
|
106
|
+
task working. Retained payloads therefore total at most 8 MiB.
|
|
107
|
+
- SQLite uses 4 KiB pages with a 16 MiB database limit, DELETE journaling and FULL
|
|
108
|
+
synchronous commits. A rollback journal temporarily consumes additional bounded
|
|
109
|
+
space. The ownership database and accepted journal sizes have separate limits.
|
|
110
|
+
- Short synchronous database operations run on the caller's thread. The store
|
|
111
|
+
rejects malformed state, mismatched result representations and corrupt databases;
|
|
112
|
+
it does not erase an unreadable store and claim successful recovery.
|
|
113
|
+
|
|
114
|
+
File permissions and path checks assume trusted local ownership. They are not
|
|
115
|
+
protection against another process with the same user's privileges replacing or
|
|
116
|
+
modifying store files. Do not manipulate SQLite files while a handle is open.
|
|
117
|
+
SQLite secure deletion is enabled, but expiry is not a secure-erasure promise for
|
|
118
|
+
backups, filesystem snapshots or storage devices. Tests demonstrate process-crash
|
|
119
|
+
recovery, not arbitrary hardware or power-loss durability.
|
|
120
|
+
|
|
121
|
+
## Reproduce
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
npm run build
|
|
125
|
+
node --test dist/test/task-store.test.js
|
|
126
|
+
node scripts/verify-task-store-container.mjs
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Native regressions cover real validation and reopening, same-process and
|
|
130
|
+
cross-process contention, SIGKILL recovery, rollback of an uncommitted deletion,
|
|
131
|
+
completion/cancellation ordering, capacity and TTL, UTF-8 byte limits, disclosure
|
|
132
|
+
binding, private modes, links, foreign databases and malformed stored results.
|
|
133
|
+
The container helper additionally verifies a fresh offline production-only package
|
|
134
|
+
installation, native validation and reopening with networking disabled and the
|
|
135
|
+
installed package mounted read-only. Hosted CI remains a separate release gate.
|
|
136
|
+
|
|
137
|
+
Guard-removal experiments made the named cancellation and root-binding tests fail
|
|
138
|
+
for their intended conditions: a late completion was accepted after cancellation
|
|
139
|
+
reservation, and another project root could open the same store. Restoring each
|
|
140
|
+
guard restored the tests. The rollback fixture forces dirty pages to spill to disk
|
|
141
|
+
before killing its writer; it does not rely on an unflushed in-memory edit.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Tool identity evidence
|
|
2
|
+
|
|
3
|
+
Detailed plans include how selected tool identities will be obtained. Planning
|
|
4
|
+
does not execute a version command or import project code. Validation captures
|
|
5
|
+
identities only after operator trust, before running checks. Detailed reports
|
|
6
|
+
retain the version, evidence method, native probe result or package metadata path.
|
|
7
|
+
Summaries omit this information along with other tool/environment details.
|
|
8
|
+
|
|
9
|
+
Native probes use the same bounded process runner, environment filtering,
|
|
10
|
+
cancellation signal, overall deadline and output budget as validation commands.
|
|
11
|
+
Each probe has an 8 KiB output limit. Identical probes under the same declared environment fingerprint are reused within one run;
|
|
12
|
+
there is no persistent version cache. Missing, nonzero, truncated, cancelled or
|
|
13
|
+
unrecognized version output is not identified. A successful check with an
|
|
14
|
+
unidentified required tool becomes incomplete; an actual check failure stays a
|
|
15
|
+
failure.
|
|
16
|
+
|
|
17
|
+
Node uses the running engine's version because JavaScript child commands use that
|
|
18
|
+
same executable path. Installed JavaScript tools use their package metadata,
|
|
19
|
+
resolved within the configured root; both package name and version are checked.
|
|
20
|
+
Python, Go, PHP and Ruff use version commands. Pytest and mypy use Python's installed
|
|
21
|
+
distribution metadata through the same selected `python3` runtime.
|
|
22
|
+
|
|
23
|
+
These methods identify the engine runtime and primary tools. Go's recorded version
|
|
24
|
+
identifies the `go` command, not an independently replaced `gofmt` binary. JavaScript
|
|
25
|
+
transitive tools, language plugins, compilers loaded behind another wrapper,
|
|
26
|
+
dependency trees, executable hashes and service versions are not fully fingerprinted.
|
|
27
|
+
Package metadata can be changed independently of code and is labeled accordingly.
|
|
28
|
+
This is not binary attestation, hermetic reproducibility, or proof that any version
|
|
29
|
+
is compatible. Native fixture results and the support matrix remain the evidence
|
|
30
|
+
for compatibility.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# TypeScript project-reference validation
|
|
2
|
+
|
|
3
|
+
Select `javascript.typescript-build` on a solution root with `tsconfig.json` and
|
|
4
|
+
an installed TypeScript compiler inside the configured repository. Unlike the
|
|
5
|
+
single-project `javascript.typescript` check, this check inventories TypeScript
|
|
6
|
+
source throughout the solution directory, including nested package boundaries.
|
|
7
|
+
Every inventoried source must appear in a native compiler program. Unrelated or
|
|
8
|
+
excluded source beneath that directory therefore makes the check incomplete.
|
|
9
|
+
|
|
10
|
+
The adapter uses TypeScript's solution-builder API to follow references in native
|
|
11
|
+
dependency order. It forces a fresh build, enables checking even when `noCheck`
|
|
12
|
+
is configured, and supplies an in-memory output filesystem. Declarations flow
|
|
13
|
+
from producers to consumers without writing JavaScript, declarations or build
|
|
14
|
+
state to disk. `noEmit` is overridden for this virtual build; emission happens
|
|
15
|
+
only in memory. Existing build state is not read, and virtual outputs shadow
|
|
16
|
+
existing declarations. Other type-checking options remain project policy.
|
|
17
|
+
|
|
18
|
+
Compiler/configuration diagnostics fail and retain native TS rule IDs and source
|
|
19
|
+
locations where available. Missing runtime integration, unsupported compiler
|
|
20
|
+
version, malformed evidence or omitted source is incomplete. Cyclic references
|
|
21
|
+
produce the native compiler diagnostic. Empty solutions cannot pass.
|
|
22
|
+
|
|
23
|
+
The integration is verified and version-gated to TypeScript 6.0.3. It uses the
|
|
24
|
+
compiler API rather than replacing TypeScript semantics. It does not run custom
|
|
25
|
+
build scripts, verify emitted bundles, install dependencies or validate Vue SFCs.
|
|
26
|
+
Those require their corresponding separate checks. Installed compiler code runs
|
|
27
|
+
only with operator trust and is not sandboxed.
|
|
28
|
+
|
|
29
|
+
Compiler reads are constrained to the configured root, including canonical
|
|
30
|
+
symlink targets. Missing/outside referenced configuration is rejected. Virtual
|
|
31
|
+
outputs must stay within that root and are bounded to 64 MiB and 20,000 entries.
|
|
32
|
+
References can cross the selected solution directory while staying inside the
|
|
33
|
+
configured repository; source outside the selected directory is not thereby
|
|
34
|
+
claimed as completely inventoried or validated. Select its own project or a
|
|
35
|
+
common solution root when that coverage is required.
|
|
36
|
+
|
|
37
|
+
## Evidence
|
|
38
|
+
|
|
39
|
+
Synthetic native tests cover nested package boundaries, producer errors, changed
|
|
40
|
+
producer types breaking consumers, the corrected consumer, excluded source,
|
|
41
|
+
stale on-disk declarations/build state, cyclic references, escaped configuration
|
|
42
|
+
and output destinations, and planning without compiler execution. Preservation
|
|
43
|
+
assertions check original bytes and absent output paths. Parser tests cover
|
|
44
|
+
missing programs, duplicate/outside paths and partial evidence.
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
npm run build
|
|
48
|
+
node --test dist/test/typescript-build.test.js
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Current native evidence is TypeScript 6.0.3 on macOS. Hosted platform runs remain
|
|
52
|
+
separate verification gates.
|
|
53
|
+
|
|
54
|
+
References: [project references](https://www.typescriptlang.org/docs/handbook/project-references.html),
|
|
55
|
+
[compiler API](https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API).
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Durable local validation worker
|
|
2
|
+
|
|
3
|
+
`openValidationTasks` connects the shared validation engine to the bounded local
|
|
4
|
+
[task store](TASK-STORAGE.md). This is a library API, not a daemon or an MCP
|
|
5
|
+
extension. The CLI and MCP server still use their existing execution paths.
|
|
6
|
+
Standard MCP Tasks remains unadvertised until its wire contracts and SDK routing
|
|
7
|
+
work; see [MCP compatibility](MCP-COMPATIBILITY.md).
|
|
8
|
+
|
|
9
|
+
## Use
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
13
|
+
import { openValidationTasks } from "@stsepelin/checktrail";
|
|
14
|
+
|
|
15
|
+
const tasks = await openValidationTasks({
|
|
16
|
+
root: projectRoot,
|
|
17
|
+
directory: privateStoreDirectory,
|
|
18
|
+
allowExecution: true,
|
|
19
|
+
detailed: false,
|
|
20
|
+
timeoutMs: 30000,
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
let task = await tasks.start();
|
|
24
|
+
while (task.status === "working") {
|
|
25
|
+
await delay(250);
|
|
26
|
+
task = await tasks.get(task.taskId);
|
|
27
|
+
}
|
|
28
|
+
console.log(task);
|
|
29
|
+
} finally {
|
|
30
|
+
await tasks.close();
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The store directory must satisfy the canonical-parent, private-permission and
|
|
35
|
+
local-filesystem requirements in `TASK-STORAGE.md`. Keep it outside inventoried
|
|
36
|
+
source, or inside an excluded directory. Native lifecycle tests cover macOS with
|
|
37
|
+
Node 26.8.1 and Linux with Node 22.23.2. Node 22's built-in SQLite is experimental.
|
|
38
|
+
The worker calls the same engine and adapter registry; the new worker-specific
|
|
39
|
+
native fixtures exercise Node validation, rather than claiming another full
|
|
40
|
+
native-toolchain compatibility matrix.
|
|
41
|
+
|
|
42
|
+
Execution permission, output mode, timeout, Git base, policy overlay, explicit
|
|
43
|
+
environment values and external adapter registrations are startup settings.
|
|
44
|
+
`start()` takes no arguments that can change them. Opening with
|
|
45
|
+
`allowExecution: false` permits reading retained results but rejects execution.
|
|
46
|
+
Starting a worker does not evaluate project source. The helper uses the current
|
|
47
|
+
Node executable, empty Node startup arguments and a narrow inherited environment;
|
|
48
|
+
parent `NODE_OPTIONS` preloads are not forwarded. Project execution still has the
|
|
49
|
+
user's privileges and is not sandboxed.
|
|
50
|
+
|
|
51
|
+
## Operations and results
|
|
52
|
+
|
|
53
|
+
- `start()` performs execution-free planning, durably creates a task, then starts
|
|
54
|
+
validation. It returns the working task with an opaque ID. One validation or
|
|
55
|
+
pending start is allowed at a time; overlap is rejected, not silently queued.
|
|
56
|
+
- `get(id)` returns a detached snapshot while validation continues. Completed
|
|
57
|
+
reports retain their native `passed`, `failed` or `incomplete` outcome. A task
|
|
58
|
+
with status `completed` does not by itself indicate that checks passed.
|
|
59
|
+
- `cancel(id)` reserves cancellation, aborts the shared engine, waits for process
|
|
60
|
+
cleanup and then returns the terminal task. Completed tasks stay unchanged.
|
|
61
|
+
- `close()` rejects new work, stops active validation, waits for cleanup and
|
|
62
|
+
releases the store. It is idempotent. Always await it during normal shutdown.
|
|
63
|
+
|
|
64
|
+
The client wrapper bounds pending requests at 32. The store bounds retained tasks,
|
|
65
|
+
result bytes and disk pages separately. Task TTL is the store default of 24 hours;
|
|
66
|
+
this worker API does not accept per-call TTL overrides. Validation uses the
|
|
67
|
+
engine's timeout contract, defaulting to 30 seconds and accepting at most 120.
|
|
68
|
+
Timeouts retain native incomplete evidence when it fits the configured result
|
|
69
|
+
projection. Invalid, missing and expired IDs fail without exposing filesystem
|
|
70
|
+
paths or raw exceptions.
|
|
71
|
+
|
|
72
|
+
If validation throws, source identity no longer matches the task, or the selected
|
|
73
|
+
result projection exceeds the store limit, the task retains an explicit
|
|
74
|
+
`isError: true` interruption result with no structured validation report. A large
|
|
75
|
+
detailed report can exceed the limit even when its summary fits. A persistence
|
|
76
|
+
failure that also prevents recording interruption shuts down the worker; it is
|
|
77
|
+
not converted into a passing result. Historical results are not revalidated or
|
|
78
|
+
used as a cache on retrieval.
|
|
79
|
+
|
|
80
|
+
## Ownership and parent loss
|
|
81
|
+
|
|
82
|
+
A child Node process owns both the SQLite handle and the active engine call. The
|
|
83
|
+
parent communicates through a local IPC channel; raw tool output is not forwarded
|
|
84
|
+
to the parent's stdout or stderr. The worker keeps the store's exclusive lock
|
|
85
|
+
until cleanup finishes, preventing a new owner from taking over live work.
|
|
86
|
+
|
|
87
|
+
When the parent disconnects or is killed, the worker detects the lost IPC channel,
|
|
88
|
+
reserves cancellation, aborts validation and closes the store after cleanup. Native
|
|
89
|
+
tests confirm that the running test and its ordinary descendant stop before the
|
|
90
|
+
worker's normal shutdown completes. SIGTERM and SIGINT to the worker use the same
|
|
91
|
+
cleanup path. The caller waits for process exit; it does not depend exclusively
|
|
92
|
+
on Node emitting `close` after simultaneous IPC disconnects.
|
|
93
|
+
|
|
94
|
+
This behavior covers loss of the parent while its worker survives to clean up.
|
|
95
|
+
It is not proof of cleanup if the worker itself is forcibly killed, native code
|
|
96
|
+
escapes its process group, or the operating system fails. After an abrupt store
|
|
97
|
+
owner death, the existing store recovery records unfinished work as an
|
|
98
|
+
interruption error and never resumes it. Broader orphan-process supervision is a
|
|
99
|
+
separate capability; no stronger guarantee is advertised here.
|
|
100
|
+
|
|
101
|
+
## Reproduce
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
npm run build
|
|
105
|
+
node --test --test-timeout=15000 dist/test/validation-tasks.test.js
|
|
106
|
+
node scripts/verify-task-store-container.mjs
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
The native regressions exercise passing/failing/empty validation, retained results,
|
|
110
|
+
read-only reopening, trust and preload boundaries, responsive polling, overlap,
|
|
111
|
+
explicit cancellation, shutdown, parent SIGKILL, native descendants, timeout,
|
|
112
|
+
oversized output and close during planning. The container helper additionally
|
|
113
|
+
checks this API from a fresh offline production-only installation, with networking
|
|
114
|
+
disabled and the installed package mounted read-only. The corresponding hosted
|
|
115
|
+
Linux Node 22 step passed at `52ba415`; see `NATIVE-CI.md`.
|
|
116
|
+
|
|
117
|
+
Removing the worker's parent-disconnect handler made the named SIGKILL regression
|
|
118
|
+
fail because native descendants remained alive. Restoring the handler restored
|
|
119
|
+
the native suite. This experiment checks cleanup behavior, not just stored status.
|
package/docs/VITEST.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Vitest validation
|
|
2
|
+
|
|
3
|
+
Select `javascript.vitest` explicitly in the root policy. The adapter resolves an
|
|
4
|
+
installed Vitest within the configured root, including hoisted installations.
|
|
5
|
+
Planning reads paths only. Execution requires operator trust because configuration,
|
|
6
|
+
test code, plugins and setup/teardown hooks can run arbitrary code.
|
|
7
|
+
|
|
8
|
+
Scope is the project's inventoried `.test` and `.spec` files with JavaScript or
|
|
9
|
+
TypeScript extensions, including module/CommonJS and JSX/TSX variants. Each planned
|
|
10
|
+
file must appear exactly once in the native report. Configuration exclusions and
|
|
11
|
+
filters that omit a file produce incomplete evidence. A file executed repeatedly
|
|
12
|
+
through multiple Vitest projects is currently ambiguous and also incomplete.
|
|
13
|
+
|
|
14
|
+
The child invokes the public Vitest API in run mode with a JSON reporter explicitly
|
|
15
|
+
directed to stdout. It overrides configured report output files, watch mode,
|
|
16
|
+
snapshot updating, focused-test allowance, result caches and unhandled-error
|
|
17
|
+
bypasses. Automatic installation through Vitest's package installer is disabled;
|
|
18
|
+
missing dependencies must be prepared by the operator. User code can still write
|
|
19
|
+
files or access networks. This is not an execution sandbox.
|
|
20
|
+
|
|
21
|
+
Evidence reconciles native totals with per-assertion statuses and checks file
|
|
22
|
+
identity and suite counters. Empty, all-skipped, unfinished, malformed and
|
|
23
|
+
truncated reports cannot pass. Successful assertions cannot hide a failing suite,
|
|
24
|
+
unhandled error or nonzero process exit. Test logs that corrupt the JSON output
|
|
25
|
+
produce incomplete evidence rather than being guessed around. Detailed reports
|
|
26
|
+
retain native diagnostics; summaries omit them.
|
|
27
|
+
|
|
28
|
+
The integration suite exercises Vitest 5.0.1 with Vite 8.3.0, using original
|
|
29
|
+
synthetic tests. It covers passing/failing assertions, skips/todos, excluded files,
|
|
30
|
+
focused tests, snapshot protection, unhandled rejections and missing environment
|
|
31
|
+
packages. Other versions, browser mode, custom pools and workspace multi-project
|
|
32
|
+
duplication need separate verification. This check does not establish coverage
|
|
33
|
+
quality or type-checking support.
|
|
34
|
+
|
|
35
|
+
References: [Vitest reporters](https://vitest.dev/guide/reporters),
|
|
36
|
+
[Vitest API](https://vitest.dev/advanced/api/).
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Vue Router testing assembly profile
|
|
2
|
+
|
|
3
|
+
`javascript.vue-router` creates a native memory router, awaits an explicitly
|
|
4
|
+
selected registration function, captures its final route records and checks
|
|
5
|
+
declared URL probes using native resolution. A pass means every native record
|
|
6
|
+
participated in a probe and all expected matched chains agreed. It does not prove
|
|
7
|
+
that the selected testing assembly matches the application's production assembly.
|
|
8
|
+
Reuse application registration code instead of maintaining a second route table.
|
|
9
|
+
|
|
10
|
+
The verified versions are Vue Router 5.3.1 and Vue 3.5.43, with Node 26.8.1 on
|
|
11
|
+
macOS arm64 and Node 22.23.2 on Linux arm64. Other framework versions are unavailable
|
|
12
|
+
until verified. Framework dependencies must already exist inside the operator
|
|
13
|
+
root; the engine never installs them. Fixture dependencies are locked separately
|
|
14
|
+
in `scripts/vue-router-tools/package-lock.json` and are not distributed as runtime
|
|
15
|
+
dependencies of Checktrail.
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
Select `javascript.vue-router` in `checktrail.json`, or use the pinned
|
|
20
|
+
`packs/vue-router.json` profile. Add `checktrail.vue-router.json` in that project:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"schemaVersion": 1,
|
|
25
|
+
"module": "routes.mjs",
|
|
26
|
+
"attribute": "configure",
|
|
27
|
+
"assembly": "example.catalog",
|
|
28
|
+
"environment": "test",
|
|
29
|
+
"strict": false,
|
|
30
|
+
"sensitive": false,
|
|
31
|
+
"probes": [
|
|
32
|
+
{
|
|
33
|
+
"path": "/catalog",
|
|
34
|
+
"matched": [{ "path": "/catalog", "name": "catalog" }]
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The inventoried Node-compatible module exports the named function:
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
export async function configure(router) {
|
|
44
|
+
router.addRoute({
|
|
45
|
+
path: "/catalog",
|
|
46
|
+
name: "catalog",
|
|
47
|
+
component: { render: () => null },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Use `name: null` for unnamed records. Each probe contains the complete ordered
|
|
53
|
+
matched chain, including parents and default children. Aliases are separate native
|
|
54
|
+
records and require participation too. A negative probe uses `matched: []`;
|
|
55
|
+
at least one probe must expect a match. Removed or replaced declarations that
|
|
56
|
+
are absent from the final router are not counted. Shadowed records that cannot
|
|
57
|
+
participate in any selected probe prevent a complete result.
|
|
58
|
+
|
|
59
|
+
Planning reads configuration without importing the module. Execution requires
|
|
60
|
+
the normal operator trust setting. The collector protects `NODE_ENV=test` and
|
|
61
|
+
clears `NODE_OPTIONS`; permitted environment inputs remain available to startup.
|
|
62
|
+
Startup and imports execute trusted code with the process user's privileges.
|
|
63
|
+
They can perform I/O or invoke other router methods themselves. This is not a
|
|
64
|
+
sandbox. Node must be able to load the module and its dependencies; the collector
|
|
65
|
+
does not build TypeScript/SFC files or install a loader.
|
|
66
|
+
|
|
67
|
+
## Evidence and limits
|
|
68
|
+
|
|
69
|
+
The runtime inventory preserves native record order and multiplicity. Each entry
|
|
70
|
+
records path/name, alias identity, named view keys, canonical JSON metadata/static
|
|
71
|
+
redirect data, per-record guard function names, child count and the configured
|
|
72
|
+
global strict/sensitive options. Per-record matcher overrides are exercised by
|
|
73
|
+
probes but are not separately serialized. Component bodies, guard bodies, closure
|
|
74
|
+
captures, props, global navigation hooks and scroll behavior are not captured.
|
|
75
|
+
Changing a function body without changing the projected fields can leave the
|
|
76
|
+
inventory unchanged. Use runtime comparison to review changes in this projection.
|
|
77
|
+
|
|
78
|
+
The collector calls `resolve`, not navigation: it does not follow redirects, run
|
|
79
|
+
navigation guards, load lazy views, render components or initialize a browser.
|
|
80
|
+
Static redirect targets are recorded without proving they exist. Dynamic redirects,
|
|
81
|
+
symbol route names and unsupported metadata make capture incomplete. Metadata
|
|
82
|
+
supports bounded finite JSON values in plain objects and dense arrays; functions,
|
|
83
|
+
custom prototypes, symbol keys, computed properties, hidden object properties and
|
|
84
|
+
extra array properties are unsupported. Metadata and redirects are limited to
|
|
85
|
+
eight levels, 1,024 visited values, 64 members per object/array and 4,096 serialized
|
|
86
|
+
characters. The whole run retains shared process time/output limits.
|
|
87
|
+
|
|
88
|
+
Profiles have at most 256 unique probe paths, 32 records per expected chain and
|
|
89
|
+
64 KiB of encoded configuration. Native capture permits 2,048 route records.
|
|
90
|
+
Empty routers, uncovered records, unsupported projections and malformed accounting
|
|
91
|
+
cannot pass. A known probe mismatch is a failed finding even if other evidence is
|
|
92
|
+
incomplete; `findingsComplete` records that distinction. Native resolution only
|
|
93
|
+
establishes behavior for the supplied URLs, not every path/parameter combination.
|
|
94
|
+
|
|
95
|
+
Detailed reports include route metadata and configured probe paths. Summary
|
|
96
|
+
CLI/MCP output omits them, and MCP arguments cannot enable detailed output.
|
|
97
|
+
The profile does not infer authorization, server endpoints, Nuxt page generation,
|
|
98
|
+
Nuxt plugins/middleware or application integration. Those need separate profiles
|
|
99
|
+
and native evidence.
|
|
100
|
+
|
|
101
|
+
## Reproduce native evidence
|
|
102
|
+
|
|
103
|
+
From the checkout, prepare the development fixture tools explicitly:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
mkdir -p .checktrail/vue-router-tools
|
|
107
|
+
cp scripts/vue-router-tools/package.json scripts/vue-router-tools/package-lock.json .checktrail/vue-router-tools/
|
|
108
|
+
npm ci --prefix .checktrail/vue-router-tools --ignore-scripts --no-audit --no-fund
|
|
109
|
+
npm run build
|
|
110
|
+
node --test dist/test/vue-router.test.js
|
|
111
|
+
node scripts/verify-vue-router-container.mjs
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The container helper requires its pinned Node image to be available. Validation
|
|
115
|
+
uses disabled container networking and read-only source mounts. It runs native
|
|
116
|
+
fixtures, installs a freshly packed package offline, and exercises the public
|
|
117
|
+
`examples/vue-router` fixture through installed library, CLI and MCP entry points.
|
|
118
|
+
An intentionally changed route name must fail before the fixture is restored.
|
|
119
|
+
The source tests cover async registration, nested default children, aliases,
|
|
120
|
+
removed records, metadata changes, unprobed and shadowed records, unsupported
|
|
121
|
+
data, evidence tampering, version gates, trust, protected environment and output
|
|
122
|
+
privacy. Hosted CI is configured separately and has not been run remotely.
|
|
123
|
+
|
|
124
|
+
A manual mutation removed the requirement that every record participate in a
|
|
125
|
+
probe. The native uncovered-record regression then failed specifically because
|
|
126
|
+
the result changed from incomplete to passed. Restoring the guard restored the
|
|
127
|
+
passing native suite; container and package verification ran afterward.
|
|
128
|
+
|
|
129
|
+
Reference: [Vue Router API](https://router.vuejs.org/api/). Compatibility claims
|
|
130
|
+
above come from the pinned installed runtime and native tests.
|
package/docs/VUE-TSC.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Vue type checking
|
|
2
|
+
|
|
3
|
+
Select `javascript.vue-tsc` explicitly. A project-local `tsconfig.json` and an
|
|
4
|
+
installed `vue-tsc` with TypeScript are required. Installations may be hoisted
|
|
5
|
+
within the configured root; escaping symlinks are rejected. Planning does not
|
|
6
|
+
load compiler code or execute configuration. Execution requires operator trust.
|
|
7
|
+
|
|
8
|
+
The adapter calls the installed Vue compiler with no emit, no incremental state,
|
|
9
|
+
`noCheck` disabled and a compiler file list. Every inventoried `.vue`, `.ts`,
|
|
10
|
+
`.tsx`, `.mts` and `.cts` file must appear in that list. A zero exit with excluded
|
|
11
|
+
source is incomplete. Compilation errors fail the check. Vue compiler options
|
|
12
|
+
are resolved through the installed language core, including inherited options;
|
|
13
|
+
`skipTemplateCodegen` is rejected. Other strictness and suppression choices follow
|
|
14
|
+
project configuration and are not a guarantee of complete semantic coverage.
|
|
15
|
+
|
|
16
|
+
Verified native versions: vue-tsc 3.3.11, Vue 3.5.43 and TypeScript 6.0.3. Fixtures
|
|
17
|
+
exercise script and template type errors, a valid SFC, excluded source, inherited
|
|
18
|
+
template disabling, filenames with spaces, and no emitted or incremental output.
|
|
19
|
+
Project references/composite builds, Nuxt-generated configuration, custom Vue
|
|
20
|
+
language plugins, custom file extensions and alternate loaders require separate
|
|
21
|
+
verification. A library check does not start Nuxt or generate its application
|
|
22
|
+
types. Missing generated configuration remains a compiler failure.
|
|
23
|
+
|
|
24
|
+
The installed compiler and project plugins run with the user's privileges.
|
|
25
|
+
See the official [Vue TypeScript guide](https://vuejs.org/guide/typescript/overview.html)
|
|
26
|
+
for the distinction between transpilation and SFC type checking.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Workspace and Git selection
|
|
2
|
+
|
|
3
|
+
Checks still cover whole configured projects. Optional `--base REVISION` selects
|
|
4
|
+
changed projects and their declared transitive consumers:
|
|
5
|
+
|
|
6
|
+
```json
|
|
7
|
+
{
|
|
8
|
+
"schemaVersion": 1,
|
|
9
|
+
"projects": [
|
|
10
|
+
{ "path": "library", "checks": ["javascript.node-test"] },
|
|
11
|
+
{ "path": "web", "checks": ["javascript.node-test"] }
|
|
12
|
+
],
|
|
13
|
+
"workspace": {
|
|
14
|
+
"complete": true,
|
|
15
|
+
"dependencies": [{ "consumer": "web", "producer": "library" }]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`complete` asserts that the maintainer has listed every relevant dependency
|
|
21
|
+
between configured projects. The engine does not infer imports or prove the
|
|
22
|
+
graph complete. Edges must name configured projects; duplicate and self edges
|
|
23
|
+
are rejected. Cycles terminate and include every reachable consumer.
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
node dist/src/cli.js plan --root /path/to/worktree --base main --detailed
|
|
27
|
+
node dist/src/cli.js run --root /path/to/worktree --base main --trust-project
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The library accepts `base` in plan/validation options. For MCP, configure
|
|
31
|
+
`serve --base REVISION` at startup; tool calls cannot override it. Without a
|
|
32
|
+
base, the complete configured plan runs regardless of workspace declarations.
|
|
33
|
+
|
|
34
|
+
## Comparison and fallback
|
|
35
|
+
|
|
36
|
+
The reader resolves base and HEAD to immutable commit IDs, reads committed trees
|
|
37
|
+
and NUL-delimited index entries, and hashes inventoried working files directly.
|
|
38
|
+
This covers committed changes, staged changes, dirty or deleted files, untracked
|
|
39
|
+
inventoried files and executable modes. Renames include both old and new owners.
|
|
40
|
+
The longest configured project directory owns a changed file.
|
|
41
|
+
|
|
42
|
+
The full configured plan is retained for missing Git/history/base, an incomplete
|
|
43
|
+
graph, no changed paths, a root or hidden configuration change, an unowned path,
|
|
44
|
+
a root-project change, unsupported index entries, unresolved merges, submodules,
|
|
45
|
+
tracked excluded content, inspection limits or inconsistent Git metadata. The
|
|
46
|
+
configured root must be the worktree root. Fallback is a broader validation run,
|
|
47
|
+
not a passing empty selection. It does not add unconfigured checks.
|
|
48
|
+
|
|
49
|
+
Git inspection uses a host executable outside the project and bounded read-only
|
|
50
|
+
commands. It disables filesystem monitors, hooks, lazy fetch and replacement
|
|
51
|
+
objects, and does not invoke working-tree diff, clean or text conversion filters.
|
|
52
|
+
Raw content comparison can select additional files when Git attributes transform
|
|
53
|
+
content; it cannot establish a normalized checkout identity. `.gitignore` is not
|
|
54
|
+
interpreted. The inventory's fixed exclusions still apply.
|
|
55
|
+
|
|
56
|
+
Each Git inspection has a five-second/four-MiB process-output budget, separate
|
|
57
|
+
from native validation execution. Entries and working-file reads use the same
|
|
58
|
+
20,000-entry, eight-MiB-file and 64-MiB-total limits as inventory. Post-run Git
|
|
59
|
+
identity checks run in addition to the source snapshot. Changed HEAD/index or
|
|
60
|
+
unreadable metadata prevents an aggregate pass, even if source bytes stayed equal.
|
|
61
|
+
|
|
62
|
+
Detailed plans/reports record changed paths, selected projects, resolved commits,
|
|
63
|
+
Git version, an index fingerprint and a digest identifying the canonical worktree
|
|
64
|
+
root. Linked worktrees have distinct identities. Summaries retain selection mode,
|
|
65
|
+
reason and counts only. Neither identity is a hermetic build or dependency hash.
|
|
66
|
+
|
|
67
|
+
## Evidence
|
|
68
|
+
|
|
69
|
+
Native synthetic tests exercise committed/index/working changes, newline paths,
|
|
70
|
+
renames, modes, linked worktrees, unresolved merges, tracked exclusions and
|
|
71
|
+
project-configured filter commands that must never run. A changed library selects
|
|
72
|
+
its consumer and exposes a real assertion failure. CLI/MCP scope and strict MCP
|
|
73
|
+
startup ownership are covered. Current host evidence is macOS with Git 2.54.0;
|
|
74
|
+
the paired [impact measurement](IMPACT-MEASUREMENT.md) additionally exercises
|
|
75
|
+
its documented corpus on Linux arm64 with Git 2.52.0. That narrower corpus does
|
|
76
|
+
not establish the full Git edge-case matrix on Linux. Other Git/OS combinations
|
|
77
|
+
need their own integration runs.
|
|
78
|
+
|
|
79
|
+
References: [tree entries](https://git-scm.com/docs/git-ls-tree),
|
|
80
|
+
[index entries](https://git-scm.com/docs/git-ls-files),
|
|
81
|
+
[revision resolution](https://git-scm.com/docs/git-rev-parse).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nodable
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|