@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
|
@@ -14,11 +14,11 @@ argument-hint: "<PR# or blank> [--fix-threshold P0|P1|P2|P3]"
|
|
|
14
14
|
|
|
15
15
|
## Purpose
|
|
16
16
|
|
|
17
|
-
Run the
|
|
18
|
-
**plus** the Superpowers code-reviewer agent as a complementary
|
|
19
|
-
and reconcile all findings through MMR. This is the single entry
|
|
20
|
-
**PR-scoped** code review — agents call this once instead of
|
|
21
|
-
separate review invocations.
|
|
17
|
+
Run the four built-in CLI review channels (Codex, Gemini, Claude, Grok) on a
|
|
18
|
+
pull request **plus** the Superpowers code-reviewer agent as a complementary
|
|
19
|
+
agent channel, and reconcile all findings through MMR. This is the single entry
|
|
20
|
+
point for **PR-scoped** code review — agents call this once instead of
|
|
21
|
+
remembering separate review invocations.
|
|
22
22
|
|
|
23
23
|
**For non-PR targets**, don't use this tool. Call `mmr review` directly with
|
|
24
24
|
the appropriate input mode, or use `scaffold run review-code` for local
|
|
@@ -34,13 +34,14 @@ pre-commit review:
|
|
|
34
34
|
under `set -o pipefail`)
|
|
35
35
|
|
|
36
36
|
The `--diff` flag expects diff-format content; it does not read raw document
|
|
37
|
-
content. The
|
|
37
|
+
content. The built-in CLI review itself is not PR-specific — this tool is
|
|
38
38
|
just the PR wrapper around the more general `mmr review` CLI.
|
|
39
39
|
|
|
40
|
-
The
|
|
40
|
+
The built-in CLI channels are:
|
|
41
41
|
1. **Codex CLI** — OpenAI's code analysis (implementation correctness, security, API contracts)
|
|
42
42
|
2. **Gemini CLI** — Google's design reasoning (architectural patterns, broad context)
|
|
43
43
|
3. **Claude CLI** — Anthropic's code review (plan alignment, code quality, testing)
|
|
44
|
+
4. **Grok CLI** — xAI's independent second opinion (correctness, code quality; proprietary)
|
|
44
45
|
|
|
45
46
|
## Inputs
|
|
46
47
|
|
|
@@ -53,7 +54,7 @@ in the review criteria config rather than read at dispatch time.
|
|
|
53
54
|
|
|
54
55
|
## Expected Outputs
|
|
55
56
|
|
|
56
|
-
- All
|
|
57
|
+
- All built-in CLI review channels executed (or fallback documented) plus the Superpowers code-reviewer agent channel reconciled via `mmr reconcile`
|
|
57
58
|
- findings at or above the configured `fix_threshold` fixed before proceeding (read from `results.fix_threshold` in the verdict JSON; default `P2`)
|
|
58
59
|
- Review summary with per-channel results and reconciliation
|
|
59
60
|
|
|
@@ -108,7 +109,7 @@ The CLI supports multiple input modes:
|
|
|
108
109
|
|
|
109
110
|
**Manual fallback** (when MMR CLI is not installed):
|
|
110
111
|
|
|
111
|
-
Run Codex, Gemini, and
|
|
112
|
+
Run Codex, Gemini, Claude, and Grok CLI commands individually as foreground Bash calls.
|
|
112
113
|
Never use `run_in_background`, `&`, or `nohup`.
|
|
113
114
|
|
|
114
115
|
#### Channel 1: Codex CLI
|
|
@@ -141,11 +142,28 @@ claude -p "REVIEW_PROMPT" --output-format json 2>/dev/null
|
|
|
141
142
|
|
|
142
143
|
Claude CLI handles its own auth. Focus: plan alignment, code quality, testing.
|
|
143
144
|
|
|
145
|
+
#### Channel 4: Grok CLI
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
command -v grok >/dev/null 2>&1 || echo "Grok not installed"
|
|
149
|
+
grok models >/dev/null 2>&1 && echo "Grok authed" || echo "Run: grok login"
|
|
150
|
+
# grok ignores stdin — the prompt MUST be passed via a file (or the -p arg).
|
|
151
|
+
# Use mktemp (never a predictable /tmp path) and clean up afterward:
|
|
152
|
+
PROMPT_FILE=$(mktemp)
|
|
153
|
+
printf '%s' "REVIEW_PROMPT" > "$PROMPT_FILE"
|
|
154
|
+
grok --prompt-file "$PROMPT_FILE" --output-format json 2>/dev/null
|
|
155
|
+
rm -f "$PROMPT_FILE"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Grok's JSON wraps the reply in `.text`. If not installed or auth fails, queue a
|
|
159
|
+
compensating pass focused on an independent second opinion over correctness and code
|
|
160
|
+
quality. Auth failure recovery: `! grok login`.
|
|
161
|
+
|
|
144
162
|
**After all channels:** Run any queued compensating passes as additional `claude -p`
|
|
145
|
-
dispatches with focused prompts. Label findings as `[compensating: Codex-equivalent]
|
|
146
|
-
or `[compensating:
|
|
163
|
+
dispatches with focused prompts. Label findings as `[compensating: Codex-equivalent]`,
|
|
164
|
+
`[compensating: Gemini-equivalent]`, or `[compensating: Grok-equivalent]`.
|
|
147
165
|
|
|
148
|
-
### Step 3: Run Agent Code Review (
|
|
166
|
+
### Step 3: Run Agent Code Review (complementary agent channel)
|
|
149
167
|
|
|
150
168
|
Dispatch your platform's code-reviewer skill for a complementary review:
|
|
151
169
|
- **Claude Code:** dispatch `superpowers:code-reviewer` subagent with the PR diff and review criteria
|
|
@@ -153,7 +171,7 @@ Dispatch your platform's code-reviewer skill for a complementary review:
|
|
|
153
171
|
|
|
154
172
|
The agent skill runs inside your agent's context — it has access to conversation history, project knowledge, and plan context that external CLIs lack.
|
|
155
173
|
|
|
156
|
-
**Important:** The agent's review output must use MMR-compatible finding schema: each finding needs `severity` (P0-P3), `location` (file:line), and `description` (`suggestion` is
|
|
174
|
+
**Important:** The agent's review output must use MMR-compatible finding schema: each finding needs `severity` (P0-P3), `location` (file:line), and `description` (`category` and `suggestion` are optional, but `category` is recommended for finding identity). The strict validator in `mmr reconcile` will reject findings with missing or invalid required fields.
|
|
157
175
|
|
|
158
176
|
### Step 4: Inject Agent Review into MMR
|
|
159
177
|
|
|
@@ -230,15 +248,357 @@ If any findings sit at or above `fix_threshold` (the verdict JSON's `fix_thresho
|
|
|
230
248
|
1. Fix them in the code
|
|
231
249
|
2. Push the fixes: `git push`
|
|
232
250
|
3. Re-run the review to verify fixes: `mmr review --pr "$PR_NUMBER" --sync --format json`
|
|
233
|
-
4. The 3-round limit is **per finding**,
|
|
234
|
-
- **Keep going** when each new round surfaces
|
|
235
|
-
- **Stop and ask the user** when (a)
|
|
236
|
-
- **When stopped**, do NOT merge automatically. Document the unresolved findings (severity, location, attempt count) and let the user decide whether to continue fixing, create follow-up issues, or override.
|
|
251
|
+
4. The 3-round limit is **per finding**, enforced by the wrapper-side hash in Step 7a (`.scaffold/review-attempts/<session-id>.json`):
|
|
252
|
+
- **Keep going** when each new round surfaces genuinely different findings with *new* hashes — that is healthy review/fix iteration.
|
|
253
|
+
- **Stop and ask the user** when (a) any blocking finding's hash hits 3 attempts in the attempts file (`_review_at_strike_limit` returns true), (b) the same underlying defect keeps recurring across 3 rounds even if reviewer wording changes and produces a new hash, (c) a finding is genuinely ambiguous (channels contradict each other), or (d) the user explicitly asks to stop.
|
|
254
|
+
- **When stopped**, do NOT merge automatically. Document the unresolved findings (severity, location, hash, attempt count, and semantic recurrence notes when wording changed) and let the user decide whether to continue fixing, create follow-up issues, or override.
|
|
255
|
+
- Identity components used by the hash — `location`, `category`, `description`, `suggestion` — mirror MMR T2-A's forthcoming native `finding_key` (v3.30) so this bookkeeping migrates cleanly.
|
|
237
256
|
|
|
238
257
|
**Note:** Fix cycles are an orchestration concern — the caller (agent or human) handles the fix loop. The CLI provides the review and verdict; the caller decides whether to fix and re-run.
|
|
239
258
|
|
|
240
259
|
**Fix cycle channel rule:** Re-run only channels that originally completed or ran as compensating passes. Never retry a channel marked `not_installed`, `auth_failed`, or `timeout` during fix rounds — its availability does not change within a session.
|
|
241
260
|
|
|
261
|
+
### Step 7a: Wrapper-Side Per-Finding Hash (Stopgap until MMR v3.30)
|
|
262
|
+
|
|
263
|
+
Before each fix round, compute a stable hash per finding and record an attempt
|
|
264
|
+
in `.scaffold/review-attempts/<session-id>.json`. The hash mirrors MMR T2-A's
|
|
265
|
+
forthcoming `finding_key` identity (location + category + description +
|
|
266
|
+
suggestion) so it migrates cleanly when MMR v3.30 ships native `--session` and
|
|
267
|
+
`finding_key`. **Until then**, this wrapper-side bookkeeping is what enforces
|
|
268
|
+
the per-finding 3-strike rule.
|
|
269
|
+
|
|
270
|
+
This section is throwaway — when MMR v3.30 lands, replace this entire block
|
|
271
|
+
with `mmr review --session <id> --max-rounds N` and read `finding_key` from
|
|
272
|
+
the verdict JSON directly.
|
|
273
|
+
|
|
274
|
+
#### Derive the session id
|
|
275
|
+
|
|
276
|
+
<!-- review-wrapper-hash-helpers:start -->
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Session id rules (first match wins):
|
|
280
|
+
# 1. PR mode (--pr N) → "pr-<N>"
|
|
281
|
+
# 2. Branch+base → "<branch>@<base>" (sanitized to ^[a-zA-Z0-9_.-]+$)
|
|
282
|
+
# 3. Fallback → "ts-$(date -u +%Y%m%dT%H%M%SZ)"
|
|
283
|
+
_review_session_id() {
|
|
284
|
+
_review_sanitize_session_id() {
|
|
285
|
+
local raw="$1" sanitized
|
|
286
|
+
sanitized=$(printf '%s' "$raw" | tr -c 'a-zA-Z0-9_.-' '_')
|
|
287
|
+
if [ -z "$sanitized" ] || [ "$sanitized" = "." ] || [ "$sanitized" = ".." ]; then
|
|
288
|
+
echo "Error: review session id resolves to an unsafe path segment" >&2
|
|
289
|
+
return 1
|
|
290
|
+
fi
|
|
291
|
+
printf '%s' "$sanitized"
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if [ -n "${REVIEW_SESSION_ID:-}" ]; then
|
|
295
|
+
_review_sanitize_session_id "$REVIEW_SESSION_ID"
|
|
296
|
+
return
|
|
297
|
+
fi
|
|
298
|
+
if [ -n "${__REVIEW_SESSION_ID:-}" ]; then
|
|
299
|
+
printf '%s' "$__REVIEW_SESSION_ID"
|
|
300
|
+
return
|
|
301
|
+
fi
|
|
302
|
+
if [ -n "${PR_NUMBER:-}" ]; then
|
|
303
|
+
__REVIEW_SESSION_ID=$(_review_sanitize_session_id "pr-$PR_NUMBER") || return 1
|
|
304
|
+
printf '%s' "$__REVIEW_SESSION_ID"
|
|
305
|
+
return
|
|
306
|
+
fi
|
|
307
|
+
local branch base
|
|
308
|
+
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
|
|
309
|
+
base="${BASE_REF:-main}"
|
|
310
|
+
if [ -n "$branch" ] && [ "$branch" != "HEAD" ]; then
|
|
311
|
+
__REVIEW_SESSION_ID=$(_review_sanitize_session_id "$branch@$base") || return 1
|
|
312
|
+
printf '%s' "$__REVIEW_SESSION_ID"
|
|
313
|
+
return
|
|
314
|
+
fi
|
|
315
|
+
__REVIEW_SESSION_ID=$(_review_sanitize_session_id "ts-$(date -u +%Y%m%dT%H%M%SZ)") || return 1
|
|
316
|
+
printf '%s' "$__REVIEW_SESSION_ID"
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
_review_attempts_file() {
|
|
320
|
+
local id; id=$(_review_session_id)
|
|
321
|
+
mkdir -p .scaffold/review-attempts
|
|
322
|
+
printf '.scaffold/review-attempts/%s.json' "$id"
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
#### Normalize the four identity components
|
|
327
|
+
|
|
328
|
+
`normalized_location` strips trailing line/column spans (anchored to
|
|
329
|
+
end-of-string so mid-path digits survive):
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
_review_normalize_location() {
|
|
333
|
+
# Input: $1 = raw location (e.g. "src/foo.ts:42-44" or "pkg/Bar.kt (line 10)")
|
|
334
|
+
# Output: lowercased file path with trailing :N, :N-M, :N:M, (line N) stripped
|
|
335
|
+
printf '%s' "$1" \
|
|
336
|
+
| tr '[:upper:]' '[:lower:]' \
|
|
337
|
+
| awk '{ sub(/^[ \t]+/, ""); sub(/[ \t]+$/, ""); print }' \
|
|
338
|
+
| sed -E 's/(:[0-9]+(:[0-9]+)?(-[0-9]+)?|[[:space:]]+\(line[[:space:]]+[0-9]+\))$//'
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
The `(line N)` form requires whitespace before the parenthetical, so paths
|
|
343
|
+
like `archive/v1(line 10).txt` are preserved rather than treated as review
|
|
344
|
+
line references.
|
|
345
|
+
|
|
346
|
+
`description_normalized` is the tricky one — backtick-quoted code spans must
|
|
347
|
+
stay case-sensitive while prose around them is lowercased and stripped of
|
|
348
|
+
line-number filler. A python3 one-liner is the least painful implementation:
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
_review_normalize_description() {
|
|
352
|
+
# Input: $1 = raw description
|
|
353
|
+
# Output: tokenize on backticks → normalize non-code segments → reassemble
|
|
354
|
+
printf '%s' "$1" | python3 -c '
|
|
355
|
+
import re, sys
|
|
356
|
+
s = sys.stdin.read()
|
|
357
|
+
parts = s.split("`")
|
|
358
|
+
out = []
|
|
359
|
+
for i, seg in enumerate(parts):
|
|
360
|
+
if i % 2 == 1:
|
|
361
|
+
# Odd index = inside backticks = code, preserve exactly
|
|
362
|
+
out.append("`" + seg + "`")
|
|
363
|
+
else:
|
|
364
|
+
seg = seg.lower()
|
|
365
|
+
seg = re.sub(r"\bline\s+\d+\b", "", seg)
|
|
366
|
+
seg = re.sub(r"\bat\s+line\s+\d+\b", "", seg)
|
|
367
|
+
seg = re.sub(r"^\s*(p[0-3]|critical|high|medium|low|trivial)\s*:\s*", "", seg)
|
|
368
|
+
seg = re.sub(r"\s+", " ", seg).strip()
|
|
369
|
+
out.append(seg)
|
|
370
|
+
print(" ".join(p for p in out if p))
|
|
371
|
+
'
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
`suggestion_normalized` is lowercase + collapse-whitespace only (suggestions
|
|
376
|
+
are short and distinguishing — no further stripping):
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
_review_normalize_suggestion() {
|
|
380
|
+
printf '%s' "$1" | python3 -c 'import re, sys; print(re.sub(r"\s+", " ", sys.stdin.read().lower()).strip())'
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
#### Compute the stable hash
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
_review_finding_hash() {
|
|
388
|
+
# Input: $1 = single-finding JSON object (with location, category, description, suggestion fields)
|
|
389
|
+
# Output: 40-char sha1 hex of normalized_location + "|" + category + "|" + sha1(description_normalized) + "|" + sha1(suggestion_normalized)
|
|
390
|
+
local f="$1"
|
|
391
|
+
local loc cat desc sugg
|
|
392
|
+
loc=$(printf '%s' "$f" | jq -r '.location // ""')
|
|
393
|
+
cat=$(printf '%s' "$f" | jq -r '.category // ""')
|
|
394
|
+
desc=$(printf '%s' "$f" | jq -r '.description // ""')
|
|
395
|
+
sugg=$(printf '%s' "$f" | jq -r '.suggestion // ""')
|
|
396
|
+
|
|
397
|
+
local nloc ndesc nsugg dhash shash
|
|
398
|
+
nloc=$(_review_normalize_location "$loc")
|
|
399
|
+
ndesc=$(_review_normalize_description "$desc")
|
|
400
|
+
nsugg=$(_review_normalize_suggestion "$sugg")
|
|
401
|
+
dhash=$(printf '%s' "$ndesc" | shasum -a 1 | awk '{print $1}')
|
|
402
|
+
shash=$(printf '%s' "$nsugg" | shasum -a 1 | awk '{print $1}')
|
|
403
|
+
|
|
404
|
+
printf '%s|%s|%s|%s' "$nloc" "$cat" "$dhash" "$shash" \
|
|
405
|
+
| shasum -a 1 | awk '{print $1}'
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
#### Compute the description shingle (for future cross-round fuzzy matching)
|
|
410
|
+
|
|
411
|
+
This array is persisted alongside the hash so a follow-up MMR v3.30 migration
|
|
412
|
+
can run Jaccard ≥ 0.7 against historical findings without re-deriving
|
|
413
|
+
shingles. The wrapper itself does not currently consume the shingle for any
|
|
414
|
+
gating decision — strict-hash exact match is enough for the 3-strike rule.
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
_review_description_shingle() {
|
|
418
|
+
# Input: $1 = normalized description
|
|
419
|
+
# Output: JSON array of normalized 5-grams (token-based)
|
|
420
|
+
printf '%s' "$1" | python3 -c '
|
|
421
|
+
import json, sys
|
|
422
|
+
tokens = sys.stdin.read().split()
|
|
423
|
+
shingles = sorted({" ".join(tokens[i:i+5]) for i in range(max(0, len(tokens)-4))})
|
|
424
|
+
print(json.dumps(shingles))
|
|
425
|
+
'
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
#### Record an attempt and check the strike limit
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
_review_record_attempt() {
|
|
433
|
+
# Input: $1 = finding JSON, $2 = current round number (1-based), $3 = optional precomputed finding hash
|
|
434
|
+
# Side effect: increments attempts in the attempts file
|
|
435
|
+
# Output: prints new attempt count on stdout
|
|
436
|
+
local f="$1" round="$2" hash="${3:-}"
|
|
437
|
+
local file loc cat desc sugg nloc ndesc nsugg dhash shash shingle
|
|
438
|
+
file=$(_review_attempts_file)
|
|
439
|
+
loc=$(printf '%s' "$f" | jq -r '.location // ""')
|
|
440
|
+
cat=$(printf '%s' "$f" | jq -r '.category // ""')
|
|
441
|
+
desc=$(printf '%s' "$f" | jq -r '.description // ""')
|
|
442
|
+
sugg=$(printf '%s' "$f" | jq -r '.suggestion // ""')
|
|
443
|
+
nloc=$(_review_normalize_location "$loc")
|
|
444
|
+
ndesc=$(_review_normalize_description "$desc")
|
|
445
|
+
nsugg=$(_review_normalize_suggestion "$sugg")
|
|
446
|
+
if [ -z "$hash" ]; then
|
|
447
|
+
dhash=$(printf '%s' "$ndesc" | shasum -a 1 | awk '{print $1}')
|
|
448
|
+
shash=$(printf '%s' "$nsugg" | shasum -a 1 | awk '{print $1}')
|
|
449
|
+
hash=$(printf '%s|%s|%s|%s' "$nloc" "$cat" "$dhash" "$shash" \
|
|
450
|
+
| shasum -a 1 | awk '{print $1}')
|
|
451
|
+
fi
|
|
452
|
+
shingle=$(_review_description_shingle "$ndesc")
|
|
453
|
+
|
|
454
|
+
[ -f "$file" ] || jq -n --arg id "$(_review_session_id)" --arg created "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
|
|
455
|
+
'{session_id: $id, created_at: $created, findings: {}}' > "$file"
|
|
456
|
+
|
|
457
|
+
jq --arg h "$hash" --arg loc "$nloc" --argjson sh "$shingle" --argjson r "$round" '
|
|
458
|
+
.findings[$h] = (
|
|
459
|
+
.findings[$h] // {attempts: 0, first_seen_round: $r, normalized_location: $loc, description_shingle: $sh}
|
|
460
|
+
| .attempts += (if .last_seen_round == $r then 0 else 1 end)
|
|
461
|
+
| .last_seen_round = $r
|
|
462
|
+
)
|
|
463
|
+
' "$file" > "$file.tmp" && mv "$file.tmp" "$file"
|
|
464
|
+
|
|
465
|
+
jq -r --arg h "$hash" '.findings[$h].attempts' "$file"
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
_review_at_strike_limit() {
|
|
469
|
+
# Input: $1 = finding JSON, $2 = optional precomputed finding hash
|
|
470
|
+
# Exit: 0 if hash already has >= 3 attempts, 1 otherwise
|
|
471
|
+
local f="$1" file hash
|
|
472
|
+
hash="${2:-}"
|
|
473
|
+
file=$(_review_attempts_file)
|
|
474
|
+
[ -f "$file" ] || return 1
|
|
475
|
+
[ -n "$hash" ] || hash=$(_review_finding_hash "$f")
|
|
476
|
+
local n; n=$(jq -r --arg h "$hash" '.findings[$h].attempts // 0' "$file")
|
|
477
|
+
[ "$n" -ge 3 ]
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
This bookkeeping assumes sequential execution within a single workspace or
|
|
482
|
+
worktree. Do not run multiple review/fix loops against the same
|
|
483
|
+
`REVIEW_SESSION_ID` concurrently.
|
|
484
|
+
|
|
485
|
+
#### Per-round flow
|
|
486
|
+
|
|
487
|
+
After every `mmr review … --sync --format json` call:
|
|
488
|
+
|
|
489
|
+
1. Extract reconciled findings: `FINDINGS=$(mmr results "$JOB_ID" | jq -c '.reconciled_findings[]')`
|
|
490
|
+
2. Iterate safely over the newline-delimited JSON:
|
|
491
|
+
`printf '%s\n' "$FINDINGS" | while IFS= read -r f; do ... done`
|
|
492
|
+
3. For each blocking finding (severity at or above `fix_threshold`):
|
|
493
|
+
- Compute its hash via `_review_finding_hash`.
|
|
494
|
+
- Call `_review_at_strike_limit "$f" "$hash"` before incrementing — if true,
|
|
495
|
+
this finding already has 3 recorded attempts. Abort the entire task with
|
|
496
|
+
a clear blocked error; do not merely `break` the inner `while` loop or
|
|
497
|
+
continue the outer fix loop. Then follow the **Stop path** in Step 8.
|
|
498
|
+
- Call `_review_record_attempt "$f" "$ROUND" "$hash"` to increment its counter.
|
|
499
|
+
4. Otherwise apply fixes, re-push, increment `ROUND`, and loop.
|
|
500
|
+
|
|
501
|
+
For very noisy fix loops, you may suggest the user re-run with
|
|
502
|
+
`--fix-threshold P1` to narrow the gate (the project default stays at P2 per
|
|
503
|
+
the design's Decision 4). Do not auto-change the threshold.
|
|
504
|
+
|
|
505
|
+
This mirrors T2-A's identity components — `location`, `category`,
|
|
506
|
+
`description`, `suggestion` — so a future migration to MMR's native
|
|
507
|
+
`finding_key` is a search-and-replace of the helper calls with the field
|
|
508
|
+
read from the verdict JSON.
|
|
509
|
+
|
|
510
|
+
<!-- review-wrapper-hash-helpers:end -->
|
|
511
|
+
|
|
512
|
+
### Step 7b: File blocking findings as Beads tasks (opt-in)
|
|
513
|
+
|
|
514
|
+
If `.mmr.yaml` has `beads.create_issues_from_blocking_findings: true` AND `.beads/`
|
|
515
|
+
exists in the project, file each blocking finding (severity at-or-above
|
|
516
|
+
`beads.fix_threshold`, default `P2`) as a Beads bug. This is purely additive
|
|
517
|
+
tracking — it does NOT replace Step 7's fix-in-place flow; it only creates a
|
|
518
|
+
durable record of findings that ought to become standalone follow-up work.
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
# First: gate on the opt-in flag in .mmr.yaml. Defaults to disabled.
|
|
522
|
+
# Uses pure bash + grep/sed — no yq dependency (yq isn't always installed).
|
|
523
|
+
beads_enabled=false
|
|
524
|
+
beads_fix_threshold=P2
|
|
525
|
+
beads_default_type=bug
|
|
526
|
+
if [ -f .mmr.yaml ]; then
|
|
527
|
+
# Match a `create_issues_from_blocking_findings: true` line under any indentation.
|
|
528
|
+
# We don't validate it's nested under `beads:` — false positives in unrelated
|
|
529
|
+
# config keys with the same name are unlikely given the explicit name.
|
|
530
|
+
# POSIX character classes ([[:space:]]) for BSD-sed compatibility (macOS default).
|
|
531
|
+
# Patterns tolerate trailing whitespace/comments — uncommenting a template line with
|
|
532
|
+
# a trailing `# comment` should still match.
|
|
533
|
+
if grep -qE '^[[:space:]]*create_issues_from_blocking_findings:[[:space:]]*true([[:space:]]+#.*)?[[:space:]]*$' .mmr.yaml; then
|
|
534
|
+
beads_enabled=true
|
|
535
|
+
fi
|
|
536
|
+
# Optional overrides for threshold / type. Defaults apply if the keys are absent.
|
|
537
|
+
if v=$(grep -E '^[[:space:]]*fix_threshold:[[:space:]]*P[0-4]([[:space:]]+#.*)?[[:space:]]*$' .mmr.yaml | head -1 | sed -E 's/^[^:]*:[[:space:]]*(P[0-4]).*/\1/'); [ -n "$v" ]; then
|
|
538
|
+
beads_fix_threshold=$v
|
|
539
|
+
fi
|
|
540
|
+
if v=$(grep -E '^[[:space:]]*default_type:[[:space:]]*[a-zA-Z]+([[:space:]]+#.*)?[[:space:]]*$' .mmr.yaml | head -1 | sed -E 's/^[^:]*:[[:space:]]*([a-zA-Z]+).*/\1/'); [ -n "$v" ]; then
|
|
541
|
+
beads_default_type=$v
|
|
542
|
+
fi
|
|
543
|
+
fi
|
|
544
|
+
|
|
545
|
+
if [ "$beads_enabled" = "true" ] && [ -d .beads ] && command -v bd >/dev/null 2>&1 \
|
|
546
|
+
&& command -v mmr >/dev/null 2>&1 && [ -n "${JOB_ID:-}" ]; then
|
|
547
|
+
threshold_rank=$(case "$beads_fix_threshold" in P0) echo 0;; P1) echo 1;; P2) echo 2;; P3) echo 3;; *) echo 4;; esac)
|
|
548
|
+
|
|
549
|
+
# Capture the reconciled findings from the MMR job we already ran in Step 2.
|
|
550
|
+
# MMR JSON shape: { reconciled_findings: [{ severity, location, description, suggestion, ... }] }
|
|
551
|
+
review_json=$(mmr results "$JOB_ID" --format json)
|
|
552
|
+
|
|
553
|
+
while IFS= read -r finding; do
|
|
554
|
+
title=$(jq -r '.description | .[0:120]' <<<"$finding")
|
|
555
|
+
severity=$(jq -r '.severity' <<<"$finding")
|
|
556
|
+
pnum="${severity#P}"
|
|
557
|
+
description=$(jq -r --arg job "$JOB_ID" '"\(.description)\n\nSuggestion: \(.suggestion // "(none)")\n\nLocation: \(.location // "(unknown)")\n\nFirst seen in MMR job: \($job)"' <<<"$finding")
|
|
558
|
+
# Per-finding identity in the external-ref so a future Beads release with
|
|
559
|
+
# filter-by-external-ref can dedupe on re-runs. Uses the same
|
|
560
|
+
# location+description identity components as the wrapper-side hash stopgap
|
|
561
|
+
# (Step 7a) for consistency. NOTE: bd v1.0.4 has no `bd list --external-ref`
|
|
562
|
+
# flag, so cross-run dedupe is not enforced at the bridge level today —
|
|
563
|
+
# known limitation; re-running on the same MMR job will create duplicates.
|
|
564
|
+
loc=$(jq -r '.location // ""' <<<"$finding")
|
|
565
|
+
desc_for_hash=$(jq -r '.description // ""' <<<"$finding")
|
|
566
|
+
finding_hash=$(printf '%s|%s' "$loc" "$desc_for_hash" | shasum -a 1 | cut -c1-8)
|
|
567
|
+
|
|
568
|
+
# Build args conditionally — only include --deps discovered-from when SOURCE_BD_ID
|
|
569
|
+
# is set AND non-empty. Avoids bd create rejecting a bogus "discovered-from:unknown".
|
|
570
|
+
args=(
|
|
571
|
+
"$title"
|
|
572
|
+
--type "$beads_default_type"
|
|
573
|
+
-p "$pnum"
|
|
574
|
+
--description "$description"
|
|
575
|
+
--external-ref "mmr:$finding_hash"
|
|
576
|
+
)
|
|
577
|
+
if [ -n "${SOURCE_BD_ID:-}" ]; then
|
|
578
|
+
args+=(--deps "discovered-from:$SOURCE_BD_ID")
|
|
579
|
+
fi
|
|
580
|
+
bd create "${args[@]}"
|
|
581
|
+
done < <(jq -c --argjson maxRank "$threshold_rank" '
|
|
582
|
+
.reconciled_findings[]?
|
|
583
|
+
| (.severity | sub("^P";"") | tonumber) as $rank
|
|
584
|
+
| select($rank <= $maxRank)
|
|
585
|
+
' <<<"$review_json")
|
|
586
|
+
fi
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
Notes on this script:
|
|
590
|
+
- The opt-in flag `beads.create_issues_from_blocking_findings` in `.mmr.yaml` is read first; the rest of the block is skipped unless it's `true`. No env-var override — config is the single source of truth.
|
|
591
|
+
- Pure-bash YAML parsing (grep + sed) — no `yq` dependency. The match patterns are intentionally simple: a single boolean enable flag, plus optional `fix_threshold` and `default_type` overrides. Anything more complex than that should be parsed with a real YAML library.
|
|
592
|
+
- `--argjson maxRank "$threshold_rank"` passes a number so jq can compare numerically.
|
|
593
|
+
- `(.severity | sub("^P";"") | tonumber)` extracts the integer rank from `P2`-style severities.
|
|
594
|
+
- `while IFS= read -r` streams one JSON object per line without word-splitting on spaces.
|
|
595
|
+
- `.description | .[0:120]` truncates safely under UTF-8 (unlike `head -c 120`).
|
|
596
|
+
- The `--deps discovered-from:$SOURCE_BD_ID` flag is included only when `$SOURCE_BD_ID` is non-empty — avoids a bogus `discovered-from:unknown` dependency or a `bd create` failure for the common case where no source task is in scope.
|
|
597
|
+
|
|
598
|
+
Use `--external-ref "mmr:$finding_hash"` to link the new Beads issue to the *finding identity* (location + description hash, same components as Step 7a's wrapper hash). The ref is stable across MMR job IDs. **Known limitation:** Beads v1.0.4 has no `bd list --external-ref <ref>` filter, so this bridge can't dedupe at write time — re-running the bridge on the same finding will create another Beads issue. When upstream adds an external-ref filter, prepend a `bd list --external-ref "mmr:$finding_hash"` skip-check to this loop. The job ID is preserved in the issue's description (`First seen in MMR job: <id>`) for traceability.
|
|
599
|
+
|
|
600
|
+
`--deps discovered-from:$SOURCE_BD_ID` chains the new issue to whatever current task triggered the review (only when that ID is known).
|
|
601
|
+
|
|
242
602
|
### Step 8: Confirm Completion
|
|
243
603
|
|
|
244
604
|
**Success path** — all findings resolved (verdict is `pass` or `degraded-pass`):
|
|
@@ -252,7 +612,7 @@ Code review complete. Verdict: [pass/degraded-pass]. Channels: [N] executed, [N]
|
|
|
252
612
|
```
|
|
253
613
|
Code review halted. Verdict: [blocked/needs-user-decision]. PR #[number] is NOT ready for merge.
|
|
254
614
|
Unresolved findings:
|
|
255
|
-
- [severity] [location] — [description] (rounds attempted: [N])
|
|
615
|
+
- [severity] [location] [hash] — [description] (rounds attempted: [N])
|
|
256
616
|
- ...
|
|
257
617
|
Reason for stop: [same finding recurred 3× / channels contradict each other / user requested stop]
|
|
258
618
|
```
|
|
@@ -272,12 +632,12 @@ In either path, output the message and stop. Do NOT proceed to the next task wit
|
|
|
272
632
|
|
|
273
633
|
## Process Rules
|
|
274
634
|
|
|
275
|
-
1. **Foreground only** — Always run Codex, Gemini, and
|
|
276
|
-
2. **All
|
|
635
|
+
1. **Foreground only** — Always run Codex, Gemini, Claude, and Grok CLI commands as foreground Bash calls. Never use `run_in_background`, `&`, or `nohup`.
|
|
636
|
+
2. **All built-in CLI channels are mandatory** — Codex CLI, Gemini CLI, Claude CLI, and Grok CLI. Plus the Superpowers code-reviewer agent as a complementary agent channel reconciled via `mmr reconcile` (Step 3). Skip a CLI channel only when a tool is genuinely not installed or auth cannot be recovered (in which case MMR emits a compensating pass for missing Codex/Gemini/Grok channels; a missing Claude CLI has no compensator). Never skip by choice.
|
|
277
637
|
3. **Auth failures are not silent** — always surface to the user with the exact recovery command.
|
|
278
638
|
4. **Independence** — never share one channel's output with another. Each reviews the diff independently.
|
|
279
639
|
5. **Fix before proceeding** — findings at or above `fix_threshold` must be resolved before moving to the next task.
|
|
280
|
-
6. **3-round limit (per finding)** — never attempt to fix the *same* blocking finding more than 3 times. Each round that surfaces
|
|
640
|
+
6. **3-round limit (per finding hash)** — never attempt to fix the *same* blocking finding (identified by the Step 7a hash of `location` + `category` + `description` + `suggestion`) more than 3 times. The attempts file `.scaffold/review-attempts/<session-id>.json` is the source of truth; `_review_at_strike_limit` checks it. Each round that surfaces genuinely different findings with *new* hashes is healthy iteration — keep going. Stop when a hash hits 3 attempts, when the same underlying defect recurs across 3 rounds even if reviewer wording produces new hashes, when channels contradict each other, or when the user asks to stop. For noisy fix loops, optionally suggest `--fix-threshold P1` (the project default stays at P2).
|
|
281
641
|
7. **Document everything** — the review summary must show which channels ran and which were skipped, with reasons.
|
|
282
642
|
8. **CLI-first** — use `mmr review --sync` as the primary entry point. Manual dispatch is a fallback only.
|
|
283
643
|
9. **Job storage** — the CLI stores job data at `~/.mmr/jobs/{job-id}/results.json`. Review results are available via `mmr results <job-id>`.
|
|
@@ -179,14 +179,14 @@ Omit empty sections. Use the commit's first line (without the type prefix) as th
|
|
|
179
179
|
|
|
180
180
|
If `.beads/` exists:
|
|
181
181
|
|
|
182
|
-
1. Run `bd list --status closed` (
|
|
183
|
-
2. Cross-reference closed tasks with the commit range (match task IDs like `
|
|
182
|
+
1. Run `bd list --status closed --json` (canonical). If `bd` is unavailable in this environment, skip the autogenerated closed-tasks section — manual changelog entry expected.
|
|
183
|
+
2. Cross-reference closed tasks with the commit range (match task IDs like `bd-xxxx` or `scaffold-xxx` in commit messages).
|
|
184
184
|
3. If matches found, append a section:
|
|
185
185
|
|
|
186
186
|
```markdown
|
|
187
187
|
### Completed Tasks
|
|
188
|
-
- [
|
|
189
|
-
- [
|
|
188
|
+
- [bd-<id>] Task title
|
|
189
|
+
- [bd-<id2>] Task title
|
|
190
190
|
```
|
|
191
191
|
|
|
192
192
|
If `.beads/` does not exist or no tasks match, silently skip.
|
|
@@ -232,7 +232,7 @@ git add <changed-files>
|
|
|
232
232
|
git commit -m "chore(version): vX.Y.Z"
|
|
233
233
|
```
|
|
234
234
|
|
|
235
|
-
If Beads is configured (`.beads/` exists) and a task is active, include the task ID: `[
|
|
235
|
+
If Beads is configured (`.beads/` exists) and a task is active, include the task ID: `[bd-<id>] chore(version): vX.Y.Z`.
|
|
236
236
|
|
|
237
237
|
---
|
|
238
238
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAgC1C,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAgC1C,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAiCD,QAAA,MAAM,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAkO3E,CAAA;AAED,eAAe,gBAAgB,CAAA"}
|
|
@@ -29,14 +29,14 @@ function writeAndOpenDashboard(html, argv, output) {
|
|
|
29
29
|
const outputPath = argv.output ?? path.join(os.tmpdir(), `scaffold-dashboard-${Date.now()}.html`);
|
|
30
30
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
31
31
|
atomicWriteFile(outputPath, html);
|
|
32
|
-
if (
|
|
33
|
-
let opener = 'xdg-open';
|
|
34
|
-
if (process.platform === 'darwin')
|
|
35
|
-
opener = 'open';
|
|
36
|
-
if (process.platform === 'win32')
|
|
37
|
-
opener = 'start';
|
|
32
|
+
if (argv.open) {
|
|
38
33
|
try {
|
|
39
|
-
|
|
34
|
+
if (process.platform === 'darwin')
|
|
35
|
+
execFileSync('open', [outputPath]);
|
|
36
|
+
else if (process.platform === 'win32')
|
|
37
|
+
execFileSync('cmd', ['/c', 'start', '', outputPath]);
|
|
38
|
+
else
|
|
39
|
+
execFileSync('xdg-open', [outputPath]);
|
|
40
40
|
}
|
|
41
41
|
catch {
|
|
42
42
|
// Ignore errors when opening browser
|
|
@@ -54,10 +54,10 @@ const dashboardCommand = {
|
|
|
54
54
|
type: 'string',
|
|
55
55
|
description: 'Output path for HTML file',
|
|
56
56
|
})
|
|
57
|
-
.option('
|
|
57
|
+
.option('open', {
|
|
58
58
|
type: 'boolean',
|
|
59
|
-
description: '
|
|
60
|
-
default:
|
|
59
|
+
description: 'Open in browser (use --no-open to suppress)',
|
|
60
|
+
default: true,
|
|
61
61
|
})
|
|
62
62
|
.option('json-only', {
|
|
63
63
|
type: 'boolean',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAwB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,iCAAiC,EACjC,wBAAwB,GACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAiB1E;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,IAAY,EACZ,IAAmB,EACnB,MAA0C;IAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAEjG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAEjC,IAAI,
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
|