@mmerterden/multi-agent-pipeline 12.6.0 → 12.8.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/CHANGELOG.md +209 -0
- package/README.md +18 -18
- package/docs/FIGMA_PIPELINE.md +34 -34
- package/docs/adr/0001-three-model-triage.md +12 -12
- package/docs/adr/0002-instruction-driven-flag.md +5 -5
- package/docs/adr/0003-unified-shared-skills.md +5 -5
- package/docs/adr/0004-zero-dependency-philosophy.md +5 -5
- package/docs/adr/0005-lazy-phase-docs.md +2 -2
- package/docs/adr/0006-skills-core-external-split.md +6 -6
- package/docs/adr/0007-multi-tool-adapter-framework.md +19 -19
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +19 -19
- package/docs/adr/README.md +1 -1
- package/docs/best-practices.md +3 -3
- package/docs/features.md +28 -28
- package/docs/performance.md +16 -16
- package/docs/recovery-guide.md +39 -39
- package/index.js +4 -4
- package/install/_common.mjs +53 -11
- package/install/_copilot-instructions.mjs +2 -2
- package/install/_dev-only-files.mjs +126 -6
- package/install/_platform-filter.mjs +1 -1
- package/install/_telemetry.mjs +1 -1
- package/install/claude.mjs +20 -13
- package/install/copilot.mjs +11 -23
- package/install/index.mjs +7 -15
- package/install/templates/copilot-instructions.md +54 -54
- package/install.js +1 -1
- package/package.json +29 -11
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/finish/SKILL.md +6 -6
- package/pipeline/commands/multi-agent/forget/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/issue/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/local/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/log/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/purge/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/refactor/SKILL.md +16 -8
- package/pipeline/commands/multi-agent/resume/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/review/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/routines/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/save/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/scan/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/search/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/stack/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/status/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/sync/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/test/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +3 -3
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/channels-multi-repo.sh +1 -1
- package/pipeline/lib/context-link-extractor.sh +1 -1
- package/pipeline/lib/credential-store.sh +21 -1
- package/pipeline/lib/fetch-confluence.sh +1 -1
- package/pipeline/lib/fetch-crashlytics.sh +1 -1
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/fetch-graylog.sh +1 -1
- package/pipeline/lib/fetch-swagger.sh +1 -1
- package/pipeline/lib/issue-fetcher.sh +1 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/repo-cache.sh +1 -1
- package/pipeline/lib/submodule-detector.sh +1 -1
- package/pipeline/multi-agent-refs/_account-picker.md +1 -1
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +1 -1
- package/pipeline/multi-agent-refs/component-generation.md +121 -0
- package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
- package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
- package/pipeline/multi-agent-refs/phases/operations.md +28 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -5
- package/pipeline/preferences-template.json +5 -11
- package/pipeline/schemas/agent-state.schema.json +39 -9
- package/pipeline/schemas/analysis-output.schema.json +18 -4
- package/pipeline/schemas/analysis-spec.schema.json +120 -32
- package/pipeline/schemas/clarify-output.schema.json +15 -5
- package/pipeline/schemas/design-check-config.schema.json +32 -11
- package/pipeline/schemas/dev-critic-output.schema.json +20 -5
- package/pipeline/schemas/figma-project-config.schema.json +42 -10
- package/pipeline/schemas/learnings-ledger.schema.json +10 -2
- package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +1 -4
- package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +24 -7
- package/pipeline/schemas/plan-todos.schema.json +6 -3
- package/pipeline/schemas/planning-output.schema.json +5 -1
- package/pipeline/schemas/prefs.schema.json +97 -229
- package/pipeline/schemas/test-gap.schema.json +5 -5
- package/pipeline/schemas/token-budget.json +8 -8
- package/pipeline/schemas/triage-corpus.schema.json +1 -1
- package/pipeline/scripts/_smoke-root.sh +61 -0
- package/pipeline/scripts/aggregate-metrics.mjs +18 -6
- package/pipeline/scripts/audit-log.sh +25 -0
- package/pipeline/scripts/build-skills-index.mjs +6 -2
- package/pipeline/scripts/build-stack-plugins.mjs +142 -39
- package/pipeline/scripts/check-derived-drift.mjs +196 -0
- package/pipeline/scripts/classify-plan-safety.mjs +20 -7
- package/pipeline/scripts/cost-budget-check.mjs +2 -1
- package/pipeline/scripts/cost-table.json +1 -1
- package/pipeline/scripts/diff-explain.mjs +7 -3
- package/pipeline/scripts/diff-risk-score.mjs +13 -3
- package/pipeline/scripts/evidence-gate.mjs +7 -2
- package/pipeline/scripts/gen-mode-dispatch.mjs +38 -21
- package/pipeline/scripts/gen-skills-index.mjs +18 -3
- package/pipeline/scripts/learning-curve.mjs +13 -3
- package/pipeline/scripts/learnings-ledger.mjs +103 -36
- package/pipeline/scripts/localize-commands.mjs +6 -1
- package/pipeline/scripts/match-skills.mjs +15 -4
- package/pipeline/scripts/migrate-prefs.mjs +33 -16
- package/pipeline/scripts/phase-tracker.sh +3 -1
- package/pipeline/scripts/repo-map.mjs +110 -64
- package/pipeline/scripts/review-scope.mjs +7 -1
- package/pipeline/scripts/routine-registry.mjs +4 -9
- package/pipeline/scripts/run-aggregator.mjs +11 -5
- package/pipeline/scripts/run-metrics.mjs +13 -8
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
- package/pipeline/scripts/test-gap-scan.mjs +44 -12
- package/pipeline/scripts/test-integrity-gate.mjs +5 -1
- package/pipeline/scripts/token-budget-report.mjs +44 -21
- package/pipeline/scripts/triage-memory.mjs +126 -34
- package/pipeline/scripts/uninstall.mjs +74 -30
- package/pipeline/scripts/validate-analysis-doc.mjs +15 -5
- package/pipeline/scripts/validate-diff-risk.mjs +32 -18
- package/pipeline/scripts/validate-test-gap.mjs +17 -7
- package/pipeline/scripts/validate-triage.mjs +17 -5
- package/pipeline/scripts/write-state.mjs +32 -9
- package/pipeline/skills/.skills-index.json +91 -91
- package/pipeline/skills/shared/README.md +57 -57
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +26 -279
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +16 -8
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +1 -1
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -4
- package/pipeline/skills/shared/external/agentflow/SKILL.md +1 -1
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +1 -1
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +1 -1
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +1 -1
- package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +12 -12
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -1
- package/pipeline/skills/shared/external/context-compression/SKILL.md +1 -1
- package/pipeline/skills/shared/external/council/SKILL.md +3 -3
- package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -1
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +1 -1
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +1 -1
- package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +1 -1
- package/pipeline/skills/shared/external/help-skills/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +1 -1
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -1
- package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -1
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +1 -1
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +1 -1
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +1 -1
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +1 -1
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -1
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +1 -1
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -1
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -2
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +12 -12
- package/pipeline/skills/shared/external/skill-creator/audit.md +21 -21
- package/pipeline/skills/shared/external/skill-creator/checklist.md +3 -3
- package/pipeline/skills/shared/external/skill-creator/examples.md +10 -10
- package/pipeline/skills/shared/external/skill-creator/label-check.md +17 -17
- package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +86 -50
- package/pipeline/skills/shared/external/skill-creator/template.md +9 -9
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +1 -1
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -1
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -1
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -1
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -1
- package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -1
- package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +9 -49
- package/pipeline/skills/skills-index.md +57 -57
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
- package/pipeline/eval/golden-tasks/README.md +0 -65
- package/pipeline/eval/intent-cases.json +0 -40
- package/pipeline/eval/run-metrics-fixture.json +0 -46
- package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
- package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
- package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
- package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
- package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
- package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
- package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
- package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
- package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
- package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
- package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
- package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
- package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
- package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
- package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
- package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
- package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
- package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
- package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
- package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
- package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
- package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
- package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
- package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
- package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
- package/pipeline/eval/triage/README.md +0 -54
- package/pipeline/scripts/benchmark-phase-0.sh +0 -128
- package/pipeline/scripts/check-md-links.mjs +0 -84
- package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -297
- package/pipeline/scripts/eval-golden-tasks.mjs +0 -212
- package/pipeline/scripts/eval-intent.mjs +0 -103
- package/pipeline/scripts/eval-mine-corpus.mjs +0 -201
- package/pipeline/scripts/eval-triage.mjs +0 -171
- package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
- package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
- package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
- package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
- package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
- package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
- package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
- package/pipeline/scripts/lint-mcp-refs.mjs +0 -207
- package/pipeline/scripts/lint-skills.mjs +0 -143
- package/pipeline/scripts/run-smokes.mjs +0 -76
- package/pipeline/scripts/smoke-add-detail.sh +0 -137
- package/pipeline/scripts/smoke-agent-guard.sh +0 -74
- package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
- package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
- package/pipeline/scripts/smoke-ask-choice.sh +0 -42
- package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
- package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
- package/pipeline/scripts/smoke-changelog-version.sh +0 -47
- package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
- package/pipeline/scripts/smoke-channels-flow.sh +0 -130
- package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
- package/pipeline/scripts/smoke-clarify.sh +0 -148
- package/pipeline/scripts/smoke-command-inventory.sh +0 -81
- package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
- package/pipeline/scripts/smoke-community-gates.sh +0 -75
- package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
- package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
- package/pipeline/scripts/smoke-cost-budget.sh +0 -70
- package/pipeline/scripts/smoke-cost-summary.sh +0 -139
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
- package/pipeline/scripts/smoke-description-tr.sh +0 -82
- package/pipeline/scripts/smoke-dev-critic.sh +0 -144
- package/pipeline/scripts/smoke-diff-explain.sh +0 -147
- package/pipeline/scripts/smoke-diff-risk.sh +0 -190
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
- package/pipeline/scripts/smoke-eval-live.sh +0 -136
- package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
- package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
- package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
- package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
- package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
- package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
- package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
- package/pipeline/scripts/smoke-generate-issue.sh +0 -120
- package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
- package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
- package/pipeline/scripts/smoke-install-layout.sh +0 -248
- package/pipeline/scripts/smoke-intent-guard.sh +0 -86
- package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
- package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
- package/pipeline/scripts/smoke-keychain.sh +0 -158
- package/pipeline/scripts/smoke-language-axis.sh +0 -109
- package/pipeline/scripts/smoke-learning-curve.sh +0 -61
- package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
- package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
- package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
- package/pipeline/scripts/smoke-md-links.sh +0 -8
- package/pipeline/scripts/smoke-md2confluence.sh +0 -126
- package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
- package/pipeline/scripts/smoke-migrate-state.sh +0 -102
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
- package/pipeline/scripts/smoke-model-fallback.sh +0 -89
- package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
- package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -115
- package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
- package/pipeline/scripts/smoke-pack-contents.sh +0 -140
- package/pipeline/scripts/smoke-pat-audit.sh +0 -128
- package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
- package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
- package/pipeline/scripts/smoke-phase-banner.sh +0 -101
- package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
- package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
- package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
- package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
- package/pipeline/scripts/smoke-plan-safety.sh +0 -139
- package/pipeline/scripts/smoke-plan-todos.sh +0 -196
- package/pipeline/scripts/smoke-plugin-validate.sh +0 -64
- package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
- package/pipeline/scripts/smoke-pre-commit.sh +0 -170
- package/pipeline/scripts/smoke-pref-migration.sh +0 -226
- package/pipeline/scripts/smoke-prefs-language.sh +0 -134
- package/pipeline/scripts/smoke-progress-contract.sh +0 -127
- package/pipeline/scripts/smoke-prune-logs.sh +0 -137
- package/pipeline/scripts/smoke-purge.sh +0 -138
- package/pipeline/scripts/smoke-push-retry.sh +0 -75
- package/pipeline/scripts/smoke-repo-map.sh +0 -300
- package/pipeline/scripts/smoke-review-readiness.sh +0 -92
- package/pipeline/scripts/smoke-review-watch.sh +0 -146
- package/pipeline/scripts/smoke-routines.sh +0 -84
- package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
- package/pipeline/scripts/smoke-run-metrics.sh +0 -50
- package/pipeline/scripts/smoke-search.sh +0 -187
- package/pipeline/scripts/smoke-shadow-git.sh +0 -224
- package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
- package/pipeline/scripts/smoke-skill-language.sh +0 -83
- package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
- package/pipeline/scripts/smoke-skill-scan.sh +0 -198
- package/pipeline/scripts/smoke-source-parity.sh +0 -85
- package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
- package/pipeline/scripts/smoke-sync-parity.sh +0 -92
- package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
- package/pipeline/scripts/smoke-telemetry.sh +0 -147
- package/pipeline/scripts/smoke-test-gap.sh +0 -183
- package/pipeline/scripts/smoke-token-budget.sh +0 -67
- package/pipeline/scripts/smoke-token-preflight.sh +0 -82
- package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
- package/pipeline/scripts/smoke-triage-memory.sh +0 -174
- package/pipeline/scripts/smoke-update-check.sh +0 -135
- package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
- package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
- package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
- package/pipeline/scripts/smoke-validator-gates.sh +0 -164
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
- package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
- package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
- package/pipeline/scripts/smoke-work-summary.sh +0 -163
- package/pipeline/scripts/smoke-workflow-audit.sh +0 -69
- package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
- package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
- package/pipeline/scripts/smoke-write-state.sh +0 -115
- package/pipeline/scripts/sync-parity-check.sh +0 -135
- package/pipeline/scripts/test-gap-rules/android.json +0 -25
- package/pipeline/scripts/test-gap-rules/ios.json +0 -29
- package/pipeline/scripts/test-gap-rules/node.json +0 -17
- package/pipeline/scripts/test-gap-rules/python.json +0 -19
- package/pipeline/scripts/validate-schemas.mjs +0 -88
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-cost-summary.sh - v6.1.J
|
|
3
|
-
#
|
|
4
|
-
# Verifies the cost-summary pipeline:
|
|
5
|
-
# 1. cost-table.json parses and has opus/sonnet/haiku entries
|
|
6
|
-
# 2. render-cost-summary.sh exits 2 when no tracker data available
|
|
7
|
-
# 3. render-cost-summary.sh emits a valid markdown table from tracker fixture
|
|
8
|
-
# 4. OTel-spans fallback path renders when tracker JSON is missing
|
|
9
|
-
# 5. Unknown model gracefully renders USD as - with footnote
|
|
10
|
-
# 6. Schema (prefs.schema.json) exposes costSummary toggle
|
|
11
|
-
# 7. channels.md documents Cost Summary content option
|
|
12
|
-
#
|
|
13
|
-
# Exit 0 = all pass, 1 = any failure.
|
|
14
|
-
|
|
15
|
-
set -euo pipefail
|
|
16
|
-
|
|
17
|
-
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
18
|
-
RENDERER="$ROOT/pipeline/scripts/render-cost-summary.sh"
|
|
19
|
-
TABLE="$ROOT/pipeline/scripts/cost-table.json"
|
|
20
|
-
SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
|
|
21
|
-
CHANNELS_DOC="$ROOT/pipeline/commands/multi-agent/channels/SKILL.md"
|
|
22
|
-
|
|
23
|
-
pass=0
|
|
24
|
-
fail=0
|
|
25
|
-
failures=()
|
|
26
|
-
record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
|
|
27
|
-
record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
|
|
28
|
-
|
|
29
|
-
printf '→ smoke-cost-summary (v6.1.J): PR-body Cost Summary renderer contract\n'
|
|
30
|
-
|
|
31
|
-
# --- 1: cost-table.json shape ---
|
|
32
|
-
if jq -e '.prices.opus.inPerMtok and .prices.sonnet.inPerMtok and .prices.haiku.inPerMtok' "$TABLE" >/dev/null 2>&1; then
|
|
33
|
-
record_pass "cost-table.json has opus/sonnet/haiku prices"
|
|
34
|
-
else
|
|
35
|
-
record_fail "cost-table.json missing one of opus/sonnet/haiku"
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
# --- 2: missing-data path returns exit 2 ---
|
|
39
|
-
tmp=$(mktemp -d)
|
|
40
|
-
pushd "$tmp" >/dev/null
|
|
41
|
-
set +e
|
|
42
|
-
bash "$RENDERER" GHOST-1 >/dev/null 2>&1
|
|
43
|
-
rc=$?
|
|
44
|
-
set -e
|
|
45
|
-
if [ "$rc" -eq 2 ]; then
|
|
46
|
-
record_pass "renderer exits 2 when no tracker data"
|
|
47
|
-
else
|
|
48
|
-
record_fail "renderer should exit 2 with no data (got $rc)"
|
|
49
|
-
fi
|
|
50
|
-
popd >/dev/null
|
|
51
|
-
rm -rf "$tmp"
|
|
52
|
-
|
|
53
|
-
# --- 3: tracker fixture renders markdown ---
|
|
54
|
-
tmp=$(mktemp -d)
|
|
55
|
-
pushd "$tmp" >/dev/null
|
|
56
|
-
mkdir -p .worktrees/DEMO-1
|
|
57
|
-
cat > .worktrees/DEMO-1/phase-tracker.json <<JSON
|
|
58
|
-
{"taskId":"DEMO-1","phases":{
|
|
59
|
-
"1":{"name":"1. Analysis","model":"opus","tokens_in":12480,"tokens_out":3210},
|
|
60
|
-
"3":{"name":"3. Dev","model":"sonnet","tokens_in":42310,"tokens_out":9880}
|
|
61
|
-
}}
|
|
62
|
-
JSON
|
|
63
|
-
out=$(bash "$RENDERER" DEMO-1)
|
|
64
|
-
popd >/dev/null
|
|
65
|
-
rm -rf "$tmp"
|
|
66
|
-
|
|
67
|
-
if grep -q '^### Cost Summary$' <<< "$out" && \
|
|
68
|
-
grep -q '1. Analysis' <<< "$out" && \
|
|
69
|
-
grep -q '3. Dev' <<< "$out" && \
|
|
70
|
-
grep -q '\*\*Total\*\*' <<< "$out"; then
|
|
71
|
-
record_pass "tracker fixture renders header/rows/total"
|
|
72
|
-
else
|
|
73
|
-
record_fail "tracker fixture output missing required rows"
|
|
74
|
-
fi
|
|
75
|
-
|
|
76
|
-
if grep -qE '\$[0-9]+\.[0-9]{2}' <<< "$out"; then
|
|
77
|
-
record_pass "USD formatted to 2 dp"
|
|
78
|
-
else
|
|
79
|
-
record_fail "USD not formatted to 2 dp"
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# --- 4: OTel spans fallback ---
|
|
83
|
-
tmp=$(mktemp -d)
|
|
84
|
-
pushd "$tmp" >/dev/null
|
|
85
|
-
mkdir -p .worktrees/OTEL-1
|
|
86
|
-
cat > /tmp/cost-spans.jsonl <<JSON
|
|
87
|
-
{"name":"phase.tokens.1","attributes":{"phase_id":"1","phase_name":"1. Analysis","model":"opus","tokens_in_delta":5000,"tokens_out_delta":1200}}
|
|
88
|
-
{"name":"phase.tokens.1","attributes":{"phase_id":"1","phase_name":"1. Analysis","model":"opus","tokens_in_delta":3000,"tokens_out_delta":800}}
|
|
89
|
-
JSON
|
|
90
|
-
out2=$(bash "$RENDERER" OTEL-1 --otel-spans /tmp/cost-spans.jsonl || true)
|
|
91
|
-
popd >/dev/null
|
|
92
|
-
rm -rf "$tmp" /tmp/cost-spans.jsonl
|
|
93
|
-
|
|
94
|
-
if grep -q '1. Analysis' <<< "$out2" && grep -q '8,000' <<< "$out2"; then
|
|
95
|
-
record_pass "OTel spans fallback aggregates phase tokens"
|
|
96
|
-
else
|
|
97
|
-
record_fail "OTel fallback did not aggregate tokens (expected 8,000 in, got: $(echo "$out2" | tr '\n' ' ' | cut -c1-200))"
|
|
98
|
-
fi
|
|
99
|
-
|
|
100
|
-
# --- 5: unknown model → - + footnote ---
|
|
101
|
-
tmp=$(mktemp -d)
|
|
102
|
-
pushd "$tmp" >/dev/null
|
|
103
|
-
mkdir -p .worktrees/UNK-1
|
|
104
|
-
cat > .worktrees/UNK-1/phase-tracker.json <<JSON
|
|
105
|
-
{"taskId":"UNK-1","phases":{
|
|
106
|
-
"1":{"name":"1. Analysis","model":"mystery-model","tokens_in":1000,"tokens_out":500}
|
|
107
|
-
}}
|
|
108
|
-
JSON
|
|
109
|
-
out3=$(bash "$RENDERER" UNK-1)
|
|
110
|
-
popd >/dev/null
|
|
111
|
-
rm -rf "$tmp"
|
|
112
|
-
|
|
113
|
-
if grep -q '| - ' <<< "$out3" && grep -q 'USD unavailable' <<< "$out3"; then
|
|
114
|
-
record_pass "unknown model renders dash + footnote"
|
|
115
|
-
else
|
|
116
|
-
record_fail "unknown model path missing dash or footnote"
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# --- 6: prefs schema exposes costSummary toggle ---
|
|
120
|
-
if jq -e '.properties.global.properties.reportContent.properties.costSummary' "$SCHEMA" >/dev/null 2>&1; then
|
|
121
|
-
record_pass "prefs schema exposes reportContent.costSummary"
|
|
122
|
-
else
|
|
123
|
-
record_fail "prefs schema missing reportContent.costSummary"
|
|
124
|
-
fi
|
|
125
|
-
|
|
126
|
-
# --- 7: channels.md documents the option ---
|
|
127
|
-
if grep -q '^### Cost Summary' "$CHANNELS_DOC" && grep -q 'Cost özeti' "$CHANNELS_DOC"; then
|
|
128
|
-
record_pass "channels.md documents Cost Summary option"
|
|
129
|
-
else
|
|
130
|
-
record_fail "channels.md missing Cost Summary docs"
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
printf '\n══ cost-summary smoke: %d passed, %d failed ══\n' "$pass" "$fail"
|
|
134
|
-
if [ "$fail" -gt 0 ]; then
|
|
135
|
-
printf '\nFailures:\n'
|
|
136
|
-
for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
|
|
137
|
-
exit 1
|
|
138
|
-
fi
|
|
139
|
-
exit 0
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# smoke-cross-phase-cohesion.sh - assert every Phase N → Phase N+1 hand-off
|
|
4
|
-
# in the multi-agent pipeline references the same schema on both sides.
|
|
5
|
-
#
|
|
6
|
-
# Why this exists (v8.0.0): existing schema-validation smoke proves each
|
|
7
|
-
# JSON schema is itself well-formed. It does NOT prove that Phase 1's
|
|
8
|
-
# reference doc says "I emit analysis-output.schema.json" while Phase 2's
|
|
9
|
-
# reference doc says "I read analysis-output.schema.json". A reference can
|
|
10
|
-
# rename or drop the schema without the validator catching it - phase docs
|
|
11
|
-
# would silently desynchronize from the runtime contract.
|
|
12
|
-
#
|
|
13
|
-
# The contract chain:
|
|
14
|
-
# Phase 1 (Analysis) → analysis-output.schema.json → Phase 2 (Planning)
|
|
15
|
-
# Phase 2 (Planning) → planning-output.schema.json → Phase 3 (Dev)
|
|
16
|
-
# Phase 4 (Review) → reviewer-output.schema.json → Phase 4 triage
|
|
17
|
-
# Phase 4 (Review) → triage-output.schema.json → Phase 6 (Commit)
|
|
18
|
-
# Phase 6 (Commit) → agent-state.json fields → Phase 7 (Report)
|
|
19
|
-
#
|
|
20
|
-
# Each schema must (a) exist on disk, (b) be referenced in the producer
|
|
21
|
-
# phase ref doc, (c) be referenced in the consumer phase ref doc.
|
|
22
|
-
#
|
|
23
|
-
# Exit codes: 0=pass, 1=cohesion break detected
|
|
24
|
-
set -euo pipefail
|
|
25
|
-
|
|
26
|
-
REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
27
|
-
PHASE_DIR="$REPO_ROOT/pipeline/multi-agent-refs/phases"
|
|
28
|
-
SCHEMA_DIR="$REPO_ROOT/pipeline/schemas"
|
|
29
|
-
|
|
30
|
-
PASS=0
|
|
31
|
-
FAIL=0
|
|
32
|
-
pass() { echo " ✓ $*"; PASS=$((PASS + 1)); }
|
|
33
|
-
fail() { echo " ✗ $*"; FAIL=$((FAIL + 1)); }
|
|
34
|
-
|
|
35
|
-
assert_schema_exists() {
|
|
36
|
-
local schema="$1"
|
|
37
|
-
if [ -f "$SCHEMA_DIR/$schema" ]; then
|
|
38
|
-
pass "$schema exists in pipeline/schemas/"
|
|
39
|
-
else
|
|
40
|
-
fail "$schema MISSING - runtime contract broken"
|
|
41
|
-
fi
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
assert_phase_references() {
|
|
45
|
-
local phase_file="$1" schema="$2" role="$3"
|
|
46
|
-
local path="$PHASE_DIR/$phase_file"
|
|
47
|
-
if [ ! -f "$path" ]; then
|
|
48
|
-
fail "$phase_file not found at $path"
|
|
49
|
-
return
|
|
50
|
-
fi
|
|
51
|
-
if grep -Fq "$schema" "$path"; then
|
|
52
|
-
pass "$phase_file [$role] references $schema"
|
|
53
|
-
else
|
|
54
|
-
fail "$phase_file [$role] does NOT reference $schema - cohesion break"
|
|
55
|
-
fi
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
# -----------------------------------------------------------------------------
|
|
59
|
-
echo "→ 1. Pipeline schemas all exist on disk"
|
|
60
|
-
# -----------------------------------------------------------------------------
|
|
61
|
-
assert_schema_exists "analysis-output.schema.json"
|
|
62
|
-
assert_schema_exists "planning-output.schema.json"
|
|
63
|
-
assert_schema_exists "reviewer-output.schema.json"
|
|
64
|
-
assert_schema_exists "triage-output.schema.json"
|
|
65
|
-
assert_schema_exists "agent-state.schema.json"
|
|
66
|
-
assert_schema_exists "prefs.schema.json"
|
|
67
|
-
|
|
68
|
-
# -----------------------------------------------------------------------------
|
|
69
|
-
echo ""
|
|
70
|
-
echo "→ 2. Phase 1 → Phase 2 hand-off (analysis-output.schema.json)"
|
|
71
|
-
# -----------------------------------------------------------------------------
|
|
72
|
-
assert_phase_references "phase-1-analysis.md" "analysis-output.schema.json" "producer"
|
|
73
|
-
assert_phase_references "phase-2-planning.md" "analysis-output.schema.json" "consumer"
|
|
74
|
-
|
|
75
|
-
# -----------------------------------------------------------------------------
|
|
76
|
-
echo ""
|
|
77
|
-
echo "→ 3. Phase 2 → Phase 3 hand-off (planning-output.schema.json)"
|
|
78
|
-
# -----------------------------------------------------------------------------
|
|
79
|
-
assert_phase_references "phase-2-planning.md" "planning-output.schema.json" "producer"
|
|
80
|
-
assert_phase_references "phase-3-dev.md" "planning-output.schema.json" "consumer"
|
|
81
|
-
|
|
82
|
-
# -----------------------------------------------------------------------------
|
|
83
|
-
echo ""
|
|
84
|
-
echo "→ 4. Phase 4 review → triage hand-off (reviewer-output.schema.json)"
|
|
85
|
-
# -----------------------------------------------------------------------------
|
|
86
|
-
assert_phase_references "phase-4-review.md" "reviewer-output.schema.json" "producer"
|
|
87
|
-
# Triage lives inside phase-4-review.md too; same file is producer + consumer for the chain.
|
|
88
|
-
if grep -B 2 -A 60 "reviewer-output.schema.json" "$PHASE_DIR/phase-4-review.md" \
|
|
89
|
-
| grep -q "triage-output.schema.json"; then
|
|
90
|
-
pass "phase-4-review.md threads reviewer→triage in the same doc"
|
|
91
|
-
else
|
|
92
|
-
fail "phase-4-review.md missing triage hand-off block"
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
# -----------------------------------------------------------------------------
|
|
96
|
-
echo ""
|
|
97
|
-
echo "→ 5. Phase 4 triage → Phase 6 commit hand-off (triage-output.schema.json)"
|
|
98
|
-
# -----------------------------------------------------------------------------
|
|
99
|
-
assert_phase_references "phase-4-review.md" "triage-output.schema.json" "producer"
|
|
100
|
-
# Phase 6 doesn't always re-state the schema name; instead it references the
|
|
101
|
-
# triage outcome bucket counts. Accept either form.
|
|
102
|
-
if grep -Eq "triage-output\.schema\.json|triage outcome|accepted findings" "$PHASE_DIR/phase-6-commit.md"; then
|
|
103
|
-
pass "phase-6-commit.md consumes triage output (schema or outcome reference)"
|
|
104
|
-
else
|
|
105
|
-
fail "phase-6-commit.md does NOT consume Phase 4 triage output"
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
# -----------------------------------------------------------------------------
|
|
109
|
-
echo ""
|
|
110
|
-
echo "→ 6. Phase 6 → Phase 7 hand-off (agent-state.json mutations)"
|
|
111
|
-
# -----------------------------------------------------------------------------
|
|
112
|
-
assert_phase_references "phase-6-commit.md" "agent-state" "producer"
|
|
113
|
-
assert_phase_references "phase-7-report.md" "agent-state" "consumer"
|
|
114
|
-
|
|
115
|
-
# -----------------------------------------------------------------------------
|
|
116
|
-
echo ""
|
|
117
|
-
echo "→ 7. Validator runs the round-trip without errors"
|
|
118
|
-
# -----------------------------------------------------------------------------
|
|
119
|
-
if node "$REPO_ROOT/pipeline/scripts/validate-schemas.mjs" >/dev/null 2>&1; then
|
|
120
|
-
pass "validate-schemas.mjs reports all schemas valid"
|
|
121
|
-
else
|
|
122
|
-
fail "validate-schemas.mjs failed - schema integrity broken"
|
|
123
|
-
fi
|
|
124
|
-
|
|
125
|
-
# -----------------------------------------------------------------------------
|
|
126
|
-
echo ""
|
|
127
|
-
echo "══ smoke-cross-phase-cohesion: $PASS passed, $FAIL failed ══"
|
|
128
|
-
[ "$FAIL" -gt 0 ] && exit 1 || exit 0
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-description-tr.sh - localized picker-description contract.
|
|
3
|
-
#
|
|
4
|
-
# Verifies: every shipped command SKILL.md carries a description-tr line
|
|
5
|
-
# (coverage), repo description: lines stay English with no description-en
|
|
6
|
-
# sidecars committed (hygiene), and localize-commands.mjs apply/restore is
|
|
7
|
-
# an idempotent, byte-identical round trip (mechanics).
|
|
8
|
-
|
|
9
|
-
set -uo pipefail
|
|
10
|
-
|
|
11
|
-
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
12
|
-
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
13
|
-
CMD_DIR="$REPO_ROOT/pipeline/commands/multi-agent"
|
|
14
|
-
LOCALIZER="$REPO_ROOT/pipeline/scripts/localize-commands.mjs"
|
|
15
|
-
|
|
16
|
-
PASS=0
|
|
17
|
-
FAIL=0
|
|
18
|
-
record_pass() { PASS=$((PASS + 1)); printf ' \342\234\223 %s\n' "$1"; }
|
|
19
|
-
record_fail() { FAIL=$((FAIL + 1)); printf ' \342\234\227 %s\n' "$1"; }
|
|
20
|
-
|
|
21
|
-
printf '\342\206\222 smoke-description-tr: localized picker-description contract\n'
|
|
22
|
-
|
|
23
|
-
# 1. Coverage: every command SKILL.md (incl. the dispatcher) has description-tr
|
|
24
|
-
missing=""
|
|
25
|
-
count=0
|
|
26
|
-
for f in "$CMD_DIR/SKILL.md" "$CMD_DIR"/*/SKILL.md; do
|
|
27
|
-
[ -f "$f" ] || continue
|
|
28
|
-
count=$((count + 1))
|
|
29
|
-
grep -q '^description-tr:' "$f" || missing="$missing ${f#"$CMD_DIR/"}"
|
|
30
|
-
done
|
|
31
|
-
if [ -z "$missing" ]; then
|
|
32
|
-
record_pass "all $count command SKILL.md files carry description-tr"
|
|
33
|
-
else
|
|
34
|
-
record_fail "missing description-tr in:$missing"
|
|
35
|
-
fi
|
|
36
|
-
|
|
37
|
-
# 2. Hygiene: repo descriptions stay English, no sidecars committed
|
|
38
|
-
if grep -rn '^description:.*[çğıöşüÇĞİÖŞÜ]' "$CMD_DIR" >/dev/null 2>&1; then
|
|
39
|
-
record_fail "repo description: lines must stay English (Turkish characters found)"
|
|
40
|
-
else
|
|
41
|
-
record_pass "repo description: lines are English"
|
|
42
|
-
fi
|
|
43
|
-
if grep -rln '^description-en:' "$CMD_DIR" >/dev/null 2>&1; then
|
|
44
|
-
record_fail "description-en sidecar committed to the repo (installed-tree artifact)"
|
|
45
|
-
else
|
|
46
|
-
record_pass "no description-en sidecar in the repo"
|
|
47
|
-
fi
|
|
48
|
-
|
|
49
|
-
# 3. Translation length within the agent-skills description budget
|
|
50
|
-
long=$(awk '/^description-tr:/ && length($0) > 1044 { print FILENAME }' "$CMD_DIR"/*/SKILL.md "$CMD_DIR/SKILL.md" 2>/dev/null | head -1)
|
|
51
|
-
if [ -z "$long" ]; then
|
|
52
|
-
record_pass "every description-tr is within the 1024-char budget"
|
|
53
|
-
else
|
|
54
|
-
record_fail "description-tr exceeds budget in $long"
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
# 4. Round trip: apply is idempotent, restore is byte-identical
|
|
58
|
-
tmpdir=$(mktemp -d)
|
|
59
|
-
trap 'rm -rf "$tmpdir"' EXIT
|
|
60
|
-
cp -R "$CMD_DIR" "$tmpdir/cmds"
|
|
61
|
-
node "$LOCALIZER" apply --dir "$tmpdir/cmds" >/dev/null 2>&1
|
|
62
|
-
if grep -q '^description:.*[çğıöşüÇĞİÖŞÜ]' "$tmpdir/cmds/dev/SKILL.md" \
|
|
63
|
-
&& grep -q '^description-en:' "$tmpdir/cmds/dev/SKILL.md"; then
|
|
64
|
-
record_pass "apply swaps description and writes the description-en sidecar"
|
|
65
|
-
else
|
|
66
|
-
record_fail "apply did not localize the sample file"
|
|
67
|
-
fi
|
|
68
|
-
second=$(node "$LOCALIZER" apply --dir "$tmpdir/cmds" 2>/dev/null)
|
|
69
|
-
if printf '%s' "$second" | grep -q ' 0 file(s) changed'; then
|
|
70
|
-
record_pass "second apply is a no-op (idempotent)"
|
|
71
|
-
else
|
|
72
|
-
record_fail "second apply changed files again: $second"
|
|
73
|
-
fi
|
|
74
|
-
node "$LOCALIZER" restore --dir "$tmpdir/cmds" >/dev/null 2>&1
|
|
75
|
-
if diff -r "$CMD_DIR" "$tmpdir/cmds" >/dev/null 2>&1; then
|
|
76
|
-
record_pass "restore returns a byte-identical tree"
|
|
77
|
-
else
|
|
78
|
-
record_fail "restore left differences vs the original tree"
|
|
79
|
-
fi
|
|
80
|
-
|
|
81
|
-
printf '\n\342\225\220\342\225\220 smoke-description-tr: %d passed, %d failed \342\225\220\342\225\220\n' "$PASS" "$FAIL"
|
|
82
|
-
[ "$FAIL" -eq 0 ]
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-dev-critic.sh
|
|
3
|
-
#
|
|
4
|
-
# Verifies the Phase 3.5 evaluator-optimizer contract:
|
|
5
|
-
# 1. pipeline/agents/dev-critic.md exists with required frontmatter
|
|
6
|
-
# 2. phase-3-dev.md documents Step 3.5 with loop cap + gates + escalate rule
|
|
7
|
-
# 3. prefs.schema.json exposes global.devCritic.{enabled,maxIterations,model,minDiffLoc}
|
|
8
|
-
# 4. dev-critic-output.schema.json exists and is valid JSON Schema
|
|
9
|
-
# 5. Severity enum + gate enum match the agent doc
|
|
10
|
-
# 6. Loop cap default is 2 (matches "max 2" rule documented in the agent)
|
|
11
|
-
# 7. Off-by-default (no surprise cost on existing users)
|
|
12
|
-
#
|
|
13
|
-
# Exit 0 = all pass, 1 = any failure.
|
|
14
|
-
|
|
15
|
-
set -euo pipefail
|
|
16
|
-
|
|
17
|
-
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
18
|
-
AGENT="$ROOT/pipeline/agents/dev-critic.md"
|
|
19
|
-
PHASE_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-3-dev.md"
|
|
20
|
-
PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
|
|
21
|
-
CRITIC_SCHEMA="$ROOT/pipeline/schemas/dev-critic-output.schema.json"
|
|
22
|
-
|
|
23
|
-
pass=0
|
|
24
|
-
fail=0
|
|
25
|
-
failures=()
|
|
26
|
-
record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
|
|
27
|
-
record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
|
|
28
|
-
|
|
29
|
-
printf '→ smoke-dev-critic: Phase 3.5 evaluator-optimizer contract\n'
|
|
30
|
-
|
|
31
|
-
# 1. Agent file exists with required frontmatter
|
|
32
|
-
if [ ! -f "$AGENT" ]; then
|
|
33
|
-
record_fail "pipeline/agents/dev-critic.md missing"
|
|
34
|
-
else
|
|
35
|
-
# Extract frontmatter (between first two --- lines)
|
|
36
|
-
fm=$(awk '/^---$/{n++; if(n==2) exit; if(n==1) next} n==1{print}' "$AGENT")
|
|
37
|
-
for key in description model preferredModel; do
|
|
38
|
-
if grep -qE "^${key}:" <<<"$fm"; then
|
|
39
|
-
record_pass "agent frontmatter has '${key}'"
|
|
40
|
-
else
|
|
41
|
-
record_fail "agent frontmatter missing '${key}'"
|
|
42
|
-
fi
|
|
43
|
-
done
|
|
44
|
-
# Model must be sonnet (the documented default)
|
|
45
|
-
if grep -qE "^model: sonnet" <<<"$fm"; then
|
|
46
|
-
record_pass "agent default model is sonnet"
|
|
47
|
-
else
|
|
48
|
-
record_fail "agent model default should be sonnet (was: $(grep '^model:' <<<"$fm" || echo missing))"
|
|
49
|
-
fi
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
# 2. Phase doc mentions Step 3.5 with the loop contract
|
|
53
|
-
if [ ! -f "$PHASE_DOC" ]; then
|
|
54
|
-
record_fail "phase-3-dev.md missing"
|
|
55
|
-
else
|
|
56
|
-
if grep -qF "Step 3.5" "$PHASE_DOC" && grep -qF "Dev Critic" "$PHASE_DOC"; then
|
|
57
|
-
record_pass "phase-3-dev.md documents Step 3.5 - Dev Critic"
|
|
58
|
-
else
|
|
59
|
-
record_fail "phase-3-dev.md missing Step 3.5 section"
|
|
60
|
-
fi
|
|
61
|
-
if grep -qE "max(imum)? (\*\*)?2(\*\*)? iterations?" "$PHASE_DOC"; then
|
|
62
|
-
record_pass "phase doc documents max 2 iterations"
|
|
63
|
-
else
|
|
64
|
-
record_fail "phase doc must state 'max 2 iterations' rule"
|
|
65
|
-
fi
|
|
66
|
-
if grep -qF "escalate" "$PHASE_DOC"; then
|
|
67
|
-
record_pass "phase doc documents escalate path"
|
|
68
|
-
else
|
|
69
|
-
record_fail "phase doc must document escalate behavior"
|
|
70
|
-
fi
|
|
71
|
-
if grep -qF "dev-critic.md" "$PHASE_DOC"; then
|
|
72
|
-
record_pass "phase doc cites agents/dev-critic.md"
|
|
73
|
-
else
|
|
74
|
-
record_fail "phase doc must reference agents/dev-critic.md"
|
|
75
|
-
fi
|
|
76
|
-
fi
|
|
77
|
-
|
|
78
|
-
# 3. Prefs schema exposes devCritic toggle
|
|
79
|
-
if jq -e '.properties.global.properties.devCritic.properties.enabled' "$PREFS_SCHEMA" >/dev/null 2>&1; then
|
|
80
|
-
record_pass "prefs schema exposes devCritic.enabled"
|
|
81
|
-
else
|
|
82
|
-
record_fail "prefs schema missing devCritic.enabled"
|
|
83
|
-
fi
|
|
84
|
-
for prop in maxIterations model minDiffLoc; do
|
|
85
|
-
if jq -e ".properties.global.properties.devCritic.properties.${prop}" "$PREFS_SCHEMA" >/dev/null 2>&1; then
|
|
86
|
-
record_pass "prefs schema exposes devCritic.${prop}"
|
|
87
|
-
else
|
|
88
|
-
record_fail "prefs schema missing devCritic.${prop}"
|
|
89
|
-
fi
|
|
90
|
-
done
|
|
91
|
-
|
|
92
|
-
# 4. dev-critic-output schema is valid JSON
|
|
93
|
-
if [ ! -f "$CRITIC_SCHEMA" ]; then
|
|
94
|
-
record_fail "dev-critic-output.schema.json missing"
|
|
95
|
-
elif ! jq empty "$CRITIC_SCHEMA" 2>/dev/null; then
|
|
96
|
-
record_fail "dev-critic-output.schema.json is not valid JSON"
|
|
97
|
-
else
|
|
98
|
-
record_pass "dev-critic-output.schema.json parses"
|
|
99
|
-
fi
|
|
100
|
-
|
|
101
|
-
# 5. Severity enum matches doc (blocking/important/suggestion)
|
|
102
|
-
if jq -e '.properties.findings.items.properties.severity.enum
|
|
103
|
-
| (index("blocking") != null
|
|
104
|
-
and index("important") != null
|
|
105
|
-
and index("suggestion") != null)' "$CRITIC_SCHEMA" >/dev/null 2>&1; then
|
|
106
|
-
record_pass "schema severity enum includes blocking/important/suggestion"
|
|
107
|
-
else
|
|
108
|
-
record_fail "schema severity enum incomplete"
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
# Gate keys (build/lint/test/secrets) match doc
|
|
112
|
-
for gate in build lint test secrets; do
|
|
113
|
-
if jq -e ".properties.gates.properties.${gate}" "$CRITIC_SCHEMA" >/dev/null 2>&1; then
|
|
114
|
-
record_pass "schema gates expose '${gate}'"
|
|
115
|
-
else
|
|
116
|
-
record_fail "schema gates missing '${gate}'"
|
|
117
|
-
fi
|
|
118
|
-
done
|
|
119
|
-
|
|
120
|
-
# 6. Loop cap default = 2
|
|
121
|
-
default_iter=$(jq -r '.properties.global.properties.devCritic.properties.maxIterations.default // empty' "$PREFS_SCHEMA")
|
|
122
|
-
if [ "$default_iter" = "2" ]; then
|
|
123
|
-
record_pass "devCritic.maxIterations defaults to 2"
|
|
124
|
-
else
|
|
125
|
-
record_fail "devCritic.maxIterations default should be 2 (was: ${default_iter:-missing})"
|
|
126
|
-
fi
|
|
127
|
-
|
|
128
|
-
# 7. Off by default - preserves existing-user baseline
|
|
129
|
-
# Note: jq's `// empty` treats boolean false as falsy, so use `has("default")` + raw value.
|
|
130
|
-
if jq -e '.properties.global.properties.devCritic.properties.enabled
|
|
131
|
-
| has("default") and .default == false' "$PREFS_SCHEMA" >/dev/null 2>&1; then
|
|
132
|
-
record_pass "devCritic.enabled defaults to false (opt-in)"
|
|
133
|
-
else
|
|
134
|
-
default_enabled=$(jq -c '.properties.global.properties.devCritic.properties.enabled.default' "$PREFS_SCHEMA")
|
|
135
|
-
record_fail "devCritic.enabled should default to false (was: ${default_enabled})"
|
|
136
|
-
fi
|
|
137
|
-
|
|
138
|
-
printf '\n══ dev-critic smoke: %d passed, %d failed ══\n' "$pass" "$fail"
|
|
139
|
-
if [ "$fail" -gt 0 ]; then
|
|
140
|
-
printf '\nFailures:\n'
|
|
141
|
-
for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
|
|
142
|
-
exit 1
|
|
143
|
-
fi
|
|
144
|
-
exit 0
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# smoke-diff-explain.sh - v7.8.0 Paket B: Phase 4 triage to diff bridge.
|
|
3
|
-
#
|
|
4
|
-
# Validates:
|
|
5
|
-
# 1. Slash command + Copilot peer present (parity smoke also catches this)
|
|
6
|
-
# 2. Empty triage produces a "no findings" stub without crashing
|
|
7
|
-
# 3. Mixed-classification fixture renders all bucket icons (✅ ⏭️ ❌)
|
|
8
|
-
# 4. Severity icons (🚫 ⚠️ 💡) render correctly
|
|
9
|
-
# 5. Hunk binding: synthetic diff + matching line → diff fence in output
|
|
10
|
-
# 6. Out-of-diff line → fallback message (no crash)
|
|
11
|
-
# 7. --help works without inputs
|
|
12
|
-
# 8. Missing inputs exit 1 with a clear error
|
|
13
|
-
# 9. Read-only contract: script does NOT call git apply / git checkout / write APIs
|
|
14
|
-
|
|
15
|
-
set -uo pipefail
|
|
16
|
-
|
|
17
|
-
REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
18
|
-
SCRIPT="$REPO_ROOT/pipeline/scripts/diff-explain.mjs"
|
|
19
|
-
|
|
20
|
-
PASS=0
|
|
21
|
-
FAIL=0
|
|
22
|
-
pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
|
|
23
|
-
fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
|
|
24
|
-
|
|
25
|
-
cleanup() { [ -n "${TMP:-}" ] && rm -rf "$TMP"; }
|
|
26
|
-
trap cleanup EXIT
|
|
27
|
-
TMP=$(mktemp -d)
|
|
28
|
-
|
|
29
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
30
|
-
echo "→ 1. Command + skill files exist"
|
|
31
|
-
[ -f "$REPO_ROOT/pipeline/commands/multi-agent/diff-explain/SKILL.md" ] && pass "diff-explain.md present" || fail "diff-explain.md missing"
|
|
32
|
-
[ -f "$REPO_ROOT/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md" ] && pass "multi-agent-diff-explain SKILL.md present" || fail "Copilot peer missing"
|
|
33
|
-
[ -x "$SCRIPT" ] && pass "diff-explain.mjs is executable" || fail "diff-explain.mjs not executable"
|
|
34
|
-
|
|
35
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
36
|
-
echo "→ 2. Empty findings stub"
|
|
37
|
-
cat > "$TMP/empty.json" <<'EOF'
|
|
38
|
-
{"accepted": [], "deferred": [], "rejected": [], "approved": true}
|
|
39
|
-
EOF
|
|
40
|
-
OUT=$(node "$SCRIPT" --triage "$TMP/empty.json" --diff /dev/null 2>&1)
|
|
41
|
-
if echo "$OUT" | grep -q "no findings to map"; then
|
|
42
|
-
pass "empty triage → 'no findings' stub"
|
|
43
|
-
else
|
|
44
|
-
fail "empty triage did not produce stub message"
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
48
|
-
echo "→ 3. Bucket icons render correctly"
|
|
49
|
-
OUT=$(node "$SCRIPT" --triage "$REPO_ROOT/pipeline/eval/triage/05-mixed-classification/expected.json" --diff /dev/null 2>&1)
|
|
50
|
-
echo "$OUT" | grep -q "✅" && pass "accepted bucket icon (✅) rendered" || fail "accepted icon missing"
|
|
51
|
-
echo "$OUT" | grep -q "⏭️" && pass "deferred bucket icon (⏭️) rendered" || fail "deferred icon missing"
|
|
52
|
-
|
|
53
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
54
|
-
echo "→ 4. Severity icons render"
|
|
55
|
-
echo "$OUT" | grep -q "🚫" && pass "blocking severity icon (🚫) rendered" || fail "blocking icon missing"
|
|
56
|
-
echo "$OUT" | grep -q "⚠️" && pass "important severity icon (⚠️) rendered" || fail "important icon missing"
|
|
57
|
-
echo "$OUT" | grep -q "💡" && pass "suggestion severity icon (💡) rendered" || fail "suggestion icon missing"
|
|
58
|
-
|
|
59
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
60
|
-
echo "→ 5. Hunk binding - synthetic diff matches finding line"
|
|
61
|
-
cat > "$TMP/syn.diff" <<'EOF'
|
|
62
|
-
diff --git a/src/api/checkout.ts b/src/api/checkout.ts
|
|
63
|
-
index a..b 100644
|
|
64
|
-
--- a/src/api/checkout.ts
|
|
65
|
-
+++ b/src/api/checkout.ts
|
|
66
|
-
@@ -98,5 +98,7 @@ ...
|
|
67
|
-
const total = sum(items);
|
|
68
|
-
+ const total2 = sum(items);
|
|
69
|
-
+ // duplicate
|
|
70
|
-
await chargeCard(total);
|
|
71
|
-
EOF
|
|
72
|
-
OUT=$(node "$SCRIPT" --triage "$REPO_ROOT/pipeline/eval/triage/05-mixed-classification/expected.json" --diff "$TMP/syn.diff" 2>&1)
|
|
73
|
-
if echo "$OUT" | grep -q '```diff'; then
|
|
74
|
-
pass "hunk fenced diff block rendered"
|
|
75
|
-
else
|
|
76
|
-
fail "no diff code fence in output"
|
|
77
|
-
fi
|
|
78
|
-
if echo "$OUT" | grep -q "@@ -98,5 +98,7 @@"; then
|
|
79
|
-
pass "hunk header preserved in output"
|
|
80
|
-
else
|
|
81
|
-
fail "hunk header missing in output"
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
85
|
-
echo "→ 6. Out-of-diff line fallback"
|
|
86
|
-
# checkout.ts is in the diff but its lines 145, 200 are NOT covered by the
|
|
87
|
-
# single hunk above. Should produce fallback messages, not crash.
|
|
88
|
-
fallback_count=$(echo "$OUT" | grep -c "line not in diff" || true)
|
|
89
|
-
if [ "$fallback_count" -ge 1 ]; then
|
|
90
|
-
pass "out-of-diff lines produce fallback message ($fallback_count occurrences)"
|
|
91
|
-
else
|
|
92
|
-
# Acceptable alternative: hunk renderer outputs nothing visible. Both options OK.
|
|
93
|
-
pass "out-of-diff lines handled (no crash)"
|
|
94
|
-
fi
|
|
95
|
-
|
|
96
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
97
|
-
echo "→ 7. --help works without inputs"
|
|
98
|
-
HELP=$(node "$SCRIPT" --help 2>&1)
|
|
99
|
-
if echo "$HELP" | grep -q "Usage:"; then
|
|
100
|
-
pass "--help prints usage"
|
|
101
|
-
else
|
|
102
|
-
fail "--help missing Usage block"
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
106
|
-
echo "→ 8. Missing inputs exit non-zero"
|
|
107
|
-
set +e
|
|
108
|
-
node "$SCRIPT" 2>"$TMP/err.txt"
|
|
109
|
-
EC=$?
|
|
110
|
-
set -e
|
|
111
|
-
if [ "$EC" -ne 0 ] && grep -q "required" "$TMP/err.txt"; then
|
|
112
|
-
pass "no-input exit $EC with 'required' error"
|
|
113
|
-
else
|
|
114
|
-
fail "no-input did not error correctly (exit=$EC)"
|
|
115
|
-
fi
|
|
116
|
-
|
|
117
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
118
|
-
echo "→ 9. Read-only contract - no destructive git APIs"
|
|
119
|
-
if grep -qE "git apply|git checkout|git reset|git rebase|git push|git commit|writeFileSync" "$SCRIPT"; then
|
|
120
|
-
fail "diff-explain.mjs references destructive git API or writeFileSync (read-only contract violated)"
|
|
121
|
-
else
|
|
122
|
-
pass "no destructive git/write API references in diff-explain.mjs"
|
|
123
|
-
fi
|
|
124
|
-
|
|
125
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
126
|
-
echo "→ 10. Injection-safe - shell metacharacters in --base are not executed"
|
|
127
|
-
SENTINEL="$TMP/PWNED"
|
|
128
|
-
set +e
|
|
129
|
-
node "$SCRIPT" \
|
|
130
|
-
--triage "$REPO_ROOT/pipeline/eval/triage/05-mixed-classification/expected.json" \
|
|
131
|
-
--base "main; touch $SENTINEL" --branch HEAD >/dev/null 2>&1
|
|
132
|
-
set -e
|
|
133
|
-
if [ -f "$SENTINEL" ]; then
|
|
134
|
-
fail "command injection: --base executed arbitrary shell (sentinel created)"
|
|
135
|
-
else
|
|
136
|
-
pass "shell metacharacters in --base not executed (execFileSync)"
|
|
137
|
-
fi
|
|
138
|
-
if grep -q "execSync" "$SCRIPT"; then
|
|
139
|
-
fail "diff-explain.mjs still uses execSync (shell interpolation risk)"
|
|
140
|
-
else
|
|
141
|
-
pass "diff-explain.mjs uses execFileSync only"
|
|
142
|
-
fi
|
|
143
|
-
|
|
144
|
-
# ──────────────────────────────────────────────────────────────────────────
|
|
145
|
-
echo ""
|
|
146
|
-
echo "══ diff-explain smoke: $PASS passed, $FAIL failed ══"
|
|
147
|
-
[ "$FAIL" -eq 0 ]
|