@cairn-tool/cairn 2.0.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/.markdownlintrc +7 -0
- package/LICENSE +21 -0
- package/README.md +1431 -0
- package/dist/agent/audit/baseline.d.ts +69 -0
- package/dist/agent/audit/baseline.js +128 -0
- package/dist/agent/audit/baseline.js.map +1 -0
- package/dist/agent/audit/index.d.ts +126 -0
- package/dist/agent/audit/index.js +625 -0
- package/dist/agent/audit/index.js.map +1 -0
- package/dist/agent/import/detect.d.ts +49 -0
- package/dist/agent/import/detect.js +159 -0
- package/dist/agent/import/detect.js.map +1 -0
- package/dist/agent/import/normalize.d.ts +72 -0
- package/dist/agent/import/normalize.js +475 -0
- package/dist/agent/import/normalize.js.map +1 -0
- package/dist/agent/install/index.d.ts +211 -0
- package/dist/agent/install/index.js +907 -0
- package/dist/agent/install/index.js.map +1 -0
- package/dist/agent/manifest.d.ts +75 -0
- package/dist/agent/manifest.js +210 -0
- package/dist/agent/manifest.js.map +1 -0
- package/dist/agent/marketplace/index.d.ts +69 -0
- package/dist/agent/marketplace/index.js +212 -0
- package/dist/agent/marketplace/index.js.map +1 -0
- package/dist/agent/marketplace/spec.d.ts +48 -0
- package/dist/agent/marketplace/spec.js +237 -0
- package/dist/agent/marketplace/spec.js.map +1 -0
- package/dist/agent/output.d.ts +36 -0
- package/dist/agent/output.js +56 -0
- package/dist/agent/output.js.map +1 -0
- package/dist/agent/overlays.d.ts +38 -0
- package/dist/agent/overlays.js +223 -0
- package/dist/agent/overlays.js.map +1 -0
- package/dist/agent/package/index.d.ts +105 -0
- package/dist/agent/package/index.js +339 -0
- package/dist/agent/package/index.js.map +1 -0
- package/dist/agent/package/tar.d.ts +36 -0
- package/dist/agent/package/tar.js +137 -0
- package/dist/agent/package/tar.js.map +1 -0
- package/dist/agent/parser.d.ts +13 -0
- package/dist/agent/parser.js +559 -0
- package/dist/agent/parser.js.map +1 -0
- package/dist/agent/render.d.ts +16 -0
- package/dist/agent/render.js +721 -0
- package/dist/agent/render.js.map +1 -0
- package/dist/agent/sarif.d.ts +18 -0
- package/dist/agent/sarif.js +56 -0
- package/dist/agent/sarif.js.map +1 -0
- package/dist/agent/scaffold.d.ts +86 -0
- package/dist/agent/scaffold.js +250 -0
- package/dist/agent/scaffold.js.map +1 -0
- package/dist/agent/targets/antigravity.d.ts +17 -0
- package/dist/agent/targets/antigravity.js +218 -0
- package/dist/agent/targets/antigravity.js.map +1 -0
- package/dist/agent/targets/claude-code.d.ts +2 -0
- package/dist/agent/targets/claude-code.js +220 -0
- package/dist/agent/targets/claude-code.js.map +1 -0
- package/dist/agent/targets/codex.d.ts +2 -0
- package/dist/agent/targets/codex.js +212 -0
- package/dist/agent/targets/codex.js.map +1 -0
- package/dist/agent/targets/cursor.d.ts +2 -0
- package/dist/agent/targets/cursor.js +210 -0
- package/dist/agent/targets/cursor.js.map +1 -0
- package/dist/agent/targets/index.d.ts +31 -0
- package/dist/agent/targets/index.js +64 -0
- package/dist/agent/targets/index.js.map +1 -0
- package/dist/agent/targets/opencode.d.ts +15 -0
- package/dist/agent/targets/opencode.js +215 -0
- package/dist/agent/targets/opencode.js.map +1 -0
- package/dist/agent/targets/schema.d.ts +315 -0
- package/dist/agent/targets/schema.js +179 -0
- package/dist/agent/targets/schema.js.map +1 -0
- package/dist/agent/test/assert.d.ts +46 -0
- package/dist/agent/test/assert.js +288 -0
- package/dist/agent/test/assert.js.map +1 -0
- package/dist/agent/test/index.d.ts +73 -0
- package/dist/agent/test/index.js +181 -0
- package/dist/agent/test/index.js.map +1 -0
- package/dist/agent/test/schema.d.ts +81 -0
- package/dist/agent/test/schema.js +235 -0
- package/dist/agent/test/schema.js.map +1 -0
- package/dist/agent/types.d.ts +204 -0
- package/dist/agent/types.js +11 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/upgrade.d.ts +29 -0
- package/dist/agent/upgrade.js +72 -0
- package/dist/agent/upgrade.js.map +1 -0
- package/dist/agent/writer.d.ts +30 -0
- package/dist/agent/writer.js +73 -0
- package/dist/agent/writer.js.map +1 -0
- package/dist/archive/db.d.ts +20 -0
- package/dist/archive/db.js +98 -0
- package/dist/archive/db.js.map +1 -0
- package/dist/archive/progress.d.ts +62 -0
- package/dist/archive/progress.js +151 -0
- package/dist/archive/progress.js.map +1 -0
- package/dist/archive/query.d.ts +86 -0
- package/dist/archive/query.js +241 -0
- package/dist/archive/query.js.map +1 -0
- package/dist/archive/run.d.ts +91 -0
- package/dist/archive/run.js +331 -0
- package/dist/archive/run.js.map +1 -0
- package/dist/archive/segments.d.ts +89 -0
- package/dist/archive/segments.js +144 -0
- package/dist/archive/segments.js.map +1 -0
- package/dist/archive/sets.d.ts +58 -0
- package/dist/archive/sets.js +344 -0
- package/dist/archive/sets.js.map +1 -0
- package/dist/archive/tar-read.d.ts +35 -0
- package/dist/archive/tar-read.js +90 -0
- package/dist/archive/tar-read.js.map +1 -0
- package/dist/audit-baseline.d.ts +66 -0
- package/dist/audit-baseline.js +124 -0
- package/dist/audit-baseline.js.map +1 -0
- package/dist/automation.d.ts +16 -0
- package/dist/automation.js +38 -0
- package/dist/automation.js.map +1 -0
- package/dist/backlinks.d.ts +15 -0
- package/dist/backlinks.js +30 -0
- package/dist/backlinks.js.map +1 -0
- package/dist/checkers/katex.d.ts +3 -0
- package/dist/checkers/katex.js +71 -0
- package/dist/checkers/katex.js.map +1 -0
- package/dist/checkers/markdown-lint.d.ts +28 -0
- package/dist/checkers/markdown-lint.js +53 -0
- package/dist/checkers/markdown-lint.js.map +1 -0
- package/dist/checkers/mermaid.d.ts +6 -0
- package/dist/checkers/mermaid.js +53 -0
- package/dist/checkers/mermaid.js.map +1 -0
- package/dist/checkers/references.d.ts +3 -0
- package/dist/checkers/references.js +55 -0
- package/dist/checkers/references.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1117 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-result.d.ts +6 -0
- package/dist/command-result.js +13 -0
- package/dist/command-result.js.map +1 -0
- package/dist/commands/agent-audit.d.ts +21 -0
- package/dist/commands/agent-audit.js +119 -0
- package/dist/commands/agent-audit.js.map +1 -0
- package/dist/commands/agent-doctor.d.ts +25 -0
- package/dist/commands/agent-doctor.js +217 -0
- package/dist/commands/agent-doctor.js.map +1 -0
- package/dist/commands/agent-import.d.ts +21 -0
- package/dist/commands/agent-import.js +212 -0
- package/dist/commands/agent-import.js.map +1 -0
- package/dist/commands/agent-install.d.ts +18 -0
- package/dist/commands/agent-install.js +59 -0
- package/dist/commands/agent-install.js.map +1 -0
- package/dist/commands/agent-installed.d.ts +6 -0
- package/dist/commands/agent-installed.js +17 -0
- package/dist/commands/agent-installed.js.map +1 -0
- package/dist/commands/agent-marketplace.d.ts +11 -0
- package/dist/commands/agent-marketplace.js +178 -0
- package/dist/commands/agent-marketplace.js.map +1 -0
- package/dist/commands/agent-package.d.ts +16 -0
- package/dist/commands/agent-package.js +159 -0
- package/dist/commands/agent-package.js.map +1 -0
- package/dist/commands/agent-scaffold.d.ts +17 -0
- package/dist/commands/agent-scaffold.js +181 -0
- package/dist/commands/agent-scaffold.js.map +1 -0
- package/dist/commands/agent-specs.d.ts +7 -0
- package/dist/commands/agent-specs.js +20 -0
- package/dist/commands/agent-specs.js.map +1 -0
- package/dist/commands/agent-test.d.ts +21 -0
- package/dist/commands/agent-test.js +50 -0
- package/dist/commands/agent-test.js.map +1 -0
- package/dist/commands/agent-uninstall.d.ts +6 -0
- package/dist/commands/agent-uninstall.js +45 -0
- package/dist/commands/agent-uninstall.js.map +1 -0
- package/dist/commands/agent-upgrade.d.ts +5 -0
- package/dist/commands/agent-upgrade.js +105 -0
- package/dist/commands/agent-upgrade.js.map +1 -0
- package/dist/commands/agent.d.ts +27 -0
- package/dist/commands/agent.js +549 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/archive.d.ts +47 -0
- package/dist/commands/archive.js +311 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/audit.d.ts +25 -0
- package/dist/commands/audit.js +325 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/check-snippets.d.ts +58 -0
- package/dist/commands/check-snippets.js +247 -0
- package/dist/commands/check-snippets.js.map +1 -0
- package/dist/commands/check-urls.d.ts +52 -0
- package/dist/commands/check-urls.js +205 -0
- package/dist/commands/check-urls.js.map +1 -0
- package/dist/commands/code-blocks.d.ts +8 -0
- package/dist/commands/code-blocks.js +66 -0
- package/dist/commands/code-blocks.js.map +1 -0
- package/dist/commands/completion.d.ts +15 -0
- package/dist/commands/completion.js +20 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/context.d.ts +16 -0
- package/dist/commands/context.js +131 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/describe.d.ts +12 -0
- package/dist/commands/describe.js +62 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.js +185 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/fix.d.ts +59 -0
- package/dist/commands/fix.js +173 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/frontmatter.d.ts +7 -0
- package/dist/commands/frontmatter.js +84 -0
- package/dist/commands/frontmatter.js.map +1 -0
- package/dist/commands/graph.d.ts +12 -0
- package/dist/commands/graph.js +122 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/headers.d.ts +7 -0
- package/dist/commands/headers.js +48 -0
- package/dist/commands/headers.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.js +32 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/links.d.ts +9 -0
- package/dist/commands/links.js +123 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/lint-dir.d.ts +15 -0
- package/dist/commands/lint-dir.js +156 -0
- package/dist/commands/lint-dir.js.map +1 -0
- package/dist/commands/lint.d.ts +14 -0
- package/dist/commands/lint.js +45 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/orphans.d.ts +10 -0
- package/dist/commands/orphans.js +74 -0
- package/dist/commands/orphans.js.map +1 -0
- package/dist/commands/outline.d.ts +7 -0
- package/dist/commands/outline.js +54 -0
- package/dist/commands/outline.js.map +1 -0
- package/dist/commands/query.d.ts +18 -0
- package/dist/commands/query.js +341 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/refs-to.d.ts +8 -0
- package/dist/commands/refs-to.js +65 -0
- package/dist/commands/refs-to.js.map +1 -0
- package/dist/commands/refs.d.ts +10 -0
- package/dist/commands/refs.js +103 -0
- package/dist/commands/refs.js.map +1 -0
- package/dist/commands/rename-file.d.ts +16 -0
- package/dist/commands/rename-file.js +215 -0
- package/dist/commands/rename-file.js.map +1 -0
- package/dist/commands/rename-heading.d.ts +10 -0
- package/dist/commands/rename-heading.js +182 -0
- package/dist/commands/rename-heading.js.map +1 -0
- package/dist/commands/schema.d.ts +10 -0
- package/dist/commands/schema.js +34 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/scripts.d.ts +59 -0
- package/dist/commands/scripts.js +222 -0
- package/dist/commands/scripts.js.map +1 -0
- package/dist/commands/section.d.ts +9 -0
- package/dist/commands/section.js +49 -0
- package/dist/commands/section.js.map +1 -0
- package/dist/commands/serve.d.ts +6 -0
- package/dist/commands/serve.js +48 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.js +109 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/structure.d.ts +6 -0
- package/dist/commands/structure.js +130 -0
- package/dist/commands/structure.js.map +1 -0
- package/dist/commands/tables.d.ts +8 -0
- package/dist/commands/tables.js +77 -0
- package/dist/commands/tables.js.map +1 -0
- package/dist/commands/tasks.d.ts +8 -0
- package/dist/commands/tasks.js +59 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/toc.d.ts +18 -0
- package/dist/commands/toc.js +105 -0
- package/dist/commands/toc.js.map +1 -0
- package/dist/commands/update-check.d.ts +36 -0
- package/dist/commands/update-check.js +119 -0
- package/dist/commands/update-check.js.map +1 -0
- package/dist/commands/usage.d.ts +56 -0
- package/dist/commands/usage.js +883 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/validate-frontmatter.d.ts +13 -0
- package/dist/commands/validate-frontmatter.js +34 -0
- package/dist/commands/validate-frontmatter.js.map +1 -0
- package/dist/completion/model.d.ts +49 -0
- package/dist/completion/model.js +194 -0
- package/dist/completion/model.js.map +1 -0
- package/dist/completion/shells.d.ts +2 -0
- package/dist/completion/shells.js +280 -0
- package/dist/completion/shells.js.map +1 -0
- package/dist/config-schema.d.ts +15 -0
- package/dist/config-schema.js +44 -0
- package/dist/config-schema.js.map +1 -0
- package/dist/config.d.ts +102 -0
- package/dist/config.js +614 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +106 -0
- package/dist/context.js +202 -0
- package/dist/context.js.map +1 -0
- package/dist/contract/describe.d.ts +84 -0
- package/dist/contract/describe.js +104 -0
- package/dist/contract/describe.js.map +1 -0
- package/dist/contract/registry.d.ts +2 -0
- package/dist/contract/registry.js +622 -0
- package/dist/contract/registry.js.map +1 -0
- package/dist/contract/schemas/agent.d.ts +2 -0
- package/dist/contract/schemas/agent.js +572 -0
- package/dist/contract/schemas/agent.js.map +1 -0
- package/dist/contract/schemas/archive.d.ts +3 -0
- package/dist/contract/schemas/archive.js +227 -0
- package/dist/contract/schemas/archive.js.map +1 -0
- package/dist/contract/schemas/index.d.ts +11 -0
- package/dist/contract/schemas/index.js +49 -0
- package/dist/contract/schemas/index.js.map +1 -0
- package/dist/contract/schemas/markdown.d.ts +15 -0
- package/dist/contract/schemas/markdown.js +1035 -0
- package/dist/contract/schemas/markdown.js.map +1 -0
- package/dist/contract/schemas/meta.d.ts +5 -0
- package/dist/contract/schemas/meta.js +233 -0
- package/dist/contract/schemas/meta.js.map +1 -0
- package/dist/contract/schemas/scripts.d.ts +4 -0
- package/dist/contract/schemas/scripts.js +183 -0
- package/dist/contract/schemas/scripts.js.map +1 -0
- package/dist/contract/schemas/shared.d.ts +11 -0
- package/dist/contract/schemas/shared.js +26 -0
- package/dist/contract/schemas/shared.js.map +1 -0
- package/dist/contract/schemas/usage.d.ts +6 -0
- package/dist/contract/schemas/usage.js +489 -0
- package/dist/contract/schemas/usage.js.map +1 -0
- package/dist/contract/types.d.ts +63 -0
- package/dist/contract/types.js +2 -0
- package/dist/contract/types.js.map +1 -0
- package/dist/contract/version.d.ts +20 -0
- package/dist/contract/version.js +21 -0
- package/dist/contract/version.js.map +1 -0
- package/dist/diff.d.ts +156 -0
- package/dist/diff.js +500 -0
- package/dist/diff.js.map +1 -0
- package/dist/edit-plan.d.ts +133 -0
- package/dist/edit-plan.js +245 -0
- package/dist/edit-plan.js.map +1 -0
- package/dist/fix/markdownlint-fixer.d.ts +34 -0
- package/dist/fix/markdownlint-fixer.js +125 -0
- package/dist/fix/markdownlint-fixer.js.map +1 -0
- package/dist/fix/registry.d.ts +48 -0
- package/dist/fix/registry.js +28 -0
- package/dist/fix/registry.js.map +1 -0
- package/dist/fix/relative-links-fixer.d.ts +21 -0
- package/dist/fix/relative-links-fixer.js +96 -0
- package/dist/fix/relative-links-fixer.js.map +1 -0
- package/dist/fix/snippets-fixer.d.ts +2 -0
- package/dist/fix/snippets-fixer.js +64 -0
- package/dist/fix/snippets-fixer.js.map +1 -0
- package/dist/fix/toc-fixer.d.ts +2 -0
- package/dist/fix/toc-fixer.js +94 -0
- package/dist/fix/toc-fixer.js.map +1 -0
- package/dist/formats.d.ts +22 -0
- package/dist/formats.js +34 -0
- package/dist/formats.js.map +1 -0
- package/dist/formatters.d.ts +11 -0
- package/dist/formatters.js +48 -0
- package/dist/formatters.js.map +1 -0
- package/dist/frontmatter-validation.d.ts +11 -0
- package/dist/frontmatter-validation.js +188 -0
- package/dist/frontmatter-validation.js.map +1 -0
- package/dist/git.d.ts +40 -0
- package/dist/git.js +124 -0
- package/dist/git.js.map +1 -0
- package/dist/graph.d.ts +50 -0
- package/dist/graph.js +200 -0
- package/dist/graph.js.map +1 -0
- package/dist/input-selection.d.ts +9 -0
- package/dist/input-selection.js +122 -0
- package/dist/input-selection.js.map +1 -0
- package/dist/input.d.ts +2 -0
- package/dist/input.js +32 -0
- package/dist/input.js.map +1 -0
- package/dist/link-target.d.ts +39 -0
- package/dist/link-target.js +68 -0
- package/dist/link-target.js.map +1 -0
- package/dist/lint.d.ts +13 -0
- package/dist/lint.js +27 -0
- package/dist/lint.js.map +1 -0
- package/dist/markdown-ast.d.ts +73 -0
- package/dist/markdown-ast.js +187 -0
- package/dist/markdown-ast.js.map +1 -0
- package/dist/object-path.d.ts +14 -0
- package/dist/object-path.js +14 -0
- package/dist/object-path.js.map +1 -0
- package/dist/option-utils.d.ts +13 -0
- package/dist/option-utils.js +25 -0
- package/dist/option-utils.js.map +1 -0
- package/dist/outline.d.ts +16 -0
- package/dist/outline.js +32 -0
- package/dist/outline.js.map +1 -0
- package/dist/query/entities.d.ts +60 -0
- package/dist/query/entities.js +219 -0
- package/dist/query/entities.js.map +1 -0
- package/dist/query/execute.d.ts +22 -0
- package/dist/query/execute.js +0 -0
- package/dist/query/execute.js.map +1 -0
- package/dist/query/plan.d.ts +76 -0
- package/dist/query/plan.js +183 -0
- package/dist/query/plan.js.map +1 -0
- package/dist/query/render.d.ts +3 -0
- package/dist/query/render.js +39 -0
- package/dist/query/render.js.map +1 -0
- package/dist/refs.d.ts +19 -0
- package/dist/refs.js +10 -0
- package/dist/refs.js.map +1 -0
- package/dist/result.d.ts +49 -0
- package/dist/result.js +47 -0
- package/dist/result.js.map +1 -0
- package/dist/runtime.d.ts +35 -0
- package/dist/runtime.js +77 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sarif.d.ts +36 -0
- package/dist/sarif.js +30 -0
- package/dist/sarif.js.map +1 -0
- package/dist/scripts/execute.d.ts +65 -0
- package/dist/scripts/execute.js +235 -0
- package/dist/scripts/execute.js.map +1 -0
- package/dist/scripts/registry.d.ts +55 -0
- package/dist/scripts/registry.js +103 -0
- package/dist/scripts/registry.js.map +1 -0
- package/dist/scripts/resolve.d.ts +90 -0
- package/dist/scripts/resolve.js +288 -0
- package/dist/scripts/resolve.js.map +1 -0
- package/dist/sections.d.ts +53 -0
- package/dist/sections.js +100 -0
- package/dist/sections.js.map +1 -0
- package/dist/serve/errors.d.ts +25 -0
- package/dist/serve/errors.js +45 -0
- package/dist/serve/errors.js.map +1 -0
- package/dist/serve/paths.d.ts +32 -0
- package/dist/serve/paths.js +71 -0
- package/dist/serve/paths.js.map +1 -0
- package/dist/serve/server.d.ts +31 -0
- package/dist/serve/server.js +123 -0
- package/dist/serve/server.js.map +1 -0
- package/dist/serve/tools.d.ts +19 -0
- package/dist/serve/tools.js +597 -0
- package/dist/serve/tools.js.map +1 -0
- package/dist/snippets.d.ts +184 -0
- package/dist/snippets.js +454 -0
- package/dist/snippets.js.map +1 -0
- package/dist/sqlite-store.d.ts +62 -0
- package/dist/sqlite-store.js +104 -0
- package/dist/sqlite-store.js.map +1 -0
- package/dist/sqlite.d.ts +59 -0
- package/dist/sqlite.js +51 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/toc.d.ts +58 -0
- package/dist/toc.js +83 -0
- package/dist/toc.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/update-notifier.d.ts +95 -0
- package/dist/update-notifier.js +301 -0
- package/dist/update-notifier.js.map +1 -0
- package/dist/url-cache.d.ts +14 -0
- package/dist/url-cache.js +70 -0
- package/dist/url-cache.js.map +1 -0
- package/dist/usage/aggregate.d.ts +107 -0
- package/dist/usage/aggregate.js +435 -0
- package/dist/usage/aggregate.js.map +1 -0
- package/dist/usage/db/index.d.ts +49 -0
- package/dist/usage/db/index.js +118 -0
- package/dist/usage/db/index.js.map +1 -0
- package/dist/usage/db/migrations.d.ts +29 -0
- package/dist/usage/db/migrations.js +38 -0
- package/dist/usage/db/migrations.js.map +1 -0
- package/dist/usage/db/open.d.ts +33 -0
- package/dist/usage/db/open.js +37 -0
- package/dist/usage/db/open.js.map +1 -0
- package/dist/usage/db/schema.d.ts +18 -0
- package/dist/usage/db/schema.js +147 -0
- package/dist/usage/db/schema.js.map +1 -0
- package/dist/usage/db/store.d.ts +74 -0
- package/dist/usage/db/store.js +280 -0
- package/dist/usage/db/store.js.map +1 -0
- package/dist/usage/events.d.ts +202 -0
- package/dist/usage/events.js +243 -0
- package/dist/usage/events.js.map +1 -0
- package/dist/usage/filter.d.ts +43 -0
- package/dist/usage/filter.js +97 -0
- package/dist/usage/filter.js.map +1 -0
- package/dist/usage/providers/antigravity.d.ts +2 -0
- package/dist/usage/providers/antigravity.js +431 -0
- package/dist/usage/providers/antigravity.js.map +1 -0
- package/dist/usage/providers/claude-code.d.ts +2 -0
- package/dist/usage/providers/claude-code.js +400 -0
- package/dist/usage/providers/claude-code.js.map +1 -0
- package/dist/usage/providers/codex.d.ts +2 -0
- package/dist/usage/providers/codex.js +387 -0
- package/dist/usage/providers/codex.js.map +1 -0
- package/dist/usage/providers/gemini-cli.d.ts +2 -0
- package/dist/usage/providers/gemini-cli.js +466 -0
- package/dist/usage/providers/gemini-cli.js.map +1 -0
- package/dist/usage/providers/index.d.ts +23 -0
- package/dist/usage/providers/index.js +46 -0
- package/dist/usage/providers/index.js.map +1 -0
- package/dist/usage/providers/opencode.d.ts +2 -0
- package/dist/usage/providers/opencode.js +422 -0
- package/dist/usage/providers/opencode.js.map +1 -0
- package/dist/usage/providers/protobuf.d.ts +35 -0
- package/dist/usage/providers/protobuf.js +125 -0
- package/dist/usage/providers/protobuf.js.map +1 -0
- package/dist/usage/providers/types.d.ts +74 -0
- package/dist/usage/providers/types.js +2 -0
- package/dist/usage/providers/types.js.map +1 -0
- package/dist/usage/scan.d.ts +54 -0
- package/dist/usage/scan.js +216 -0
- package/dist/usage/scan.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace-index.d.ts +39 -0
- package/dist/workspace-index.js +265 -0
- package/dist/workspace-index.js.map +1 -0
- package/dist/workspace.d.ts +89 -0
- package/dist/workspace.js +219 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { minimatch } from "minimatch";
|
|
4
|
+
import { lintFile } from "../lint.js";
|
|
5
|
+
import { buildWorkspaceGraph } from "../graph.js";
|
|
6
|
+
import { FrontmatterValidator } from "../frontmatter-validation.js";
|
|
7
|
+
import { tocSynchronizationIssue } from "./toc.js";
|
|
8
|
+
import { checkUrlOccurrences } from "./check-urls.js";
|
|
9
|
+
import { outputPath, runtime } from "../runtime.js";
|
|
10
|
+
import { requireDirectory } from "../input.js";
|
|
11
|
+
import { terminate } from "../command-result.js";
|
|
12
|
+
import { formatDiagnostics } from "../automation.js";
|
|
13
|
+
import { changedMarkdownFiles } from "../input-selection.js";
|
|
14
|
+
import { extractCodeBlocks } from "../markdown-ast.js";
|
|
15
|
+
import { createSourceReader, synchronizeSnippets } from "../snippets.js";
|
|
16
|
+
import { jsonPayload } from "../result.js";
|
|
17
|
+
import { packageName, packageVersion } from "../version.js";
|
|
18
|
+
import { applyBaseline, buildBaseline, readBaseline, writeBaseline, } from "../audit-baseline.js";
|
|
19
|
+
async function concurrent(items, limit, fn) {
|
|
20
|
+
const results = new Array(items.length);
|
|
21
|
+
let next = 0;
|
|
22
|
+
const worker = async () => {
|
|
23
|
+
while (next < items.length) {
|
|
24
|
+
const index = next++;
|
|
25
|
+
results[index] = await fn(items[index]);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
await Promise.all(Array.from({ length: Math.min(Math.max(1, limit), items.length) }, worker));
|
|
29
|
+
return results;
|
|
30
|
+
}
|
|
31
|
+
function graphFindings(graph) {
|
|
32
|
+
return [
|
|
33
|
+
...graph.broken.map((edge) => ({
|
|
34
|
+
file: edge.source,
|
|
35
|
+
line: edge.line,
|
|
36
|
+
checker: "graph/broken",
|
|
37
|
+
message: `Markdown target not found: ${edge.target}`,
|
|
38
|
+
})),
|
|
39
|
+
...graph.unreachable.map((file) => ({
|
|
40
|
+
file,
|
|
41
|
+
line: 1,
|
|
42
|
+
checker: "graph/unreachable",
|
|
43
|
+
message: "Document is unreachable from configured entry points",
|
|
44
|
+
})),
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Snippet drift, reported but never repaired.
|
|
49
|
+
*
|
|
50
|
+
* The checker names are prefixed `snippets/` so the audit category derived
|
|
51
|
+
* from the checker matches the `enabled` entry. Messages carry the target as
|
|
52
|
+
* the author wrote it and no line number, because `--baseline` keys on
|
|
53
|
+
* checker, workspace-relative path, and message.
|
|
54
|
+
*/
|
|
55
|
+
function snippetFindings(files) {
|
|
56
|
+
const root = runtime().config.root;
|
|
57
|
+
const read = createSourceReader(root);
|
|
58
|
+
const issues = [];
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const document = runtime().workspace.document(file);
|
|
61
|
+
const results = synchronizeSnippets(document.content, extractCodeBlocks(document.tree), {
|
|
62
|
+
file,
|
|
63
|
+
root,
|
|
64
|
+
read,
|
|
65
|
+
});
|
|
66
|
+
for (const result of results) {
|
|
67
|
+
if (result.status === "current")
|
|
68
|
+
continue;
|
|
69
|
+
if (result.status === "stale") {
|
|
70
|
+
issues.push({
|
|
71
|
+
file,
|
|
72
|
+
line: result.line,
|
|
73
|
+
checker: "snippets/drift",
|
|
74
|
+
message: `Snippet is out of date with ${result.target}`,
|
|
75
|
+
});
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const kind = result.reason.startsWith("source-")
|
|
79
|
+
? "source"
|
|
80
|
+
: result.reason.startsWith("region-")
|
|
81
|
+
? "region"
|
|
82
|
+
: "meta";
|
|
83
|
+
issues.push({
|
|
84
|
+
file,
|
|
85
|
+
line: result.line,
|
|
86
|
+
checker: `snippets/${kind}`,
|
|
87
|
+
message: result.message,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return issues;
|
|
92
|
+
}
|
|
93
|
+
export async function auditAction(directory, opts) {
|
|
94
|
+
const dir = requireDirectory(directory, opts);
|
|
95
|
+
let files = runtime().workspace.markdownFiles(dir, {
|
|
96
|
+
include: opts.include,
|
|
97
|
+
exclude: opts.exclude,
|
|
98
|
+
});
|
|
99
|
+
if (opts.changedSince) {
|
|
100
|
+
const changed = new Set(changedMarkdownFiles(opts.changedSince));
|
|
101
|
+
files = files.filter((file) => changed.has(file));
|
|
102
|
+
}
|
|
103
|
+
const enabled = [];
|
|
104
|
+
const skipped = [];
|
|
105
|
+
let findings = [];
|
|
106
|
+
const lintNames = [
|
|
107
|
+
["markdownlint", opts.style],
|
|
108
|
+
["mermaid", opts.mermaid],
|
|
109
|
+
["katex", opts.katex],
|
|
110
|
+
["references", opts.references],
|
|
111
|
+
];
|
|
112
|
+
for (const [name, active] of lintNames)
|
|
113
|
+
(active ? enabled : skipped).push(name);
|
|
114
|
+
const lintResults = await concurrent(files, parseInt(opts.concurrency, 10) || 1, (file) => lintFile(file, {
|
|
115
|
+
style: opts.style,
|
|
116
|
+
mermaid: opts.mermaid,
|
|
117
|
+
katex: opts.katex,
|
|
118
|
+
references: opts.references,
|
|
119
|
+
}));
|
|
120
|
+
findings.push(...lintResults.flat());
|
|
121
|
+
let graph;
|
|
122
|
+
if (opts.graph) {
|
|
123
|
+
enabled.push("graph");
|
|
124
|
+
const entries = opts.entry.map((entry) => path.resolve(entry));
|
|
125
|
+
for (const entry of entries) {
|
|
126
|
+
if (!fs.existsSync(entry) || !fs.statSync(entry).isFile()) {
|
|
127
|
+
throw new Error(`Entry point not found: ${entry}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
graph = buildWorkspaceGraph(runtime().workspace, files, entries);
|
|
131
|
+
const graphIssues = graphFindings(graph);
|
|
132
|
+
const duplicate = new Set(graph.broken.map((edge) => `${edge.source}\0${edge.line}\0${edge.target}`));
|
|
133
|
+
findings = findings.filter((issue) => {
|
|
134
|
+
const target = issue.message.replace(/^Link target not found: /, "");
|
|
135
|
+
return !(issue.checker === "ref/link" && duplicate.has(`${issue.file}\0${issue.line}\0${target}`));
|
|
136
|
+
});
|
|
137
|
+
findings.push(...graphIssues);
|
|
138
|
+
}
|
|
139
|
+
else
|
|
140
|
+
skipped.push("graph");
|
|
141
|
+
const hasFrontmatter = Boolean(runtime().config.frontmatter.schema) ||
|
|
142
|
+
Object.values(runtime().config.frontmatter.rules).some((value) => Array.isArray(value) ? value.length : Object.keys(value).length);
|
|
143
|
+
if (opts.frontmatter && hasFrontmatter) {
|
|
144
|
+
enabled.push("frontmatter");
|
|
145
|
+
findings.push(...new FrontmatterValidator(runtime().config.frontmatter.rules, runtime().config.frontmatter.schema).validateMany(files.map((file) => runtime().workspace.document(file))));
|
|
146
|
+
}
|
|
147
|
+
else
|
|
148
|
+
skipped.push("frontmatter");
|
|
149
|
+
if (opts.toc && runtime().config.toc.files.length) {
|
|
150
|
+
enabled.push("toc");
|
|
151
|
+
for (const file of files) {
|
|
152
|
+
const relative = path.relative(runtime().config.root, file).split(path.sep).join("/");
|
|
153
|
+
if (!runtime().config.toc.files.some((pattern) => minimatch(relative, pattern, { dot: true, nonegate: true })))
|
|
154
|
+
continue;
|
|
155
|
+
const result = tocSynchronizationIssue(file, opts);
|
|
156
|
+
if (result.malformed)
|
|
157
|
+
throw new Error(`${file}: ${result.malformed}`);
|
|
158
|
+
if (!result.current)
|
|
159
|
+
findings.push({ file, line: 1, checker: "toc", message: result.issue });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else
|
|
163
|
+
skipped.push("toc");
|
|
164
|
+
if (opts.snippets) {
|
|
165
|
+
enabled.push("snippets");
|
|
166
|
+
findings.push(...snippetFindings(files));
|
|
167
|
+
}
|
|
168
|
+
else
|
|
169
|
+
skipped.push("snippets");
|
|
170
|
+
if (opts.external) {
|
|
171
|
+
enabled.push("external");
|
|
172
|
+
const occurrences = files.flatMap((file) => runtime()
|
|
173
|
+
.workspace.document(file)
|
|
174
|
+
.references.filter((ref) => ref.isExternal &&
|
|
175
|
+
/^https?:/i.test(ref.target) &&
|
|
176
|
+
!runtime().config.urls.ignore.some((pattern) => minimatch(ref.target, pattern, { nonegate: true })) &&
|
|
177
|
+
!runtime().config.urls.ignoreDomains.some((domain) => {
|
|
178
|
+
try {
|
|
179
|
+
const host = new URL(ref.target).hostname.toLowerCase();
|
|
180
|
+
const normalized = domain.toLowerCase().replace(/^\*\./, "");
|
|
181
|
+
return host === normalized || host.endsWith(`.${normalized}`);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}))
|
|
187
|
+
.map((ref) => ({ file, line: ref.line, url: ref.target })));
|
|
188
|
+
const results = await checkUrlOccurrences(occurrences, {
|
|
189
|
+
timeout: parseInt(opts.timeout, 10) || 5000,
|
|
190
|
+
concurrency: parseInt(opts.concurrency, 10) || 5,
|
|
191
|
+
retries: parseInt(opts.retry, 10) || 0,
|
|
192
|
+
allowedStatuses: runtime().config.urls.allowedStatuses,
|
|
193
|
+
headFallbackStatuses: runtime().config.urls.headFallbackStatuses,
|
|
194
|
+
cache: runtime().config.urls.cache,
|
|
195
|
+
cacheTtl: runtime().config.urls.cacheTtl,
|
|
196
|
+
});
|
|
197
|
+
findings.push(...results
|
|
198
|
+
.filter((result) => !result.ok)
|
|
199
|
+
.map((result) => ({
|
|
200
|
+
file: result.file,
|
|
201
|
+
line: result.line,
|
|
202
|
+
checker: "external",
|
|
203
|
+
message: `${result.url}: ${result.status ?? result.error ?? "request failed"}`,
|
|
204
|
+
})));
|
|
205
|
+
}
|
|
206
|
+
else
|
|
207
|
+
skipped.push("external");
|
|
208
|
+
findings.sort((a, b) => a.checker.localeCompare(b.checker) || a.file.localeCompare(b.file) || a.line - b.line);
|
|
209
|
+
const root = runtime().config.root;
|
|
210
|
+
if (opts.writeBaseline) {
|
|
211
|
+
// Recording is a separate act from checking: writing the file a run is
|
|
212
|
+
// simultaneously being judged against has no meaning.
|
|
213
|
+
if (opts.baseline)
|
|
214
|
+
throw new Error("--baseline and --write-baseline cannot be combined");
|
|
215
|
+
writeBaseline(opts.writeBaseline, buildBaseline(findings, root, { name: packageName, version: packageVersion }));
|
|
216
|
+
process.stdout.write(`Wrote ${findings.length} baseline entr${findings.length === 1 ? "y" : "ies"} to ${opts.writeBaseline}\n`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
let baseline;
|
|
220
|
+
if (opts.baseline) {
|
|
221
|
+
const applied = applyBaseline(findings, readBaseline(opts.baseline), root);
|
|
222
|
+
if (applied.foreign) {
|
|
223
|
+
findings.push({
|
|
224
|
+
file: path.resolve(opts.baseline),
|
|
225
|
+
line: 1,
|
|
226
|
+
checker: "baseline",
|
|
227
|
+
message: "Not a cairn-md-audit-baseline document; no findings were suppressed",
|
|
228
|
+
});
|
|
229
|
+
findings.sort((a, b) => a.checker.localeCompare(b.checker) || a.file.localeCompare(b.file) || a.line - b.line);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
findings = applied.kept;
|
|
233
|
+
}
|
|
234
|
+
baseline = {
|
|
235
|
+
path: outputPath(path.resolve(opts.baseline), opts),
|
|
236
|
+
suppressed: applied.suppressed,
|
|
237
|
+
stale: applied.stale,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const shown = findings.map((issue) => ({ ...issue, file: outputPath(issue.file, opts) }));
|
|
241
|
+
const byCheck = Object.fromEntries(enabled.map((check) => [check, 0]));
|
|
242
|
+
const byFile = {};
|
|
243
|
+
for (const issue of shown) {
|
|
244
|
+
const rawCategory = issue.checker.split("/")[0];
|
|
245
|
+
const category = rawCategory === "ref" ? "references" : rawCategory;
|
|
246
|
+
byCheck[category] = (byCheck[category] ?? 0) + 1;
|
|
247
|
+
byFile[issue.file] = (byFile[issue.file] ?? 0) + 1;
|
|
248
|
+
}
|
|
249
|
+
const result = {
|
|
250
|
+
directory: outputPath(dir, opts),
|
|
251
|
+
enabled,
|
|
252
|
+
skipped,
|
|
253
|
+
totals: {
|
|
254
|
+
files: files.length,
|
|
255
|
+
findings: shown.length,
|
|
256
|
+
filesWithFindings: Object.keys(byFile).length,
|
|
257
|
+
byCheck,
|
|
258
|
+
byFile,
|
|
259
|
+
},
|
|
260
|
+
findings: shown,
|
|
261
|
+
...(baseline ? { baseline } : {}),
|
|
262
|
+
...(graph
|
|
263
|
+
? {
|
|
264
|
+
graph: {
|
|
265
|
+
nodes: graph.nodes.length,
|
|
266
|
+
edges: graph.edges.length,
|
|
267
|
+
broken: graph.broken.length,
|
|
268
|
+
unreachable: graph.unreachable.length,
|
|
269
|
+
deadEnds: graph.nodes.filter((node) => node.deadEnd).length,
|
|
270
|
+
components: graph.components.length,
|
|
271
|
+
cycles: graph.cycles.length,
|
|
272
|
+
reachabilityEvaluated: graph.reachabilityEvaluated,
|
|
273
|
+
},
|
|
274
|
+
}
|
|
275
|
+
: {}),
|
|
276
|
+
};
|
|
277
|
+
// One value decides the payload counts, the stream, and the exit code.
|
|
278
|
+
// Reading `findings` for the stream while the payload counted `shown` was a
|
|
279
|
+
// latent split that baseline suppression would have turned into a real bug.
|
|
280
|
+
const actionable = shown.length;
|
|
281
|
+
// Suppression and staleness are described, never judged: a stale entry means
|
|
282
|
+
// something was fixed, which must not fail a build.
|
|
283
|
+
const baselineLines = baseline
|
|
284
|
+
? [
|
|
285
|
+
`Baseline: ${baseline.suppressed} suppressed, ${baseline.stale.length} stale (${baseline.path})`,
|
|
286
|
+
]
|
|
287
|
+
: [];
|
|
288
|
+
let payload;
|
|
289
|
+
if (opts.format === "json")
|
|
290
|
+
payload = jsonPayload("md audit", result, opts, {
|
|
291
|
+
exitCode: actionable ? 2 : 0,
|
|
292
|
+
summary: {
|
|
293
|
+
findings: actionable,
|
|
294
|
+
files: result.totals.files,
|
|
295
|
+
...(baseline ? { suppressed: baseline.suppressed } : {}),
|
|
296
|
+
},
|
|
297
|
+
}).trimEnd();
|
|
298
|
+
else if (opts.format === "jsonl" || opts.format === "sarif")
|
|
299
|
+
payload = formatDiagnostics(shown, opts.format, {
|
|
300
|
+
files: files.length,
|
|
301
|
+
findings: actionable,
|
|
302
|
+
enabled,
|
|
303
|
+
skipped,
|
|
304
|
+
...(baseline ? { suppressed: baseline.suppressed } : {}),
|
|
305
|
+
});
|
|
306
|
+
else if (opts.summary)
|
|
307
|
+
payload = [
|
|
308
|
+
`Audit: ${result.totals.files} file(s), ${result.totals.findings} finding(s)`,
|
|
309
|
+
...baselineLines,
|
|
310
|
+
...Object.entries(byCheck).map(([check, count]) => ` ${check}: ${count}`),
|
|
311
|
+
...Object.entries(byFile).map(([file, count]) => ` ${file}: ${count}`),
|
|
312
|
+
].join("\n");
|
|
313
|
+
else
|
|
314
|
+
payload = (actionable
|
|
315
|
+
? [
|
|
316
|
+
`${actionable} audit finding(s) in ${result.directory}:`,
|
|
317
|
+
...shown.map((issue) => ` ${issue.file}:${issue.line} [${issue.checker}] ${issue.message}`),
|
|
318
|
+
...baselineLines,
|
|
319
|
+
]
|
|
320
|
+
: [`Audit passed for ${files.length} file(s) in ${result.directory}`, ...baselineLines]).join("\n");
|
|
321
|
+
(actionable ? process.stderr : process.stdout).write(payload + "\n");
|
|
322
|
+
if (actionable)
|
|
323
|
+
terminate(2);
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type SnippetReason } from "../snippets.js";
|
|
2
|
+
export type CheckSnippetsMode = "check" | "dry-run" | "write";
|
|
3
|
+
interface CheckSnippetsOptions {
|
|
4
|
+
envelope?: boolean;
|
|
5
|
+
format: string;
|
|
6
|
+
paths?: string;
|
|
7
|
+
check?: boolean;
|
|
8
|
+
write?: boolean;
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
includeOk: boolean;
|
|
11
|
+
include: string[];
|
|
12
|
+
exclude: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface SnippetFindingJson {
|
|
15
|
+
file: string;
|
|
16
|
+
/** 1-based line of the opening fence. */
|
|
17
|
+
line: number;
|
|
18
|
+
endLine: number;
|
|
19
|
+
status: "current" | "stale" | "unresolved" | "malformed";
|
|
20
|
+
/** The attribute value as written. Absent when it could not be parsed. */
|
|
21
|
+
target?: string;
|
|
22
|
+
/** Absolute or relative per --paths. Absent until the path resolves. */
|
|
23
|
+
source?: string;
|
|
24
|
+
/** Present on everything except a clean match. */
|
|
25
|
+
reason?: SnippetReason;
|
|
26
|
+
message?: string;
|
|
27
|
+
/** --dry-run only: the two bodies, container indentation removed. */
|
|
28
|
+
documented?: string;
|
|
29
|
+
expected?: string;
|
|
30
|
+
/** Stale blocks outside --check: false when the fence cannot be rewritten. */
|
|
31
|
+
writable?: boolean;
|
|
32
|
+
/** --write only: whether this block's bytes changed. */
|
|
33
|
+
applied?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface CheckSnippetsPayload {
|
|
36
|
+
mode: CheckSnippetsMode;
|
|
37
|
+
filesScanned: number;
|
|
38
|
+
/** Fences carrying a snippet link. An unlinked fence is never counted. */
|
|
39
|
+
linked: number;
|
|
40
|
+
current: number;
|
|
41
|
+
drift: number;
|
|
42
|
+
unresolved: number;
|
|
43
|
+
malformed: number;
|
|
44
|
+
/** Stale blocks the fence cannot accept. Always 0 under --check. */
|
|
45
|
+
unwritable: number;
|
|
46
|
+
/** Files whose bytes changed. Always 0 outside --write. */
|
|
47
|
+
applied: number;
|
|
48
|
+
/** `current` entries appear only under --include-ok. */
|
|
49
|
+
findings: SnippetFindingJson[];
|
|
50
|
+
conflicts: Array<{
|
|
51
|
+
kind: string;
|
|
52
|
+
file: string;
|
|
53
|
+
message: string;
|
|
54
|
+
rules: string[];
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
export declare function checkSnippetsAction(inputs: string[], opts: CheckSnippetsOptions): Promise<void>;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { applyPlan, buildPlan, containmentRoot, snapshot, } from "../edit-plan.js";
|
|
2
|
+
import { extractCodeBlocks, parseMarkdown } from "../markdown-ast.js";
|
|
3
|
+
import { createSourceReader, snippetEdits, synchronizeSnippets, } from "../snippets.js";
|
|
4
|
+
import { fingerprint } from "../workspace-index.js";
|
|
5
|
+
import { resolveMarkdownInputs } from "../input-selection.js";
|
|
6
|
+
import { outputPath, runtime } from "../runtime.js";
|
|
7
|
+
import { terminate } from "../command-result.js";
|
|
8
|
+
import { jsonPayload } from "../result.js";
|
|
9
|
+
function resolveFormat(opts) {
|
|
10
|
+
const fmt = opts.format;
|
|
11
|
+
if (fmt === "llm" || fmt === "human" || fmt === "json")
|
|
12
|
+
return fmt;
|
|
13
|
+
return "llm";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Which of check, dry-run, and write was asked for.
|
|
17
|
+
*
|
|
18
|
+
* A plain guard is enough, as in `md fix`: those three keys are deliberately
|
|
19
|
+
* absent from `COMMAND_OPTIONS["check-snippets"]`, so a checked-in config can
|
|
20
|
+
* never turn this checker into a writer and there is no config-versus-CLI
|
|
21
|
+
* ambiguity to disentangle. That rule matters more here than anywhere else,
|
|
22
|
+
* because `--write` copies the contents of arbitrary source files into tracked
|
|
23
|
+
* documents.
|
|
24
|
+
*/
|
|
25
|
+
function resolveMode(opts) {
|
|
26
|
+
const requested = [
|
|
27
|
+
["check", opts.check],
|
|
28
|
+
["write", opts.write],
|
|
29
|
+
["dry-run", opts.dryRun],
|
|
30
|
+
]
|
|
31
|
+
.filter(([, enabled]) => enabled)
|
|
32
|
+
.map(([name]) => name);
|
|
33
|
+
if (requested.length > 1) {
|
|
34
|
+
throw new Error("--check, --write, and --dry-run cannot be used together");
|
|
35
|
+
}
|
|
36
|
+
return requested[0] ?? "check";
|
|
37
|
+
}
|
|
38
|
+
function truncate(value, limit = 120) {
|
|
39
|
+
const flat = value.replace(/\n/g, "\\n");
|
|
40
|
+
return flat.length > limit ? `${flat.slice(0, limit)}…` : flat;
|
|
41
|
+
}
|
|
42
|
+
function toFinding(file, result, mode, applied, opts) {
|
|
43
|
+
const base = {
|
|
44
|
+
file: outputPath(file, opts),
|
|
45
|
+
line: result.line,
|
|
46
|
+
endLine: result.endLine,
|
|
47
|
+
};
|
|
48
|
+
if (result.status === "malformed") {
|
|
49
|
+
return { ...base, status: "malformed", reason: result.reason, message: result.message };
|
|
50
|
+
}
|
|
51
|
+
if (result.status === "unresolved") {
|
|
52
|
+
return {
|
|
53
|
+
...base,
|
|
54
|
+
status: "unresolved",
|
|
55
|
+
target: result.target,
|
|
56
|
+
...(result.source ? { source: outputPath(result.source, opts) } : {}),
|
|
57
|
+
reason: result.reason,
|
|
58
|
+
message: result.message,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (result.status === "current") {
|
|
62
|
+
return {
|
|
63
|
+
...base,
|
|
64
|
+
status: "current",
|
|
65
|
+
target: result.target,
|
|
66
|
+
source: outputPath(result.source, opts),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
...base,
|
|
71
|
+
status: "stale",
|
|
72
|
+
target: result.target,
|
|
73
|
+
source: outputPath(result.source, opts),
|
|
74
|
+
...(result.unwritable && mode !== "check"
|
|
75
|
+
? { reason: result.unwritable.reason, message: result.unwritable.message }
|
|
76
|
+
: {}),
|
|
77
|
+
...(mode === "dry-run" ? { documented: result.documented, expected: result.expected } : {}),
|
|
78
|
+
...(mode === "check" ? {} : { writable: Boolean(result.write) }),
|
|
79
|
+
...(applied ? { applied: applied.has(file) && Boolean(result.write) } : {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function renderText(payload, human) {
|
|
83
|
+
const bold = (value) => (human ? `\x1b[1m${value}\x1b[0m` : value);
|
|
84
|
+
const red = (value) => (human ? `\x1b[31m${value}\x1b[0m` : value);
|
|
85
|
+
const green = (value) => (human ? `\x1b[32m${value}\x1b[0m` : value);
|
|
86
|
+
const cyan = (value) => (human ? `\x1b[36m${value}\x1b[0m` : value);
|
|
87
|
+
const lines = [];
|
|
88
|
+
const headline = payload.mode === "write"
|
|
89
|
+
? payload.applied
|
|
90
|
+
? `Refreshed ${payload.applied} file(s) of ${payload.linked} linked snippet(s).`
|
|
91
|
+
: `Nothing to refresh in ${payload.linked} linked snippet(s).`
|
|
92
|
+
: payload.drift + payload.unresolved + payload.malformed
|
|
93
|
+
? bold(`${payload.drift} stale, ${payload.unresolved} unresolved, ${payload.malformed} malformed ` +
|
|
94
|
+
`of ${payload.linked} linked snippet(s) in ${payload.filesScanned} file(s)`)
|
|
95
|
+
: `${payload.linked} linked snippet(s) up to date in ${payload.filesScanned} file(s)`;
|
|
96
|
+
for (const finding of payload.findings) {
|
|
97
|
+
const where = cyan(`${finding.file}:L${finding.line}`);
|
|
98
|
+
if (finding.status === "current") {
|
|
99
|
+
lines.push(` ${where} ok ${finding.target}`);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (finding.status === "stale") {
|
|
103
|
+
const suffix = finding.writable === false ? ` (not rewritten: ${finding.reason})` : "";
|
|
104
|
+
lines.push(` ${where} stale ${finding.target}${suffix}`);
|
|
105
|
+
if (payload.mode === "dry-run") {
|
|
106
|
+
lines.push(` ${red(`- ${truncate(finding.documented ?? "")}`)}`);
|
|
107
|
+
lines.push(` ${green(`+ ${truncate(finding.expected ?? "")}`)}`);
|
|
108
|
+
}
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
lines.push(` ${where} ${finding.status} ${finding.reason} ${finding.message}`);
|
|
112
|
+
}
|
|
113
|
+
lines.push(headline);
|
|
114
|
+
if (payload.mode === "dry-run" && payload.drift) {
|
|
115
|
+
lines.push("(dry run — no files modified)");
|
|
116
|
+
}
|
|
117
|
+
if (payload.mode === "check" && payload.drift) {
|
|
118
|
+
lines.push("Run with --dry-run to see the full plan, or --write to refresh.");
|
|
119
|
+
}
|
|
120
|
+
if (payload.conflicts.length) {
|
|
121
|
+
lines.push("", bold("Conflicts (nothing will be written):"));
|
|
122
|
+
for (const conflict of payload.conflicts) {
|
|
123
|
+
lines.push(` ${conflict.file} ${conflict.kind} ${conflict.message}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return lines.join("\n");
|
|
127
|
+
}
|
|
128
|
+
export async function checkSnippetsAction(inputs, opts) {
|
|
129
|
+
const format = resolveFormat(opts);
|
|
130
|
+
const mode = resolveMode(opts);
|
|
131
|
+
// --write has no path to write stdin back to, and a snippet link is only
|
|
132
|
+
// meaningful relative to a document that has a location on disk.
|
|
133
|
+
if (inputs.includes("-"))
|
|
134
|
+
throw new Error("md check-snippets does not accept stdin");
|
|
135
|
+
const files = resolveMarkdownInputs(inputs, { include: opts.include, exclude: opts.exclude });
|
|
136
|
+
// Two roots, deliberately. Source reads are bounded by the workspace, because
|
|
137
|
+
// a document under docs/ legitimately points at ../src; writes are bounded by
|
|
138
|
+
// the md fix containment root, which for `md check-snippets docs` is docs/
|
|
139
|
+
// itself and would reject every real source.
|
|
140
|
+
const readRoot = runtime().config.root;
|
|
141
|
+
const writeRoot = containmentRoot(files, runtime().config);
|
|
142
|
+
const read = createSourceReader(readRoot);
|
|
143
|
+
const snapshots = new Map();
|
|
144
|
+
const perFile = [];
|
|
145
|
+
const edits = [];
|
|
146
|
+
for (const file of files) {
|
|
147
|
+
const taken = snapshot(file);
|
|
148
|
+
snapshots.set(file, taken);
|
|
149
|
+
const document = runtime().workspace.document(file);
|
|
150
|
+
// Offsets address the snapshot's bytes; the cached tree is only safe to
|
|
151
|
+
// reuse when it was parsed from exactly those bytes.
|
|
152
|
+
const blocks = document.content === taken.content
|
|
153
|
+
? extractCodeBlocks(document.tree)
|
|
154
|
+
: extractCodeBlocks(parseMarkdown(taken.content));
|
|
155
|
+
const results = synchronizeSnippets(taken.content, blocks, { file, root: readRoot, read });
|
|
156
|
+
if (!results.length)
|
|
157
|
+
continue;
|
|
158
|
+
perFile.push({ file, results });
|
|
159
|
+
edits.push(...snippetEdits(file, taken.content, results));
|
|
160
|
+
}
|
|
161
|
+
const plan = mode === "write"
|
|
162
|
+
? buildPlan(writeRoot, edits, snapshots)
|
|
163
|
+
: { root: writeRoot, files: [], conflicts: [] };
|
|
164
|
+
let applied;
|
|
165
|
+
if (mode === "write" && !plan.conflicts.length) {
|
|
166
|
+
// applyPlan re-fingerprints its edit targets but knows nothing about the
|
|
167
|
+
// sources the replacements were read from, so a source edited mid-run
|
|
168
|
+
// would otherwise land already stale.
|
|
169
|
+
for (const { results } of perFile) {
|
|
170
|
+
for (const result of results) {
|
|
171
|
+
if (result.status !== "stale" || !result.write)
|
|
172
|
+
continue;
|
|
173
|
+
const current = fingerprint(result.source);
|
|
174
|
+
if (current.size !== result.sourceFingerprint.size ||
|
|
175
|
+
current.mtimeMs !== result.sourceFingerprint.mtimeMs) {
|
|
176
|
+
throw new Error(`Aborted: ${result.source} changed after the plan was built`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const result = applyPlan(plan, { invalidate: (file) => runtime().workspace.invalidate(file) });
|
|
181
|
+
applied = new Set(result.files.filter((entry) => entry.changed).map((entry) => entry.file));
|
|
182
|
+
}
|
|
183
|
+
const findings = [];
|
|
184
|
+
let linked = 0;
|
|
185
|
+
let current = 0;
|
|
186
|
+
let drift = 0;
|
|
187
|
+
let unresolved = 0;
|
|
188
|
+
let malformed = 0;
|
|
189
|
+
let unwritable = 0;
|
|
190
|
+
for (const entry of perFile) {
|
|
191
|
+
for (const result of entry.results) {
|
|
192
|
+
linked++;
|
|
193
|
+
if (result.status === "current")
|
|
194
|
+
current++;
|
|
195
|
+
else if (result.status === "unresolved")
|
|
196
|
+
unresolved++;
|
|
197
|
+
else if (result.status === "malformed")
|
|
198
|
+
malformed++;
|
|
199
|
+
else {
|
|
200
|
+
drift++;
|
|
201
|
+
if (!result.write && mode !== "check")
|
|
202
|
+
unwritable++;
|
|
203
|
+
}
|
|
204
|
+
if (result.status === "current" && !opts.includeOk)
|
|
205
|
+
continue;
|
|
206
|
+
findings.push(toFinding(entry.file, result, mode, applied, opts));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const payload = {
|
|
210
|
+
mode,
|
|
211
|
+
filesScanned: files.length,
|
|
212
|
+
linked,
|
|
213
|
+
current,
|
|
214
|
+
drift,
|
|
215
|
+
unresolved,
|
|
216
|
+
malformed,
|
|
217
|
+
unwritable,
|
|
218
|
+
applied: applied?.size ?? 0,
|
|
219
|
+
findings,
|
|
220
|
+
conflicts: plan.conflicts.map((conflict) => ({
|
|
221
|
+
...conflict,
|
|
222
|
+
file: outputPath(conflict.file, opts),
|
|
223
|
+
})),
|
|
224
|
+
};
|
|
225
|
+
// Unlike `md fix`, a finding with no available fix fails every mode. This
|
|
226
|
+
// command's job is checking, so a snippet naming a deleted file or a deleted
|
|
227
|
+
// region is the most severe drift it can report — exiting 0 would let CI pass
|
|
228
|
+
// over provably wrong documentation. Drift itself only fails the modes that
|
|
229
|
+
// are not about to correct it.
|
|
230
|
+
const actionable = payload.conflicts.length > 0 ||
|
|
231
|
+
payload.malformed + payload.unresolved + payload.unwritable > 0 ||
|
|
232
|
+
(mode !== "write" && payload.drift > 0);
|
|
233
|
+
const rendered = format === "json"
|
|
234
|
+
? jsonPayload("md check-snippets", payload, opts, {
|
|
235
|
+
exitCode: actionable ? 2 : 0,
|
|
236
|
+
summary: {
|
|
237
|
+
linked: payload.linked,
|
|
238
|
+
drift: payload.drift,
|
|
239
|
+
unresolved: payload.unresolved + payload.malformed,
|
|
240
|
+
},
|
|
241
|
+
}).trimEnd()
|
|
242
|
+
: renderText(payload, format === "human");
|
|
243
|
+
(actionable ? process.stderr : process.stdout).write(rendered + "\n");
|
|
244
|
+
if (actionable)
|
|
245
|
+
terminate(2);
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=check-snippets.js.map
|