@zigrivers/scaffold 3.28.0 → 3.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/content/guides/.gitkeep +0 -0
- package/content/guides/index.html +1188 -0
- package/content/guides/mmr/.diagrams/diagram-0.svg +1 -0
- package/content/guides/mmr/.diagrams/manifest.json +3 -0
- package/content/guides/mmr/index.html +1728 -0
- package/content/guides/mmr/index.md +403 -0
- package/content/knowledge/VERSION +1 -0
- package/content/knowledge/backend/backend-api-design.md +8 -0
- package/content/knowledge/backend/backend-architecture.md +8 -0
- package/content/knowledge/backend/backend-async-patterns.md +7 -0
- package/content/knowledge/backend/backend-auth-patterns.md +9 -0
- package/content/knowledge/backend/backend-conventions.md +6 -0
- package/content/knowledge/backend/backend-data-modeling.md +7 -0
- package/content/knowledge/backend/backend-deployment.md +8 -0
- package/content/knowledge/backend/backend-dev-environment.md +5 -0
- package/content/knowledge/backend/backend-fintech-broker-integration.md +6 -0
- package/content/knowledge/backend/backend-fintech-compliance.md +10 -2
- package/content/knowledge/backend/backend-fintech-data-modeling.md +6 -0
- package/content/knowledge/backend/backend-fintech-ledger.md +6 -0
- package/content/knowledge/backend/backend-fintech-observability.md +6 -0
- package/content/knowledge/backend/backend-fintech-order-lifecycle.md +6 -0
- package/content/knowledge/backend/backend-fintech-risk-management.md +6 -0
- package/content/knowledge/backend/backend-fintech-testing.md +6 -0
- package/content/knowledge/backend/backend-observability.md +7 -0
- package/content/knowledge/backend/backend-project-structure.md +6 -0
- package/content/knowledge/backend/backend-requirements.md +6 -0
- package/content/knowledge/backend/backend-security.md +7 -0
- package/content/knowledge/backend/backend-testing.md +7 -0
- package/content/knowledge/backend/backend-worker-patterns.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-architecture.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-content-scripts.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-conventions.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-cross-browser.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-dev-environment.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-manifest.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-project-structure.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-requirements.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-security.md +7 -0
- package/content/knowledge/browser-extension/browser-extension-service-workers.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-store-submission.md +6 -0
- package/content/knowledge/browser-extension/browser-extension-testing.md +6 -0
- package/content/knowledge/cli/cli-architecture.md +4 -0
- package/content/knowledge/cli/cli-conventions.md +4 -0
- package/content/knowledge/cli/cli-dev-environment.md +5 -0
- package/content/knowledge/cli/cli-distribution-patterns.md +5 -0
- package/content/knowledge/cli/cli-interactivity-patterns.md +4 -0
- package/content/knowledge/cli/cli-output-patterns.md +4 -0
- package/content/knowledge/cli/cli-project-structure.md +4 -0
- package/content/knowledge/cli/cli-requirements.md +4 -0
- package/content/knowledge/cli/cli-shell-integration.md +4 -0
- package/content/knowledge/cli/cli-testing.md +4 -0
- package/content/knowledge/core/adr-craft.md +8 -0
- package/content/knowledge/core/ai-memory-management.md +6 -0
- package/content/knowledge/core/api-design.md +6 -0
- package/content/knowledge/core/automated-review-tooling.md +8 -0
- package/content/knowledge/core/claude-md-patterns.md +8 -0
- package/content/knowledge/core/coding-conventions.md +8 -0
- package/content/knowledge/core/database-design.md +8 -0
- package/content/knowledge/core/design-system-tokens.md +8 -0
- package/content/knowledge/core/dev-environment.md +4 -0
- package/content/knowledge/core/domain-modeling.md +6 -0
- package/content/knowledge/core/eval-craft.md +6 -0
- package/content/knowledge/core/git-workflow-patterns.md +8 -0
- package/content/knowledge/core/multi-model-research-dispatch.md +6 -0
- package/content/knowledge/core/multi-model-review-dispatch.md +6 -0
- package/content/knowledge/core/multi-service-api-contracts.md +5 -0
- package/content/knowledge/core/multi-service-architecture.md +5 -0
- package/content/knowledge/core/multi-service-auth.md +6 -0
- package/content/knowledge/core/multi-service-data-ownership.md +8 -0
- package/content/knowledge/core/multi-service-observability.md +8 -0
- package/content/knowledge/core/multi-service-resilience.md +5 -0
- package/content/knowledge/core/multi-service-task-decomposition.md +8 -0
- package/content/knowledge/core/multi-service-testing.md +5 -0
- package/content/knowledge/core/operations-runbook.md +8 -0
- package/content/knowledge/core/project-structure-patterns.md +4 -0
- package/content/knowledge/core/review-step-template.md +4 -0
- package/content/knowledge/core/security-best-practices.md +6 -0
- package/content/knowledge/core/system-architecture.md +6 -0
- package/content/knowledge/core/task-decomposition.md +5 -0
- package/content/knowledge/core/task-tracking.md +8 -0
- package/content/knowledge/core/tech-stack-selection.md +8 -0
- package/content/knowledge/core/test-skeleton-generation.md +4 -0
- package/content/knowledge/core/testing-strategy.md +8 -0
- package/content/knowledge/core/user-stories.md +8 -0
- package/content/knowledge/core/user-story-innovation.md +4 -0
- package/content/knowledge/core/ux-specification.md +5 -0
- package/content/knowledge/data-pipeline/data-pipeline-architecture.md +5 -0
- package/content/knowledge/data-pipeline/data-pipeline-batch-patterns.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-conventions.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-dev-environment.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-orchestration.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-project-structure.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-quality.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-requirements.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-schema-management.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-security.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-streaming-patterns.md +4 -0
- package/content/knowledge/data-pipeline/data-pipeline-testing.md +4 -0
- package/content/knowledge/data-science/data-science-architecture.md +5 -0
- package/content/knowledge/data-science/data-science-conventions.md +6 -0
- package/content/knowledge/data-science/data-science-data-versioning.md +6 -0
- package/content/knowledge/data-science/data-science-dev-environment.md +6 -0
- package/content/knowledge/data-science/data-science-experiment-tracking.md +8 -0
- package/content/knowledge/data-science/data-science-model-evaluation.md +5 -0
- package/content/knowledge/data-science/data-science-notebook-discipline.md +5 -0
- package/content/knowledge/data-science/data-science-observability.md +6 -0
- package/content/knowledge/data-science/data-science-project-structure.md +5 -0
- package/content/knowledge/data-science/data-science-reproducibility.md +8 -0
- package/content/knowledge/data-science/data-science-requirements.md +5 -0
- package/content/knowledge/data-science/data-science-security.md +8 -0
- package/content/knowledge/data-science/data-science-testing.md +5 -0
- package/content/knowledge/execution/enhancement-workflow.md +4 -0
- package/content/knowledge/execution/multi-agent-coordination.md +12 -1
- package/content/knowledge/execution/task-claiming-strategy.md +4 -0
- package/content/knowledge/execution/tdd-execution-loop.md +5 -0
- package/content/knowledge/execution/worktree-management.md +5 -0
- package/content/knowledge/finalization/apply-fixes-and-freeze.md +4 -0
- package/content/knowledge/finalization/developer-onboarding.md +4 -0
- package/content/knowledge/finalization/implementation-playbook.md +4 -0
- package/content/knowledge/game/game-accessibility.md +4 -0
- package/content/knowledge/game/game-ai-patterns.md +4 -0
- package/content/knowledge/game/game-asset-pipeline.md +4 -0
- package/content/knowledge/game/game-audio-design.md +4 -0
- package/content/knowledge/game/game-binary-vcs-strategy.md +5 -0
- package/content/knowledge/game/game-design-document.md +4 -0
- package/content/knowledge/game/game-domain-patterns.md +4 -0
- package/content/knowledge/game/game-economy-design.md +4 -0
- package/content/knowledge/game/game-engine-selection.md +4 -0
- package/content/knowledge/game/game-ideation.md +4 -0
- package/content/knowledge/game/game-input-systems.md +4 -0
- package/content/knowledge/game/game-level-content-design.md +4 -0
- package/content/knowledge/game/game-liveops-analytics.md +4 -0
- package/content/knowledge/game/game-localization.md +4 -0
- package/content/knowledge/game/game-milestone-definitions.md +4 -0
- package/content/knowledge/game/game-modding-ugc.md +4 -0
- package/content/knowledge/game/game-narrative-design.md +4 -0
- package/content/knowledge/game/game-networking.md +4 -0
- package/content/knowledge/game/game-performance-budgeting.md +4 -0
- package/content/knowledge/game/game-platform-certification.md +6 -0
- package/content/knowledge/game/game-project-structure.md +4 -0
- package/content/knowledge/game/game-save-systems.md +4 -0
- package/content/knowledge/game/game-testing-strategy.md +4 -0
- package/content/knowledge/game/game-ui-patterns.md +4 -0
- package/content/knowledge/game/game-vr-ar-design.md +6 -0
- package/content/knowledge/library/library-api-design.md +4 -0
- package/content/knowledge/library/library-architecture.md +4 -0
- package/content/knowledge/library/library-bundling.md +4 -0
- package/content/knowledge/library/library-conventions.md +5 -0
- package/content/knowledge/library/library-dev-environment.md +4 -0
- package/content/knowledge/library/library-documentation.md +4 -0
- package/content/knowledge/library/library-project-structure.md +4 -0
- package/content/knowledge/library/library-requirements.md +4 -0
- package/content/knowledge/library/library-security.md +4 -0
- package/content/knowledge/library/library-testing.md +4 -0
- package/content/knowledge/library/library-type-definitions.md +4 -0
- package/content/knowledge/library/library-versioning.md +5 -0
- package/content/knowledge/ml/ml-architecture.md +4 -0
- package/content/knowledge/ml/ml-conventions.md +4 -0
- package/content/knowledge/ml/ml-dev-environment.md +4 -0
- package/content/knowledge/ml/ml-experiment-tracking.md +6 -0
- package/content/knowledge/ml/ml-model-evaluation.md +4 -0
- package/content/knowledge/ml/ml-observability.md +5 -0
- package/content/knowledge/ml/ml-project-structure.md +4 -0
- package/content/knowledge/ml/ml-requirements.md +4 -0
- package/content/knowledge/ml/ml-security.md +5 -0
- package/content/knowledge/ml/ml-serving-patterns.md +4 -0
- package/content/knowledge/ml/ml-testing.md +4 -0
- package/content/knowledge/ml/ml-training-patterns.md +4 -0
- package/content/knowledge/mobile-app/mobile-app-architecture.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-conventions.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-deployment.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-dev-environment.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-distribution.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-observability.md +7 -0
- package/content/knowledge/mobile-app/mobile-app-offline-patterns.md +7 -0
- package/content/knowledge/mobile-app/mobile-app-project-structure.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-push-notifications.md +6 -0
- package/content/knowledge/mobile-app/mobile-app-requirements.md +7 -0
- package/content/knowledge/mobile-app/mobile-app-security.md +8 -0
- package/content/knowledge/mobile-app/mobile-app-testing.md +6 -0
- package/content/knowledge/product/gap-analysis.md +4 -0
- package/content/knowledge/product/ideation-craft.md +4 -0
- package/content/knowledge/product/prd-craft.md +4 -0
- package/content/knowledge/product/prd-innovation.md +4 -0
- package/content/knowledge/product/vision-craft.md +4 -0
- package/content/knowledge/product/vision-innovation.md +4 -0
- package/content/knowledge/research/research-architecture.md +4 -0
- package/content/knowledge/research/research-conventions.md +6 -0
- package/content/knowledge/research/research-dev-environment.md +6 -0
- package/content/knowledge/research/research-experiment-loop.md +4 -0
- package/content/knowledge/research/research-experiment-tracking.md +6 -0
- package/content/knowledge/research/research-ml-architecture-search.md +4 -0
- package/content/knowledge/research/research-ml-evaluation.md +4 -0
- package/content/knowledge/research/research-ml-experiment-tracking.md +6 -0
- package/content/knowledge/research/research-ml-training-patterns.md +4 -0
- package/content/knowledge/research/research-observability.md +5 -0
- package/content/knowledge/research/research-overfitting-prevention.md +5 -0
- package/content/knowledge/research/research-project-structure.md +5 -0
- package/content/knowledge/research/research-quant-backtesting.md +4 -0
- package/content/knowledge/research/research-quant-market-data.md +4 -0
- package/content/knowledge/research/research-quant-metrics.md +4 -0
- package/content/knowledge/research/research-quant-requirements.md +4 -0
- package/content/knowledge/research/research-quant-risk.md +4 -0
- package/content/knowledge/research/research-quant-strategy-patterns.md +4 -0
- package/content/knowledge/research/research-requirements.md +5 -0
- package/content/knowledge/research/research-security.md +5 -0
- package/content/knowledge/research/research-sim-compute-management.md +4 -0
- package/content/knowledge/research/research-sim-engine-patterns.md +4 -0
- package/content/knowledge/research/research-sim-parameter-spaces.md +4 -0
- package/content/knowledge/research/research-sim-validation.md +4 -0
- package/content/knowledge/research/research-testing.md +5 -0
- package/content/knowledge/review/review-adr.md +6 -0
- package/content/knowledge/review/review-api-design.md +6 -0
- package/content/knowledge/review/review-art-bible.md +4 -0
- package/content/knowledge/review/review-database-design.md +5 -0
- package/content/knowledge/review/review-domain-modeling.md +5 -0
- package/content/knowledge/review/review-game-design.md +4 -0
- package/content/knowledge/review/review-game-economy.md +4 -0
- package/content/knowledge/review/review-game-ui.md +5 -0
- package/content/knowledge/review/review-implementation-tasks.md +5 -0
- package/content/knowledge/review/review-methodology.md +4 -0
- package/content/knowledge/review/review-netcode.md +4 -0
- package/content/knowledge/review/review-operations.md +6 -0
- package/content/knowledge/review/review-platform-cert.md +4 -0
- package/content/knowledge/review/review-prd.md +4 -0
- package/content/knowledge/review/review-security.md +7 -0
- package/content/knowledge/review/review-system-architecture.md +6 -0
- package/content/knowledge/review/review-testing-strategy.md +6 -0
- package/content/knowledge/review/review-user-stories.md +5 -0
- package/content/knowledge/review/review-ux-specification.md +6 -0
- package/content/knowledge/review/review-vision.md +4 -0
- package/content/knowledge/tools/post-implementation-review-methodology.md +4 -0
- package/content/knowledge/tools/release-management.md +5 -0
- package/content/knowledge/tools/session-analysis.md +4 -0
- package/content/knowledge/tools/version-strategy.md +4 -0
- package/content/knowledge/validation/critical-path-analysis.md +4 -0
- package/content/knowledge/validation/cross-phase-consistency.md +4 -0
- package/content/knowledge/validation/decision-completeness.md +5 -0
- package/content/knowledge/validation/dependency-validation.md +4 -0
- package/content/knowledge/validation/implementability-review.md +4 -0
- package/content/knowledge/validation/scope-management.md +4 -0
- package/content/knowledge/validation/traceability.md +4 -0
- package/content/knowledge/web-app/web-app-api-patterns.md +6 -0
- package/content/knowledge/web-app/web-app-architecture.md +6 -0
- package/content/knowledge/web-app/web-app-auth-patterns.md +9 -0
- package/content/knowledge/web-app/web-app-conventions.md +5 -0
- package/content/knowledge/web-app/web-app-data-patterns.md +6 -0
- package/content/knowledge/web-app/web-app-deployment-workflow.md +6 -0
- package/content/knowledge/web-app/web-app-deployment.md +6 -0
- package/content/knowledge/web-app/web-app-design-system.md +6 -0
- package/content/knowledge/web-app/web-app-dev-environment.md +6 -0
- package/content/knowledge/web-app/web-app-observability.md +6 -0
- package/content/knowledge/web-app/web-app-project-structure.md +5 -0
- package/content/knowledge/web-app/web-app-rendering-strategies.md +6 -0
- package/content/knowledge/web-app/web-app-requirements.md +6 -0
- package/content/knowledge/web-app/web-app-security.md +8 -0
- package/content/knowledge/web-app/web-app-session-patterns.md +7 -0
- package/content/knowledge/web-app/web-app-testing.md +6 -0
- package/content/knowledge/web-app/web-app-ux-patterns.md +6 -0
- package/content/knowledge/web3/web3-access-control.md +8 -0
- package/content/knowledge/web3/web3-architecture.md +7 -0
- package/content/knowledge/web3/web3-audit-workflow.md +7 -0
- package/content/knowledge/web3/web3-common-vulnerabilities.md +8 -0
- package/content/knowledge/web3/web3-conventions.md +6 -0
- package/content/knowledge/web3/web3-deployment-and-verification.md +7 -0
- package/content/knowledge/web3/web3-dev-environment.md +6 -0
- package/content/knowledge/web3/web3-gas-optimization.md +7 -0
- package/content/knowledge/web3/web3-oracles-and-external-data.md +7 -0
- package/content/knowledge/web3/web3-project-structure.md +6 -0
- package/content/knowledge/web3/web3-requirements.md +6 -0
- package/content/knowledge/web3/web3-security.md +8 -0
- package/content/knowledge/web3/web3-testing.md +6 -0
- package/content/knowledge/web3/web3-upgradeability.md +7 -0
- package/content/tools/knowledge-audit-entry.md +79 -0
- package/content/tools/review-code.md +41 -14
- package/content/tools/review-pr.md +32 -14
- package/dist/cli/commands/dashboard.d.ts +1 -1
- package/dist/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/cli/commands/dashboard.js +10 -10
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/dashboard.test.js +1 -1
- package/dist/cli/commands/dashboard.test.js.map +1 -1
- package/dist/cli/commands/guides.d.ts +24 -0
- package/dist/cli/commands/guides.d.ts.map +1 -0
- package/dist/cli/commands/guides.js +103 -0
- package/dist/cli/commands/guides.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts +9 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js +112 -0
- package/dist/cli/commands/knowledge-freshness-anti-over-rewrite.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts +8 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.js +96 -0
- package/dist/cli/commands/knowledge-freshness-audit-apply.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts +7 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.js +42 -0
- package/dist/cli/commands/knowledge-freshness-audit-prefilter.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts +9 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.js +63 -0
- package/dist/cli/commands/knowledge-freshness-audit-run-entry.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.d.ts +8 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.js +34 -0
- package/dist/cli/commands/knowledge-freshness-bump-version.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts +7 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js +51 -0
- package/dist/cli/commands/knowledge-freshness-deep-guidance-check.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-link-check.d.ts +7 -0
- package/dist/cli/commands/knowledge-freshness-link-check.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-link-check.js +57 -0
- package/dist/cli/commands/knowledge-freshness-link-check.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts +8 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.js +58 -0
- package/dist/cli/commands/knowledge-freshness-lint-unsourced.js.map +1 -0
- package/dist/cli/commands/knowledge-freshness.d.ts +4 -0
- package/dist/cli/commands/knowledge-freshness.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-freshness.js +25 -0
- package/dist/cli/commands/knowledge-freshness.js.map +1 -0
- package/dist/cli/commands/observe.d.ts +4 -0
- package/dist/cli/commands/observe.d.ts.map +1 -1
- package/dist/cli/commands/observe.js +13 -0
- package/dist/cli/commands/observe.js.map +1 -1
- package/dist/cli/commands/observe.test.js +46 -0
- package/dist/cli/commands/observe.test.js.map +1 -1
- package/dist/cli/commands/validate-knowledge.d.ts +4 -0
- package/dist/cli/commands/validate-knowledge.d.ts.map +1 -0
- package/dist/cli/commands/validate-knowledge.js +32 -0
- package/dist/cli/commands/validate-knowledge.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapters/claude-code.d.ts.map +1 -1
- package/dist/core/adapters/claude-code.js +6 -3
- package/dist/core/adapters/claude-code.js.map +1 -1
- package/dist/core/adapters/claude-code.test.js +45 -1
- package/dist/core/adapters/claude-code.test.js.map +1 -1
- package/dist/core/assembly/engine.d.ts.map +1 -1
- package/dist/core/assembly/engine.js +7 -3
- package/dist/core/assembly/engine.js.map +1 -1
- package/dist/core/assembly/engine.test.js +45 -1
- package/dist/core/assembly/engine.test.js.map +1 -1
- package/dist/core/assembly/gap-signal-tail.d.ts +18 -0
- package/dist/core/assembly/gap-signal-tail.d.ts.map +1 -0
- package/dist/core/assembly/gap-signal-tail.js +43 -0
- package/dist/core/assembly/gap-signal-tail.js.map +1 -0
- package/dist/core/assembly/gap-signal-tail.test.d.ts +2 -0
- package/dist/core/assembly/gap-signal-tail.test.d.ts.map +1 -0
- package/dist/core/assembly/gap-signal-tail.test.js +49 -0
- package/dist/core/assembly/gap-signal-tail.test.js.map +1 -0
- package/dist/core/assembly/knowledge-loader.d.ts +11 -0
- package/dist/core/assembly/knowledge-loader.d.ts.map +1 -1
- package/dist/core/assembly/knowledge-loader.js +54 -1
- package/dist/core/assembly/knowledge-loader.js.map +1 -1
- package/dist/core/assembly/knowledge-loader.test.js +73 -0
- package/dist/core/assembly/knowledge-loader.test.js.map +1 -1
- package/dist/guides/build.d.ts +12 -0
- package/dist/guides/build.d.ts.map +1 -0
- package/dist/guides/build.js +50 -0
- package/dist/guides/build.js.map +1 -0
- package/dist/guides/build.test.d.ts +2 -0
- package/dist/guides/build.test.d.ts.map +1 -0
- package/dist/guides/build.test.js +74 -0
- package/dist/guides/build.test.js.map +1 -0
- package/dist/guides/chrome.d.ts +24 -0
- package/dist/guides/chrome.d.ts.map +1 -0
- package/dist/guides/chrome.js +118 -0
- package/dist/guides/chrome.js.map +1 -0
- package/dist/guides/cli-guides.test.d.ts +2 -0
- package/dist/guides/cli-guides.test.d.ts.map +1 -0
- package/dist/guides/cli-guides.test.js +41 -0
- package/dist/guides/cli-guides.test.js.map +1 -0
- package/dist/guides/dashboard-theme.css +1073 -0
- package/dist/guides/directives-callout.test.d.ts +2 -0
- package/dist/guides/directives-callout.test.d.ts.map +1 -0
- package/dist/guides/directives-callout.test.js +22 -0
- package/dist/guides/directives-callout.test.js.map +1 -0
- package/dist/guides/directives-chart.test.d.ts +2 -0
- package/dist/guides/directives-chart.test.d.ts.map +1 -0
- package/dist/guides/directives-chart.test.js +25 -0
- package/dist/guides/directives-chart.test.js.map +1 -0
- package/dist/guides/directives-filter-table.test.d.ts +2 -0
- package/dist/guides/directives-filter-table.test.d.ts.map +1 -0
- package/dist/guides/directives-filter-table.test.js +22 -0
- package/dist/guides/directives-filter-table.test.js.map +1 -0
- package/dist/guides/directives-sev.test.d.ts +2 -0
- package/dist/guides/directives-sev.test.d.ts.map +1 -0
- package/dist/guides/directives-sev.test.js +15 -0
- package/dist/guides/directives-sev.test.js.map +1 -0
- package/dist/guides/directives-tabs.test.d.ts +2 -0
- package/dist/guides/directives-tabs.test.d.ts.map +1 -0
- package/dist/guides/directives-tabs.test.js +52 -0
- package/dist/guides/directives-tabs.test.js.map +1 -0
- package/dist/guides/directives.d.ts +7 -0
- package/dist/guides/directives.d.ts.map +1 -0
- package/dist/guides/directives.js +158 -0
- package/dist/guides/directives.js.map +1 -0
- package/dist/guides/fs-guides.test.d.ts +2 -0
- package/dist/guides/fs-guides.test.d.ts.map +1 -0
- package/dist/guides/fs-guides.test.js +14 -0
- package/dist/guides/fs-guides.test.js.map +1 -0
- package/dist/guides/index-page.d.ts +3 -0
- package/dist/guides/index-page.d.ts.map +1 -0
- package/dist/guides/index-page.js +14 -0
- package/dist/guides/index-page.js.map +1 -0
- package/dist/guides/lint.d.ts +6 -0
- package/dist/guides/lint.d.ts.map +1 -0
- package/dist/guides/lint.js +27 -0
- package/dist/guides/lint.js.map +1 -0
- package/dist/guides/lint.test.d.ts +2 -0
- package/dist/guides/lint.test.d.ts.map +1 -0
- package/dist/guides/lint.test.js +24 -0
- package/dist/guides/lint.test.js.map +1 -0
- package/dist/guides/loader.d.ts +4 -0
- package/dist/guides/loader.d.ts.map +1 -0
- package/dist/guides/loader.js +63 -0
- package/dist/guides/loader.js.map +1 -0
- package/dist/guides/loader.test.d.ts +2 -0
- package/dist/guides/loader.test.d.ts.map +1 -0
- package/dist/guides/loader.test.js +85 -0
- package/dist/guides/loader.test.js.map +1 -0
- package/dist/guides/mermaid-sanitize.test.d.ts +2 -0
- package/dist/guides/mermaid-sanitize.test.d.ts.map +1 -0
- package/dist/guides/mermaid-sanitize.test.js +57 -0
- package/dist/guides/mermaid-sanitize.test.js.map +1 -0
- package/dist/guides/mermaid.d.ts +18 -0
- package/dist/guides/mermaid.d.ts.map +1 -0
- package/dist/guides/mermaid.js +137 -0
- package/dist/guides/mermaid.js.map +1 -0
- package/dist/guides/mermaid.test.d.ts +2 -0
- package/dist/guides/mermaid.test.d.ts.map +1 -0
- package/dist/guides/mermaid.test.js +105 -0
- package/dist/guides/mermaid.test.js.map +1 -0
- package/dist/guides/render.d.ts +12 -0
- package/dist/guides/render.d.ts.map +1 -0
- package/dist/guides/render.js +58 -0
- package/dist/guides/render.js.map +1 -0
- package/dist/guides/render.test.d.ts +2 -0
- package/dist/guides/render.test.d.ts.map +1 -0
- package/dist/guides/render.test.js +46 -0
- package/dist/guides/render.test.js.map +1 -0
- package/dist/guides/sanitize.d.ts +3 -0
- package/dist/guides/sanitize.d.ts.map +1 -0
- package/dist/guides/sanitize.js +76 -0
- package/dist/guides/sanitize.js.map +1 -0
- package/dist/guides/sanitize.test.d.ts +2 -0
- package/dist/guides/sanitize.test.d.ts.map +1 -0
- package/dist/guides/sanitize.test.js +45 -0
- package/dist/guides/sanitize.test.js.map +1 -0
- package/dist/guides/template.d.ts +11 -0
- package/dist/guides/template.d.ts.map +1 -0
- package/dist/guides/template.js +38 -0
- package/dist/guides/template.js.map +1 -0
- package/dist/guides/template.test.d.ts +2 -0
- package/dist/guides/template.test.d.ts.map +1 -0
- package/dist/guides/template.test.js +41 -0
- package/dist/guides/template.test.js.map +1 -0
- package/dist/guides/types.d.ts +20 -0
- package/dist/guides/types.d.ts.map +1 -0
- package/dist/guides/types.js +2 -0
- package/dist/guides/types.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.d.ts +64 -0
- package/dist/knowledge-freshness/audit-apply-pr.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.js +309 -0
- package/dist/knowledge-freshness/audit-apply-pr.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.js +211 -0
- package/dist/knowledge-freshness/audit-apply-pr.test.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply.d.ts +16 -0
- package/dist/knowledge-freshness/audit-apply.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply.js +193 -0
- package/dist/knowledge-freshness/audit-apply.js.map +1 -0
- package/dist/knowledge-freshness/audit-apply.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-apply.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-apply.test.js +482 -0
- package/dist/knowledge-freshness/audit-apply.test.js.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.d.ts +12 -0
- package/dist/knowledge-freshness/audit-prefilter.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.js +74 -0
- package/dist/knowledge-freshness/audit-prefilter.js.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-prefilter.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-prefilter.test.js +78 -0
- package/dist/knowledge-freshness/audit-prefilter.test.js.map +1 -0
- package/dist/knowledge-freshness/audit-runner.d.ts +135 -0
- package/dist/knowledge-freshness/audit-runner.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-runner.js +168 -0
- package/dist/knowledge-freshness/audit-runner.js.map +1 -0
- package/dist/knowledge-freshness/audit-runner.test.d.ts +2 -0
- package/dist/knowledge-freshness/audit-runner.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/audit-runner.test.js +130 -0
- package/dist/knowledge-freshness/audit-runner.test.js.map +1 -0
- package/dist/knowledge-freshness/bump-version.d.ts +24 -0
- package/dist/knowledge-freshness/bump-version.d.ts.map +1 -0
- package/dist/knowledge-freshness/bump-version.js +69 -0
- package/dist/knowledge-freshness/bump-version.js.map +1 -0
- package/dist/knowledge-freshness/bump-version.test.d.ts +2 -0
- package/dist/knowledge-freshness/bump-version.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/bump-version.test.js +82 -0
- package/dist/knowledge-freshness/bump-version.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts +86 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.js +210 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.js.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js +115 -0
- package/dist/knowledge-freshness/gates/anti-over-rewrite.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/changed-files.d.ts +53 -0
- package/dist/knowledge-freshness/gates/changed-files.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/changed-files.js +128 -0
- package/dist/knowledge-freshness/gates/changed-files.js.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts +23 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.js +27 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.js.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.js +23 -0
- package/dist/knowledge-freshness/gates/deep-guidance-check.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.d.ts +55 -0
- package/dist/knowledge-freshness/gates/link-check.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.js +161 -0
- package/dist/knowledge-freshness/gates/link-check.js.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/link-check.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/link-check.test.js +76 -0
- package/dist/knowledge-freshness/gates/link-check.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.d.ts +40 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.js +143 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.js.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.js +68 -0
- package/dist/knowledge-freshness/gates/lint-unsourced.test.js.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.d.ts +25 -0
- package/dist/knowledge-freshness/gates/parse-entry.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.js +41 -0
- package/dist/knowledge-freshness/gates/parse-entry.js.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.d.ts +2 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.js +34 -0
- package/dist/knowledge-freshness/gates/parse-entry.test.js.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.d.ts +33 -0
- package/dist/knowledge-freshness/providers/anthropic.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.js +36 -0
- package/dist/knowledge-freshness/providers/anthropic.js.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.test.d.ts +2 -0
- package/dist/knowledge-freshness/providers/anthropic.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/anthropic.test.js +32 -0
- package/dist/knowledge-freshness/providers/anthropic.test.js.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.d.ts +33 -0
- package/dist/knowledge-freshness/providers/deepseek.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.js +157 -0
- package/dist/knowledge-freshness/providers/deepseek.js.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.test.d.ts +2 -0
- package/dist/knowledge-freshness/providers/deepseek.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/deepseek.test.js +142 -0
- package/dist/knowledge-freshness/providers/deepseek.test.js.map +1 -0
- package/dist/knowledge-freshness/providers/index.d.ts +41 -0
- package/dist/knowledge-freshness/providers/index.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/index.js +108 -0
- package/dist/knowledge-freshness/providers/index.js.map +1 -0
- package/dist/knowledge-freshness/providers/index.test.d.ts +2 -0
- package/dist/knowledge-freshness/providers/index.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/providers/index.test.js +97 -0
- package/dist/knowledge-freshness/providers/index.test.js.map +1 -0
- package/dist/knowledge-freshness/source-hash.d.ts +39 -0
- package/dist/knowledge-freshness/source-hash.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-hash.js +180 -0
- package/dist/knowledge-freshness/source-hash.js.map +1 -0
- package/dist/knowledge-freshness/source-hash.test.d.ts +2 -0
- package/dist/knowledge-freshness/source-hash.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-hash.test.js +63 -0
- package/dist/knowledge-freshness/source-hash.test.js.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.d.ts +57 -0
- package/dist/knowledge-freshness/source-url-validator.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.js +304 -0
- package/dist/knowledge-freshness/source-url-validator.js.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.test.d.ts +2 -0
- package/dist/knowledge-freshness/source-url-validator.test.d.ts.map +1 -0
- package/dist/knowledge-freshness/source-url-validator.test.js +167 -0
- package/dist/knowledge-freshness/source-url-validator.test.js.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.d.ts +3 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.js +165 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.js.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts +2 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.js +421 -0
- package/dist/observability/checks/lens-i-knowledge-gaps.test.js.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.d.ts +16 -0
- package/dist/observability/checks/lens-i-lessons-scanner.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.js +106 -0
- package/dist/observability/checks/lens-i-lessons-scanner.js.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts +2 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.js +174 -0
- package/dist/observability/checks/lens-i-lessons-scanner.test.js.map +1 -0
- package/dist/observability/engine/api.d.ts +4 -0
- package/dist/observability/engine/api.d.ts.map +1 -1
- package/dist/observability/engine/api.js +17 -1
- package/dist/observability/engine/api.js.map +1 -1
- package/dist/observability/engine/checks/observability-config.d.ts +4 -0
- package/dist/observability/engine/checks/observability-config.d.ts.map +1 -1
- package/dist/observability/engine/checks/observability-config.js +1 -0
- package/dist/observability/engine/checks/observability-config.js.map +1 -1
- package/dist/observability/engine/checks/registry.d.ts.map +1 -1
- package/dist/observability/engine/checks/registry.js +7 -0
- package/dist/observability/engine/checks/registry.js.map +1 -1
- package/dist/observability/engine/checks/registry.test.js +3 -2
- package/dist/observability/engine/checks/registry.test.js.map +1 -1
- package/dist/observability/engine/checks/runner.d.ts +30 -0
- package/dist/observability/engine/checks/runner.d.ts.map +1 -1
- package/dist/observability/engine/checks/runner.js +8 -1
- package/dist/observability/engine/checks/runner.js.map +1 -1
- package/dist/observability/engine/checks/runner.test.js +74 -0
- package/dist/observability/engine/checks/runner.test.js.map +1 -1
- package/dist/observability/engine/event-schemas.d.ts.map +1 -1
- package/dist/observability/engine/event-schemas.js +41 -3
- package/dist/observability/engine/event-schemas.js.map +1 -1
- package/dist/observability/engine/event-schemas.test.js +105 -0
- package/dist/observability/engine/event-schemas.test.js.map +1 -1
- package/dist/observability/engine/fix-flow.d.ts +7 -0
- package/dist/observability/engine/fix-flow.d.ts.map +1 -1
- package/dist/observability/engine/fix-flow.js +5 -3
- package/dist/observability/engine/fix-flow.js.map +1 -1
- package/dist/observability/engine/knowledge-root-integration.test.d.ts +2 -0
- package/dist/observability/engine/knowledge-root-integration.test.d.ts.map +1 -0
- package/dist/observability/engine/knowledge-root-integration.test.js +103 -0
- package/dist/observability/engine/knowledge-root-integration.test.js.map +1 -0
- package/dist/observability/engine/types.d.ts +20 -1
- package/dist/observability/engine/types.d.ts.map +1 -1
- package/dist/observability/engine/types.test.js +1 -1
- package/dist/observability/engine/types.test.js.map +1 -1
- package/dist/observability/knowledge-index.d.ts +145 -0
- package/dist/observability/knowledge-index.d.ts.map +1 -0
- package/dist/observability/knowledge-index.js +353 -0
- package/dist/observability/knowledge-index.js.map +1 -0
- package/dist/observability/knowledge-index.test.d.ts +2 -0
- package/dist/observability/knowledge-index.test.d.ts.map +1 -0
- package/dist/observability/knowledge-index.test.js +364 -0
- package/dist/observability/knowledge-index.test.js.map +1 -0
- package/dist/observability/renderers/markdown.d.ts.map +1 -1
- package/dist/observability/renderers/markdown.js +14 -0
- package/dist/observability/renderers/markdown.js.map +1 -1
- package/dist/observability/renderers/markdown.test.js +30 -0
- package/dist/observability/renderers/markdown.test.js.map +1 -1
- package/dist/types/assembly.d.ts +10 -0
- package/dist/types/assembly.d.ts.map +1 -1
- package/dist/utils/fs.d.ts +6 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +13 -0
- package/dist/utils/fs.js.map +1 -1
- package/dist/validation/knowledge-frontmatter-validator.d.ts +15 -0
- package/dist/validation/knowledge-frontmatter-validator.d.ts.map +1 -0
- package/dist/validation/knowledge-frontmatter-validator.js +131 -0
- package/dist/validation/knowledge-frontmatter-validator.js.map +1 -0
- package/dist/validation/knowledge-frontmatter-validator.test.d.ts +2 -0
- package/dist/validation/knowledge-frontmatter-validator.test.d.ts.map +1 -0
- package/dist/validation/knowledge-frontmatter-validator.test.js +66 -0
- package/dist/validation/knowledge-frontmatter-validator.test.js.map +1 -0
- package/package.json +13 -4
|
@@ -0,0 +1,1728 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-chrome-version="1">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>MMR Reference</title>
|
|
7
|
+
<!-- scaffold:chrome v1 -->
|
|
8
|
+
<style>/* Scaffold Dashboard Theme
|
|
9
|
+
* All CSS for the generated pipeline dashboard.
|
|
10
|
+
* Embedded into HTML by scripts/generate-dashboard.sh.
|
|
11
|
+
* Design system reference: docs/design-system.md
|
|
12
|
+
*
|
|
13
|
+
* Aesthetic: "Precision Industrial" — Swiss-typographic control room.
|
|
14
|
+
* Deep navy dark mode with indigo accents, clean cool-white light mode.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/* ─── Design Tokens (Light Mode) ──────────────── */
|
|
18
|
+
:root {
|
|
19
|
+
/* Surface */
|
|
20
|
+
--bg: #f5f6fa;
|
|
21
|
+
--bg-card: #ffffff;
|
|
22
|
+
--bg-hover: #eef0f6;
|
|
23
|
+
--bg-inset: #e8eaf2;
|
|
24
|
+
|
|
25
|
+
/* Text */
|
|
26
|
+
--text: #1a1d2e;
|
|
27
|
+
--text-muted: #6b7294;
|
|
28
|
+
--text-faint: #9ba1c0;
|
|
29
|
+
|
|
30
|
+
/* Borders & Structure */
|
|
31
|
+
--border: #dde0ed;
|
|
32
|
+
--border-light: #eceef5;
|
|
33
|
+
--radius: 10px;
|
|
34
|
+
--radius-sm: 6px;
|
|
35
|
+
|
|
36
|
+
/* Accent */
|
|
37
|
+
--accent: #4f46e5;
|
|
38
|
+
--accent-hover: #4338ca;
|
|
39
|
+
--accent-glow: rgba(79, 70, 229, 0.10);
|
|
40
|
+
|
|
41
|
+
/* Semantic: Status */
|
|
42
|
+
--green: #059669;
|
|
43
|
+
--green-bg: #ecfdf5;
|
|
44
|
+
--green-border: #a7f3d0;
|
|
45
|
+
--blue: #2563eb;
|
|
46
|
+
--blue-bg: #eff6ff;
|
|
47
|
+
--blue-border: #bfdbfe;
|
|
48
|
+
--yellow: #d97706;
|
|
49
|
+
--yellow-bg: #fffbeb;
|
|
50
|
+
--yellow-border:#fde68a;
|
|
51
|
+
--gray: #9ca3af;
|
|
52
|
+
--gray-bg: #f3f4f6;
|
|
53
|
+
--gray-border: #e5e7eb;
|
|
54
|
+
|
|
55
|
+
/* Semantic: Next Banner */
|
|
56
|
+
--next-bg: #eef2ff;
|
|
57
|
+
--next-border: #4f46e5;
|
|
58
|
+
--next-glow: rgba(79, 70, 229, 0.06);
|
|
59
|
+
|
|
60
|
+
/* Semantic: Progress */
|
|
61
|
+
--progress-bg: #e5e7eb;
|
|
62
|
+
--progress-h: 10px;
|
|
63
|
+
|
|
64
|
+
/* Depth */
|
|
65
|
+
--shadow-sm: 0 1px 2px rgba(30, 34, 60, 0.04);
|
|
66
|
+
--shadow: 0 1px 3px rgba(30, 34, 60, 0.07), 0 1px 2px rgba(30, 34, 60, 0.04);
|
|
67
|
+
--shadow-md: 0 4px 12px rgba(30, 34, 60, 0.08), 0 1px 3px rgba(30, 34, 60, 0.05);
|
|
68
|
+
--shadow-lg: 0 8px 24px rgba(30, 34, 60, 0.10), 0 2px 6px rgba(30, 34, 60, 0.04);
|
|
69
|
+
|
|
70
|
+
/* Spacing scale (4px base) */
|
|
71
|
+
--sp-1: 4px;
|
|
72
|
+
--sp-2: 8px;
|
|
73
|
+
--sp-3: 12px;
|
|
74
|
+
--sp-4: 16px;
|
|
75
|
+
--sp-5: 20px;
|
|
76
|
+
--sp-6: 24px;
|
|
77
|
+
--sp-8: 32px;
|
|
78
|
+
--sp-10: 40px;
|
|
79
|
+
|
|
80
|
+
/* Typography */
|
|
81
|
+
--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
|
|
82
|
+
--font-mono: "SF Mono", "Cascadia Code", "Fira Code", "JetBrains Mono", Menlo, Consolas, monospace;
|
|
83
|
+
--text-xs: 0.75rem;
|
|
84
|
+
--text-sm: 0.8125rem;
|
|
85
|
+
--text-base: 0.9375rem;
|
|
86
|
+
--text-lg: 1.125rem;
|
|
87
|
+
--text-xl: 1.375rem;
|
|
88
|
+
--text-2xl: 1.75rem;
|
|
89
|
+
--lh-tight: 1.25;
|
|
90
|
+
--lh-normal: 1.5;
|
|
91
|
+
--lh-relaxed: 1.625;
|
|
92
|
+
--ls-tight: -0.01em;
|
|
93
|
+
--ls-wide: 0.025em;
|
|
94
|
+
--fw-normal: 400;
|
|
95
|
+
--fw-medium: 500;
|
|
96
|
+
--fw-semi: 600;
|
|
97
|
+
--fw-bold: 700;
|
|
98
|
+
|
|
99
|
+
/* Layout */
|
|
100
|
+
--max-w: 960px;
|
|
101
|
+
--page-pad: 24px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* ─── Design Tokens (Dark Mode) ───────────────── */
|
|
105
|
+
[data-theme="dark"] {
|
|
106
|
+
/* Surface */
|
|
107
|
+
--bg: #0f1117;
|
|
108
|
+
--bg-card: #1a1d2e;
|
|
109
|
+
--bg-hover: #252940;
|
|
110
|
+
--bg-inset: #141724;
|
|
111
|
+
|
|
112
|
+
/* Text */
|
|
113
|
+
--text: #e2e5f0;
|
|
114
|
+
--text-muted: #7c82a8;
|
|
115
|
+
--text-faint: #555c80;
|
|
116
|
+
|
|
117
|
+
/* Borders & Structure */
|
|
118
|
+
--border: #2a2f45;
|
|
119
|
+
--border-light: #21253a;
|
|
120
|
+
|
|
121
|
+
/* Accent */
|
|
122
|
+
--accent: #818cf8;
|
|
123
|
+
--accent-hover: #a5b4fc;
|
|
124
|
+
--accent-glow: rgba(129, 140, 248, 0.12);
|
|
125
|
+
|
|
126
|
+
/* Semantic: Status */
|
|
127
|
+
--green: #34d399;
|
|
128
|
+
--green-bg: rgba(6, 78, 59, 0.25);
|
|
129
|
+
--green-border: rgba(52, 211, 153, 0.25);
|
|
130
|
+
--blue: #60a5fa;
|
|
131
|
+
--blue-bg: rgba(30, 58, 95, 0.30);
|
|
132
|
+
--blue-border: rgba(96, 165, 250, 0.25);
|
|
133
|
+
--yellow: #fbbf24;
|
|
134
|
+
--yellow-bg: rgba(120, 53, 15, 0.25);
|
|
135
|
+
--yellow-border:rgba(251, 191, 36, 0.20);
|
|
136
|
+
--gray: #6b7294;
|
|
137
|
+
--gray-bg: #252940;
|
|
138
|
+
--gray-border: #363c58;
|
|
139
|
+
|
|
140
|
+
/* Semantic: Next Banner */
|
|
141
|
+
--next-bg: rgba(30, 27, 75, 0.50);
|
|
142
|
+
--next-border: #818cf8;
|
|
143
|
+
--next-glow: rgba(129, 140, 248, 0.08);
|
|
144
|
+
|
|
145
|
+
/* Semantic: Progress */
|
|
146
|
+
--progress-bg: #1f2337;
|
|
147
|
+
|
|
148
|
+
/* Depth */
|
|
149
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.20);
|
|
150
|
+
--shadow: 0 1px 3px rgba(0, 0, 0, 0.30), 0 1px 2px rgba(0, 0, 0, 0.15);
|
|
151
|
+
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.35), 0 1px 3px rgba(0, 0, 0, 0.20);
|
|
152
|
+
--shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.40), 0 2px 6px rgba(0, 0, 0, 0.20);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* ─── Theme Toggle ───────────────────────────── */
|
|
156
|
+
.theme-toggle {
|
|
157
|
+
background: var(--bg-inset);
|
|
158
|
+
border: 1px solid var(--border);
|
|
159
|
+
border-radius: var(--radius-sm);
|
|
160
|
+
padding: var(--sp-1) var(--sp-2);
|
|
161
|
+
cursor: pointer;
|
|
162
|
+
font-size: var(--text-base);
|
|
163
|
+
line-height: 1;
|
|
164
|
+
color: var(--text-muted);
|
|
165
|
+
transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
margin-left: auto;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.theme-toggle:hover {
|
|
172
|
+
border-color: var(--accent);
|
|
173
|
+
color: var(--accent);
|
|
174
|
+
background: var(--accent-glow);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* ─── Base ────────────────────────────────────── */
|
|
178
|
+
*, *::before, *::after {
|
|
179
|
+
margin: 0;
|
|
180
|
+
padding: 0;
|
|
181
|
+
box-sizing: border-box;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
body {
|
|
185
|
+
font-family: var(--font-sans);
|
|
186
|
+
font-size: var(--text-base);
|
|
187
|
+
line-height: var(--lh-normal);
|
|
188
|
+
color: var(--text);
|
|
189
|
+
background: var(--bg);
|
|
190
|
+
-webkit-font-smoothing: antialiased;
|
|
191
|
+
-moz-osx-font-smoothing: grayscale;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* ─── Layout ──────────────────────────────────── */
|
|
195
|
+
.wrap {
|
|
196
|
+
max-width: var(--max-w);
|
|
197
|
+
margin: 0 auto;
|
|
198
|
+
padding: var(--sp-8) var(--page-pad);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* ─── Header ──────────────────────────────────── */
|
|
202
|
+
.header {
|
|
203
|
+
display: flex;
|
|
204
|
+
align-items: baseline;
|
|
205
|
+
gap: var(--sp-3);
|
|
206
|
+
margin-bottom: var(--sp-2);
|
|
207
|
+
flex-wrap: wrap;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
h1 {
|
|
211
|
+
font-size: var(--text-2xl);
|
|
212
|
+
font-weight: var(--fw-bold);
|
|
213
|
+
letter-spacing: var(--ls-tight);
|
|
214
|
+
line-height: var(--lh-tight);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
h2 {
|
|
218
|
+
font-size: var(--text-lg);
|
|
219
|
+
font-weight: var(--fw-semi);
|
|
220
|
+
letter-spacing: var(--ls-tight);
|
|
221
|
+
line-height: var(--lh-tight);
|
|
222
|
+
margin-bottom: var(--sp-3);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.header-meta {
|
|
226
|
+
font-size: var(--text-xs);
|
|
227
|
+
color: var(--text-faint);
|
|
228
|
+
margin-bottom: var(--sp-6);
|
|
229
|
+
letter-spacing: var(--ls-wide);
|
|
230
|
+
text-transform: uppercase;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* ─── Badge ───────────────────────────────────── */
|
|
234
|
+
.badge {
|
|
235
|
+
display: inline-block;
|
|
236
|
+
padding: 2px var(--sp-2);
|
|
237
|
+
border-radius: 99px;
|
|
238
|
+
font-size: var(--text-xs);
|
|
239
|
+
font-weight: var(--fw-semi);
|
|
240
|
+
letter-spacing: var(--ls-wide);
|
|
241
|
+
background: var(--accent);
|
|
242
|
+
color: #fff;
|
|
243
|
+
text-transform: uppercase;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.badge-optional {
|
|
247
|
+
background: var(--yellow-bg);
|
|
248
|
+
color: var(--yellow);
|
|
249
|
+
border: 1px solid var(--yellow-border);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* ─── Progress Bar ────────────────────────────── */
|
|
253
|
+
.progress-bar {
|
|
254
|
+
width: 100%;
|
|
255
|
+
height: var(--progress-h);
|
|
256
|
+
background: var(--progress-bg);
|
|
257
|
+
border-radius: 99px;
|
|
258
|
+
overflow: hidden;
|
|
259
|
+
margin-bottom: var(--sp-6);
|
|
260
|
+
display: flex;
|
|
261
|
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.progress-bar .seg-done {
|
|
265
|
+
background: linear-gradient(135deg, var(--green), #10b981);
|
|
266
|
+
box-shadow: 0 0 8px rgba(5, 150, 105, 0.3);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.progress-bar .seg-likely {
|
|
270
|
+
background: linear-gradient(135deg, var(--blue), #3b82f6);
|
|
271
|
+
box-shadow: 0 0 8px rgba(37, 99, 235, 0.25);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.progress-bar .seg-skip {
|
|
275
|
+
background: var(--gray);
|
|
276
|
+
opacity: 0.7;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* ─── Summary Cards ───────────────────────────── */
|
|
280
|
+
.cards {
|
|
281
|
+
display: grid;
|
|
282
|
+
grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
|
|
283
|
+
gap: var(--sp-3);
|
|
284
|
+
margin-bottom: var(--sp-6);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
.card {
|
|
288
|
+
background: var(--bg-card);
|
|
289
|
+
border: 1px solid var(--border);
|
|
290
|
+
border-radius: var(--radius);
|
|
291
|
+
padding: var(--sp-4) var(--sp-5);
|
|
292
|
+
box-shadow: var(--shadow);
|
|
293
|
+
transition: box-shadow 0.15s ease, transform 0.15s ease;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
.card:hover {
|
|
297
|
+
box-shadow: var(--shadow-md);
|
|
298
|
+
transform: translateY(-1px);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.card-num {
|
|
302
|
+
font-size: var(--text-2xl);
|
|
303
|
+
font-weight: var(--fw-bold);
|
|
304
|
+
font-family: var(--font-mono);
|
|
305
|
+
letter-spacing: var(--ls-tight);
|
|
306
|
+
line-height: 1;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.card-lbl {
|
|
310
|
+
font-size: var(--text-xs);
|
|
311
|
+
color: var(--text-muted);
|
|
312
|
+
margin-top: var(--sp-1);
|
|
313
|
+
letter-spacing: var(--ls-wide);
|
|
314
|
+
text-transform: uppercase;
|
|
315
|
+
font-weight: var(--fw-medium);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/* ─── What's Next Banner ──────────────────────── */
|
|
319
|
+
.next-banner {
|
|
320
|
+
background: var(--next-bg);
|
|
321
|
+
border: 1px solid var(--next-border);
|
|
322
|
+
border-left: 4px solid var(--next-border);
|
|
323
|
+
border-radius: var(--radius);
|
|
324
|
+
padding: var(--sp-5) var(--sp-6);
|
|
325
|
+
margin-bottom: var(--sp-6);
|
|
326
|
+
box-shadow: 0 0 0 1px var(--next-glow), var(--shadow);
|
|
327
|
+
position: relative;
|
|
328
|
+
overflow: hidden;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.next-banner::before {
|
|
332
|
+
content: "";
|
|
333
|
+
position: absolute;
|
|
334
|
+
top: 0;
|
|
335
|
+
left: 0;
|
|
336
|
+
width: 4px;
|
|
337
|
+
height: 100%;
|
|
338
|
+
background: var(--next-border);
|
|
339
|
+
animation: pulse-border 2.5s ease-in-out infinite;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
@keyframes pulse-border {
|
|
343
|
+
0%, 100% { opacity: 1; }
|
|
344
|
+
50% { opacity: 0.5; }
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.next-banner h2 {
|
|
348
|
+
color: var(--accent);
|
|
349
|
+
margin-bottom: var(--sp-1);
|
|
350
|
+
font-size: var(--text-base);
|
|
351
|
+
font-weight: var(--fw-semi);
|
|
352
|
+
letter-spacing: var(--ls-wide);
|
|
353
|
+
text-transform: uppercase;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.next-banner p {
|
|
357
|
+
color: var(--text);
|
|
358
|
+
font-size: var(--text-base);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.next-cmd {
|
|
362
|
+
font-family: var(--font-mono);
|
|
363
|
+
background: var(--bg-card);
|
|
364
|
+
padding: var(--sp-1) var(--sp-3);
|
|
365
|
+
border-radius: var(--radius-sm);
|
|
366
|
+
font-size: var(--text-sm);
|
|
367
|
+
display: inline-flex;
|
|
368
|
+
align-items: center;
|
|
369
|
+
gap: var(--sp-2);
|
|
370
|
+
margin-top: var(--sp-3);
|
|
371
|
+
border: 1px solid var(--border);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/* ─── Phase Headers (Collapsible) ─────────────── */
|
|
375
|
+
.phase {
|
|
376
|
+
margin-bottom: var(--sp-6);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.phase-hdr {
|
|
380
|
+
display: flex;
|
|
381
|
+
align-items: center;
|
|
382
|
+
gap: var(--sp-2);
|
|
383
|
+
cursor: pointer;
|
|
384
|
+
padding: var(--sp-2) 0;
|
|
385
|
+
user-select: none;
|
|
386
|
+
border-bottom: 2px solid var(--border);
|
|
387
|
+
margin-bottom: var(--sp-3);
|
|
388
|
+
transition: border-color 0.15s ease;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.phase-hdr:hover {
|
|
392
|
+
border-bottom-color: var(--accent);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.phase-hdr:hover h2 {
|
|
396
|
+
color: var(--accent);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.phase-hdr h2 {
|
|
400
|
+
transition: color 0.15s ease;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.phase-hdr .arr {
|
|
404
|
+
transition: transform 0.2s ease;
|
|
405
|
+
font-size: var(--text-xs);
|
|
406
|
+
color: var(--text-muted);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.phase-hdr.closed .arr {
|
|
410
|
+
transform: rotate(-90deg);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.phase-cnt {
|
|
414
|
+
font-size: var(--text-xs);
|
|
415
|
+
font-family: var(--font-mono);
|
|
416
|
+
color: var(--text-faint);
|
|
417
|
+
margin-left: auto;
|
|
418
|
+
letter-spacing: var(--ls-wide);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* ─── Prompt List ─────────────────────────────── */
|
|
422
|
+
.plist {
|
|
423
|
+
display: flex;
|
|
424
|
+
flex-direction: column;
|
|
425
|
+
gap: var(--sp-2);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/* ─── Prompt Cards ────────────────────────────── */
|
|
429
|
+
.pcard {
|
|
430
|
+
background: var(--bg-card);
|
|
431
|
+
border: 1px solid var(--border);
|
|
432
|
+
border-radius: var(--radius);
|
|
433
|
+
padding: var(--sp-3) var(--sp-4);
|
|
434
|
+
box-shadow: var(--shadow-sm);
|
|
435
|
+
display: grid;
|
|
436
|
+
grid-template-columns: auto 1fr auto;
|
|
437
|
+
gap: var(--sp-2) var(--sp-3);
|
|
438
|
+
align-items: start;
|
|
439
|
+
transition: box-shadow 0.15s ease, transform 0.15s ease, border-color 0.15s ease;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.pcard:hover {
|
|
443
|
+
box-shadow: var(--shadow);
|
|
444
|
+
transform: translateY(-1px);
|
|
445
|
+
border-color: var(--accent-glow);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/* ─── Status Badges ──────────────────────────── */
|
|
449
|
+
.status-badge {
|
|
450
|
+
display: inline-flex;
|
|
451
|
+
align-items: center;
|
|
452
|
+
gap: var(--sp-1);
|
|
453
|
+
font-size: var(--text-xs);
|
|
454
|
+
font-weight: var(--fw-medium);
|
|
455
|
+
padding: 2px var(--sp-2);
|
|
456
|
+
border-radius: 99px;
|
|
457
|
+
white-space: nowrap;
|
|
458
|
+
flex-shrink: 0;
|
|
459
|
+
letter-spacing: var(--ls-wide);
|
|
460
|
+
line-height: var(--lh-tight);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.st-completed {
|
|
464
|
+
background: var(--green-bg);
|
|
465
|
+
color: var(--green);
|
|
466
|
+
border: 1px solid var(--green-border);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.st-likely-completed {
|
|
470
|
+
background: var(--blue-bg);
|
|
471
|
+
color: var(--blue);
|
|
472
|
+
border: 1px solid var(--blue-border);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.st-skipped {
|
|
476
|
+
background: var(--gray-bg);
|
|
477
|
+
color: var(--gray);
|
|
478
|
+
border: 1px solid var(--gray-border);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
.st-pending {
|
|
482
|
+
background: var(--bg-inset);
|
|
483
|
+
color: var(--text-faint);
|
|
484
|
+
border: 1px solid var(--border);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/* ─── Status Legend ──────────────────────────── */
|
|
488
|
+
.status-legend {
|
|
489
|
+
display: flex;
|
|
490
|
+
flex-wrap: wrap;
|
|
491
|
+
gap: var(--sp-2);
|
|
492
|
+
margin-bottom: var(--sp-4);
|
|
493
|
+
padding: var(--sp-2) 0;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
.status-legend .status-badge {
|
|
497
|
+
cursor: default;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/* ─── Prompt Card Inner ───────────────────────── */
|
|
501
|
+
.pinfo {
|
|
502
|
+
min-width: 0;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
.pname {
|
|
506
|
+
font-weight: var(--fw-semi);
|
|
507
|
+
font-size: var(--text-base);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.pstep {
|
|
511
|
+
font-size: var(--text-xs);
|
|
512
|
+
font-family: var(--font-mono);
|
|
513
|
+
color: var(--text-faint);
|
|
514
|
+
letter-spacing: var(--ls-wide);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.pdesc {
|
|
518
|
+
font-size: var(--text-sm);
|
|
519
|
+
color: var(--text-muted);
|
|
520
|
+
margin-top: 2px;
|
|
521
|
+
line-height: var(--lh-relaxed);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.pdesc-long {
|
|
525
|
+
font-size: var(--text-xs);
|
|
526
|
+
color: var(--text-faint);
|
|
527
|
+
margin-top: 2px;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
.pdeps {
|
|
531
|
+
font-size: var(--text-xs);
|
|
532
|
+
color: var(--yellow);
|
|
533
|
+
margin-top: var(--sp-1);
|
|
534
|
+
font-weight: var(--fw-medium);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/* ─── Copy Command Button ─────────────────────── */
|
|
538
|
+
.pcmd {
|
|
539
|
+
font-family: var(--font-mono);
|
|
540
|
+
font-size: var(--text-xs);
|
|
541
|
+
background: var(--bg-inset);
|
|
542
|
+
padding: 3px var(--sp-2);
|
|
543
|
+
border-radius: var(--radius-sm);
|
|
544
|
+
cursor: pointer;
|
|
545
|
+
border: 1px solid var(--border);
|
|
546
|
+
white-space: nowrap;
|
|
547
|
+
align-self: center;
|
|
548
|
+
color: var(--text-muted);
|
|
549
|
+
transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
|
|
550
|
+
letter-spacing: var(--ls-wide);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
.pcmd:hover {
|
|
554
|
+
border-color: var(--accent);
|
|
555
|
+
color: var(--accent);
|
|
556
|
+
background: var(--accent-glow);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
.pcmd.copied {
|
|
560
|
+
border-color: var(--green);
|
|
561
|
+
color: var(--green);
|
|
562
|
+
background: var(--green-bg);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/* ─── Prompt Modal ────────────────────────────── */
|
|
566
|
+
.modal-overlay {
|
|
567
|
+
position: fixed;
|
|
568
|
+
inset: 0;
|
|
569
|
+
background: rgba(0, 0, 0, 0.6);
|
|
570
|
+
display: flex;
|
|
571
|
+
align-items: center;
|
|
572
|
+
justify-content: center;
|
|
573
|
+
z-index: 1000;
|
|
574
|
+
padding: var(--sp-4);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
.modal {
|
|
578
|
+
background: var(--bg-card);
|
|
579
|
+
border: 1px solid var(--border);
|
|
580
|
+
border-radius: var(--radius);
|
|
581
|
+
box-shadow: var(--shadow-lg);
|
|
582
|
+
max-width: 720px;
|
|
583
|
+
width: 100%;
|
|
584
|
+
max-height: 85vh;
|
|
585
|
+
display: flex;
|
|
586
|
+
flex-direction: column;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.modal-header {
|
|
590
|
+
display: flex;
|
|
591
|
+
align-items: center;
|
|
592
|
+
gap: var(--sp-3);
|
|
593
|
+
padding: var(--sp-4) var(--sp-5);
|
|
594
|
+
border-bottom: 1px solid var(--border);
|
|
595
|
+
flex-shrink: 0;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.modal-header h3 {
|
|
599
|
+
font-size: var(--text-lg);
|
|
600
|
+
font-weight: var(--fw-semi);
|
|
601
|
+
flex: 1;
|
|
602
|
+
min-width: 0;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
.modal-close {
|
|
606
|
+
background: var(--bg-inset);
|
|
607
|
+
border: 1px solid var(--border);
|
|
608
|
+
border-radius: var(--radius-sm);
|
|
609
|
+
padding: var(--sp-1) var(--sp-2);
|
|
610
|
+
cursor: pointer;
|
|
611
|
+
font-size: var(--text-base);
|
|
612
|
+
color: var(--text-muted);
|
|
613
|
+
line-height: 1;
|
|
614
|
+
transition: border-color 0.15s ease, color 0.15s ease;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
.modal-close:hover {
|
|
618
|
+
border-color: var(--accent);
|
|
619
|
+
color: var(--accent);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.modal-body {
|
|
623
|
+
padding: var(--sp-5);
|
|
624
|
+
overflow-y: auto;
|
|
625
|
+
flex: 1;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
.modal-body pre {
|
|
629
|
+
font-family: var(--font-mono);
|
|
630
|
+
font-size: var(--text-sm);
|
|
631
|
+
line-height: var(--lh-relaxed);
|
|
632
|
+
white-space: pre-wrap;
|
|
633
|
+
word-break: break-word;
|
|
634
|
+
color: var(--text);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
.modal-body pre .md-heading {
|
|
638
|
+
font-weight: var(--fw-bold);
|
|
639
|
+
color: var(--accent);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
.modal-body pre .md-code {
|
|
643
|
+
background: var(--bg-inset);
|
|
644
|
+
padding: 1px 4px;
|
|
645
|
+
border-radius: 3px;
|
|
646
|
+
font-size: var(--text-xs);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
.modal-footer {
|
|
650
|
+
display: flex;
|
|
651
|
+
gap: var(--sp-2);
|
|
652
|
+
padding: var(--sp-3) var(--sp-5);
|
|
653
|
+
border-top: 1px solid var(--border);
|
|
654
|
+
flex-shrink: 0;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
.modal-copy-btn {
|
|
658
|
+
background: var(--accent);
|
|
659
|
+
color: #fff;
|
|
660
|
+
border: none;
|
|
661
|
+
border-radius: var(--radius-sm);
|
|
662
|
+
padding: var(--sp-2) var(--sp-4);
|
|
663
|
+
font-size: var(--text-sm);
|
|
664
|
+
font-weight: var(--fw-medium);
|
|
665
|
+
cursor: pointer;
|
|
666
|
+
transition: background 0.15s ease;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
.modal-copy-btn:hover {
|
|
670
|
+
background: var(--accent-hover);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
.modal-copy-btn.copied {
|
|
674
|
+
background: var(--green);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/* ─── Beads Task Section ─────────────────────── */
|
|
678
|
+
.beads-section {
|
|
679
|
+
margin-top: var(--sp-8);
|
|
680
|
+
margin-bottom: var(--sp-6);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
.beads-filters {
|
|
684
|
+
display: flex;
|
|
685
|
+
gap: var(--sp-2);
|
|
686
|
+
margin-bottom: var(--sp-3);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
.beads-filter {
|
|
690
|
+
background: var(--bg-inset);
|
|
691
|
+
border: 1px solid var(--border);
|
|
692
|
+
border-radius: 99px;
|
|
693
|
+
padding: var(--sp-1) var(--sp-3);
|
|
694
|
+
font-size: var(--text-xs);
|
|
695
|
+
font-weight: var(--fw-medium);
|
|
696
|
+
color: var(--text-muted);
|
|
697
|
+
cursor: pointer;
|
|
698
|
+
transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
|
|
699
|
+
letter-spacing: var(--ls-wide);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.beads-filter:hover {
|
|
703
|
+
border-color: var(--accent);
|
|
704
|
+
color: var(--accent);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
.beads-filter.active {
|
|
708
|
+
background: var(--accent);
|
|
709
|
+
color: #fff;
|
|
710
|
+
border-color: var(--accent);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/* ─── Beads Status Badges ────────────────────── */
|
|
714
|
+
.st-bead-open {
|
|
715
|
+
background: var(--accent-glow);
|
|
716
|
+
color: var(--accent);
|
|
717
|
+
border: 1px solid var(--accent);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
.st-bead-progress {
|
|
721
|
+
background: var(--blue-bg);
|
|
722
|
+
color: var(--blue);
|
|
723
|
+
border: 1px solid var(--blue-border);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
.st-bead-blocked {
|
|
727
|
+
background: var(--yellow-bg);
|
|
728
|
+
color: var(--yellow);
|
|
729
|
+
border: 1px solid var(--yellow-border);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
.st-bead-deferred {
|
|
733
|
+
background: var(--gray-bg);
|
|
734
|
+
color: var(--gray);
|
|
735
|
+
border: 1px solid var(--gray-border);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
.st-bead-closed {
|
|
739
|
+
background: var(--green-bg);
|
|
740
|
+
color: var(--green);
|
|
741
|
+
border: 1px solid var(--green-border);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/* ─── Beads Filter Separator ─────────────────── */
|
|
745
|
+
.beads-filter-sep {
|
|
746
|
+
width: 1px;
|
|
747
|
+
background: var(--border);
|
|
748
|
+
align-self: stretch;
|
|
749
|
+
margin: 0 var(--sp-1);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/* ─── Beads Priority Filter ──────────────────── */
|
|
753
|
+
.beads-prio-filter {
|
|
754
|
+
background: var(--bg-inset);
|
|
755
|
+
border: 1px solid var(--border);
|
|
756
|
+
border-radius: 99px;
|
|
757
|
+
padding: var(--sp-1) var(--sp-3);
|
|
758
|
+
font-size: var(--text-xs);
|
|
759
|
+
font-weight: var(--fw-medium);
|
|
760
|
+
color: var(--text-muted);
|
|
761
|
+
cursor: pointer;
|
|
762
|
+
transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
|
|
763
|
+
letter-spacing: var(--ls-wide);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
.beads-prio-filter:hover {
|
|
767
|
+
border-color: var(--accent);
|
|
768
|
+
color: var(--accent);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
.beads-prio-filter.active {
|
|
772
|
+
background: var(--accent);
|
|
773
|
+
color: #fff;
|
|
774
|
+
border-color: var(--accent);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/* ─── Beads Task Detail Modal ────────────────── */
|
|
778
|
+
.bead-meta-grid {
|
|
779
|
+
display: grid;
|
|
780
|
+
grid-template-columns: 1fr 1fr;
|
|
781
|
+
gap: var(--sp-3);
|
|
782
|
+
padding: var(--sp-4) 0;
|
|
783
|
+
border-bottom: 1px solid var(--border-light);
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
.bead-meta-item {
|
|
787
|
+
display: flex;
|
|
788
|
+
flex-direction: column;
|
|
789
|
+
gap: 2px;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
.bead-meta-label {
|
|
793
|
+
font-size: var(--text-xs);
|
|
794
|
+
color: var(--text-faint);
|
|
795
|
+
text-transform: uppercase;
|
|
796
|
+
letter-spacing: var(--ls-wide);
|
|
797
|
+
font-weight: var(--fw-medium);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
.bead-meta-value {
|
|
801
|
+
font-size: var(--text-sm);
|
|
802
|
+
font-weight: var(--fw-medium);
|
|
803
|
+
color: var(--text);
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.bead-description {
|
|
807
|
+
padding: var(--sp-4) 0;
|
|
808
|
+
border-bottom: 1px solid var(--border-light);
|
|
809
|
+
white-space: pre-wrap;
|
|
810
|
+
font-size: var(--text-sm);
|
|
811
|
+
line-height: var(--lh-relaxed);
|
|
812
|
+
color: var(--text-muted);
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
.bead-deps {
|
|
816
|
+
padding: var(--sp-4) 0;
|
|
817
|
+
border-bottom: 1px solid var(--border-light);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
.bead-dep-group {
|
|
821
|
+
display: flex;
|
|
822
|
+
flex-wrap: wrap;
|
|
823
|
+
align-items: center;
|
|
824
|
+
gap: var(--sp-2);
|
|
825
|
+
margin-bottom: var(--sp-2);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
.bead-dep-group:last-child {
|
|
829
|
+
margin-bottom: 0;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
.bead-dep-label {
|
|
833
|
+
font-size: var(--text-xs);
|
|
834
|
+
color: var(--text-faint);
|
|
835
|
+
text-transform: uppercase;
|
|
836
|
+
letter-spacing: var(--ls-wide);
|
|
837
|
+
font-weight: var(--fw-medium);
|
|
838
|
+
min-width: 80px;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
.bead-dep-link {
|
|
842
|
+
display: inline-block;
|
|
843
|
+
font-family: var(--font-mono);
|
|
844
|
+
font-size: var(--text-xs);
|
|
845
|
+
padding: 2px var(--sp-2);
|
|
846
|
+
border-radius: 99px;
|
|
847
|
+
background: var(--accent-glow);
|
|
848
|
+
color: var(--accent);
|
|
849
|
+
border: 1px solid var(--accent);
|
|
850
|
+
cursor: pointer;
|
|
851
|
+
transition: background 0.15s ease, color 0.15s ease;
|
|
852
|
+
text-decoration: none;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
.bead-dep-link:hover {
|
|
856
|
+
background: var(--accent);
|
|
857
|
+
color: #fff;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
.bead-timestamps {
|
|
861
|
+
display: flex;
|
|
862
|
+
flex-wrap: wrap;
|
|
863
|
+
gap: var(--sp-4);
|
|
864
|
+
padding: var(--sp-4) 0;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
.bead-ts-item {
|
|
868
|
+
display: flex;
|
|
869
|
+
flex-direction: column;
|
|
870
|
+
gap: 2px;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
.bead-ts-label {
|
|
874
|
+
font-size: var(--text-xs);
|
|
875
|
+
color: var(--text-faint);
|
|
876
|
+
text-transform: uppercase;
|
|
877
|
+
letter-spacing: var(--ls-wide);
|
|
878
|
+
font-weight: var(--fw-medium);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
.bead-ts-value {
|
|
882
|
+
font-size: var(--text-sm);
|
|
883
|
+
color: var(--text-muted);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
.bead-ts-value[title] {
|
|
887
|
+
border-bottom: 1px dotted var(--text-faint);
|
|
888
|
+
cursor: help;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/* ─── Standalone Commands Section ─────────────── */
|
|
892
|
+
.ongoing {
|
|
893
|
+
margin-top: var(--sp-10);
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
.ongoing h2 {
|
|
897
|
+
letter-spacing: var(--ls-wide);
|
|
898
|
+
text-transform: uppercase;
|
|
899
|
+
font-size: var(--text-sm);
|
|
900
|
+
color: var(--text-muted);
|
|
901
|
+
margin-bottom: var(--sp-4);
|
|
902
|
+
border-bottom: 2px solid var(--border);
|
|
903
|
+
padding-bottom: var(--sp-2);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/* ─── Footer ──────────────────────────────────── */
|
|
907
|
+
.footer {
|
|
908
|
+
text-align: center;
|
|
909
|
+
font-size: var(--text-xs);
|
|
910
|
+
color: var(--text-faint);
|
|
911
|
+
margin-top: var(--sp-10);
|
|
912
|
+
padding-top: var(--sp-4);
|
|
913
|
+
border-top: 1px solid var(--border-light);
|
|
914
|
+
letter-spacing: var(--ls-wide);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/* ─── Utilities ───────────────────────────────── */
|
|
918
|
+
.hidden {
|
|
919
|
+
display: none;
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
/* Build-observability severity + verdict tokens (Plan 4) */
|
|
923
|
+
:root {
|
|
924
|
+
--sev-p0: #dc2626; /* red 600 */
|
|
925
|
+
--sev-p1: #ea580c; /* orange 600 */
|
|
926
|
+
--sev-p2: #ca8a04; /* yellow 600 */
|
|
927
|
+
--sev-p3: #2563eb; /* blue 600 */
|
|
928
|
+
--sev-pass: #16a34a; /* green 600 */
|
|
929
|
+
}
|
|
930
|
+
[data-theme="dark"] {
|
|
931
|
+
--sev-p0: #f87171;
|
|
932
|
+
--sev-p1: #fb923c;
|
|
933
|
+
--sev-p2: #facc15;
|
|
934
|
+
--sev-p3: #60a5fa;
|
|
935
|
+
--sev-pass: #4ade80;
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
/* Build-observability panel layout */
|
|
939
|
+
.panel {
|
|
940
|
+
background: var(--bg-card);
|
|
941
|
+
border: 1px solid var(--border);
|
|
942
|
+
border-radius: var(--radius);
|
|
943
|
+
padding: var(--sp-4) var(--sp-6);
|
|
944
|
+
margin-bottom: var(--sp-6);
|
|
945
|
+
}
|
|
946
|
+
.panel > header {
|
|
947
|
+
display: flex;
|
|
948
|
+
align-items: center;
|
|
949
|
+
gap: var(--sp-3);
|
|
950
|
+
margin-bottom: var(--sp-4);
|
|
951
|
+
flex-wrap: wrap;
|
|
952
|
+
}
|
|
953
|
+
.panel > header h2 {
|
|
954
|
+
margin: 0;
|
|
955
|
+
font-size: var(--text-base);
|
|
956
|
+
font-weight: var(--fw-semi);
|
|
957
|
+
}
|
|
958
|
+
.panel .meta {
|
|
959
|
+
color: var(--text-muted);
|
|
960
|
+
font-size: var(--text-sm);
|
|
961
|
+
}
|
|
962
|
+
.grid { display: grid; gap: var(--sp-4); }
|
|
963
|
+
.grid-2 { grid-template-columns: repeat(2, 1fr); }
|
|
964
|
+
@media (max-width: 640px) { .grid-2 { grid-template-columns: 1fr; } }
|
|
965
|
+
|
|
966
|
+
/* Finding filters */
|
|
967
|
+
.finding-filters {
|
|
968
|
+
display: flex;
|
|
969
|
+
gap: var(--sp-2);
|
|
970
|
+
flex-wrap: wrap;
|
|
971
|
+
margin-bottom: var(--sp-4);
|
|
972
|
+
}
|
|
973
|
+
.finding-filters button {
|
|
974
|
+
padding: var(--sp-1) var(--sp-3);
|
|
975
|
+
border: 1px solid var(--border);
|
|
976
|
+
border-radius: var(--radius-sm);
|
|
977
|
+
background: var(--bg-inset);
|
|
978
|
+
color: var(--text);
|
|
979
|
+
font-size: var(--text-sm);
|
|
980
|
+
cursor: pointer;
|
|
981
|
+
}
|
|
982
|
+
.finding-filters button:hover,
|
|
983
|
+
.finding-filters button.active {
|
|
984
|
+
background: var(--accent);
|
|
985
|
+
border-color: var(--accent);
|
|
986
|
+
color: #fff;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
/* Findings list */
|
|
990
|
+
.findings {
|
|
991
|
+
list-style: none;
|
|
992
|
+
padding: 0;
|
|
993
|
+
margin: 0;
|
|
994
|
+
display: flex;
|
|
995
|
+
flex-direction: column;
|
|
996
|
+
gap: var(--sp-3);
|
|
997
|
+
}
|
|
998
|
+
.finding {
|
|
999
|
+
background: var(--bg-inset);
|
|
1000
|
+
border: 1px solid var(--border-light);
|
|
1001
|
+
border-radius: var(--radius-sm);
|
|
1002
|
+
padding: var(--sp-3) var(--sp-4);
|
|
1003
|
+
}
|
|
1004
|
+
.finding header {
|
|
1005
|
+
display: flex;
|
|
1006
|
+
align-items: center;
|
|
1007
|
+
gap: var(--sp-2);
|
|
1008
|
+
flex-wrap: wrap;
|
|
1009
|
+
margin-bottom: var(--sp-2);
|
|
1010
|
+
}
|
|
1011
|
+
.finding-id {
|
|
1012
|
+
font-family: var(--font-mono, monospace);
|
|
1013
|
+
font-size: var(--text-xs);
|
|
1014
|
+
color: var(--text-muted);
|
|
1015
|
+
background: var(--bg-card);
|
|
1016
|
+
border: 1px solid var(--border);
|
|
1017
|
+
border-radius: 4px;
|
|
1018
|
+
padding: 1px var(--sp-1);
|
|
1019
|
+
}
|
|
1020
|
+
.finding .lens {
|
|
1021
|
+
font-size: var(--text-xs);
|
|
1022
|
+
color: var(--text-muted);
|
|
1023
|
+
}
|
|
1024
|
+
.finding .title {
|
|
1025
|
+
font-size: var(--text-sm);
|
|
1026
|
+
font-weight: var(--fw-semi);
|
|
1027
|
+
flex: 1;
|
|
1028
|
+
}
|
|
1029
|
+
.finding p { margin: 0; font-size: var(--text-sm); color: var(--text-muted); }
|
|
1030
|
+
.empty { color: var(--text-muted); font-size: var(--text-sm); text-align: center; padding: var(--sp-4); }
|
|
1031
|
+
|
|
1032
|
+
/* ── Mermaid diagrams ─────────────────────────────────────────────────────────
|
|
1033
|
+
The build renders mermaid to inline SVG via mmdc, then sanitizeSvg() +
|
|
1034
|
+
rehype-sanitize strip the SVG's own <script>, <foreignObject>, AND <style>
|
|
1035
|
+
for security. Stripping <style> means the diagram arrives unstyled (nodes
|
|
1036
|
+
default to a black fill). These theme-token rules restyle the SVG so nodes,
|
|
1037
|
+
edges, arrowheads, and labels render correctly — and follow light/dark mode.
|
|
1038
|
+
Authors must render with htmlLabels:false (the generator forces this) so node
|
|
1039
|
+
labels are native <text>/<tspan> rather than stripped <foreignObject> HTML. */
|
|
1040
|
+
figure.mermaid { margin: var(--sp-5) 0; text-align: center; }
|
|
1041
|
+
figure.mermaid svg { max-width: 100%; height: auto; }
|
|
1042
|
+
/* Node shapes */
|
|
1043
|
+
figure.mermaid svg .node rect,
|
|
1044
|
+
figure.mermaid svg .node circle,
|
|
1045
|
+
figure.mermaid svg .node ellipse,
|
|
1046
|
+
figure.mermaid svg .node polygon,
|
|
1047
|
+
figure.mermaid svg .node path {
|
|
1048
|
+
fill: var(--bg-inset);
|
|
1049
|
+
stroke: var(--border);
|
|
1050
|
+
stroke-width: 1px;
|
|
1051
|
+
}
|
|
1052
|
+
/* Background helper rects mermaid emits behind labels */
|
|
1053
|
+
figure.mermaid svg .node .label-container { fill: var(--bg-inset); stroke: var(--border); }
|
|
1054
|
+
figure.mermaid svg rect.background { fill: none; stroke: none; }
|
|
1055
|
+
/* Labels (rendered as <text>/<tspan> when htmlLabels:false) */
|
|
1056
|
+
figure.mermaid svg .nodeLabel,
|
|
1057
|
+
figure.mermaid svg .node text,
|
|
1058
|
+
figure.mermaid svg text.nodeLabel,
|
|
1059
|
+
figure.mermaid svg .label text,
|
|
1060
|
+
figure.mermaid svg span.nodeLabel {
|
|
1061
|
+
fill: var(--text);
|
|
1062
|
+
color: var(--text);
|
|
1063
|
+
font-family: var(--font-sans);
|
|
1064
|
+
}
|
|
1065
|
+
/* Edges: thin strokes, not filled blobs */
|
|
1066
|
+
figure.mermaid svg .edgePath path,
|
|
1067
|
+
figure.mermaid svg path.flowchart-link,
|
|
1068
|
+
figure.mermaid svg .flowchart-link {
|
|
1069
|
+
fill: none;
|
|
1070
|
+
stroke: var(--text-faint);
|
|
1071
|
+
stroke-width: 1.5px;
|
|
1072
|
+
}
|
|
1073
|
+
/* Arrowheads */
|
|
1074
|
+
figure.mermaid svg marker path,
|
|
1075
|
+
figure.mermaid svg .marker {
|
|
1076
|
+
fill: var(--text-faint);
|
|
1077
|
+
stroke: var(--text-faint);
|
|
1078
|
+
}
|
|
1079
|
+
figure.mermaid svg .edgeLabel,
|
|
1080
|
+
figure.mermaid svg .edgeLabel text { fill: var(--text-muted); color: var(--text-muted); }
|
|
1081
|
+
</style>
|
|
1082
|
+
<script>(function(){try{var t=localStorage.getItem('guide-theme');if(!t&&window.matchMedia&&matchMedia('(prefers-color-scheme: dark)').matches)t='dark';if(t)document.documentElement.setAttribute('data-theme',t);}catch(e){}})();</script>
|
|
1083
|
+
</head>
|
|
1084
|
+
<body>
|
|
1085
|
+
<header class="topbar">
|
|
1086
|
+
<button data-action="nav" class="nav-toggle" aria-label="Toggle navigation">☰</button>
|
|
1087
|
+
<h1>MMR Reference</h1>
|
|
1088
|
+
<button data-action="theme" class="theme-toggle" aria-label="Toggle theme">◐</button>
|
|
1089
|
+
</header>
|
|
1090
|
+
<div class="layout">
|
|
1091
|
+
<aside class="rail"><nav class="toc" aria-label="Table of contents"><ul><li class="toc-2"><a href="#what-mmr-is">What MMR is</a></li><li class="toc-3"><a href="#the-core-idea-in-five-moves">The core idea in five moves</a></li><li class="toc-2"><a href="#end-to-end-flow">End-to-end flow</a></li><li class="toc-2"><a href="#the-mmr-review-command">The mmr review command</a></li><li class="toc-3"><a href="#copy-paste-commands-by-target">Copy-paste commands by target</a></li><li class="toc-2"><a href="#other-subcommands">Other subcommands</a></li><li class="toc-2"><a href="#channel-architecture">Channel architecture</a></li><li class="toc-3"><a href="#the-channel-config-shape">The channel config shape</a></li><li class="toc-3"><a href="#built-in-channels">Built-in channels</a></li><li class="toc-3"><a href="#the-dispatcher">The dispatcher</a></li><li class="toc-2"><a href="#scaffold-wrappers">Scaffold wrappers</a></li><li class="toc-2"><a href="#findings-reconciliation-verdicts">Findings, reconciliation & verdicts</a></li><li class="toc-3"><a href="#the-finding-shape">The Finding shape</a></li><li class="toc-3"><a href="#stable-identity-finding-key">Stable identity (finding_key)</a></li><li class="toc-3"><a href="#agreement-confidence">Agreement & confidence</a></li><li class="toc-3"><a href="#the-gate-the-four-verdicts">The gate & the four verdicts</a></li><li class="toc-2"><a href="#degraded-mode-compensation-auth">Degraded mode, compensation & auth</a></li><li class="toc-2"><a href="#configuration-mmryaml">Configuration (.mmr.yaml)</a></li></ul></nav></aside>
|
|
1092
|
+
<main class="content"><h2 id="what-mmr-is">What MMR is</h2>
|
|
1093
|
+
<p>Multi-Model Review runs your changes past several <strong>independent</strong> AI code
|
|
1094
|
+
reviewers ("channels"), then <strong>reconciles</strong> their findings into a single
|
|
1095
|
+
de-duplicated list and a <strong>verdict</strong> that gates the work. No channel ever sees
|
|
1096
|
+
another channel's output — agreement between them is what raises confidence, and
|
|
1097
|
+
disagreement is what surfaces ambiguity.</p>
|
|
1098
|
+
<h3 id="the-core-idea-in-five-moves">The core idea in five moves</h3>
|
|
1099
|
+
<ol>
|
|
1100
|
+
<li><strong>Resolve a diff</strong> — from a PR, staged changes, a branch range, or a piped diff.</li>
|
|
1101
|
+
<li><strong>Dispatch channels</strong> — each channel is a separate subprocess given the same
|
|
1102
|
+
prompt, run in parallel and isolated.</li>
|
|
1103
|
+
<li><strong>Parse</strong> — each channel's raw output is parsed into a common <code>Finding</code> shape.</li>
|
|
1104
|
+
<li><strong>Reconcile</strong> — findings are grouped by a stable key, de-duplicated, and
|
|
1105
|
+
scored for agreement and confidence.</li>
|
|
1106
|
+
<li><strong>Verdict</strong> — a severity gate yields <code>pass</code>, <code>degraded-pass</code>, <code>blocked</code>, or
|
|
1107
|
+
<code>needs-user-decision</code>.</li>
|
|
1108
|
+
</ol>
|
|
1109
|
+
<div class="callout callout-tip"><p><strong>Two layers, one mental model.</strong> The <code>mmr</code> CLI is the engine that dispatches
|
|
1110
|
+
the built-in channels and computes the verdict. The <code>scaffold run review-pr</code> /
|
|
1111
|
+
<code>review-code</code> wrappers sit on top: they add a Superpowers code-reviewer <em>agent</em>
|
|
1112
|
+
channel via <code>mmr reconcile</code>, handle auth recovery, and drive the fix loop.</p></div>
|
|
1113
|
+
<h2 id="end-to-end-flow">End-to-end flow</h2>
|
|
1114
|
+
<p>A single <code>mmr review … --sync</code> run walks the whole pipeline. Channels fan out in
|
|
1115
|
+
parallel; everything converges at reconciliation.</p>
|
|
1116
|
+
<figure class="mermaid"><svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1307.42px; background-color: transparent;" viewBox="0 0 1307.421875 478.6000061035156" role="graphics-document document">#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#666!important;stroke-width:0;stroke:#666;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#666;stroke-width:1px;}#my-svg .flowchart-link{stroke:#666;fill:none;}#my-svg .edgeLabel{background-color:white;text-align:center;}#my-svg .edgeLabel p{background-color:white;}#my-svg .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#my-svg .labelBkg{background-color:rgba(255, 255, 255, 0.5);}#my-svg .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#000000;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:white;text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:white;padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:white;fill:white;}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg .node .neo-node{stroke:#999;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node path{stroke:url(#my-svg-gradient);stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#999;filter:none;}#my-svg [data-look="neo"].node circle{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}<g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker><marker id="my-svg_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"></path></marker><marker id="my-svg_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"><polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"></polygon></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></circle></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></circle></marker><marker id="my-svg_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"></circle></marker><marker id="my-svg_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"></circle></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"></path></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"></path></marker><marker id="my-svg_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"></path></marker><marker id="my-svg_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path d="M177.453,230.5L181.62,230.5C185.786,230.5,194.12,230.5,201.786,230.5C209.453,230.5,216.453,230.5,219.953,230.5L223.453,230.5" id="my-svg-L_R_B_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M340.454,197.2L356.831,169.75C373.209,142.3,405.964,87.4,432.689,59.95C459.414,32.5,480.109,32.5,490.457,32.5L500.805,32.5" id="my-svg-L_B_C1_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M360.322,197.2L373.388,186.25C386.454,175.3,412.586,153.4,435.522,142.45C458.458,131.5,478.198,131.5,488.068,131.5L497.938,131.5" id="my-svg-L_B_C2_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M413.719,230.5L417.885,230.5C422.052,230.5,430.385,230.5,444.461,230.5C458.536,230.5,478.354,230.5,488.263,230.5L498.172,230.5" id="my-svg-L_B_C3_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M360.322,263.8L373.388,274.75C386.454,285.7,412.586,307.6,436.939,318.55C461.292,329.5,483.865,329.5,495.151,329.5L506.438,329.5" id="my-svg-L_B_C4_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M339.608,263.8L356.127,292.717C372.645,321.633,405.682,379.467,425.7,408.383C445.719,437.3,452.719,437.3,456.219,437.3L459.719,437.3" id="my-svg-L_B_C5_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M606.977,32.5L617.991,32.5C629.005,32.5,651.034,32.5,674.439,59.345C697.844,86.189,722.625,139.879,735.016,166.724L747.407,193.568" id="my-svg-L_C1_P_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M609.844,131.5L620.38,131.5C630.917,131.5,651.99,131.5,672.182,141.96C692.375,152.42,711.687,173.341,721.343,183.801L730.999,194.261" id="my-svg-L_C2_P_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M609.609,230.5L620.185,230.5C630.76,230.5,651.911,230.5,665.987,230.5C680.063,230.5,687.063,230.5,690.563,230.5L694.063,230.5" id="my-svg-L_C3_P_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M601.344,329.5L613.297,329.5C625.25,329.5,649.156,329.5,670.766,319.04C692.375,308.58,711.687,287.659,721.343,277.199L730.999,266.739" id="my-svg-L_C4_P_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M648.063,437.3L652.229,437.3C656.396,437.3,664.729,437.3,681.405,408.993C698.082,380.686,723.101,324.072,735.61,295.766L748.12,267.459" id="my-svg-L_C5_P_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M830.844,230.5L835.01,230.5C839.177,230.5,847.51,230.5,855.177,230.5C862.844,230.5,869.844,230.5,873.344,230.5L876.844,230.5" id="my-svg-L_P_RC_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path><path d="M1061.5,230.5L1065.667,230.5C1069.833,230.5,1078.167,230.5,1085.833,230.5C1093.5,230.5,1100.5,230.5,1104,230.5L1107.5,230.5" id="my-svg-L_RC_V_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" marker-end="url(#my-svg_flowchart-v2-pointEnd)"></path></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g><g class="edgeLabel"><g class="label" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" text-anchor="middle"></tspan></text></g></g><g><rect class="background" style="stroke: none"></rect></g></g><g class="nodes"><g class="node default" id="my-svg-flowchart-R-0" transform="translate(92.7265625, 230.5)"><rect class="basic label-container" style="" x="-84.7265625" y="-42.099998474121094" width="169.453125" height="84.19999694824219"></rect><g class="label" style="" transform="translate(0, -27.099998474121094)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">Resolve</tspan><tspan class="text-inner-tspan"> diff</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em"><tspan class="text-inner-tspan">(--pr</tspan><tspan class="text-inner-tspan"> /</tspan><tspan class="text-inner-tspan"> --staged</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="2.1em"><tspan class="text-inner-tspan">--diff</tspan><tspan class="text-inner-tspan"> /</tspan><tspan class="text-inner-tspan"> --base)</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-B-1" transform="translate(320.5859375, 230.5)"><rect class="basic label-container" style="" x="-93.1328125" y="-33.29999923706055" width="186.265625" height="66.5999984741211"></rect><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">Build</tspan><tspan class="text-inner-tspan"> prompt</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em"><tspan class="text-inner-tspan">(+</tspan><tspan class="text-inner-tspan"> focus,</tspan><tspan class="text-inner-tspan"> criteria)</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-C1-3" transform="translate(555.890625, 32.5)"><rect class="basic label-container" style="" x="-51.0859375" y="-24.5" width="102.171875" height="49"></rect><g class="label" style="" transform="translate(0, -9.5)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">codex</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-C2-5" transform="translate(555.890625, 131.5)"><rect class="basic label-container" style="" x="-53.953125" y="-24.5" width="107.90625" height="49"></rect><g class="label" style="" transform="translate(0, -9.5)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">gemini</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-C3-7" transform="translate(555.890625, 230.5)"><rect class="basic label-container" style="" x="-53.71875" y="-24.5" width="107.4375" height="49"></rect><g class="label" style="" transform="translate(0, -9.5)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">claude</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-C4-9" transform="translate(555.890625, 329.5)"><rect class="basic label-container" style="" x="-45.453125" y="-24.5" width="90.90625" height="49"></rect><g class="label" style="" transform="translate(0, -9.5)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">grok</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-C5-11" transform="translate(555.890625, 437.29999923706055)"><rect class="basic label-container" style="" x="-92.171875" y="-33.29999923706055" width="184.34375" height="66.5999984741211"></rect><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">doc-conformance</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em"><tspan class="text-inner-tspan">(opt-in)</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-P-13" transform="translate(764.453125, 230.5)"><rect class="basic label-container" style="" x="-66.390625" y="-33.29999923706055" width="132.78125" height="66.5999984741211"></rect><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">Parse</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em"><tspan class="text-inner-tspan">→</tspan><tspan class="text-inner-tspan"> Finding</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-RC-23" transform="translate(971.171875, 230.5)"><rect class="basic label-container" style="" x="-90.328125" y="-33.29999923706055" width="180.65625" height="66.5999984741211"></rect><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">Reconcile</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em"><tspan class="text-inner-tspan">(dedupe</tspan><tspan class="text-inner-tspan"> +</tspan><tspan class="text-inner-tspan"> score)</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-V-25" transform="translate(1205.4609375, 230.5)"><rect class="basic label-container" style="" x="-93.9609375" y="-33.29999923706055" width="187.921875" height="66.5999984741211"></rect><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect></rect><g><rect class="background" style="stroke: none"></rect><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em"><tspan class="text-inner-tspan">Verdict</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em"><tspan class="text-inner-tspan">(gate</tspan><tspan class="text-inner-tspan"> +</tspan><tspan class="text-inner-tspan"> exit</tspan><tspan class="text-inner-tspan"> code)</tspan></tspan></text></g></g></g></g></g></g><defs></defs><defs></defs></svg></figure>
|
|
1117
|
+
<p>Compensating passes (see <em>Degraded mode</em> below) are injected <em>after</em> the first
|
|
1118
|
+
dispatch round for any channel that was unavailable, then folded back into the
|
|
1119
|
+
same reconcile step.</p>
|
|
1120
|
+
<h2 id="the-mmr-review-command">The <code>mmr review</code> command</h2>
|
|
1121
|
+
<p>One command, several input modes. Pick the flag that matches your target;
|
|
1122
|
+
everything else is control and output options. Type in the box to filter the
|
|
1123
|
+
table.</p>
|
|
1124
|
+
<div class="filter-table"><input type="text" class="filter-input" placeholder="Filter…" aria-label="Filter table rows" disabled>
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
<table><thead><tr><th>Flag</th><th>Group</th><th>Description</th></tr></thead><tbody><tr><td><code>--diff <path|-></code></td><td>input</td><td>Read a unified diff from a file, or <code>-</code> for stdin. Highest-priority input mode.</td></tr><tr><td><code>--pr <n></code></td><td>input</td><td>Fetch the PR diff via <code>gh pr diff</code>.</td></tr><tr><td><code>--staged</code></td><td>input</td><td>Review staged changes (<code>git diff --cached</code>).</td></tr><tr><td><code>--base <ref> [--head <ref>]</code></td><td>input</td><td>Review a branch range (<code>git diff base...head</code>, head defaults to HEAD).</td></tr><tr><td><em>(no input flag)</em></td><td>input</td><td>Falls back to unstaged working-tree changes (<code>git diff</code>).</td></tr><tr><td><code>--focus <text></code></td><td>control</td><td>Free-text focus areas appended to every channel prompt.</td></tr><tr><td><code>--fix-threshold <P0|P1|P2|P3></code></td><td>control</td><td>Severity gate. Findings at or above this block. Default P2 (from <code>.mmr.yaml</code>).</td></tr><tr><td><code>--channels <names…></code></td><td>control</td><td>Run only these channels, overriding config defaults. Abstract channels are filtered out.</td></tr><tr><td><code>--timeout <seconds></code></td><td>control</td><td>Per-channel timeout override.</td></tr><tr><td><code>--template <name></code></td><td>control</td><td>Use a named review-criteria template from config.</td></tr><tr><td><code>--format <json|text|markdown></code></td><td>output</td><td>Output format. Default <code>json</code>.</td></tr><tr><td><code>--sync</code></td><td>mode</td><td>Run the full pipeline (dispatch → parse → reconcile → verdict) and return results. Without it, dispatch is fire-and-forget.</td></tr><tr><td><code>--dry-run</code></td><td>mode</td><td>Resolve the diff and assemble the prompt without dispatching any channel.</td></tr><tr><td><code>--session <id></code></td><td>rounds</td><td>Link this run into a multi-round session (<code>[A-Za-z0-9_-]</code>).</td></tr><tr><td><code>--round <n></code></td><td>rounds</td><td>1-based round counter within a session.</td></tr><tr><td><code>--max-rounds <n></code></td><td>rounds</td><td>Hard cap on rounds. Defaults to 5 when <code>--session</code> is set without it.</td></tr><tr><td><code>--accept-new-acks</code></td><td>trust</td><td>Trust acknowledgment files newly introduced by the diff.</td></tr><tr><td><code>--trust-project-acks</code></td><td>trust</td><td>Trust working-tree project acks in non-Git / untrusted modes.</td></tr><tr><td><code>--trust-project-config</code></td><td>trust</td><td>Trust working-tree <code>.mmr.yaml</code> in untrusted modes.</td></tr><tr><td><code>--config-base-ref <ref></code></td><td>trust</td><td>Load <code>.mmr.yaml</code> and acks from a trusted Git ref instead of HEAD.</td></tr></tbody></table></div>
|
|
1235
|
+
<h3 id="copy-paste-commands-by-target">Copy-paste commands by target</h3>
|
|
1236
|
+
<pre><code class="language-bash"># PR review (full pipeline, JSON out)
|
|
1237
|
+
mmr review --pr 123 --sync --format json
|
|
1238
|
+
|
|
1239
|
+
# Staged changes before commit
|
|
1240
|
+
mmr review --staged --sync --format json
|
|
1241
|
+
|
|
1242
|
+
# All tracked uncommitted changes (no untracked)
|
|
1243
|
+
git diff HEAD | mmr review --diff - --sync --format json
|
|
1244
|
+
|
|
1245
|
+
# Branch range
|
|
1246
|
+
mmr review --base main --head "$BRANCH" --sync --format json
|
|
1247
|
+
|
|
1248
|
+
# A single file's current contents, as an "all-added" diff
|
|
1249
|
+
(diff -u /dev/null path/to/file.ts || true) | mmr review --diff - --sync --format json
|
|
1250
|
+
|
|
1251
|
+
# Only specific channels (e.g. just grok + claude)
|
|
1252
|
+
mmr review --pr 123 --channels grok claude --sync --format json
|
|
1253
|
+
</code></pre>
|
|
1254
|
+
<h2 id="other-subcommands">Other subcommands</h2>
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
<table><thead><tr><th>Command</th><th>Purpose</th></tr></thead><tbody><tr><td><code>mmr reconcile <job-id> --channel <name> --input <data></code></td><td>Inject an external channel's findings (e.g. the Superpowers agent) into an existing job and re-run the results pipeline. Input is a file, <code>-</code> for stdin, or inline JSON.</td></tr><tr><td><code>mmr status <job-id></code></td><td>Per-channel status and elapsed time. Exit 0 = all complete, 1 = running, 2 = a channel failed, 5 = not found.</td></tr><tr><td><code>mmr results <job-id> [--raw]</code></td><td>Re-run parse → reconcile → format on a completed job. Exit code reflects the verdict.</td></tr><tr><td><code>mmr jobs <list|prune></code></td><td>List jobs, or prune old ones per <code>job_retention_days</code>.</td></tr><tr><td><code>mmr sessions <start|list|show|end> <id></code></td><td>Manage multi-round review sessions (stored under <code>~/.mmr/sessions/</code>).</td></tr><tr><td><code>mmr config <init|show|validate…></code></td><td>Scaffold and inspect <code>.mmr.yaml</code> (including OSS-runtime example blocks).</td></tr><tr><td><code>mmr ack <add|list|rm|prune></code></td><td>Sticky acknowledgments — silence a finding by its stable key so it stops blocking across rounds.</td></tr></tbody></table>
|
|
1293
|
+
<pre><code class="language-bash"># Capture a job_id from a review, then fold in an agent channel:
|
|
1294
|
+
mmr reconcile "$JOB_ID" --channel superpowers --input findings.json
|
|
1295
|
+
</code></pre>
|
|
1296
|
+
<h2 id="channel-architecture">Channel architecture</h2>
|
|
1297
|
+
<p>A channel is <strong>pure config data</strong> — there is no per-channel code. The dispatcher
|
|
1298
|
+
runs whatever <code>command</code> the channel defines, hands it the prompt, and parses its
|
|
1299
|
+
output with the configured parser. Adding a channel is normally a <code>.mmr.yaml</code>
|
|
1300
|
+
edit, not a code change.</p>
|
|
1301
|
+
<h3 id="the-channel-config-shape">The channel config shape</h3>
|
|
1302
|
+
<pre><code class="language-yaml">channels:
|
|
1303
|
+
<name>:
|
|
1304
|
+
enabled: true # run by default?
|
|
1305
|
+
command: "codex exec" # whitespace-split, spawned WITHOUT a shell
|
|
1306
|
+
flags: ["--ephemeral"] # appended after the command tokens
|
|
1307
|
+
env: { KEY: value } # extra environment
|
|
1308
|
+
prompt_delivery: stdin # stdin (default) | prompt-file
|
|
1309
|
+
prompt_wrapper: "{{prompt}}" # template wrapped around the prompt
|
|
1310
|
+
output_parser: default # default | gemini | doc-conformance | {kind:…}
|
|
1311
|
+
stderr: capture # capture | suppress | passthrough
|
|
1312
|
+
timeout: 300 # seconds (falls back to defaults.timeout)
|
|
1313
|
+
auth: { check, timeout, failure_exit_codes, recovery }
|
|
1314
|
+
extends: base-channel # inherit from another channel (≤4 levels)
|
|
1315
|
+
abstract: false # template-only; never dispatched directly
|
|
1316
|
+
</code></pre>
|
|
1317
|
+
<h3 id="built-in-channels">Built-in channels</h3>
|
|
1318
|
+
<div class="callout callout-info"><p><strong>Why grok is different.</strong> codex/gemini/claude all read the prompt from <code>stdin</code>.
|
|
1319
|
+
Grok's CLI requires the prompt as an argument and ignores stdin, so its channel
|
|
1320
|
+
uses <code>prompt_delivery: prompt-file</code> — the dispatcher writes the prompt to a temp
|
|
1321
|
+
file and passes its path via the <code>{{prompt_file}}</code> placeholder. Grok wraps its
|
|
1322
|
+
reply in a JSON <code>.text</code> field, which the parser unwraps before extracting
|
|
1323
|
+
findings.</p></div>
|
|
1324
|
+
<div class="tabs"><div class="tablist" role="tablist"><button class="tab-btn active" role="tab" data-tab="0">Compare</button><button class="tab-btn" role="tab" data-tab="1">codex</button><button class="tab-btn" role="tab" data-tab="2">gemini</button><button class="tab-btn" role="tab" data-tab="3">claude</button><button class="tab-btn" role="tab" data-tab="4">grok</button><button class="tab-btn" role="tab" data-tab="5">doc-conformance</button></div><div class="tabpane active" data-tab="0">
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
|
|
1358
|
+
|
|
1359
|
+
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
<table><thead><tr><th>Channel</th><th>Default</th><th>Strength</th><th>Prompt delivery</th><th>Parser</th></tr></thead><tbody><tr><td><code>codex</code></td><td>enabled</td><td>Correctness, security, API contracts</td><td>stdin</td><td><code>default</code></td></tr><tr><td><code>gemini</code></td><td>enabled</td><td>Architecture, broad-context reasoning</td><td>stdin</td><td><code>gemini</code></td></tr><tr><td><code>claude</code></td><td>enabled</td><td>Plan alignment, code quality, testing</td><td>stdin</td><td><code>default</code></td></tr><tr><td><code>grok</code></td><td>enabled</td><td>Independent second opinion (xAI; proprietary)</td><td><strong>prompt-file</strong></td><td><code>unwrap $.text → default</code></td></tr><tr><td><code>doc-conformance</code></td><td>opt-in</td><td>PRD/stories/standards conformance (LLM-graded)</td><td>stdin</td><td><code>doc-conformance</code></td></tr></tbody></table></div><div class="tabpane" data-tab="1"><pre><code class="language-yaml">command: codex exec
|
|
1372
|
+
flags: [--skip-git-repo-check, -s, read-only, --ephemeral]
|
|
1373
|
+
auth.check: codex login status # local file check (fast, 5s)
|
|
1374
|
+
recovery: codex login
|
|
1375
|
+
output_parser: default
|
|
1376
|
+
stderr: suppress
|
|
1377
|
+
</code></pre></div><div class="tabpane" data-tab="2"><pre><code class="language-yaml">command: gemini # NO -p: gemini reads stdin natively
|
|
1378
|
+
flags: [--output-format, json]
|
|
1379
|
+
env: { NO_BROWSER: "true" }
|
|
1380
|
+
auth.check: NO_BROWSER=true gemini -p "respond with ok" -o json # LLM round-trip, 20s
|
|
1381
|
+
recovery: gemini -p "hello"
|
|
1382
|
+
output_parser: gemini # unwraps { "response": "…" }
|
|
1383
|
+
timeout: 360
|
|
1384
|
+
</code></pre></div><div class="tabpane" data-tab="3"><pre><code class="language-yaml">command: claude -p
|
|
1385
|
+
flags: [--output-format, json]
|
|
1386
|
+
auth.check: claude -p "respond with ok" # LLM round-trip, 20s
|
|
1387
|
+
recovery: claude login
|
|
1388
|
+
output_parser: default
|
|
1389
|
+
</code></pre></div><div class="tabpane" data-tab="4"><pre><code class="language-yaml">command: grok
|
|
1390
|
+
prompt_delivery: prompt-file
|
|
1391
|
+
flags: [--prompt-file, "{{prompt_file}}", --output-format, json]
|
|
1392
|
+
auth.check: grok models # lists models / login state (no round-trip)
|
|
1393
|
+
recovery: grok login
|
|
1394
|
+
output_parser: { kind: unwrap-jsonpath, wrap: "$.text", then: default }
|
|
1395
|
+
</code></pre><p>Grok is proprietary (xAI), not open-source — it joins the standard set
|
|
1396
|
+
mechanically as a 4th CLI channel. Disable it with
|
|
1397
|
+
<code>channels_disabled: ["grok"]</code>.</p></div><div class="tabpane" data-tab="5"><pre><code class="language-yaml">enabled: false # opt-in: runs up to 3 LLM calls (~3 min)
|
|
1398
|
+
command: scaffold observe audit --profile=full --scope=all --output-mode=mmr-findings
|
|
1399
|
+
output_parser: doc-conformance # expects a JSON array of findings
|
|
1400
|
+
timeout: 240
|
|
1401
|
+
</code></pre><p>Enable with <code>--channels doc-conformance</code> or in <code>.mmr.yaml</code>.</p></div></div>
|
|
1402
|
+
<h3 id="the-dispatcher">The dispatcher</h3>
|
|
1403
|
+
<ul>
|
|
1404
|
+
<li><strong>Isolation.</strong> Each channel is spawned as its own detached subprocess writing
|
|
1405
|
+
to its own output file; channels run in parallel and never share output.</li>
|
|
1406
|
+
<li><strong>Prompt delivery.</strong> <code>stdin</code> mode pipes the prompt and closes stdin (avoids
|
|
1407
|
+
<code>E2BIG</code> on large diffs). <code>prompt-file</code> mode writes the prompt to
|
|
1408
|
+
<code><channel>.prompt.txt</code> and substitutes <code>{{prompt_file}}</code> in the flags.</li>
|
|
1409
|
+
<li><strong>Timeout.</strong> A per-channel timer SIGKILLs the whole process group and marks
|
|
1410
|
+
the channel <code>timeout</code>.</li>
|
|
1411
|
+
<li><strong>Command parsing.</strong> <code>command</code> is split on whitespace and spawned without a
|
|
1412
|
+
shell — so quoting/pipelines in <code>command</code> won't work; that's exactly why
|
|
1413
|
+
arg-only CLIs like grok use <code>prompt_delivery</code> rather than a shell shim.</li>
|
|
1414
|
+
</ul>
|
|
1415
|
+
<p><strong>Adding a new channel — where it's clean vs. hard-coded.</strong> <em>Clean (config
|
|
1416
|
+
only):</em> a new subprocess channel (<code>command</code> + <code>flags</code> + <code>auth</code> +
|
|
1417
|
+
<code>output_parser</code>), output reshaping via the <code>unwrap-jsonpath</code> or
|
|
1418
|
+
<code>regex-findings</code> parser kinds, disabling/timeout overrides, and pointing the
|
|
1419
|
+
compensator at a different channel — all pure <code>.mmr.yaml</code>. <em>Needs code:</em> a
|
|
1420
|
+
brand-new <em>named</em> parser must be registered in <code>core/parser.ts</code>; HTTP-endpoint
|
|
1421
|
+
channels (<code>kind: http</code>) need the planned http-dispatcher; and the
|
|
1422
|
+
<code>COMPENSATING_FOCUS</code> map carries per-channel focus text (falls back gracefully
|
|
1423
|
+
if absent).</p>
|
|
1424
|
+
<h2 id="scaffold-wrappers">Scaffold wrappers</h2>
|
|
1425
|
+
<p>Direct <code>mmr review</code> runs the built-in CLI channels. The <code>scaffold run</code> wrappers
|
|
1426
|
+
add orchestration on top.</p>
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
<table><thead><tr><th>Wrapper</th><th>Target</th><th>Adds on top of <code>mmr review</code></th></tr></thead><tbody><tr><td><code>scaffold run review-pr</code></td><td>A PR (<code>--pr</code>)</td><td>Auth checks, the Superpowers code-reviewer <em>agent</em> channel via <code>mmr reconcile</code>, consensus/verdict handling, the 3-strike-per-finding round bookkeeping, optional Beads issue bridge.</td></tr><tr><td><code>scaffold run review-code</code></td><td>Local pre-push</td><td>Synthesizes a "delivery candidate" diff (committed + staged + unstaged), gathers file & standards context for the file-blind CLIs, then the same agent channel + round bounding. <em>Untracked files aren't covered.</em></td></tr><tr><td><code>scaffold run post-implementation-review</code></td><td>Full codebase</td><td>Two phases — systemic review + per-story functional review via parallel agents — with its own report under <code>docs/reviews/</code>. (See its own doc for the exact channel layout.)</td></tr></tbody></table>
|
|
1453
|
+
<div class="callout callout-warning"><p><strong>Foreground only.</strong> The wrappers' manual fallback runs Codex, Gemini, Claude,
|
|
1454
|
+
and Grok as foreground Bash calls when the <code>mmr</code> CLI isn't available — never in
|
|
1455
|
+
the background. Background execution produces empty output.</p></div>
|
|
1456
|
+
<h2 id="findings-reconciliation-verdicts">Findings, reconciliation & verdicts</h2>
|
|
1457
|
+
<h3 id="the-finding-shape">The Finding shape</h3>
|
|
1458
|
+
<pre><code class="language-json">{
|
|
1459
|
+
"id": "F-001",
|
|
1460
|
+
"category": "security",
|
|
1461
|
+
"severity": "P0",
|
|
1462
|
+
"location": "src/auth.ts:42",
|
|
1463
|
+
"description": "…",
|
|
1464
|
+
"suggestion": "…"
|
|
1465
|
+
}
|
|
1466
|
+
</code></pre>
|
|
1467
|
+
<p>After reconciliation, each finding also carries <code>confidence</code>, <code>sources[]</code>,
|
|
1468
|
+
<code>agreement</code>, a stable <code>finding_key</code>, a <code>description_shingle</code> (for fuzzy
|
|
1469
|
+
cross-round matching), and <code>acknowledged</code>.</p>
|
|
1470
|
+
<h3 id="stable-identity-finding-key">Stable identity (<code>finding_key</code>)</h3>
|
|
1471
|
+
<pre><code class="language-text">finding_key = sha1( normLocation | category | sha1(normDescription) | sha1(normSuggestion) )
|
|
1472
|
+
</code></pre>
|
|
1473
|
+
<p>Line numbers are stripped from the location and severity is <em>excluded</em>, so the
|
|
1474
|
+
same issue at P1 vs P2 collapses to one key. A character-5-gram shingle backs a
|
|
1475
|
+
Jaccard ≥ 0.7 fuzzy match when wording drifts between rounds.</p>
|
|
1476
|
+
<h3 id="agreement-confidence">Agreement & confidence</h3>
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
<table><thead><tr><th>Sources</th><th>Severity</th><th>Agreement</th><th>Confidence</th></tr></thead><tbody><tr><td>2+</td><td>same</td><td>consensus</td><td>high</td></tr><tr><td>2+</td><td>differ</td><td>majority</td><td>medium</td></tr><tr><td>1</td><td><span class="sev sev-p0">P0</span></td><td>unique</td><td>high</td></tr><tr><td>1</td><td><code>compensating-*</code></td><td>unique</td><td>low</td></tr><tr><td>1</td><td>other</td><td>unique</td><td>medium</td></tr></tbody></table>
|
|
1519
|
+
<h3 id="the-gate-the-four-verdicts">The gate & the four verdicts</h3>
|
|
1520
|
+
<p>The gate <strong>passes</strong> when every unacknowledged finding is <em>below</em> the
|
|
1521
|
+
<code>fix_threshold</code> (default <span class="sev sev-p2">P2</span>). Severity tiers run
|
|
1522
|
+
<span class="sev sev-p0">P0</span> (highest) → <span class="sev sev-p1">P1</span> → <span class="sev sev-p2">P2</span> →
|
|
1523
|
+
<span class="sev sev-p3">P3</span> (lowest).</p>
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
|
|
1528
|
+
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
<table><thead><tr><th>Verdict</th><th>Condition</th><th>Exit</th></tr></thead><tbody><tr><td><code>pass</code></td><td>Gate passed, all channels completed</td><td>0</td></tr><tr><td><code>degraded-pass</code></td><td>Gate passed, but some channels failed / timed out / weren't installed</td><td>0</td></tr><tr><td><code>blocked</code></td><td>An unacknowledged finding sits at or above the threshold</td><td>2</td></tr><tr><td><code>needs-user-decision</code></td><td>No channel completed (can't make a determination)</td><td>3</td></tr></tbody></table>
|
|
1555
|
+
<div class="callout callout-warning"><p>Proceed only on <strong>pass</strong> or <strong>degraded-pass</strong>. On <strong>blocked</strong> or
|
|
1556
|
+
<strong>needs-user-decision</strong>, surface the verdict and findings — don't merge
|
|
1557
|
+
automatically.</p></div>
|
|
1558
|
+
<h2 id="degraded-mode-compensation-auth">Degraded mode, compensation & auth</h2>
|
|
1559
|
+
<p>A channel is "degraded" when it's <code>not_installed</code> (no binary), <code>auth_failed</code>,
|
|
1560
|
+
<code>timeout</code>, <code>skipped</code>, or <code>failed</code>. The review doesn't stop — it compensates and
|
|
1561
|
+
tells you how to recover.</p>
|
|
1562
|
+
<ul>
|
|
1563
|
+
<li><strong>Compensating pass.</strong> For each degraded external channel, a <code>claude -p</code> pass
|
|
1564
|
+
runs with that channel's focus area, labeled e.g.
|
|
1565
|
+
<code>[compensating: Grok-equivalent]</code>. These findings are single-source, low
|
|
1566
|
+
confidence. The compensator channel is configurable via
|
|
1567
|
+
<code>defaults.compensator.channel</code>.</li>
|
|
1568
|
+
<li><strong>Auth recovery</strong> is surfaced, never silent.</li>
|
|
1569
|
+
</ul>
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
<table><thead><tr><th>Channel</th><th>Auth check</th><th>Recovery</th></tr></thead><tbody><tr><td><code>codex</code></td><td><code>codex login status</code></td><td><code>codex login</code></td></tr><tr><td><code>gemini</code></td><td><code>gemini -p "respond with ok"</code></td><td><code>gemini -p "hello"</code></td></tr><tr><td><code>claude</code></td><td><code>claude -p "respond with ok"</code></td><td><code>claude login</code></td></tr><tr><td><code>grok</code></td><td><code>grok models</code></td><td><code>grok login</code></td></tr></tbody></table>
|
|
1601
|
+
<h2 id="configuration-mmryaml">Configuration (<code>.mmr.yaml</code>)</h2>
|
|
1602
|
+
<p>Config is layered: built-in defaults → <code>~/.mmr/config.yaml</code> → project
|
|
1603
|
+
<code>.mmr.yaml</code> → CLI flags. Arrays replace; objects deep-merge.</p>
|
|
1604
|
+
<pre><code class="language-yaml">version: 1
|
|
1605
|
+
defaults:
|
|
1606
|
+
fix_threshold: P2 # gate severity
|
|
1607
|
+
timeout: 300 # default per-channel timeout (s)
|
|
1608
|
+
parallel: true
|
|
1609
|
+
channels_disabled: ["grok"] # opt OUT of a built-in (e.g. no grok installed)
|
|
1610
|
+
channels:
|
|
1611
|
+
doc-conformance:
|
|
1612
|
+
enabled: true # opt IN to a default-off channel
|
|
1613
|
+
# Bring-your-own model via channel inheritance:
|
|
1614
|
+
qwen-local:
|
|
1615
|
+
command: ollama run
|
|
1616
|
+
flags: ["qwen2.5-coder:32b", "--format", "json"]
|
|
1617
|
+
output_parser: { kind: unwrap-jsonpath, wrap: "$.response", then: default }
|
|
1618
|
+
auth: { check: "ollama list", timeout: 5, failure_exit_codes: [1], recovery: "ollama serve" }
|
|
1619
|
+
</code></pre>
|
|
1620
|
+
<ul>
|
|
1621
|
+
<li><code>channels_disabled</code> — skip these built-ins in the default dispatch (ignored
|
|
1622
|
+
when you pass an explicit <code>--channels</code> list).</li>
|
|
1623
|
+
<li><code>enabled: false</code> — per-channel off switch (how <code>doc-conformance</code> ships).</li>
|
|
1624
|
+
<li><code>extends</code> — inherit from another channel (≤ 4 levels, cycle-checked); child
|
|
1625
|
+
fields override the parent.</li>
|
|
1626
|
+
<li><code>fix_threshold</code> — project gate; override per-run with <code>--fix-threshold</code>.</li>
|
|
1627
|
+
</ul>
|
|
1628
|
+
<div class="callout callout-danger"><p><strong>Trust boundary.</strong> When reviewing a diff, project <code>.mmr.yaml</code> and acks should
|
|
1629
|
+
be read from the diff's <em>base ref</em>, not the working tree — otherwise a PR could
|
|
1630
|
+
add a channel that exfiltrates secrets or self-acknowledge its own findings. Use
|
|
1631
|
+
<code>--config-base-ref</code> / the <code>--trust-project-*</code> flags to control this in untrusted
|
|
1632
|
+
(e.g. CI) contexts.</p></div></main>
|
|
1633
|
+
</div>
|
|
1634
|
+
<script>(function(){
|
|
1635
|
+
var LS_KEY = 'guide-theme';
|
|
1636
|
+
function applyTheme(t) {
|
|
1637
|
+
document.documentElement.setAttribute('data-theme', t);
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
1641
|
+
// ─── Theme toggle ────────────────────────────────────────────────────────
|
|
1642
|
+
document.querySelectorAll('[data-action="theme"]').forEach(function(btn) {
|
|
1643
|
+
btn.addEventListener('click', function() {
|
|
1644
|
+
var current = document.documentElement.getAttribute('data-theme');
|
|
1645
|
+
var next = current === 'dark' ? 'light' : 'dark';
|
|
1646
|
+
applyTheme(next);
|
|
1647
|
+
try { localStorage.setItem(LS_KEY, next); } catch(e) {}
|
|
1648
|
+
});
|
|
1649
|
+
});
|
|
1650
|
+
|
|
1651
|
+
// ─── Mobile nav ──────────────────────────────────────────────────────────
|
|
1652
|
+
document.querySelectorAll('[data-action="nav"]').forEach(function(btn) {
|
|
1653
|
+
btn.addEventListener('click', function() {
|
|
1654
|
+
var rail = document.querySelector('.rail');
|
|
1655
|
+
if (rail) rail.classList.toggle('open');
|
|
1656
|
+
});
|
|
1657
|
+
});
|
|
1658
|
+
|
|
1659
|
+
// ─── Copy buttons ─────────────────────────────────────────────────────────
|
|
1660
|
+
document.querySelectorAll('pre').forEach(function(pre) {
|
|
1661
|
+
if (!pre.parentNode) return;
|
|
1662
|
+
var wrapper = document.createElement('div');
|
|
1663
|
+
wrapper.className = 'code';
|
|
1664
|
+
pre.parentNode.insertBefore(wrapper, pre);
|
|
1665
|
+
wrapper.appendChild(pre);
|
|
1666
|
+
var btn = document.createElement('button');
|
|
1667
|
+
btn.className = 'copy-btn';
|
|
1668
|
+
btn.textContent = 'Copy';
|
|
1669
|
+
btn.addEventListener('click', function() {
|
|
1670
|
+
var text = pre.textContent || '';
|
|
1671
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
1672
|
+
navigator.clipboard.writeText(text).then(function() {
|
|
1673
|
+
btn.textContent = 'Copied';
|
|
1674
|
+
setTimeout(function() { btn.textContent = 'Copy'; }, 1200);
|
|
1675
|
+
}, function() {
|
|
1676
|
+
btn.textContent = 'Copy';
|
|
1677
|
+
});
|
|
1678
|
+
}
|
|
1679
|
+
});
|
|
1680
|
+
wrapper.insertBefore(btn, pre);
|
|
1681
|
+
});
|
|
1682
|
+
|
|
1683
|
+
// ─── Tabs ─────────────────────────────────────────────────────────────────
|
|
1684
|
+
document.querySelectorAll('.tabs').forEach(function(group) {
|
|
1685
|
+
group.querySelectorAll('.tab-btn').forEach(function(btn) {
|
|
1686
|
+
btn.addEventListener('click', function() {
|
|
1687
|
+
var idx = btn.getAttribute('data-tab');
|
|
1688
|
+
group.querySelectorAll('.tab-btn').forEach(function(b) {
|
|
1689
|
+
b.classList.toggle('active', b === btn);
|
|
1690
|
+
});
|
|
1691
|
+
group.querySelectorAll('.tabpane').forEach(function(pane) {
|
|
1692
|
+
pane.classList.toggle('active', pane.getAttribute('data-tab') === idx);
|
|
1693
|
+
});
|
|
1694
|
+
});
|
|
1695
|
+
});
|
|
1696
|
+
});
|
|
1697
|
+
|
|
1698
|
+
// ─── Filter tables ────────────────────────────────────────────────────────
|
|
1699
|
+
document.querySelectorAll('.filter-input').forEach(function(input) {
|
|
1700
|
+
input.addEventListener('input', function() {
|
|
1701
|
+
var q = input.value.toLowerCase();
|
|
1702
|
+
var container = input.closest('.filter-table');
|
|
1703
|
+
if (!container) return;
|
|
1704
|
+
container.querySelectorAll('tbody tr').forEach(function(row) {
|
|
1705
|
+
var text = (row.textContent || '').toLowerCase();
|
|
1706
|
+
row.style.display = text.includes(q) ? '' : 'none';
|
|
1707
|
+
});
|
|
1708
|
+
});
|
|
1709
|
+
});
|
|
1710
|
+
|
|
1711
|
+
// ─── Scrollspy ────────────────────────────────────────────────────────────
|
|
1712
|
+
if (typeof IntersectionObserver === 'undefined') return;
|
|
1713
|
+
var headings = document.querySelectorAll('h2[id],h3[id]');
|
|
1714
|
+
if (!headings.length) return;
|
|
1715
|
+
var observer = new IntersectionObserver(function(entries) {
|
|
1716
|
+
entries.forEach(function(entry) {
|
|
1717
|
+
if (!entry.isIntersecting) return;
|
|
1718
|
+
var id = entry.target.getAttribute('id');
|
|
1719
|
+
document.querySelectorAll('.toc a').forEach(function(a) {
|
|
1720
|
+
a.classList.toggle('active', a.getAttribute('href') === '#' + id);
|
|
1721
|
+
});
|
|
1722
|
+
});
|
|
1723
|
+
}, { rootMargin: '0px 0px -70% 0px', threshold: 0 });
|
|
1724
|
+
headings.forEach(function(h) { observer.observe(h); });
|
|
1725
|
+
});
|
|
1726
|
+
})();</script>
|
|
1727
|
+
</body>
|
|
1728
|
+
</html>
|