@zigrivers/scaffold 3.27.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 +23 -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 +10 -2
- package/content/knowledge/core/coding-conventions.md +10 -2
- 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 +9 -4
- package/content/knowledge/core/task-tracking.md +128 -29
- 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 +9 -1
- 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 +129 -0
- package/content/knowledge/execution/task-claiming-strategy.md +19 -3
- package/content/knowledge/execution/tdd-execution-loop.md +5 -0
- package/content/knowledge/execution/worktree-management.md +10 -3
- 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/pipeline/build/multi-agent-resume.md +27 -7
- package/content/pipeline/build/multi-agent-start.md +35 -7
- package/content/pipeline/build/new-enhancement.md +8 -1
- package/content/pipeline/build/quick-task.md +9 -0
- package/content/pipeline/build/single-agent-resume.md +11 -4
- package/content/pipeline/build/single-agent-start.md +13 -4
- package/content/pipeline/consolidation/workflow-audit.md +1 -1
- package/content/pipeline/environment/git-workflow.md +2 -2
- package/content/pipeline/foundation/beads.md +148 -22
- package/content/pipeline/foundation/coding-standards.md +1 -1
- package/content/tools/knowledge-audit-entry.md +79 -0
- package/content/tools/post-implementation-review.md +6 -6
- package/content/tools/prompt-pipeline.md +1 -1
- package/content/tools/release.md +5 -5
- package/content/tools/review-code.md +388 -17
- package/content/tools/review-pr.md +381 -21
- package/content/tools/version-bump.md +5 -5
- 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 +6 -0
- package/dist/cli/commands/observe.d.ts.map +1 -1
- package/dist/cli/commands/observe.js +22 -1
- package/dist/cli/commands/observe.js.map +1 -1
- package/dist/cli/commands/observe.test.js +82 -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/adapters/beads.d.ts +4 -0
- package/dist/observability/adapters/beads.d.ts.map +1 -1
- package/dist/observability/adapters/beads.js +25 -2
- package/dist/observability/adapters/beads.js.map +1 -1
- package/dist/observability/adapters/beads.test.js +40 -2
- package/dist/observability/adapters/beads.test.js.map +1 -1
- 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/ledger-writer.d.ts +11 -1
- package/dist/observability/engine/ledger-writer.d.ts.map +1 -1
- package/dist/observability/engine/ledger-writer.js +6 -0
- package/dist/observability/engine/ledger-writer.js.map +1 -1
- package/dist/observability/engine/llm-dispatcher.d.ts.map +1 -1
- package/dist/observability/engine/llm-dispatcher.js +36 -5
- package/dist/observability/engine/llm-dispatcher.js.map +1 -1
- package/dist/observability/engine/llm-dispatcher.test.js +23 -0
- package/dist/observability/engine/llm-dispatcher.test.js.map +1 -1
- 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,69 @@
|
|
|
1
|
+
// Knowledge-base VERSION bump logic.
|
|
2
|
+
//
|
|
3
|
+
// Pure functions only — no I/O, no git, no GH. The workflow in
|
|
4
|
+
// .github/workflows/knowledge-freshness-version-bump.yml reads
|
|
5
|
+
// content/knowledge/VERSION, calls `deriveBumpKind` from the PR title/body,
|
|
6
|
+
// calls `bumpSemver` to compute the next version, and writes it back.
|
|
7
|
+
//
|
|
8
|
+
// We intentionally do not depend on a SemVer library — the bump rules here
|
|
9
|
+
// are a tiny subset (major/minor/patch on `X.Y.Z` with no prerelease tags).
|
|
10
|
+
/**
|
|
11
|
+
* Derive the bump kind from a Conventional Commits-flavored PR title and body.
|
|
12
|
+
*
|
|
13
|
+
* Rules (first match wins):
|
|
14
|
+
* 1. `BREAKING CHANGE:` token anywhere in title or body → major
|
|
15
|
+
* 2. `feat(knowledge):` or `feat(knowledge-freshness):` title prefix → minor
|
|
16
|
+
* 3. `chore(knowledge):` or `chore(knowledge-freshness):` title prefix → patch
|
|
17
|
+
* 4. Anything else → patch (the workflow logs a `::notice::` for this case)
|
|
18
|
+
*
|
|
19
|
+
* Title matching is case-sensitive against the literal prefix (Conventional
|
|
20
|
+
* Commits canonicalizes to lowercase). The BREAKING CHANGE token is matched
|
|
21
|
+
* case-sensitively as well — that's the canonical form.
|
|
22
|
+
*/
|
|
23
|
+
export function deriveBumpKind(prTitle, prBody) {
|
|
24
|
+
// BREAKING CHANGE wins over everything else, even if title is `feat(...)`.
|
|
25
|
+
//
|
|
26
|
+
// Round-2 F-002: the body match MUST be anchored to start-of-line. A
|
|
27
|
+
// freshness PR's body contains an LLM-generated findings table where an
|
|
28
|
+
// evidence URL or excerpt that happens to mention "BREAKING CHANGE:"
|
|
29
|
+
// would otherwise trigger an accidental major bump. The canonical
|
|
30
|
+
// Conventional Commits "BREAKING CHANGE:" footer lives on its own line.
|
|
31
|
+
const breakingInBody = /^BREAKING CHANGE:/m.test(prBody);
|
|
32
|
+
if (prTitle.includes('BREAKING CHANGE:') || breakingInBody) {
|
|
33
|
+
return 'major';
|
|
34
|
+
}
|
|
35
|
+
if (prTitle.startsWith('feat(knowledge):') || prTitle.startsWith('feat(knowledge-freshness):')) {
|
|
36
|
+
return 'minor';
|
|
37
|
+
}
|
|
38
|
+
if (prTitle.startsWith('chore(knowledge):') || prTitle.startsWith('chore(knowledge-freshness):')) {
|
|
39
|
+
return 'patch';
|
|
40
|
+
}
|
|
41
|
+
return 'patch';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Bump a `X.Y.Z` SemVer string by the given kind. Throws on invalid input.
|
|
45
|
+
*
|
|
46
|
+
* - `major`: `X.Y.Z` → `(X+1).0.0`
|
|
47
|
+
* - `minor`: `X.Y.Z` → `X.(Y+1).0`
|
|
48
|
+
* - `patch`: `X.Y.Z` → `X.Y.(Z+1)`
|
|
49
|
+
*/
|
|
50
|
+
export function bumpSemver(current, kind) {
|
|
51
|
+
// Trim because VERSION files routinely have a trailing newline.
|
|
52
|
+
const trimmed = current.trim();
|
|
53
|
+
const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(trimmed);
|
|
54
|
+
if (!match) {
|
|
55
|
+
throw new Error(`bumpSemver: invalid SemVer "${current}" (expected X.Y.Z)`);
|
|
56
|
+
}
|
|
57
|
+
const major = Number(match[1]);
|
|
58
|
+
const minor = Number(match[2]);
|
|
59
|
+
const patch = Number(match[3]);
|
|
60
|
+
switch (kind) {
|
|
61
|
+
case 'major':
|
|
62
|
+
return `${major + 1}.0.0`;
|
|
63
|
+
case 'minor':
|
|
64
|
+
return `${major}.${minor + 1}.0`;
|
|
65
|
+
case 'patch':
|
|
66
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=bump-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bump-version.js","sourceRoot":"","sources":["../../src/knowledge-freshness/bump-version.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,+DAA+D;AAC/D,+DAA+D;AAC/D,4EAA4E;AAC5E,sEAAsE;AACtE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAI5E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,MAAc;IAC5D,2EAA2E;IAC3E,EAAE;IACF,qEAAqE;IACrE,wEAAwE;IACxE,qEAAqE;IACrE,kEAAkE;IAClE,wEAAwE;IACxE,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,cAAc,EAAE,CAAC;QAC3D,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;QAC/F,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAAE,CAAC;QACjG,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,IAAc;IACxD,gEAAgE;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,oBAAoB,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,QAAQ,IAAI,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,CAAA;QAC3B,KAAK,OAAO;YACV,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,CAAA;QAClC,KAAK,OAAO;YACV,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAA;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bump-version.test.d.ts","sourceRoot":"","sources":["../../src/knowledge-freshness/bump-version.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { deriveBumpKind, bumpSemver } from './bump-version.js';
|
|
3
|
+
describe('deriveBumpKind', () => {
|
|
4
|
+
it('returns major when BREAKING CHANGE appears in title', () => {
|
|
5
|
+
expect(deriveBumpKind('feat(knowledge): rework API BREAKING CHANGE: drops X', '')).toBe('major');
|
|
6
|
+
});
|
|
7
|
+
it('returns major when BREAKING CHANGE appears at the start of a body line', () => {
|
|
8
|
+
expect(deriveBumpKind('feat(knowledge): new entry', 'Body line\nBREAKING CHANGE: removes Y')).toBe('major');
|
|
9
|
+
});
|
|
10
|
+
it('does NOT return major when BREAKING CHANGE appears mid-line (round-2 F-002)', () => {
|
|
11
|
+
// A freshness PR body's findings table can quote evidence containing the
|
|
12
|
+
// string "BREAKING CHANGE:" inside a cell. That must NOT trigger major.
|
|
13
|
+
const body = '| P1 | citation: "see the BREAKING CHANGE: removed-deprecated section above" |';
|
|
14
|
+
expect(deriveBumpKind('chore(knowledge): refresh X', body)).toBe('patch');
|
|
15
|
+
});
|
|
16
|
+
it('does NOT return major when BREAKING CHANGE is preceded by whitespace or > (quoted)', () => {
|
|
17
|
+
expect(deriveBumpKind('chore(knowledge): X', '> BREAKING CHANGE: from external doc')).toBe('patch');
|
|
18
|
+
expect(deriveBumpKind('chore(knowledge): X', ' BREAKING CHANGE: indented')).toBe('patch');
|
|
19
|
+
});
|
|
20
|
+
it('returns minor for feat(knowledge): prefix', () => {
|
|
21
|
+
expect(deriveBumpKind('feat(knowledge): add new entry for Z', '')).toBe('minor');
|
|
22
|
+
});
|
|
23
|
+
it('returns minor for feat(knowledge-freshness): prefix', () => {
|
|
24
|
+
expect(deriveBumpKind('feat(knowledge-freshness): new workflow', '')).toBe('minor');
|
|
25
|
+
});
|
|
26
|
+
it('returns patch for chore(knowledge): prefix', () => {
|
|
27
|
+
expect(deriveBumpKind('chore(knowledge): refresh React entry against v19', '')).toBe('patch');
|
|
28
|
+
});
|
|
29
|
+
it('returns patch for chore(knowledge-freshness): prefix', () => {
|
|
30
|
+
expect(deriveBumpKind('chore(knowledge-freshness): tweak cadence', '')).toBe('patch');
|
|
31
|
+
});
|
|
32
|
+
it('defaults to patch for unrecognized prefixes', () => {
|
|
33
|
+
expect(deriveBumpKind('docs: tweak README', '')).toBe('patch');
|
|
34
|
+
expect(deriveBumpKind('fix: nit', '')).toBe('patch');
|
|
35
|
+
expect(deriveBumpKind('', '')).toBe('patch');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('bumpSemver', () => {
|
|
39
|
+
it('bumps patch', () => {
|
|
40
|
+
expect(bumpSemver('0.1.0', 'patch')).toBe('0.1.1');
|
|
41
|
+
expect(bumpSemver('1.2.3', 'patch')).toBe('1.2.4');
|
|
42
|
+
});
|
|
43
|
+
it('bumps minor and resets patch', () => {
|
|
44
|
+
expect(bumpSemver('0.1.5', 'minor')).toBe('0.2.0');
|
|
45
|
+
expect(bumpSemver('1.2.3', 'minor')).toBe('1.3.0');
|
|
46
|
+
});
|
|
47
|
+
it('bumps major and resets minor and patch', () => {
|
|
48
|
+
expect(bumpSemver('0.1.5', 'major')).toBe('1.0.0');
|
|
49
|
+
expect(bumpSemver('2.4.7', 'major')).toBe('3.0.0');
|
|
50
|
+
});
|
|
51
|
+
it('tolerates trailing newline / whitespace from a VERSION file', () => {
|
|
52
|
+
expect(bumpSemver('0.1.0\n', 'patch')).toBe('0.1.1');
|
|
53
|
+
expect(bumpSemver(' 1.0.0 ', 'minor')).toBe('1.1.0');
|
|
54
|
+
});
|
|
55
|
+
it('throws on invalid SemVer input', () => {
|
|
56
|
+
expect(() => bumpSemver('1.0', 'patch')).toThrow(/invalid SemVer/);
|
|
57
|
+
expect(() => bumpSemver('1.0.0-beta', 'patch')).toThrow(/invalid SemVer/);
|
|
58
|
+
expect(() => bumpSemver('vNotASemver', 'patch')).toThrow(/invalid SemVer/);
|
|
59
|
+
expect(() => bumpSemver('', 'patch')).toThrow(/invalid SemVer/);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('end-to-end fixture: simulated merged PR title → version diff', () => {
|
|
63
|
+
it('chore(knowledge) PR bumps patch', () => {
|
|
64
|
+
const title = 'chore(knowledge): refresh React entry against v19';
|
|
65
|
+
const body = '';
|
|
66
|
+
const kind = deriveBumpKind(title, body);
|
|
67
|
+
expect(bumpSemver('0.1.0', kind)).toBe('0.1.1');
|
|
68
|
+
});
|
|
69
|
+
it('feat(knowledge-freshness) PR bumps minor', () => {
|
|
70
|
+
const title = 'feat(knowledge-freshness): add Postgres entry';
|
|
71
|
+
const body = 'New entry';
|
|
72
|
+
const kind = deriveBumpKind(title, body);
|
|
73
|
+
expect(bumpSemver('0.1.0', kind)).toBe('0.2.0');
|
|
74
|
+
});
|
|
75
|
+
it('BREAKING CHANGE PR bumps major', () => {
|
|
76
|
+
const title = 'feat(knowledge): drop deprecated entries';
|
|
77
|
+
const body = 'Cleanup.\n\nBREAKING CHANGE: removes 5 entries';
|
|
78
|
+
const kind = deriveBumpKind(title, body);
|
|
79
|
+
expect(bumpSemver('0.1.0', kind)).toBe('1.0.0');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=bump-version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bump-version.test.js","sourceRoot":"","sources":["../../src/knowledge-freshness/bump-version.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export interface ChurnInput {
|
|
2
|
+
file: string;
|
|
3
|
+
/** Raw post-change file contents (used to read volatility + total lines). */
|
|
4
|
+
content: string;
|
|
5
|
+
/** Added lines from the diff for this file (entire file). */
|
|
6
|
+
addedCount: number;
|
|
7
|
+
/** Removed lines from the diff for this file (entire file). */
|
|
8
|
+
removedCount: number;
|
|
9
|
+
/** Added lines from the diff that are in the BODY (post-frontmatter) region. */
|
|
10
|
+
bodyAddedCount?: number;
|
|
11
|
+
/** Removed lines from the diff that are in the BODY (post-frontmatter) region. */
|
|
12
|
+
bodyRemovedCount?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ChurnFinding {
|
|
15
|
+
file: string;
|
|
16
|
+
volatility: 'stable' | 'evolving' | 'fast-moving' | null;
|
|
17
|
+
totalLines: number;
|
|
18
|
+
addedCount: number;
|
|
19
|
+
removedCount: number;
|
|
20
|
+
churnPct: number;
|
|
21
|
+
/** True if this counts as a blocking failure (stable + over-threshold + no override). */
|
|
22
|
+
blocking: boolean;
|
|
23
|
+
/** True if the PR body contained the override marker. */
|
|
24
|
+
overridden: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface ChurnOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Labels currently applied to the PR. The gate honors the literal label
|
|
29
|
+
* `override:anti-over-rewrite` (F-005). PR-body markers are explicitly
|
|
30
|
+
* NOT honored because the bot can write the body but cannot apply labels.
|
|
31
|
+
*/
|
|
32
|
+
prLabels?: string[];
|
|
33
|
+
}
|
|
34
|
+
export declare function evaluateChurn(inputs: ChurnInput[], opts?: ChurnOptions): ChurnFinding[];
|
|
35
|
+
/**
|
|
36
|
+
* Parse a unified diff into per-file add/remove counts. Mirrors
|
|
37
|
+
* `lint-unsourced.parseUnifiedDiff` in scope (knowledge entries only) so the
|
|
38
|
+
* two gates pull the same set of files from the same diff input.
|
|
39
|
+
*/
|
|
40
|
+
export interface ChurnDiffResult {
|
|
41
|
+
file: string;
|
|
42
|
+
addedCount: number;
|
|
43
|
+
removedCount: number;
|
|
44
|
+
bodyAddedCount: number;
|
|
45
|
+
bodyRemovedCount: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse a unified diff into per-file add/remove counts. Returns raw counts;
|
|
49
|
+
* body-only counts are derived later by `splitChurnByRegion` because they
|
|
50
|
+
* require access to the post-change file content (to know where the
|
|
51
|
+
* frontmatter ends).
|
|
52
|
+
*
|
|
53
|
+
* Round-7 F-001 replaces the round-6 state-machine approach (which
|
|
54
|
+
* incorrectly flipped on the FIRST `---` line — i.e., the opening
|
|
55
|
+
* boundary — instead of the second / closing one, miscounting most
|
|
56
|
+
* frontmatter as body churn). The line-number-based filter in
|
|
57
|
+
* splitChurnByRegion is more robust because it relies on the actual
|
|
58
|
+
* file content, not on diff-content patterns.
|
|
59
|
+
*/
|
|
60
|
+
export declare function parseUnifiedDiffForChurn(diff: string): ChurnDiffResult[];
|
|
61
|
+
/**
|
|
62
|
+
* Per-file content pair used by `splitChurnByRegion` to derive separate
|
|
63
|
+
* frontmatter boundaries for added (new file) and removed (old file)
|
|
64
|
+
* sides of the diff. Round-8 F-003 introduced the asymmetry: when
|
|
65
|
+
* audit-apply ADDS frontmatter fields (hash / retrieved on first audit),
|
|
66
|
+
* the new frontmatter is taller than the old, so using the new boundary
|
|
67
|
+
* for `-` lines mis-classifies the first body lines as frontmatter and
|
|
68
|
+
* under-counts removal churn.
|
|
69
|
+
*/
|
|
70
|
+
export interface ChurnFileContent {
|
|
71
|
+
/** Post-change file content (the head / working-tree version). */
|
|
72
|
+
newContent: string;
|
|
73
|
+
/** Pre-change file content (the base / origin/main version). Optional. */
|
|
74
|
+
oldContent?: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Given the raw diff and per-file pre/post-change content, return body-only
|
|
78
|
+
* add/remove counts. An added line is "body" iff its new-file line number
|
|
79
|
+
* is past the NEW frontmatter end; a removed line is "body" iff its
|
|
80
|
+
* old-file line number is past the OLD frontmatter end.
|
|
81
|
+
*/
|
|
82
|
+
export declare function splitChurnByRegion(diff: string, fileContents: Map<string, ChurnFileContent | string>): Map<string, {
|
|
83
|
+
bodyAddedCount: number;
|
|
84
|
+
bodyRemovedCount: number;
|
|
85
|
+
}>;
|
|
86
|
+
//# sourceMappingURL=anti-over-rewrite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anti-over-rewrite.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,IAAI,CAAA;IACxD,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,YAAY,EAAE,CAqC3F;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAoBxE;AA2CD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC,GACnD,GAAG,CAAC,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAiDnE"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anti-over-rewrite gate (spec §A.5): for `volatility: stable` entries, fail
|
|
3
|
+
* if the diff's add+remove line count exceeds 20% of the entry's total line
|
|
4
|
+
* count. For `evolving` and `fast-moving` entries we still compute the churn
|
|
5
|
+
* percentage and surface it as a notice, but never fail.
|
|
6
|
+
*
|
|
7
|
+
* The override is a maintainer-applied PR label `override:anti-over-rewrite`
|
|
8
|
+
* — NOT a PR-body marker. F-005 (round-1 Phase 2 MMR review): a marker in
|
|
9
|
+
* the PR body could be prompt-injected via LLM-generated verdict text from
|
|
10
|
+
* a malicious source. Labels are applied by GitHub users with write access,
|
|
11
|
+
* so they're trustworthy.
|
|
12
|
+
*/
|
|
13
|
+
import { parseEntry } from './parse-entry.js';
|
|
14
|
+
const STABLE_THRESHOLD = 0.20;
|
|
15
|
+
const OVERRIDE_LABEL = 'override:anti-over-rewrite';
|
|
16
|
+
export function evaluateChurn(inputs, opts = {}) {
|
|
17
|
+
const overridden = Array.isArray(opts.prLabels) && opts.prLabels.includes(OVERRIDE_LABEL);
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const input of inputs) {
|
|
20
|
+
let volatility = null;
|
|
21
|
+
let bodyLines = input.content.split('\n').length;
|
|
22
|
+
try {
|
|
23
|
+
const parsed = parseEntry(input.content);
|
|
24
|
+
volatility = parsed.volatility;
|
|
25
|
+
bodyLines = parsed.body.split('\n').length;
|
|
26
|
+
}
|
|
27
|
+
catch { /* missing FM → null volatility; bodyLines stays as full file */ }
|
|
28
|
+
// Round-6 F-002: the 20% threshold applies to BODY churn only. A
|
|
29
|
+
// `current` verdict refreshes 3 frontmatter fields (~6 lines of diff)
|
|
30
|
+
// and touches no body — without excluding frontmatter changes, a
|
|
31
|
+
// stable entry under ~30 lines would trip the threshold on every
|
|
32
|
+
// metadata-only refresh PR. The diff parser exposes bodyAdded/Removed
|
|
33
|
+
// alongside the total counts so we can compute the right denominator
|
|
34
|
+
// and numerator here.
|
|
35
|
+
const bodyAdded = input.bodyAddedCount ?? input.addedCount;
|
|
36
|
+
const bodyRemoved = input.bodyRemovedCount ?? input.removedCount;
|
|
37
|
+
const totalLines = input.content.split('\n').length;
|
|
38
|
+
const totalBodyChurn = bodyAdded + bodyRemoved;
|
|
39
|
+
const churnPct = bodyLines > 0 ? totalBodyChurn / bodyLines : 0;
|
|
40
|
+
const overThreshold = churnPct > STABLE_THRESHOLD;
|
|
41
|
+
const blocking = volatility === 'stable' && overThreshold && !overridden;
|
|
42
|
+
out.push({
|
|
43
|
+
file: input.file,
|
|
44
|
+
volatility,
|
|
45
|
+
totalLines,
|
|
46
|
+
addedCount: input.addedCount,
|
|
47
|
+
removedCount: input.removedCount,
|
|
48
|
+
churnPct,
|
|
49
|
+
blocking,
|
|
50
|
+
overridden: overridden && volatility === 'stable' && overThreshold,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a unified diff into per-file add/remove counts. Returns raw counts;
|
|
57
|
+
* body-only counts are derived later by `splitChurnByRegion` because they
|
|
58
|
+
* require access to the post-change file content (to know where the
|
|
59
|
+
* frontmatter ends).
|
|
60
|
+
*
|
|
61
|
+
* Round-7 F-001 replaces the round-6 state-machine approach (which
|
|
62
|
+
* incorrectly flipped on the FIRST `---` line — i.e., the opening
|
|
63
|
+
* boundary — instead of the second / closing one, miscounting most
|
|
64
|
+
* frontmatter as body churn). The line-number-based filter in
|
|
65
|
+
* splitChurnByRegion is more robust because it relies on the actual
|
|
66
|
+
* file content, not on diff-content patterns.
|
|
67
|
+
*/
|
|
68
|
+
export function parseUnifiedDiffForChurn(diff) {
|
|
69
|
+
const perFileHunks = parseHunks(diff);
|
|
70
|
+
const out = [];
|
|
71
|
+
for (const [file, hunks] of perFileHunks) {
|
|
72
|
+
let added = 0, removed = 0;
|
|
73
|
+
for (const h of hunks) {
|
|
74
|
+
for (const line of h.lines) {
|
|
75
|
+
if (line.startsWith('+') && !line.startsWith('+++'))
|
|
76
|
+
added++;
|
|
77
|
+
else if (line.startsWith('-') && !line.startsWith('---'))
|
|
78
|
+
removed++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
out.push({
|
|
82
|
+
file,
|
|
83
|
+
addedCount: added, removedCount: removed,
|
|
84
|
+
// bodyAdded/Removed left at zero here; the caller calls
|
|
85
|
+
// splitChurnByRegion() with the new-file content to fill them in.
|
|
86
|
+
bodyAddedCount: 0, bodyRemovedCount: 0,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
function parseHunks(diff) {
|
|
92
|
+
const out = new Map();
|
|
93
|
+
const lines = diff.split('\n');
|
|
94
|
+
let i = 0;
|
|
95
|
+
let currentFile = null;
|
|
96
|
+
let currentHunks = [];
|
|
97
|
+
while (i < lines.length) {
|
|
98
|
+
const line = lines[i];
|
|
99
|
+
if (line.startsWith('diff --git ')) {
|
|
100
|
+
if (currentFile)
|
|
101
|
+
out.set(currentFile, currentHunks);
|
|
102
|
+
const m = line.match(/^diff --git a\/(.+) b\/(.+)$/);
|
|
103
|
+
const file = m ? m[2] : '';
|
|
104
|
+
currentFile = (file.startsWith('content/knowledge/') && file.endsWith('.md')) ? file : null;
|
|
105
|
+
currentHunks = [];
|
|
106
|
+
i++;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (currentFile && line.startsWith('@@')) {
|
|
110
|
+
const hh = line.match(/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)?/);
|
|
111
|
+
if (!hh) {
|
|
112
|
+
i++;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const hunk = {
|
|
116
|
+
oldStart: parseInt(hh[1], 10),
|
|
117
|
+
newStart: parseInt(hh[2], 10),
|
|
118
|
+
lines: [],
|
|
119
|
+
};
|
|
120
|
+
i++;
|
|
121
|
+
while (i < lines.length && !lines[i].startsWith('@@') && !lines[i].startsWith('diff --git ')) {
|
|
122
|
+
hunk.lines.push(lines[i]);
|
|
123
|
+
i++;
|
|
124
|
+
}
|
|
125
|
+
currentHunks.push(hunk);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
i++;
|
|
129
|
+
}
|
|
130
|
+
if (currentFile)
|
|
131
|
+
out.set(currentFile, currentHunks);
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Given the raw diff and per-file pre/post-change content, return body-only
|
|
136
|
+
* add/remove counts. An added line is "body" iff its new-file line number
|
|
137
|
+
* is past the NEW frontmatter end; a removed line is "body" iff its
|
|
138
|
+
* old-file line number is past the OLD frontmatter end.
|
|
139
|
+
*/
|
|
140
|
+
export function splitChurnByRegion(diff, fileContents) {
|
|
141
|
+
const perFile = parseHunks(diff);
|
|
142
|
+
const out = new Map();
|
|
143
|
+
for (const [file, hunks] of perFile) {
|
|
144
|
+
const entry = fileContents.get(file);
|
|
145
|
+
let newContent = '';
|
|
146
|
+
let oldContent;
|
|
147
|
+
if (typeof entry === 'string') {
|
|
148
|
+
// Back-compat shape: just the new content. Old boundary unknown;
|
|
149
|
+
// we'll fall back to the new boundary for `-` lines (round-8 F-003
|
|
150
|
+
// documented residual: this is the over-count direction, never
|
|
151
|
+
// under-count — safe).
|
|
152
|
+
newContent = entry;
|
|
153
|
+
}
|
|
154
|
+
else if (entry) {
|
|
155
|
+
newContent = entry.newContent;
|
|
156
|
+
oldContent = entry.oldContent;
|
|
157
|
+
}
|
|
158
|
+
const newFmEnd = findFrontmatterEndLineNumber(newContent);
|
|
159
|
+
const oldFmEnd = oldContent !== undefined
|
|
160
|
+
? findFrontmatterEndLineNumber(oldContent)
|
|
161
|
+
: newFmEnd;
|
|
162
|
+
let bodyAdded = 0, bodyRemoved = 0;
|
|
163
|
+
for (const hunk of hunks) {
|
|
164
|
+
// Walk through the hunk, tracking the running line number on each
|
|
165
|
+
// side. Context lines (' ') advance both sides. '+' advances only
|
|
166
|
+
// the new side. '-' advances only the old side.
|
|
167
|
+
let newLineNo = hunk.newStart;
|
|
168
|
+
let oldLineNo = hunk.oldStart;
|
|
169
|
+
for (const l of hunk.lines) {
|
|
170
|
+
if (l.startsWith('+') && !l.startsWith('+++')) {
|
|
171
|
+
if (newLineNo > newFmEnd)
|
|
172
|
+
bodyAdded++;
|
|
173
|
+
newLineNo++;
|
|
174
|
+
}
|
|
175
|
+
else if (l.startsWith('-') && !l.startsWith('---')) {
|
|
176
|
+
if (oldLineNo > oldFmEnd)
|
|
177
|
+
bodyRemoved++;
|
|
178
|
+
oldLineNo++;
|
|
179
|
+
}
|
|
180
|
+
else if (l.startsWith(' ') || l === '') {
|
|
181
|
+
// Round-9 F-001: empty diff lines (where trailing whitespace was
|
|
182
|
+
// stripped from a blank context line) must still advance both
|
|
183
|
+
// counters. Without this, line numbers drift mid-hunk and the
|
|
184
|
+
// body/frontmatter classification breaks.
|
|
185
|
+
newLineNo++;
|
|
186
|
+
oldLineNo++;
|
|
187
|
+
}
|
|
188
|
+
// → no line numbers consumed.
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
out.set(file, { bodyAddedCount: bodyAdded, bodyRemovedCount: bodyRemoved });
|
|
192
|
+
}
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Return the 1-indexed line number of the closing frontmatter `---`. If
|
|
197
|
+
* the file has no frontmatter or it's malformed, returns 0 so every
|
|
198
|
+
* line is treated as body.
|
|
199
|
+
*/
|
|
200
|
+
function findFrontmatterEndLineNumber(content) {
|
|
201
|
+
const lines = content.split(/\r?\n/);
|
|
202
|
+
if (lines[0]?.trim() !== '---')
|
|
203
|
+
return 0;
|
|
204
|
+
for (let n = 1; n < lines.length; n++) {
|
|
205
|
+
if (lines[n].trim() === '---')
|
|
206
|
+
return n + 1; // 1-indexed
|
|
207
|
+
}
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=anti-over-rewrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anti-over-rewrite.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anti-over-rewrite.test.d.ts","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { evaluateChurn, parseUnifiedDiffForChurn, splitChurnByRegion } from './anti-over-rewrite.js';
|
|
3
|
+
function makeContent(volatility, bodyLines) {
|
|
4
|
+
const body = Array.from({ length: bodyLines }, (_, i) => `body line ${i + 1}`).join('\n');
|
|
5
|
+
return `---\nname: x\nvolatility: ${volatility}\n---\n${body}\n`;
|
|
6
|
+
}
|
|
7
|
+
describe('evaluateChurn', () => {
|
|
8
|
+
it('blocks a stable entry with >20% churn and no override', () => {
|
|
9
|
+
const content = makeContent('stable', 100);
|
|
10
|
+
// 100 body lines + frontmatter ≈ 105 total. 30 churn → 28%.
|
|
11
|
+
const out = evaluateChurn([
|
|
12
|
+
{ file: 'x.md', content, addedCount: 15, removedCount: 15 },
|
|
13
|
+
]);
|
|
14
|
+
expect(out[0].blocking).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it('does not block when maintainer applied the override label', () => {
|
|
17
|
+
const content = makeContent('stable', 100);
|
|
18
|
+
const out = evaluateChurn([{ file: 'x.md', content, addedCount: 15, removedCount: 15 }], { prLabels: ['knowledge-freshness', 'override:anti-over-rewrite'] });
|
|
19
|
+
expect(out[0].blocking).toBe(false);
|
|
20
|
+
expect(out[0].overridden).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it('DOES still block when only a PR-body marker is present (no label)', () => {
|
|
23
|
+
// F-005: the gate explicitly does not honor PR-body markers, which a
|
|
24
|
+
// prompt-injected source body could plant. Only the maintainer-applied
|
|
25
|
+
// label is trusted.
|
|
26
|
+
const content = makeContent('stable', 100);
|
|
27
|
+
const out = evaluateChurn([{ file: 'x.md', content, addedCount: 15, removedCount: 15 }], { prLabels: [] });
|
|
28
|
+
expect(out[0].blocking).toBe(true);
|
|
29
|
+
expect(out[0].overridden).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it('does not block evolving entries even at high churn', () => {
|
|
32
|
+
const content = makeContent('evolving', 100);
|
|
33
|
+
const out = evaluateChurn([
|
|
34
|
+
{ file: 'x.md', content, addedCount: 40, removedCount: 40 },
|
|
35
|
+
]);
|
|
36
|
+
expect(out[0].blocking).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it('passes stable entries under threshold', () => {
|
|
39
|
+
const content = makeContent('stable', 100);
|
|
40
|
+
const out = evaluateChurn([
|
|
41
|
+
{ file: 'x.md', content, addedCount: 5, removedCount: 5 },
|
|
42
|
+
]);
|
|
43
|
+
expect(out[0].blocking).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('parseUnifiedDiffForChurn', () => {
|
|
47
|
+
it('counts adds and removes per knowledge file', () => {
|
|
48
|
+
const diff = [
|
|
49
|
+
'diff --git a/content/knowledge/x/y.md b/content/knowledge/x/y.md',
|
|
50
|
+
'--- a/content/knowledge/x/y.md',
|
|
51
|
+
'+++ b/content/knowledge/x/y.md',
|
|
52
|
+
'@@ -1,3 +1,3 @@',
|
|
53
|
+
'-old',
|
|
54
|
+
'+new',
|
|
55
|
+
' same',
|
|
56
|
+
'-gone',
|
|
57
|
+
'+came',
|
|
58
|
+
].join('\n');
|
|
59
|
+
const out = parseUnifiedDiffForChurn(diff);
|
|
60
|
+
// Hunk starts at line 1 → state begins 'inside' frontmatter; none of the
|
|
61
|
+
// diff content contains `---` boundaries to flip to 'after', so body
|
|
62
|
+
// counts stay zero. The total counts reflect the raw diff.
|
|
63
|
+
expect(out).toEqual([{
|
|
64
|
+
file: 'content/knowledge/x/y.md',
|
|
65
|
+
addedCount: 2, removedCount: 2,
|
|
66
|
+
bodyAddedCount: 0, bodyRemovedCount: 0,
|
|
67
|
+
}]);
|
|
68
|
+
});
|
|
69
|
+
it('counts body adds/removes separately from frontmatter ones (round-6 F-002, round-7 F-001)', () => {
|
|
70
|
+
// A diff where the closing --- appears, transitioning frontmatter→body.
|
|
71
|
+
// Frontmatter changes (last-reviewed) should NOT count toward body churn.
|
|
72
|
+
const diff = [
|
|
73
|
+
'diff --git a/content/knowledge/core/x.md b/content/knowledge/core/x.md',
|
|
74
|
+
'--- a/content/knowledge/core/x.md',
|
|
75
|
+
'+++ b/content/knowledge/core/x.md',
|
|
76
|
+
'@@ -1,8 +1,8 @@',
|
|
77
|
+
' ---',
|
|
78
|
+
' name: x',
|
|
79
|
+
' description: y',
|
|
80
|
+
'-last-reviewed: null',
|
|
81
|
+
'+last-reviewed: 2026-05-25',
|
|
82
|
+
' ---',
|
|
83
|
+
'',
|
|
84
|
+
'-old body line',
|
|
85
|
+
'+new body line',
|
|
86
|
+
].join('\n');
|
|
87
|
+
const raw = parseUnifiedDiffForChurn(diff);
|
|
88
|
+
expect(raw).toEqual([{
|
|
89
|
+
file: 'content/knowledge/core/x.md',
|
|
90
|
+
addedCount: 2, removedCount: 2,
|
|
91
|
+
// parseUnifiedDiffForChurn alone returns 0 here — body counts are
|
|
92
|
+
// computed by splitChurnByRegion which needs the post-change content.
|
|
93
|
+
bodyAddedCount: 0, bodyRemovedCount: 0,
|
|
94
|
+
}]);
|
|
95
|
+
// The post-change file content has the closing --- on line 5,
|
|
96
|
+
// body starts on line 6. The diff's body line (`new body line`) lands
|
|
97
|
+
// at new-file line 7 (after blank line 6).
|
|
98
|
+
const newContent = [
|
|
99
|
+
'---',
|
|
100
|
+
'name: x',
|
|
101
|
+
'description: y',
|
|
102
|
+
'last-reviewed: 2026-05-25',
|
|
103
|
+
'---',
|
|
104
|
+
'',
|
|
105
|
+
'new body line',
|
|
106
|
+
].join('\n');
|
|
107
|
+
// F-001 round-7: splitChurnByRegion uses parseEntry-derived line
|
|
108
|
+
// numbers instead of the buggy diff-content state machine.
|
|
109
|
+
const splits = splitChurnByRegion(diff, new Map([['content/knowledge/core/x.md', newContent]]));
|
|
110
|
+
expect(splits.get('content/knowledge/core/x.md')).toEqual({
|
|
111
|
+
bodyAddedCount: 1, bodyRemovedCount: 1, // only the body line pair
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=anti-over-rewrite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anti-over-rewrite.test.js","sourceRoot":"","sources":["../../../src/knowledge-freshness/gates/anti-over-rewrite.test.ts"],"names":[],"mappings":"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"}
|