@zigrivers/scaffold 3.28.0 → 3.29.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/README.md +5 -1
- package/content/guides/.gitkeep +0 -0
- package/content/guides/index.html +1188 -0
- package/content/guides/mmr/.diagrams/diagram-0.svg +1 -0
- package/content/guides/mmr/.diagrams/manifest.json +3 -0
- package/content/guides/mmr/index.html +1728 -0
- package/content/guides/mmr/index.md +403 -0
- package/content/knowledge/VERSION +1 -0
- package/content/knowledge/backend/backend-api-design.md +8 -0
- package/content/knowledge/backend/backend-architecture.md +8 -0
- package/content/knowledge/backend/backend-async-patterns.md +7 -0
- package/content/knowledge/backend/backend-auth-patterns.md +9 -0
- package/content/knowledge/backend/backend-conventions.md +6 -0
- package/content/knowledge/backend/backend-data-modeling.md +7 -0
- package/content/knowledge/backend/backend-deployment.md +8 -0
- package/content/knowledge/backend/backend-dev-environment.md +5 -0
- package/content/knowledge/backend/backend-fintech-broker-integration.md +6 -0
- package/content/knowledge/backend/backend-fintech-compliance.md +10 -2
- package/content/knowledge/backend/backend-fintech-data-modeling.md +6 -0
- package/content/knowledge/backend/backend-fintech-ledger.md +6 -0
- package/content/knowledge/backend/backend-fintech-observability.md +6 -0
- package/content/knowledge/backend/backend-fintech-order-lifecycle.md +6 -0
- package/content/knowledge/backend/backend-fintech-risk-management.md +6 -0
- package/content/knowledge/backend/backend-fintech-testing.md +6 -0
- package/content/knowledge/backend/backend-observability.md +7 -0
- package/content/knowledge/backend/backend-project-structure.md +6 -0
- package/content/knowledge/backend/backend-requirements.md +6 -0
- package/content/knowledge/backend/backend-security.md +7 -0
- package/content/knowledge/backend/backend-testing.md +7 -0
- package/content/knowledge/backend/backend-worker-patterns.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-architecture.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-content-scripts.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-conventions.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-cross-browser.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-dev-environment.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-manifest.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-project-structure.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-requirements.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-security.md +7 -0
- package/content/knowledge/browser-extension/browser-extension-service-workers.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-store-submission.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-testing.md +6 -0
- package/content/knowledge/cli/cli-architecture.md +4 -0
- package/content/knowledge/cli/cli-conventions.md +4 -0
- package/content/knowledge/cli/cli-dev-environment.md +5 -0
- package/content/knowledge/cli/cli-distribution-patterns.md +5 -0
- package/content/knowledge/cli/cli-interactivity-patterns.md +4 -0
- package/content/knowledge/cli/cli-output-patterns.md +4 -0
- package/content/knowledge/cli/cli-project-structure.md +4 -0
- package/content/knowledge/cli/cli-requirements.md +4 -0
- package/content/knowledge/cli/cli-shell-integration.md +4 -0
- package/content/knowledge/cli/cli-testing.md +4 -0
- package/content/knowledge/core/adr-craft.md +8 -0
- package/content/knowledge/core/ai-memory-management.md +6 -0
- package/content/knowledge/core/api-design.md +6 -0
- package/content/knowledge/core/automated-review-tooling.md +8 -0
- package/content/knowledge/core/claude-md-patterns.md +8 -0
- package/content/knowledge/core/coding-conventions.md +8 -0
- package/content/knowledge/core/database-design.md +8 -0
- package/content/knowledge/core/design-system-tokens.md +8 -0
- package/content/knowledge/core/dev-environment.md +4 -0
- package/content/knowledge/core/domain-modeling.md +6 -0
- package/content/knowledge/core/eval-craft.md +6 -0
- package/content/knowledge/core/git-workflow-patterns.md +8 -0
- package/content/knowledge/core/multi-model-research-dispatch.md +6 -0
- package/content/knowledge/core/multi-model-review-dispatch.md +6 -0
- package/content/knowledge/core/multi-service-api-contracts.md +5 -0
- package/content/knowledge/core/multi-service-architecture.md +5 -0
- package/content/knowledge/core/multi-service-auth.md +6 -0
- package/content/knowledge/core/multi-service-data-ownership.md +8 -0
- package/content/knowledge/core/multi-service-observability.md +8 -0
- package/content/knowledge/core/multi-service-resilience.md +5 -0
- package/content/knowledge/core/multi-service-task-decomposition.md +8 -0
- package/content/knowledge/core/multi-service-testing.md +5 -0
- package/content/knowledge/core/operations-runbook.md +8 -0
- package/content/knowledge/core/project-structure-patterns.md +4 -0
- package/content/knowledge/core/review-step-template.md +4 -0
- package/content/knowledge/core/security-best-practices.md +6 -0
- package/content/knowledge/core/system-architecture.md +6 -0
- package/content/knowledge/core/task-decomposition.md +5 -0
- package/content/knowledge/core/task-tracking.md +8 -0
- package/content/knowledge/core/tech-stack-selection.md +8 -0
- package/content/knowledge/core/test-skeleton-generation.md +4 -0
- package/content/knowledge/core/testing-strategy.md +8 -0
- package/content/knowledge/core/user-stories.md +8 -0
- package/content/knowledge/core/user-story-innovation.md +4 -0
- package/content/knowledge/core/ux-specification.md +5 -0
- package/content/knowledge/data-pipeline/data-pipeline-architecture.md +5 -0
- package/content/knowledge/data-pipeline/data-pipeline-batch-patterns.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-conventions.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-dev-environment.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-orchestration.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-project-structure.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-quality.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-requirements.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-schema-management.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-security.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-streaming-patterns.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-testing.md +4 -0
- package/content/knowledge/data-science/data-science-architecture.md +5 -0
- package/content/knowledge/data-science/data-science-conventions.md +6 -0
- package/content/knowledge/data-science/data-science-data-versioning.md +6 -0
- package/content/knowledge/data-science/data-science-dev-environment.md +6 -0
- package/content/knowledge/data-science/data-science-experiment-tracking.md +8 -0
- package/content/knowledge/data-science/data-science-model-evaluation.md +5 -0
- package/content/knowledge/data-science/data-science-notebook-discipline.md +5 -0
- package/content/knowledge/data-science/data-science-observability.md +6 -0
- package/content/knowledge/data-science/data-science-project-structure.md +5 -0
- package/content/knowledge/data-science/data-science-reproducibility.md +8 -0
- package/content/knowledge/data-science/data-science-requirements.md +5 -0
- package/content/knowledge/data-science/data-science-security.md +8 -0
- package/content/knowledge/data-science/data-science-testing.md +5 -0
- package/content/knowledge/execution/enhancement-workflow.md +4 -0
- package/content/knowledge/execution/multi-agent-coordination.md +12 -1
- package/content/knowledge/execution/task-claiming-strategy.md +4 -0
- package/content/knowledge/execution/tdd-execution-loop.md +5 -0
- package/content/knowledge/execution/worktree-management.md +5 -0
- package/content/knowledge/finalization/apply-fixes-and-freeze.md +4 -0
- package/content/knowledge/finalization/developer-onboarding.md +4 -0
- package/content/knowledge/finalization/implementation-playbook.md +4 -0
- package/content/knowledge/game/game-accessibility.md +4 -0
- package/content/knowledge/game/game-ai-patterns.md +4 -0
- package/content/knowledge/game/game-asset-pipeline.md +4 -0
- package/content/knowledge/game/game-audio-design.md +4 -0
- package/content/knowledge/game/game-binary-vcs-strategy.md +5 -0
- package/content/knowledge/game/game-design-document.md +4 -0
- package/content/knowledge/game/game-domain-patterns.md +4 -0
- package/content/knowledge/game/game-economy-design.md +4 -0
- package/content/knowledge/game/game-engine-selection.md +4 -0
- package/content/knowledge/game/game-ideation.md +4 -0
- package/content/knowledge/game/game-input-systems.md +4 -0
- package/content/knowledge/game/game-level-content-design.md +4 -0
- package/content/knowledge/game/game-liveops-analytics.md +4 -0
- package/content/knowledge/game/game-localization.md +4 -0
- package/content/knowledge/game/game-milestone-definitions.md +4 -0
- package/content/knowledge/game/game-modding-ugc.md +4 -0
- package/content/knowledge/game/game-narrative-design.md +4 -0
- package/content/knowledge/game/game-networking.md +4 -0
- package/content/knowledge/game/game-performance-budgeting.md +4 -0
- package/content/knowledge/game/game-platform-certification.md +6 -0
- package/content/knowledge/game/game-project-structure.md +4 -0
- package/content/knowledge/game/game-save-systems.md +4 -0
- package/content/knowledge/game/game-testing-strategy.md +4 -0
- package/content/knowledge/game/game-ui-patterns.md +4 -0
- package/content/knowledge/game/game-vr-ar-design.md +6 -0
- package/content/knowledge/library/library-api-design.md +4 -0
- package/content/knowledge/library/library-architecture.md +4 -0
- package/content/knowledge/library/library-bundling.md +4 -0
- package/content/knowledge/library/library-conventions.md +5 -0
- package/content/knowledge/library/library-dev-environment.md +4 -0
- package/content/knowledge/library/library-documentation.md +4 -0
- package/content/knowledge/library/library-project-structure.md +4 -0
- package/content/knowledge/library/library-requirements.md +4 -0
- package/content/knowledge/library/library-security.md +4 -0
- package/content/knowledge/library/library-testing.md +4 -0
- package/content/knowledge/library/library-type-definitions.md +4 -0
- package/content/knowledge/library/library-versioning.md +5 -0
- package/content/knowledge/ml/ml-architecture.md +4 -0
- package/content/knowledge/ml/ml-conventions.md +4 -0
- package/content/knowledge/ml/ml-dev-environment.md +4 -0
- package/content/knowledge/ml/ml-experiment-tracking.md +6 -0
- package/content/knowledge/ml/ml-model-evaluation.md +4 -0
- package/content/knowledge/ml/ml-observability.md +5 -0
- package/content/knowledge/ml/ml-project-structure.md +4 -0
- package/content/knowledge/ml/ml-requirements.md +4 -0
- package/content/knowledge/ml/ml-security.md +5 -0
- package/content/knowledge/ml/ml-serving-patterns.md +4 -0
- package/content/knowledge/ml/ml-testing.md +4 -0
- package/content/knowledge/ml/ml-training-patterns.md +4 -0
- package/content/knowledge/mobile-app/mobile-app-architecture.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-conventions.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-deployment.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-dev-environment.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-distribution.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-observability.md +7 -0
- package/content/knowledge/mobile-app/mobile-app-offline-patterns.md +7 -0
- package/content/knowledge/mobile-app/mobile-app-project-structure.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-push-notifications.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-requirements.md +7 -0
- package/content/knowledge/mobile-app/mobile-app-security.md +8 -0
- package/content/knowledge/mobile-app/mobile-app-testing.md +6 -0
- package/content/knowledge/product/gap-analysis.md +4 -0
- package/content/knowledge/product/ideation-craft.md +4 -0
- package/content/knowledge/product/prd-craft.md +4 -0
- package/content/knowledge/product/prd-innovation.md +4 -0
- package/content/knowledge/product/vision-craft.md +4 -0
- package/content/knowledge/product/vision-innovation.md +4 -0
- package/content/knowledge/research/research-architecture.md +4 -0
- package/content/knowledge/research/research-conventions.md +6 -0
- package/content/knowledge/research/research-dev-environment.md +6 -0
- package/content/knowledge/research/research-experiment-loop.md +4 -0
- package/content/knowledge/research/research-experiment-tracking.md +6 -0
- package/content/knowledge/research/research-ml-architecture-search.md +4 -0
- package/content/knowledge/research/research-ml-evaluation.md +4 -0
- package/content/knowledge/research/research-ml-experiment-tracking.md +6 -0
- package/content/knowledge/research/research-ml-training-patterns.md +4 -0
- package/content/knowledge/research/research-observability.md +5 -0
- package/content/knowledge/research/research-overfitting-prevention.md +5 -0
- package/content/knowledge/research/research-project-structure.md +5 -0
- package/content/knowledge/research/research-quant-backtesting.md +4 -0
- package/content/knowledge/research/research-quant-market-data.md +4 -0
- package/content/knowledge/research/research-quant-metrics.md +4 -0
- package/content/knowledge/research/research-quant-requirements.md +4 -0
- package/content/knowledge/research/research-quant-risk.md +4 -0
- package/content/knowledge/research/research-quant-strategy-patterns.md +4 -0
- package/content/knowledge/research/research-requirements.md +5 -0
- package/content/knowledge/research/research-security.md +5 -0
- package/content/knowledge/research/research-sim-compute-management.md +4 -0
- package/content/knowledge/research/research-sim-engine-patterns.md +4 -0
- package/content/knowledge/research/research-sim-parameter-spaces.md +4 -0
- package/content/knowledge/research/research-sim-validation.md +4 -0
- package/content/knowledge/research/research-testing.md +5 -0
- package/content/knowledge/review/review-adr.md +6 -0
- package/content/knowledge/review/review-api-design.md +6 -0
- package/content/knowledge/review/review-art-bible.md +4 -0
- package/content/knowledge/review/review-database-design.md +5 -0
- package/content/knowledge/review/review-domain-modeling.md +5 -0
- package/content/knowledge/review/review-game-design.md +4 -0
- package/content/knowledge/review/review-game-economy.md +4 -0
- package/content/knowledge/review/review-game-ui.md +5 -0
- package/content/knowledge/review/review-implementation-tasks.md +5 -0
- package/content/knowledge/review/review-methodology.md +4 -0
- package/content/knowledge/review/review-netcode.md +4 -0
- package/content/knowledge/review/review-operations.md +6 -0
- package/content/knowledge/review/review-platform-cert.md +4 -0
- package/content/knowledge/review/review-prd.md +4 -0
- package/content/knowledge/review/review-security.md +7 -0
- package/content/knowledge/review/review-system-architecture.md +6 -0
- package/content/knowledge/review/review-testing-strategy.md +6 -0
- package/content/knowledge/review/review-user-stories.md +5 -0
- package/content/knowledge/review/review-ux-specification.md +6 -0
- package/content/knowledge/review/review-vision.md +4 -0
- package/content/knowledge/tools/post-implementation-review-methodology.md +4 -0
- package/content/knowledge/tools/release-management.md +5 -0
- package/content/knowledge/tools/session-analysis.md +4 -0
- package/content/knowledge/tools/version-strategy.md +4 -0
- package/content/knowledge/validation/critical-path-analysis.md +4 -0
- package/content/knowledge/validation/cross-phase-consistency.md +4 -0
- package/content/knowledge/validation/decision-completeness.md +5 -0
- package/content/knowledge/validation/dependency-validation.md +4 -0
- package/content/knowledge/validation/implementability-review.md +4 -0
- package/content/knowledge/validation/scope-management.md +4 -0
- package/content/knowledge/validation/traceability.md +4 -0
- package/content/knowledge/web-app/web-app-api-patterns.md +6 -0
- package/content/knowledge/web-app/web-app-architecture.md +6 -0
- package/content/knowledge/web-app/web-app-auth-patterns.md +9 -0
- package/content/knowledge/web-app/web-app-conventions.md +5 -0
- package/content/knowledge/web-app/web-app-data-patterns.md +6 -0
- package/content/knowledge/web-app/web-app-deployment-workflow.md +6 -0
- package/content/knowledge/web-app/web-app-deployment.md +6 -0
- package/content/knowledge/web-app/web-app-design-system.md +6 -0
- package/content/knowledge/web-app/web-app-dev-environment.md +6 -0
- package/content/knowledge/web-app/web-app-observability.md +6 -0
- package/content/knowledge/web-app/web-app-project-structure.md +5 -0
- package/content/knowledge/web-app/web-app-rendering-strategies.md +6 -0
- package/content/knowledge/web-app/web-app-requirements.md +6 -0
- package/content/knowledge/web-app/web-app-security.md +8 -0
- package/content/knowledge/web-app/web-app-session-patterns.md +7 -0
- package/content/knowledge/web-app/web-app-testing.md +6 -0
- package/content/knowledge/web-app/web-app-ux-patterns.md +6 -0
- package/content/knowledge/web3/web3-access-control.md +8 -0
- package/content/knowledge/web3/web3-architecture.md +7 -0
- package/content/knowledge/web3/web3-audit-workflow.md +7 -0
- package/content/knowledge/web3/web3-common-vulnerabilities.md +8 -0
- package/content/knowledge/web3/web3-conventions.md +6 -0
- package/content/knowledge/web3/web3-deployment-and-verification.md +7 -0
- package/content/knowledge/web3/web3-dev-environment.md +6 -0
- package/content/knowledge/web3/web3-gas-optimization.md +7 -0
- package/content/knowledge/web3/web3-oracles-and-external-data.md +7 -0
- package/content/knowledge/web3/web3-project-structure.md +6 -0
- package/content/knowledge/web3/web3-requirements.md +6 -0
- package/content/knowledge/web3/web3-security.md +8 -0
- package/content/knowledge/web3/web3-testing.md +6 -0
- package/content/knowledge/web3/web3-upgradeability.md +7 -0
- package/content/tools/knowledge-audit-entry.md +79 -0
- package/content/tools/review-code.md +41 -14
- package/content/tools/review-pr.md +32 -14
- package/dist/cli/commands/dashboard.d.ts +1 -1
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +10 -10
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/dashboard.test.js +1 -1
- package/dist/cli/commands/dashboard.test.js.map +1 -1
- package/dist/cli/commands/guides.d.ts +24 -0
- package/dist/cli/commands/guides.d.ts.map +1 -0
- package/dist/cli/commands/guides.js +103 -0
- package/dist/cli/commands/guides.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts +9 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js +112 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts +8 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.js +96 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts +7 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.js +42 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts +9 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.js +63 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.d.ts +8 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.js +34 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts +7 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js +51 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-link-check.d.ts +7 -0
- package/dist/cli/commands/knowledge-freshness-link-check.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-link-check.js +57 -0
- package/dist/cli/commands/knowledge-freshness-link-check.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts +8 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.js +58 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness.d.ts +4 -0
- package/dist/cli/commands/knowledge-freshness.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness.js +25 -0
- package/dist/cli/commands/knowledge-freshness.js.map +1 -0
- package/dist/cli/commands/observe.d.ts +4 -0
- package/dist/cli/commands/observe.d.ts.map +1 -1
- package/dist/cli/commands/observe.js +13 -0
- package/dist/cli/commands/observe.js.map +1 -1
- package/dist/cli/commands/observe.test.js +46 -0
- package/dist/cli/commands/observe.test.js.map +1 -1
- package/dist/cli/commands/validate-knowledge.d.ts +4 -0
- package/dist/cli/commands/validate-knowledge.d.ts.map +1 -0
- package/dist/cli/commands/validate-knowledge.js +32 -0
- package/dist/cli/commands/validate-knowledge.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts.map +1 -1
- package/dist/core/adapters/claude-code.js +6 -3
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/claude-code.test.js +45 -1
- package/dist/core/adapters/claude-code.test.js.map +1 -1
- package/dist/core/assembly/engine.d.ts.map +1 -1
- package/dist/core/assembly/engine.js +7 -3
- package/dist/core/assembly/engine.js.map +1 -1
- package/dist/core/assembly/engine.test.js +45 -1
- package/dist/core/assembly/engine.test.js.map +1 -1
- package/dist/core/assembly/gap-signal-tail.d.ts +18 -0
- package/dist/core/assembly/gap-signal-tail.d.ts.map +1 -0
- package/dist/core/assembly/gap-signal-tail.js +43 -0
- package/dist/core/assembly/gap-signal-tail.js.map +1 -0
- package/dist/core/assembly/gap-signal-tail.test.d.ts +2 -0
- package/dist/core/assembly/gap-signal-tail.test.d.ts.map +1 -0
- package/dist/core/assembly/gap-signal-tail.test.js +49 -0
- package/dist/core/assembly/gap-signal-tail.test.js.map +1 -0
- package/dist/core/assembly/knowledge-loader.d.ts +11 -0
- package/dist/core/assembly/knowledge-loader.d.ts.map +1 -1
- package/dist/core/assembly/knowledge-loader.js +54 -1
- package/dist/core/assembly/knowledge-loader.js.map +1 -1
- package/dist/core/assembly/knowledge-loader.test.js +73 -0
- package/dist/core/assembly/knowledge-loader.test.js.map +1 -1
- package/dist/guides/build.d.ts +12 -0
- package/dist/guides/build.d.ts.map +1 -0
- package/dist/guides/build.js +50 -0
- package/dist/guides/build.js.map +1 -0
- package/dist/guides/build.test.d.ts +2 -0
- package/dist/guides/build.test.d.ts.map +1 -0
- package/dist/guides/build.test.js +74 -0
- package/dist/guides/build.test.js.map +1 -0
- package/dist/guides/chrome.d.ts +24 -0
- package/dist/guides/chrome.d.ts.map +1 -0
- package/dist/guides/chrome.js +118 -0
- package/dist/guides/chrome.js.map +1 -0
- package/dist/guides/cli-guides.test.d.ts +2 -0
- package/dist/guides/cli-guides.test.d.ts.map +1 -0
- package/dist/guides/cli-guides.test.js +41 -0
- package/dist/guides/cli-guides.test.js.map +1 -0
- package/dist/guides/dashboard-theme.css +1073 -0
- package/dist/guides/directives-callout.test.d.ts +2 -0
- package/dist/guides/directives-callout.test.d.ts.map +1 -0
- package/dist/guides/directives-callout.test.js +22 -0
- package/dist/guides/directives-callout.test.js.map +1 -0
- package/dist/guides/directives-chart.test.d.ts +2 -0
- package/dist/guides/directives-chart.test.d.ts.map +1 -0
- package/dist/guides/directives-chart.test.js +25 -0
- package/dist/guides/directives-chart.test.js.map +1 -0
- package/dist/guides/directives-filter-table.test.d.ts +2 -0
- package/dist/guides/directives-filter-table.test.d.ts.map +1 -0
- package/dist/guides/directives-filter-table.test.js +22 -0
- package/dist/guides/directives-filter-table.test.js.map +1 -0
- package/dist/guides/directives-sev.test.d.ts +2 -0
- package/dist/guides/directives-sev.test.d.ts.map +1 -0
- package/dist/guides/directives-sev.test.js +15 -0
- package/dist/guides/directives-sev.test.js.map +1 -0
- package/dist/guides/directives-tabs.test.d.ts +2 -0
- package/dist/guides/directives-tabs.test.d.ts.map +1 -0
- package/dist/guides/directives-tabs.test.js +52 -0
- package/dist/guides/directives-tabs.test.js.map +1 -0
- package/dist/guides/directives.d.ts +7 -0
- package/dist/guides/directives.d.ts.map +1 -0
- package/dist/guides/directives.js +158 -0
- package/dist/guides/directives.js.map +1 -0
- package/dist/guides/fs-guides.test.d.ts +2 -0
- package/dist/guides/fs-guides.test.d.ts.map +1 -0
- package/dist/guides/fs-guides.test.js +14 -0
- package/dist/guides/fs-guides.test.js.map +1 -0
- package/dist/guides/index-page.d.ts +3 -0
- package/dist/guides/index-page.d.ts.map +1 -0
- package/dist/guides/index-page.js +14 -0
- package/dist/guides/index-page.js.map +1 -0
- package/dist/guides/lint.d.ts +6 -0
- package/dist/guides/lint.d.ts.map +1 -0
- package/dist/guides/lint.js +27 -0
- package/dist/guides/lint.js.map +1 -0
- package/dist/guides/lint.test.d.ts +2 -0
- package/dist/guides/lint.test.d.ts.map +1 -0
- package/dist/guides/lint.test.js +24 -0
- package/dist/guides/lint.test.js.map +1 -0
- package/dist/guides/loader.d.ts +4 -0
- package/dist/guides/loader.d.ts.map +1 -0
- package/dist/guides/loader.js +63 -0
- package/dist/guides/loader.js.map +1 -0
- package/dist/guides/loader.test.d.ts +2 -0
- package/dist/guides/loader.test.d.ts.map +1 -0
- package/dist/guides/loader.test.js +85 -0
- package/dist/guides/loader.test.js.map +1 -0
- package/dist/guides/mermaid-sanitize.test.d.ts +2 -0
- package/dist/guides/mermaid-sanitize.test.d.ts.map +1 -0
- package/dist/guides/mermaid-sanitize.test.js +57 -0
- package/dist/guides/mermaid-sanitize.test.js.map +1 -0
- package/dist/guides/mermaid.d.ts +18 -0
- package/dist/guides/mermaid.d.ts.map +1 -0
- package/dist/guides/mermaid.js +137 -0
- package/dist/guides/mermaid.js.map +1 -0
- package/dist/guides/mermaid.test.d.ts +2 -0
- package/dist/guides/mermaid.test.d.ts.map +1 -0
- package/dist/guides/mermaid.test.js +105 -0
- package/dist/guides/mermaid.test.js.map +1 -0
- package/dist/guides/render.d.ts +12 -0
- package/dist/guides/render.d.ts.map +1 -0
- package/dist/guides/render.js +58 -0
- package/dist/guides/render.js.map +1 -0
- package/dist/guides/render.test.d.ts +2 -0
- package/dist/guides/render.test.d.ts.map +1 -0
- package/dist/guides/render.test.js +46 -0
- package/dist/guides/render.test.js.map +1 -0
- package/dist/guides/sanitize.d.ts +3 -0
- package/dist/guides/sanitize.d.ts.map +1 -0
- package/dist/guides/sanitize.js +76 -0
- package/dist/guides/sanitize.js.map +1 -0
- package/dist/guides/sanitize.test.d.ts +2 -0
- package/dist/guides/sanitize.test.d.ts.map +1 -0
- package/dist/guides/sanitize.test.js +45 -0
- package/dist/guides/sanitize.test.js.map +1 -0
- package/dist/guides/template.d.ts +11 -0
- package/dist/guides/template.d.ts.map +1 -0
- package/dist/guides/template.js +38 -0
- package/dist/guides/template.js.map +1 -0
- package/dist/guides/template.test.d.ts +2 -0
- package/dist/guides/template.test.d.ts.map +1 -0
- package/dist/guides/template.test.js +41 -0
- package/dist/guides/template.test.js.map +1 -0
- package/dist/guides/types.d.ts +20 -0
- package/dist/guides/types.d.ts.map +1 -0
- package/dist/guides/types.js +2 -0
- package/dist/guides/types.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.d.ts +64 -0
- package/dist/knowledge-freshness/audit-apply-pr.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.js +309 -0
- package/dist/knowledge-freshness/audit-apply-pr.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.js +211 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply.d.ts +16 -0
- package/dist/knowledge-freshness/audit-apply.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply.js +193 -0
- package/dist/knowledge-freshness/audit-apply.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-apply.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply.test.js +482 -0
- package/dist/knowledge-freshness/audit-apply.test.js.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.d.ts +12 -0
- package/dist/knowledge-freshness/audit-prefilter.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.js +74 -0
- package/dist/knowledge-freshness/audit-prefilter.js.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-prefilter.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.test.js +78 -0
- package/dist/knowledge-freshness/audit-prefilter.test.js.map +1 -0
- package/dist/knowledge-freshness/audit-runner.d.ts +135 -0
- package/dist/knowledge-freshness/audit-runner.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-runner.js +168 -0
- package/dist/knowledge-freshness/audit-runner.js.map +1 -0
- package/dist/knowledge-freshness/audit-runner.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-runner.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-runner.test.js +130 -0
- package/dist/knowledge-freshness/audit-runner.test.js.map +1 -0
- package/dist/knowledge-freshness/bump-version.d.ts +24 -0
- package/dist/knowledge-freshness/bump-version.d.ts.map +1 -0
- package/dist/knowledge-freshness/bump-version.js +69 -0
- package/dist/knowledge-freshness/bump-version.js.map +1 -0
- package/dist/knowledge-freshness/bump-version.test.d.ts +2 -0
- package/dist/knowledge-freshness/bump-version.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/bump-version.test.js +82 -0
- package/dist/knowledge-freshness/bump-version.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts +86 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.js +210 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.js.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js +115 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/changed-files.d.ts +53 -0
- package/dist/knowledge-freshness/gates/changed-files.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/changed-files.js +128 -0
- package/dist/knowledge-freshness/gates/changed-files.js.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts +23 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.js +27 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.js.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.js +23 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.d.ts +55 -0
- package/dist/knowledge-freshness/gates/link-check.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.js +161 -0
- package/dist/knowledge-freshness/gates/link-check.js.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/link-check.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.test.js +76 -0
- package/dist/knowledge-freshness/gates/link-check.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.d.ts +40 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.js +143 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.js.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.js +68 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.d.ts +25 -0
- package/dist/knowledge-freshness/gates/parse-entry.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.js +41 -0
- package/dist/knowledge-freshness/gates/parse-entry.js.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.js +34 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.js.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.d.ts +33 -0
- package/dist/knowledge-freshness/providers/anthropic.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.js +36 -0
- package/dist/knowledge-freshness/providers/anthropic.js.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.test.d.ts +2 -0
- package/dist/knowledge-freshness/providers/anthropic.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.test.js +32 -0
- package/dist/knowledge-freshness/providers/anthropic.test.js.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.d.ts +33 -0
- package/dist/knowledge-freshness/providers/deepseek.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.js +157 -0
- package/dist/knowledge-freshness/providers/deepseek.js.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.test.d.ts +2 -0
- package/dist/knowledge-freshness/providers/deepseek.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.test.js +142 -0
- package/dist/knowledge-freshness/providers/deepseek.test.js.map +1 -0
- package/dist/knowledge-freshness/providers/index.d.ts +41 -0
- package/dist/knowledge-freshness/providers/index.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/index.js +108 -0
- package/dist/knowledge-freshness/providers/index.js.map +1 -0
- package/dist/knowledge-freshness/providers/index.test.d.ts +2 -0
- package/dist/knowledge-freshness/providers/index.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/index.test.js +97 -0
- package/dist/knowledge-freshness/providers/index.test.js.map +1 -0
- package/dist/knowledge-freshness/source-hash.d.ts +39 -0
- package/dist/knowledge-freshness/source-hash.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-hash.js +180 -0
- package/dist/knowledge-freshness/source-hash.js.map +1 -0
- package/dist/knowledge-freshness/source-hash.test.d.ts +2 -0
- package/dist/knowledge-freshness/source-hash.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-hash.test.js +63 -0
- package/dist/knowledge-freshness/source-hash.test.js.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.d.ts +57 -0
- package/dist/knowledge-freshness/source-url-validator.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.js +304 -0
- package/dist/knowledge-freshness/source-url-validator.js.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.test.d.ts +2 -0
- package/dist/knowledge-freshness/source-url-validator.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.test.js +167 -0
- package/dist/knowledge-freshness/source-url-validator.test.js.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.d.ts +3 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.js +165 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.js.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts +2 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.js +421 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.js.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.d.ts +16 -0
- package/dist/observability/checks/lens-i-lessons-scanner.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.js +106 -0
- package/dist/observability/checks/lens-i-lessons-scanner.js.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts +2 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.js +174 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.js.map +1 -0
- package/dist/observability/engine/api.d.ts +4 -0
- package/dist/observability/engine/api.d.ts.map +1 -1
- package/dist/observability/engine/api.js +17 -1
- package/dist/observability/engine/api.js.map +1 -1
- package/dist/observability/engine/checks/observability-config.d.ts +4 -0
- package/dist/observability/engine/checks/observability-config.d.ts.map +1 -1
- package/dist/observability/engine/checks/observability-config.js +1 -0
- package/dist/observability/engine/checks/observability-config.js.map +1 -1
- package/dist/observability/engine/checks/registry.d.ts.map +1 -1
- package/dist/observability/engine/checks/registry.js +7 -0
- package/dist/observability/engine/checks/registry.js.map +1 -1
- package/dist/observability/engine/checks/registry.test.js +3 -2
- package/dist/observability/engine/checks/registry.test.js.map +1 -1
- package/dist/observability/engine/checks/runner.d.ts +30 -0
- package/dist/observability/engine/checks/runner.d.ts.map +1 -1
- package/dist/observability/engine/checks/runner.js +8 -1
- package/dist/observability/engine/checks/runner.js.map +1 -1
- package/dist/observability/engine/checks/runner.test.js +74 -0
- package/dist/observability/engine/checks/runner.test.js.map +1 -1
- package/dist/observability/engine/event-schemas.d.ts.map +1 -1
- package/dist/observability/engine/event-schemas.js +41 -3
- package/dist/observability/engine/event-schemas.js.map +1 -1
- package/dist/observability/engine/event-schemas.test.js +105 -0
- package/dist/observability/engine/event-schemas.test.js.map +1 -1
- package/dist/observability/engine/fix-flow.d.ts +7 -0
- package/dist/observability/engine/fix-flow.d.ts.map +1 -1
- package/dist/observability/engine/fix-flow.js +5 -3
- package/dist/observability/engine/fix-flow.js.map +1 -1
- package/dist/observability/engine/knowledge-root-integration.test.d.ts +2 -0
- package/dist/observability/engine/knowledge-root-integration.test.d.ts.map +1 -0
- package/dist/observability/engine/knowledge-root-integration.test.js +103 -0
- package/dist/observability/engine/knowledge-root-integration.test.js.map +1 -0
- package/dist/observability/engine/types.d.ts +20 -1
- package/dist/observability/engine/types.d.ts.map +1 -1
- package/dist/observability/engine/types.test.js +1 -1
- package/dist/observability/engine/types.test.js.map +1 -1
- package/dist/observability/knowledge-index.d.ts +145 -0
- package/dist/observability/knowledge-index.d.ts.map +1 -0
- package/dist/observability/knowledge-index.js +353 -0
- package/dist/observability/knowledge-index.js.map +1 -0
- package/dist/observability/knowledge-index.test.d.ts +2 -0
- package/dist/observability/knowledge-index.test.d.ts.map +1 -0
- package/dist/observability/knowledge-index.test.js +364 -0
- package/dist/observability/knowledge-index.test.js.map +1 -0
- package/dist/observability/renderers/markdown.d.ts.map +1 -1
- package/dist/observability/renderers/markdown.js +14 -0
- package/dist/observability/renderers/markdown.js.map +1 -1
- package/dist/observability/renderers/markdown.test.js +30 -0
- package/dist/observability/renderers/markdown.test.js.map +1 -1
- package/dist/types/assembly.d.ts +10 -0
- package/dist/types/assembly.d.ts.map +1 -1
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +13 -0
- package/dist/utils/fs.js.map +1 -1
- package/dist/validation/knowledge-frontmatter-validator.d.ts +15 -0
- package/dist/validation/knowledge-frontmatter-validator.d.ts.map +1 -0
- package/dist/validation/knowledge-frontmatter-validator.js +131 -0
- package/dist/validation/knowledge-frontmatter-validator.js.map +1 -0
- package/dist/validation/knowledge-frontmatter-validator.test.d.ts +2 -0
- package/dist/validation/knowledge-frontmatter-validator.test.d.ts.map +1 -0
- package/dist/validation/knowledge-frontmatter-validator.test.js +66 -0
- package/dist/validation/knowledge-frontmatter-validator.test.js.map +1 -0
- package/package.json +13 -4
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface LintFinding {
|
|
2
|
+
/** Source path inside `content/knowledge/`. */
|
|
3
|
+
file: string;
|
|
4
|
+
/** 1-based line number in the FILE (post-patch). */
|
|
5
|
+
line: number;
|
|
6
|
+
/** Trimmed text of the offending line (no leading `+`). */
|
|
7
|
+
text: string;
|
|
8
|
+
/** Short reason, e.g. "no source link within 3 lines". */
|
|
9
|
+
reason: string;
|
|
10
|
+
}
|
|
11
|
+
export interface LintInput {
|
|
12
|
+
/** Path of the changed file. */
|
|
13
|
+
file: string;
|
|
14
|
+
/** Raw file contents AFTER the change. */
|
|
15
|
+
content: string;
|
|
16
|
+
/**
|
|
17
|
+
* Added-line records from the diff: line numbers (1-based, post-patch) and
|
|
18
|
+
* the line text WITHOUT the leading `+`. Caller is responsible for parsing
|
|
19
|
+
* the unified diff and producing this list — keeps this module pure.
|
|
20
|
+
*/
|
|
21
|
+
addedLines: Array<{
|
|
22
|
+
line: number;
|
|
23
|
+
text: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare function lintUnsourcedClaims(inputs: LintInput[]): LintFinding[];
|
|
27
|
+
/**
|
|
28
|
+
* Parse a unified diff (`git diff` output) into per-file added-line lists.
|
|
29
|
+
* Only `content/knowledge/**\/*.md` paths are emitted; other files are
|
|
30
|
+
* silently dropped so the caller can pipe an unfiltered diff in.
|
|
31
|
+
*/
|
|
32
|
+
export interface DiffParseResult {
|
|
33
|
+
file: string;
|
|
34
|
+
addedLines: Array<{
|
|
35
|
+
line: number;
|
|
36
|
+
text: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export declare function parseUnifiedDiff(diff: string): DiffParseResult[];
|
|
40
|
+
//# sourceMappingURL=lint-unsourced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-unsourced.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/lint-unsourced.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAwCD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,WAAW,EAAE,CA4BtE;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAyChE"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisory lint: scans a unified diff for ADDED lines in
|
|
3
|
+
* `content/knowledge/**\/*.md` that read like normative claims and don't have
|
|
4
|
+
* a nearby markdown link to a domain present in the entry's declared
|
|
5
|
+
* `sources:`. Emits one warning per offending line. Spec §A.5 explicitly says
|
|
6
|
+
* "Heuristic, advisory; flags for review, doesn't block" — never returns a
|
|
7
|
+
* non-OK status.
|
|
8
|
+
*/
|
|
9
|
+
import { parseEntry } from './parse-entry.js';
|
|
10
|
+
/** Whole-word match for normative-claim keywords (case-insensitive). */
|
|
11
|
+
const NORMATIVE_RE = /\b(must|should|never|always)\b/i;
|
|
12
|
+
const NEAR_LINES = 3;
|
|
13
|
+
/**
|
|
14
|
+
* Extract the set of source domains (hostnames) declared in the entry's
|
|
15
|
+
* frontmatter. Used to decide whether a nearby link "counts" — links to
|
|
16
|
+
* arbitrary unrelated URLs don't satisfy the heuristic.
|
|
17
|
+
*/
|
|
18
|
+
function sourceDomains(content) {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = parseEntry(content);
|
|
21
|
+
const out = new Set();
|
|
22
|
+
for (const url of parsed.sourceUrls) {
|
|
23
|
+
try {
|
|
24
|
+
out.add(new URL(url).hostname);
|
|
25
|
+
}
|
|
26
|
+
catch { /* ignore unparseable */ }
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return new Set();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* True if `line` (a markdown line) contains a `[text](http...)` link whose
|
|
36
|
+
* hostname appears in `domains`.
|
|
37
|
+
*/
|
|
38
|
+
function lineHasSourceLink(line, domains) {
|
|
39
|
+
// Match every markdown link in the line. The regex is non-greedy on link
|
|
40
|
+
// text so back-to-back links don't merge into one match.
|
|
41
|
+
const re = /\[[^\]]*\]\((https?:\/\/[^\s)]+)\)/g;
|
|
42
|
+
for (let m = re.exec(line); m; m = re.exec(line)) {
|
|
43
|
+
try {
|
|
44
|
+
const h = new URL(m[1]).hostname;
|
|
45
|
+
if (domains.has(h))
|
|
46
|
+
return true;
|
|
47
|
+
// Accept subdomain matches so a source declared as "owasp.org" still
|
|
48
|
+
// covers a citation to "cheatsheetseries.owasp.org".
|
|
49
|
+
for (const d of domains)
|
|
50
|
+
if (h.endsWith('.' + d))
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch { /* ignore */ }
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
export function lintUnsourcedClaims(inputs) {
|
|
58
|
+
const findings = [];
|
|
59
|
+
for (const input of inputs) {
|
|
60
|
+
if (input.addedLines.length === 0)
|
|
61
|
+
continue;
|
|
62
|
+
const domains = sourceDomains(input.content);
|
|
63
|
+
const fileLines = input.content.split('\n');
|
|
64
|
+
for (const added of input.addedLines) {
|
|
65
|
+
if (!NORMATIVE_RE.test(added.text))
|
|
66
|
+
continue;
|
|
67
|
+
// Look within ±NEAR_LINES of the offending line. `line` is 1-based.
|
|
68
|
+
const lo = Math.max(0, added.line - 1 - NEAR_LINES);
|
|
69
|
+
const hi = Math.min(fileLines.length - 1, added.line - 1 + NEAR_LINES);
|
|
70
|
+
let found = false;
|
|
71
|
+
for (let i = lo; i <= hi; i++) {
|
|
72
|
+
if (lineHasSourceLink(fileLines[i] ?? '', domains)) {
|
|
73
|
+
found = true;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!found) {
|
|
78
|
+
findings.push({
|
|
79
|
+
file: input.file,
|
|
80
|
+
line: added.line,
|
|
81
|
+
text: added.text.trim(),
|
|
82
|
+
reason: domains.size === 0
|
|
83
|
+
? 'normative claim added but entry declares no sources'
|
|
84
|
+
: `no link to a declared source within ${NEAR_LINES} lines`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return findings;
|
|
90
|
+
}
|
|
91
|
+
export function parseUnifiedDiff(diff) {
|
|
92
|
+
const out = [];
|
|
93
|
+
const lines = diff.split('\n');
|
|
94
|
+
let i = 0;
|
|
95
|
+
while (i < lines.length) {
|
|
96
|
+
const line = lines[i];
|
|
97
|
+
if (line.startsWith('diff --git ')) {
|
|
98
|
+
// Header form: `diff --git a/path b/path`. Use the b-side as canonical.
|
|
99
|
+
const m = line.match(/^diff --git a\/(.+) b\/(.+)$/);
|
|
100
|
+
const file = m ? m[2] : '';
|
|
101
|
+
i++;
|
|
102
|
+
// Skip header lines until we hit a hunk or the next file.
|
|
103
|
+
while (i < lines.length && !lines[i].startsWith('@@') && !lines[i].startsWith('diff --git '))
|
|
104
|
+
i++;
|
|
105
|
+
if (!file.startsWith('content/knowledge/') || !file.endsWith('.md'))
|
|
106
|
+
continue;
|
|
107
|
+
const added = [];
|
|
108
|
+
while (i < lines.length && !lines[i].startsWith('diff --git ')) {
|
|
109
|
+
const hunk = lines[i].match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
|
|
110
|
+
if (!hunk) {
|
|
111
|
+
i++;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
let curLine = Number(hunk[1]);
|
|
115
|
+
i++;
|
|
116
|
+
while (i < lines.length && !lines[i].startsWith('@@') && !lines[i].startsWith('diff --git ')) {
|
|
117
|
+
const ch = lines[i].charAt(0);
|
|
118
|
+
if (ch === '+' && !lines[i].startsWith('+++')) {
|
|
119
|
+
added.push({ line: curLine, text: lines[i].slice(1) });
|
|
120
|
+
curLine++;
|
|
121
|
+
}
|
|
122
|
+
else if (ch === '-' && !lines[i].startsWith('---')) {
|
|
123
|
+
// deletion — don't advance post-patch line counter
|
|
124
|
+
}
|
|
125
|
+
else if (ch === '\\') {
|
|
126
|
+
// "" — skip
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
curLine++;
|
|
130
|
+
}
|
|
131
|
+
i++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (added.length > 0)
|
|
135
|
+
out.push({ file, addedLines: added });
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
i++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=lint-unsourced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-unsourced.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/lint-unsourced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-unsourced.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/lint-unsourced.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { lintUnsourcedClaims, parseUnifiedDiff } from './lint-unsourced.js';
|
|
3
|
+
const fmWithSource = [
|
|
4
|
+
'---',
|
|
5
|
+
'name: x',
|
|
6
|
+
'sources:',
|
|
7
|
+
' - url: https://owasp.org/Top10/',
|
|
8
|
+
'---',
|
|
9
|
+
].join('\n');
|
|
10
|
+
describe('lintUnsourcedClaims', () => {
|
|
11
|
+
it('flags normative claims with no nearby source link', () => {
|
|
12
|
+
const content = `${fmWithSource}\n## Body\nYou must use bcrypt cost 12.\n`;
|
|
13
|
+
const findings = lintUnsourcedClaims([
|
|
14
|
+
{ file: 'x.md', content, addedLines: [{ line: 7, text: 'You must use bcrypt cost 12.' }] },
|
|
15
|
+
]);
|
|
16
|
+
expect(findings).toHaveLength(1);
|
|
17
|
+
expect(findings[0].reason).toMatch(/no link/);
|
|
18
|
+
});
|
|
19
|
+
it('does not flag claims with a nearby source link', () => {
|
|
20
|
+
const content = `${fmWithSource}
|
|
21
|
+
## Body
|
|
22
|
+
You must use bcrypt cost 12.
|
|
23
|
+
See [OWASP](https://owasp.org/Top10/).
|
|
24
|
+
`;
|
|
25
|
+
const findings = lintUnsourcedClaims([
|
|
26
|
+
{ file: 'x.md', content, addedLines: [{ line: 7, text: 'You must use bcrypt cost 12.' }] },
|
|
27
|
+
]);
|
|
28
|
+
expect(findings).toHaveLength(0);
|
|
29
|
+
});
|
|
30
|
+
it('does not flag non-normative additions', () => {
|
|
31
|
+
const content = `${fmWithSource}\n## Body\nThis section covers passwords.\n`;
|
|
32
|
+
const findings = lintUnsourcedClaims([
|
|
33
|
+
{ file: 'x.md', content, addedLines: [{ line: 7, text: 'This section covers passwords.' }] },
|
|
34
|
+
]);
|
|
35
|
+
expect(findings).toHaveLength(0);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('parseUnifiedDiff', () => {
|
|
39
|
+
it('extracts added lines from a unified diff for knowledge files', () => {
|
|
40
|
+
const diff = [
|
|
41
|
+
'diff --git a/content/knowledge/x/y.md b/content/knowledge/x/y.md',
|
|
42
|
+
'index abc..def 100644',
|
|
43
|
+
'--- a/content/knowledge/x/y.md',
|
|
44
|
+
'+++ b/content/knowledge/x/y.md',
|
|
45
|
+
'@@ -1,3 +1,4 @@',
|
|
46
|
+
' line one',
|
|
47
|
+
'+new line two',
|
|
48
|
+
' line three',
|
|
49
|
+
'+new line four',
|
|
50
|
+
].join('\n');
|
|
51
|
+
const out = parseUnifiedDiff(diff);
|
|
52
|
+
expect(out).toHaveLength(1);
|
|
53
|
+
expect(out[0].file).toBe('content/knowledge/x/y.md');
|
|
54
|
+
expect(out[0].addedLines.map((l) => l.text)).toEqual(['new line two', 'new line four']);
|
|
55
|
+
});
|
|
56
|
+
it('ignores non-knowledge files', () => {
|
|
57
|
+
const diff = [
|
|
58
|
+
'diff --git a/src/foo.ts b/src/foo.ts',
|
|
59
|
+
'--- a/src/foo.ts',
|
|
60
|
+
'+++ b/src/foo.ts',
|
|
61
|
+
'@@ -1,1 +1,2 @@',
|
|
62
|
+
' x',
|
|
63
|
+
'+y',
|
|
64
|
+
].join('\n');
|
|
65
|
+
expect(parseUnifiedDiff(diff)).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=lint-unsourced.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint-unsourced.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/lint-unsourced.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE3E,MAAM,YAAY,GAAG;IACnB,KAAK;IACL,SAAS;IACT,UAAU;IACV,mCAAmC;IACnC,KAAK;CACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,GAAG,YAAY,2CAA2C,CAAA;QAC1E,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE;SAC3F,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAG,GAAG,YAAY;;;;CAIlC,CAAA;QACG,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC,EAAE;SAC3F,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,GAAG,YAAY,6CAA6C,CAAA;QAC5E,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,EAAE;SAC7F,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,IAAI,GAAG;YACX,kEAAkE;YAClE,uBAAuB;YACvB,gCAAgC;YAChC,gCAAgC;YAChC,iBAAiB;YACjB,WAAW;YACX,eAAe;YACf,aAAa;YACb,gBAAgB;SACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACpD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG;YACX,sCAAsC;YACtC,kBAAkB;YAClB,kBAAkB;YAClB,iBAAiB;YACjB,IAAI;YACJ,IAAI;SACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal frontmatter shape used by the freshness CI gates. We keep this
|
|
3
|
+
* deliberately narrow rather than reusing `KnowledgeEntry` from
|
|
4
|
+
* `src/types/index.ts` because the gates operate on raw `.md` files in a PR
|
|
5
|
+
* checkout (no project resolver, no overrides) and need to be tolerant of
|
|
6
|
+
* partially-populated frontmatter from in-progress drafts.
|
|
7
|
+
*/
|
|
8
|
+
export interface ParsedFreshnessEntry {
|
|
9
|
+
/** Raw frontmatter object (yaml.JSON_SCHEMA — ISO dates stay strings). */
|
|
10
|
+
frontmatter: Record<string, unknown>;
|
|
11
|
+
/** Markdown body (everything after the closing `---`). */
|
|
12
|
+
body: string;
|
|
13
|
+
/** Convenience accessor: declared `sources[].url` values (empty array if none). */
|
|
14
|
+
sourceUrls: string[];
|
|
15
|
+
/** Convenience accessor: declared `volatility` value (or null). */
|
|
16
|
+
volatility: 'stable' | 'evolving' | 'fast-moving' | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse a freshness-relevant entry. Throws only on unrecoverable shape errors
|
|
20
|
+
* (no frontmatter at all, unclosed `---`); a missing or non-array `sources`
|
|
21
|
+
* surfaces as an empty `sourceUrls` so gate callers can decide whether to
|
|
22
|
+
* treat that as a hard fail (link-check) or a noop (over-rewrite).
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseEntry(raw: string): ParsedFreshnessEntry;
|
|
25
|
+
//# sourceMappingURL=parse-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-entry.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/parse-entry.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,mFAAmF;IACnF,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,mEAAmE;IACnE,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAA;CACzD;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAiC5D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import yaml from 'js-yaml';
|
|
2
|
+
const VOLATILITIES = new Set(['stable', 'evolving', 'fast-moving']);
|
|
3
|
+
/**
|
|
4
|
+
* Parse a freshness-relevant entry. Throws only on unrecoverable shape errors
|
|
5
|
+
* (no frontmatter at all, unclosed `---`); a missing or non-array `sources`
|
|
6
|
+
* surfaces as an empty `sourceUrls` so gate callers can decide whether to
|
|
7
|
+
* treat that as a hard fail (link-check) or a noop (over-rewrite).
|
|
8
|
+
*/
|
|
9
|
+
export function parseEntry(raw) {
|
|
10
|
+
// Round-6 F-001: strip optional UTF-8 BOM (U+FEFF) so files authored on
|
|
11
|
+
// Windows or with a BOM don't crash gate processing. lines[0].trim() would
|
|
12
|
+
// see the BOM glyph in front of `---` and fail the equality check.
|
|
13
|
+
const BOM = '';
|
|
14
|
+
const normalized = raw.startsWith(BOM) ? raw.slice(BOM.length) : raw;
|
|
15
|
+
const lines = normalized.split(/\r?\n/);
|
|
16
|
+
if (lines[0]?.trim() !== '---') {
|
|
17
|
+
throw new Error('entry has no frontmatter');
|
|
18
|
+
}
|
|
19
|
+
let close = -1;
|
|
20
|
+
for (let i = 1; i < lines.length; i++) {
|
|
21
|
+
if (lines[i].trim() === '---') {
|
|
22
|
+
close = i;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (close === -1)
|
|
27
|
+
throw new Error('frontmatter unclosed');
|
|
28
|
+
const fm = yaml.load(lines.slice(1, close).join('\n'), { schema: yaml.JSON_SCHEMA });
|
|
29
|
+
const fmObj = fm && typeof fm === 'object' ? fm : {};
|
|
30
|
+
const body = lines.slice(close + 1).join('\n');
|
|
31
|
+
const sources = Array.isArray(fmObj['sources']) ? fmObj['sources'] : [];
|
|
32
|
+
const sourceUrls = sources
|
|
33
|
+
.map((s) => (s && typeof s === 'object' && 'url' in s ? s.url : undefined))
|
|
34
|
+
.filter((u) => typeof u === 'string' && u.length > 0);
|
|
35
|
+
const volRaw = fmObj['volatility'];
|
|
36
|
+
const volatility = typeof volRaw === 'string' && VOLATILITIES.has(volRaw)
|
|
37
|
+
? volRaw
|
|
38
|
+
: null;
|
|
39
|
+
return { frontmatter: fmObj, body, sourceUrls, volatility };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=parse-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-entry.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/parse-entry.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAA;AAoB1B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;AAEnE;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,wEAAwE;IACxE,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,GAAG,GAAG,GAAG,CAAA;IACf,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACpE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAAC,KAAK,GAAG,CAAC,CAAC;YAAC,MAAK;QAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;IAEzD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CACnD,CAAA;IAChC,MAAM,KAAK,GAAG,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAEpD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAc,CAAC,CAAC,CAAC,EAAE,CAAA;IACpF,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,CAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SACjG,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEpE,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,CAAA;IAClC,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QACvE,CAAC,CAAE,MAA6C;QAChD,CAAC,CAAC,IAAI,CAAA;IAER,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAA;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-entry.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/parse-entry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseEntry } from './parse-entry.js';
|
|
3
|
+
describe('parseEntry', () => {
|
|
4
|
+
it('extracts frontmatter, body, sources, and volatility', () => {
|
|
5
|
+
const raw = [
|
|
6
|
+
'---',
|
|
7
|
+
'name: x',
|
|
8
|
+
'volatility: stable',
|
|
9
|
+
'sources:',
|
|
10
|
+
' - url: https://example.com/a',
|
|
11
|
+
' - url: https://example.com/b',
|
|
12
|
+
'---',
|
|
13
|
+
'',
|
|
14
|
+
'## Summary',
|
|
15
|
+
'hello',
|
|
16
|
+
].join('\n');
|
|
17
|
+
const parsed = parseEntry(raw);
|
|
18
|
+
expect(parsed.sourceUrls).toEqual(['https://example.com/a', 'https://example.com/b']);
|
|
19
|
+
expect(parsed.volatility).toBe('stable');
|
|
20
|
+
expect(parsed.body).toContain('## Summary');
|
|
21
|
+
});
|
|
22
|
+
it('returns null volatility for unknown values', () => {
|
|
23
|
+
const raw = '---\nname: x\nvolatility: glacial\n---\nbody';
|
|
24
|
+
expect(parseEntry(raw).volatility).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
it('returns empty sourceUrls when sources key is missing', () => {
|
|
27
|
+
const raw = '---\nname: x\n---\nbody';
|
|
28
|
+
expect(parseEntry(raw).sourceUrls).toEqual([]);
|
|
29
|
+
});
|
|
30
|
+
it('throws on missing frontmatter', () => {
|
|
31
|
+
expect(() => parseEntry('no fm here')).toThrow(/frontmatter/);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=parse-entry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-entry.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/parse-entry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,GAAG,GAAG;YACV,KAAK;YACL,SAAS;YACT,oBAAoB;YACpB,UAAU;YACV,gCAAgC;YAChC,gCAAgC;YAChC,KAAK;YACL,EAAE;YACF,YAAY;YACZ,OAAO;SACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,CAAA;QACrF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,8CAA8C,CAAA;QAC1D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG,yBAAyB,CAAA;QACrC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { dispatchLlm } from '../../observability/engine/llm-dispatcher.js';
|
|
2
|
+
import type { Dispatcher } from '../audit-runner.js';
|
|
3
|
+
/**
|
|
4
|
+
* SECURITY: the dispatcher command is hardcoded to `claude -p --tools ""`,
|
|
5
|
+
* never loaded from project-local config. The parent knowledge-freshness
|
|
6
|
+
* design's decision #7 locked this in: a repo-local CLAUDE.md must NOT be
|
|
7
|
+
* able to inject `command: rm -rf /` into the subprocess invocation.
|
|
8
|
+
*
|
|
9
|
+
* The `--tools ""` flag disables every built-in tool. The audit prompt
|
|
10
|
+
* reads pre-fetched source bodies (round-6 F-001), so the model never
|
|
11
|
+
* needs WebFetch or any other tool.
|
|
12
|
+
*
|
|
13
|
+
* Earlier rounds experimented with `--bare`, which broke keychain auth
|
|
14
|
+
* for local devs. Reverted in Phase 1 Task 9 because the audit subcommand only
|
|
15
|
+
* operates on scaffold's own content/knowledge/, never on a downstream
|
|
16
|
+
* repo — so the round-7 isolation rationale doesn't apply.
|
|
17
|
+
*/
|
|
18
|
+
export declare const ANTHROPIC_COMMAND = "claude -p --tools \"\"";
|
|
19
|
+
/**
|
|
20
|
+
* Injectable dispatch function. Production uses the real `dispatchLlm`;
|
|
21
|
+
* tests inject a mock. Typed via `typeof dispatchLlm` so the signature
|
|
22
|
+
* stays in lock-step with the production function — no `as` cast
|
|
23
|
+
* needed at the call site, and any future change to `DispatchResult`
|
|
24
|
+
* surfaces as a type error here instead of a runtime surprise.
|
|
25
|
+
*/
|
|
26
|
+
export type DispatchLlmFn = typeof dispatchLlm;
|
|
27
|
+
export interface BuildAnthropicDispatcherOptions {
|
|
28
|
+
timeoutSec: number;
|
|
29
|
+
/** Injectable for tests. Defaults to the real `dispatchLlm`. */
|
|
30
|
+
dispatchLlmFn?: DispatchLlmFn;
|
|
31
|
+
}
|
|
32
|
+
export declare function buildAnthropicDispatcher(opts: BuildAnthropicDispatcherOptions): Dispatcher;
|
|
33
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8CAA8C,CAAA;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,2BAAyB,CAAA;AAEvD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,WAAW,CAAA;AAE9C,MAAM,WAAW,+BAA+B;IAC9C,UAAU,EAAE,MAAM,CAAA;IAClB,gEAAgE;IAChE,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,+BAA+B,GAAG,UAAU,CAiB1F"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { dispatchLlm } from '../../observability/engine/llm-dispatcher.js';
|
|
2
|
+
/**
|
|
3
|
+
* SECURITY: the dispatcher command is hardcoded to `claude -p --tools ""`,
|
|
4
|
+
* never loaded from project-local config. The parent knowledge-freshness
|
|
5
|
+
* design's decision #7 locked this in: a repo-local CLAUDE.md must NOT be
|
|
6
|
+
* able to inject `command: rm -rf /` into the subprocess invocation.
|
|
7
|
+
*
|
|
8
|
+
* The `--tools ""` flag disables every built-in tool. The audit prompt
|
|
9
|
+
* reads pre-fetched source bodies (round-6 F-001), so the model never
|
|
10
|
+
* needs WebFetch or any other tool.
|
|
11
|
+
*
|
|
12
|
+
* Earlier rounds experimented with `--bare`, which broke keychain auth
|
|
13
|
+
* for local devs. Reverted in Phase 1 Task 9 because the audit subcommand only
|
|
14
|
+
* operates on scaffold's own content/knowledge/, never on a downstream
|
|
15
|
+
* repo — so the round-7 isolation rationale doesn't apply.
|
|
16
|
+
*/
|
|
17
|
+
export const ANTHROPIC_COMMAND = 'claude -p --tools ""';
|
|
18
|
+
export function buildAnthropicDispatcher(opts) {
|
|
19
|
+
const dispatch = opts.dispatchLlmFn ?? dispatchLlm;
|
|
20
|
+
const timeoutMs = opts.timeoutSec * 1000;
|
|
21
|
+
return async (prompt) => {
|
|
22
|
+
const result = await dispatch({ prompt, command: ANTHROPIC_COMMAND, timeoutMs });
|
|
23
|
+
if (!result.ok) {
|
|
24
|
+
// Use the `anthropic dispatcher: …` prefix for consistency with
|
|
25
|
+
// `deepseek dispatcher: …` — operators can filter cron logs by a
|
|
26
|
+
// single `dispatcher:` substring across both providers
|
|
27
|
+
// (PR #393 MMR F-003).
|
|
28
|
+
throw new Error(`anthropic dispatcher: ${result.reason}`);
|
|
29
|
+
}
|
|
30
|
+
// Return raw stdout. The audit runner's schema-aware extractor walks
|
|
31
|
+
// the full response; the dispatcher's last-→-first parser is the
|
|
32
|
+
// wrong shape for our use case (see audit-runner.ts findFirstMatchingJson).
|
|
33
|
+
return result.raw;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8CAA8C,CAAA;AAG1E;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAA;AAiBvD,MAAM,UAAU,wBAAwB,CAAC,IAAqC;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,IAAI,WAAW,CAAA;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACxC,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAA;QAChF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,gEAAgE;YAChE,iEAAiE;YACjE,uDAAuD;YACvD,uBAAuB;YACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,qEAAqE;QACrE,iEAAiE;QACjE,4EAA4E;QAC5E,OAAO,MAAM,CAAC,GAAG,CAAA;IACnB,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/providers/anthropic.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { ANTHROPIC_COMMAND, buildAnthropicDispatcher } from './anthropic.js';
|
|
3
|
+
describe('anthropic provider', () => {
|
|
4
|
+
it('exports the exact hardcoded command (decision #7 invariant)', () => {
|
|
5
|
+
// The command MUST be literal — never read from project config — so the
|
|
6
|
+
// threat model from the parent design's decision #7 holds. This test
|
|
7
|
+
// acts as a tripwire if a future contributor introduces a templated
|
|
8
|
+
// command string.
|
|
9
|
+
expect(ANTHROPIC_COMMAND).toBe('claude -p --tools ""');
|
|
10
|
+
});
|
|
11
|
+
it('builds a Dispatcher that calls dispatchLlm with the hardcoded command + timeout', async () => {
|
|
12
|
+
// We can't run a real subprocess in unit tests; we mock dispatchLlm at
|
|
13
|
+
// the module level. The mock returns the full DispatchResult shape
|
|
14
|
+
// (`parsed: unknown` on success, `raw?: string` on failure) so the
|
|
15
|
+
// production typeof-derived DispatchLlmFn signature is satisfied.
|
|
16
|
+
const dispatchSpy = vi.fn().mockResolvedValue({ ok: true, raw: 'verdict json here', parsed: undefined });
|
|
17
|
+
const dispatcher = buildAnthropicDispatcher({ timeoutSec: 600, dispatchLlmFn: dispatchSpy });
|
|
18
|
+
const result = await dispatcher('hello world');
|
|
19
|
+
expect(dispatchSpy).toHaveBeenCalledWith({
|
|
20
|
+
prompt: 'hello world',
|
|
21
|
+
command: 'claude -p --tools ""',
|
|
22
|
+
timeoutMs: 600_000,
|
|
23
|
+
});
|
|
24
|
+
expect(result).toBe('verdict json here');
|
|
25
|
+
});
|
|
26
|
+
it('throws with the dispatcher reason verbatim when dispatchLlm fails', async () => {
|
|
27
|
+
const dispatchSpy = vi.fn().mockResolvedValue({ ok: false, reason: 'subprocess exit 127' });
|
|
28
|
+
const dispatcher = buildAnthropicDispatcher({ timeoutSec: 60, dispatchLlmFn: dispatchSpy });
|
|
29
|
+
await expect(dispatcher('x')).rejects.toThrow(/subprocess exit 127/);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=anthropic.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/providers/anthropic.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,wEAAwE;QACxE,qEAAqE;QACrE,oEAAoE;QACpE,kBAAkB;QAClB,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,uEAAuE;QACvE,mEAAmE;QACnE,mEAAmE;QACnE,kEAAkE;QAClE,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACxG,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAA;QAC5F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,CAAA;QAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC;YACvC,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,sBAAsB;YAC/B,SAAS,EAAE,OAAO;SACnB,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAA;QAC3F,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAA;QAC3F,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { fetch as undiciFetch } from 'undici';
|
|
2
|
+
import type { Dispatcher } from '../audit-runner.js';
|
|
3
|
+
/**
|
|
4
|
+
* SECURITY: like decision #7's anthropic-subprocess invariant, the
|
|
5
|
+
* DeepSeek URL and the model-name allowlist are HARDCODED. Project-local
|
|
6
|
+
* config can never redirect this dispatcher at a different host or run
|
|
7
|
+
* an unsupported model. Future contributors who feel tempted to read a
|
|
8
|
+
* URL from `.scaffold/observability.yaml` here should re-read the parent
|
|
9
|
+
* design doc's Resolved Decisions table first.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEEPSEEK_URL = "https://api.deepseek.com/chat/completions";
|
|
12
|
+
/**
|
|
13
|
+
* Hardcoded allowlist of DeepSeek model names. KNOWLEDGE_FRESHNESS_DEEPSEEK_MODEL
|
|
14
|
+
* may override the default, but only to a value in this set — never to
|
|
15
|
+
* arbitrary text. The previously-supported `deepseek-chat` and
|
|
16
|
+
* `deepseek-reasoner` IDs are deprecated and intentionally excluded.
|
|
17
|
+
*/
|
|
18
|
+
declare const ALLOWED_MODELS: readonly ["deepseek-v4-flash", "deepseek-v4-pro"];
|
|
19
|
+
export type DeepseekModel = typeof ALLOWED_MODELS[number];
|
|
20
|
+
export declare const DEFAULT_DEEPSEEK_MODEL: DeepseekModel;
|
|
21
|
+
/** Test-injectable fetch. Production uses undici's fetch. */
|
|
22
|
+
export type DeepseekFetch = typeof undiciFetch;
|
|
23
|
+
export interface BuildDeepseekDispatcherOptions {
|
|
24
|
+
apiKey: string;
|
|
25
|
+
timeoutSec: number;
|
|
26
|
+
/** Optional model override (must be in the allowlist). */
|
|
27
|
+
model?: string;
|
|
28
|
+
/** Test-injectable fetch implementation. Default: undici's fetch. */
|
|
29
|
+
fetchImpl?: DeepseekFetch;
|
|
30
|
+
}
|
|
31
|
+
export declare function buildDeepseekDispatcher(opts: BuildDeepseekDispatcherOptions): Dispatcher;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=deepseek.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/providers/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,8CAA8C,CAAA;AAEvE;;;;;GAKG;AACH,QAAA,MAAM,cAAc,mDAAoD,CAAA;AACxE,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;AACzD,eAAO,MAAM,sBAAsB,EAAE,aAAmC,CAAA;AAiBxE,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG,OAAO,WAAW,CAAA;AAE9C,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,SAAS,CAAC,EAAE,aAAa,CAAA;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,8BAA8B,GAAG,UAAU,CA2GxF"}
|