@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
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
"required": ["sourcesScanned", "testsScanned", "gapCount", "gapBySeverity"],
|
|
20
20
|
"properties": {
|
|
21
21
|
"sourcesScanned": { "type": "integer", "minimum": 0 },
|
|
22
|
-
"testsScanned":
|
|
23
|
-
"gapCount":
|
|
22
|
+
"testsScanned": { "type": "integer", "minimum": 0 },
|
|
23
|
+
"gapCount": { "type": "integer", "minimum": 0 },
|
|
24
24
|
"gapBySeverity": {
|
|
25
25
|
"type": "object",
|
|
26
26
|
"additionalProperties": false,
|
|
27
27
|
"properties": {
|
|
28
|
-
"blocking":
|
|
29
|
-
"important":
|
|
28
|
+
"blocking": { "type": "integer", "minimum": 0 },
|
|
29
|
+
"important": { "type": "integer", "minimum": 0 },
|
|
30
30
|
"suggestion": { "type": "integer", "minimum": 0 }
|
|
31
31
|
},
|
|
32
32
|
"required": ["blocking", "important", "suggestion"]
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"required": ["sourcePath", "symbol", "kind", "severity", "expectedTestPaths", "hint"],
|
|
42
42
|
"properties": {
|
|
43
43
|
"sourcePath": { "type": "string", "minLength": 1 },
|
|
44
|
-
"symbol":
|
|
44
|
+
"symbol": { "type": "string", "minLength": 1 },
|
|
45
45
|
"kind": {
|
|
46
46
|
"type": "string",
|
|
47
47
|
"description": "Pattern id from the rules file (e.g. public_func, composable_fun, named_export)."
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
"$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/token-budget.json",
|
|
4
4
|
"description": "Per-phase token budget for lazy-loaded pipeline docs. Enforced by smoke-token-budget.sh.",
|
|
5
5
|
"phases": {
|
|
6
|
-
"phase-0-init":
|
|
7
|
-
"phase-1-analysis":
|
|
8
|
-
"phase-2-planning":
|
|
9
|
-
"phase-3-dev":
|
|
10
|
-
"phase-4-review":
|
|
11
|
-
"phase-5-test":
|
|
12
|
-
"phase-6-commit":
|
|
13
|
-
"phase-7-report":
|
|
6
|
+
"phase-0-init": { "max_tokens": 12400, "warn_tokens": 10900 },
|
|
7
|
+
"phase-1-analysis": { "max_tokens": 3750, "warn_tokens": 3300 },
|
|
8
|
+
"phase-2-planning": { "max_tokens": 6500, "warn_tokens": 5750 },
|
|
9
|
+
"phase-3-dev": { "max_tokens": 7900, "warn_tokens": 6950 },
|
|
10
|
+
"phase-4-review": { "max_tokens": 13250, "warn_tokens": 11650 },
|
|
11
|
+
"phase-5-test": { "max_tokens": 2550, "warn_tokens": 2250 },
|
|
12
|
+
"phase-6-commit": { "max_tokens": 6150, "warn_tokens": 5400 },
|
|
13
|
+
"phase-7-report": { "max_tokens": 5600, "warn_tokens": 4950 }
|
|
14
14
|
},
|
|
15
15
|
"total_max_tokens": 51000,
|
|
16
16
|
"note": "Token estimate = ceil(chars / 4). Per-phase budget rule: warn = current+10% (rounded to nearest 50), max = current+25%. Gives ~6 edit cycles of headroom before warn trips - intentionally quiet under normal maintenance, loud when a phase grows unusually. Only the active phase is loaded (lazy). Recalibrated at v10.0.0 after the validator/consistency/simplifier/lesson gate contracts landed in phases 1-4. Recalibrated again at v10.9.0 after the verify-by-test (Phase 4 Step 3.7), update-check (Phase 0 Step 0.6), immutable-test (Phase 3 GREEN) and redTests re-entry contracts landed - Step 3.7 prose was compressed to a pointer into refs/features/verify-by-test.md before the recalibration. Total bumped 50000 -> 51000 at v12.5.0 after the worktree residue/traversal-prune contract (Phase 0 + Phase 5 heal) and the Reflexion causal-diagnosis contract (Phase 4 lesson memory) landed; the prose was compressed first (161 tokens reclaimed) and every per-phase max still passes - only the aggregate needed room."
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"file": { "type": "string" },
|
|
25
25
|
"line": { "type": ["integer", "null"] },
|
|
26
26
|
"issue": { "type": "string", "minLength": 1 },
|
|
27
|
-
"fix":
|
|
27
|
+
"fix": { "type": ["string", "null"] },
|
|
28
28
|
"reason": { "type": ["string", "null"] },
|
|
29
29
|
"reviewer": { "type": ["string", "null"] },
|
|
30
30
|
"file_sha": {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# _smoke-root.sh - resolve the pipeline tree for a smoke that must run in BOTH
|
|
4
|
+
# the repo checkout and an end-user install.
|
|
5
|
+
#
|
|
6
|
+
# Why this exists: the repo and an install have different shapes.
|
|
7
|
+
#
|
|
8
|
+
# repo checkout install (~/.claude or ~/.copilot)
|
|
9
|
+
# ------------------ --------------------------------
|
|
10
|
+
# pipeline/scripts/ scripts/
|
|
11
|
+
# pipeline/schemas/ schemas/
|
|
12
|
+
# pipeline/multi-agent-refs/ multi-agent-refs/
|
|
13
|
+
# pipeline/commands/ commands/
|
|
14
|
+
# package.json (absent)
|
|
15
|
+
#
|
|
16
|
+
# A smoke that hardcodes `REPO_ROOT="$(dirname "$0")/../.."` and then reads
|
|
17
|
+
# `$REPO_ROOT/pipeline/...` resolves to `$HOME/pipeline/...` once installed, so
|
|
18
|
+
# every path check fails. Whoever ran it sees a red report and concludes the
|
|
19
|
+
# install is broken. Source this file instead and read the MA_* variables.
|
|
20
|
+
#
|
|
21
|
+
# Usage (from any script in pipeline/scripts/):
|
|
22
|
+
# . "$(dirname "${BASH_SOURCE[0]}")/_smoke-root.sh"
|
|
23
|
+
# grep -q needle "$MA_REFS/phases/phase-4-review.md"
|
|
24
|
+
#
|
|
25
|
+
# Exports:
|
|
26
|
+
# MA_LAYOUT "repo" | "install"
|
|
27
|
+
# MA_ROOT repo root, or the install root (~/.claude)
|
|
28
|
+
# MA_SCRIPTS directory holding this script
|
|
29
|
+
# MA_SCHEMAS JSON schemas
|
|
30
|
+
# MA_REFS multi-agent-refs
|
|
31
|
+
# MA_COMMANDS slash-command tree
|
|
32
|
+
# MA_SKILLS skills tree
|
|
33
|
+
#
|
|
34
|
+
# Every exported directory is verified to exist; a missing one is left empty so
|
|
35
|
+
# the caller can skip that check rather than report a false failure.
|
|
36
|
+
|
|
37
|
+
MA_SCRIPTS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
38
|
+
|
|
39
|
+
# The repo is the only layout with pipeline/ beside package.json. Checking both
|
|
40
|
+
# rules out an install that happens to sit next to an unrelated pipeline/ dir.
|
|
41
|
+
_ma_candidate="$(cd "$MA_SCRIPTS/../.." && pwd)"
|
|
42
|
+
if [ -f "$_ma_candidate/package.json" ] && [ -d "$_ma_candidate/pipeline" ]; then
|
|
43
|
+
MA_LAYOUT="repo"
|
|
44
|
+
MA_ROOT="$_ma_candidate"
|
|
45
|
+
_ma_base="$_ma_candidate/pipeline"
|
|
46
|
+
else
|
|
47
|
+
MA_LAYOUT="install"
|
|
48
|
+
MA_ROOT="$(cd "$MA_SCRIPTS/.." && pwd)"
|
|
49
|
+
_ma_base="$MA_ROOT"
|
|
50
|
+
fi
|
|
51
|
+
unset _ma_candidate
|
|
52
|
+
|
|
53
|
+
_ma_dir() { [ -d "$1" ] && echo "$1" || echo ""; }
|
|
54
|
+
|
|
55
|
+
MA_SCHEMAS="$(_ma_dir "$_ma_base/schemas")"
|
|
56
|
+
MA_REFS="$(_ma_dir "$_ma_base/multi-agent-refs")"
|
|
57
|
+
MA_COMMANDS="$(_ma_dir "$_ma_base/commands")"
|
|
58
|
+
MA_SKILLS="$(_ma_dir "$_ma_base/skills")"
|
|
59
|
+
unset _ma_base
|
|
60
|
+
|
|
61
|
+
export MA_LAYOUT MA_ROOT MA_SCRIPTS MA_SCHEMAS MA_REFS MA_COMMANDS MA_SKILLS
|
|
@@ -230,7 +230,9 @@ if (opts.markdown) {
|
|
|
230
230
|
const lines = [];
|
|
231
231
|
lines.push(`# Pipeline Metrics Summary`);
|
|
232
232
|
lines.push(``);
|
|
233
|
-
lines.push(
|
|
233
|
+
lines.push(
|
|
234
|
+
`_Source: \`${summary.source}\` · Events: ${summary.total_events} (${summary.parse_errors} parse errors) · Unique tasks: ${summary.unique_tasks}_`,
|
|
235
|
+
);
|
|
234
236
|
lines.push(``);
|
|
235
237
|
lines.push(`## Reviews`);
|
|
236
238
|
lines.push(``);
|
|
@@ -245,9 +247,13 @@ if (opts.markdown) {
|
|
|
245
247
|
lines.push(`| Category | Count | Rate |`);
|
|
246
248
|
lines.push(`|----------|-------|------|`);
|
|
247
249
|
lines.push(`| Raw findings | ${summary.triage_totals.raw} | - |`);
|
|
248
|
-
lines.push(
|
|
250
|
+
lines.push(
|
|
251
|
+
`| Accepted | ${summary.triage_totals.accepted} | ${summary.triage_totals.accept_rate ?? " - "} |`,
|
|
252
|
+
);
|
|
249
253
|
lines.push(`| Deferred | ${summary.triage_totals.deferred} | - |`);
|
|
250
|
-
lines.push(
|
|
254
|
+
lines.push(
|
|
255
|
+
`| Rejected | ${summary.triage_totals.rejected} | ${summary.triage_totals.reject_rate ?? " - "} |`,
|
|
256
|
+
);
|
|
251
257
|
|
|
252
258
|
if (Object.keys(summary.edge_cases).length) {
|
|
253
259
|
lines.push(``);
|
|
@@ -266,14 +272,20 @@ if (opts.markdown) {
|
|
|
266
272
|
lines.push(``);
|
|
267
273
|
lines.push(`| Model | Calls | Duration (ms) | Tokens In | Tokens Out | Cached | Cache % |`);
|
|
268
274
|
lines.push(`|-------|-------|---------------|-----------|------------|--------|---------|`);
|
|
269
|
-
for (const [m, t] of Object.entries(summary.cost_per_model).sort(
|
|
275
|
+
for (const [m, t] of Object.entries(summary.cost_per_model).sort(
|
|
276
|
+
(a, b) => b[1].calls - a[1].calls,
|
|
277
|
+
)) {
|
|
270
278
|
const pct = t.cache_ratio === null ? " - " : `${Math.round(t.cache_ratio * 100)}%`;
|
|
271
|
-
lines.push(
|
|
279
|
+
lines.push(
|
|
280
|
+
`| \`${m}\` | ${t.calls} | ${t.duration_ms} | ${t.tokens_in} | ${t.tokens_out} | ${t.tokens_cached} | ${pct} |`,
|
|
281
|
+
);
|
|
272
282
|
}
|
|
273
283
|
const oc = summary.cache_reuse;
|
|
274
284
|
const ocPct = oc.cache_ratio === null ? " - " : `${Math.round(oc.cache_ratio * 100)}%`;
|
|
275
285
|
lines.push(``);
|
|
276
|
-
lines.push(
|
|
286
|
+
lines.push(
|
|
287
|
+
`_Overall prompt-cache reuse: ${oc.tokens_cached.toLocaleString()} cached / ${(oc.tokens_in + oc.tokens_cached).toLocaleString()} total input tokens = **${ocPct}**._`,
|
|
288
|
+
);
|
|
277
289
|
}
|
|
278
290
|
console.log(lines.join("\n"));
|
|
279
291
|
process.exit(0);
|
|
@@ -80,3 +80,28 @@ LINE="{\"ts\":\"${TS}\",\"event\":\"$(json_escape "$EVENT")\",\"service\":\"$(js
|
|
|
80
80
|
LINE="${LINE}}"
|
|
81
81
|
|
|
82
82
|
echo "$LINE" >> "$AUDIT_FILE" 2>/dev/null || true
|
|
83
|
+
|
|
84
|
+
# Opportunistic rotation. audit-log-rotate.sh documents a launchd/cron install,
|
|
85
|
+
# but nothing ever told a user to set that up, so an unrotated trail would grow
|
|
86
|
+
# without bound now that credential-store.sh writes an event on every PAT lookup.
|
|
87
|
+
# Self-triggering removes the operator step: check a cheap size threshold and hand
|
|
88
|
+
# off to the real rotator, which is atomic against concurrent appenders (it moves
|
|
89
|
+
# the live inode first). Silent and non-blocking - telemetry never fails a run.
|
|
90
|
+
ROTATE_AT_BYTES="${AUDIT_ROTATE_AT_BYTES:-1048576}"
|
|
91
|
+
_audit_size() {
|
|
92
|
+
case "$(uname -s)" in
|
|
93
|
+
Darwin|*BSD*) stat -f %z "$1" 2>/dev/null || echo 0 ;;
|
|
94
|
+
*) stat -c %s "$1" 2>/dev/null || echo 0 ;;
|
|
95
|
+
esac
|
|
96
|
+
}
|
|
97
|
+
if [ "${AUDIT_SELF_ROTATE:-1}" = "1" ] && [ -f "$AUDIT_FILE" ]; then
|
|
98
|
+
SIZE="$(_audit_size "$AUDIT_FILE")"
|
|
99
|
+
if [ "${SIZE:-0}" -ge "$ROTATE_AT_BYTES" ]; then
|
|
100
|
+
ROTATOR="$(dirname "${BASH_SOURCE[0]:-$0}")/audit-log-rotate.sh"
|
|
101
|
+
# The rotator derives AUDIT_FILE from AUDIT_DIR, so pass the DIRECTORY.
|
|
102
|
+
# Handing it AUDIT_FILE would leave it rotating the default path while a
|
|
103
|
+
# caller-overridden trail kept growing.
|
|
104
|
+
[ -f "$ROTATOR" ] &&
|
|
105
|
+
AUDIT_DIR="$(dirname "$AUDIT_FILE")" bash "$ROTATOR" >/dev/null 2>&1 || true
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
@@ -40,7 +40,11 @@ function* walkSkills(dir) {
|
|
|
40
40
|
for (const entry of readdirSync(dir)) {
|
|
41
41
|
const full = join(dir, entry);
|
|
42
42
|
let st;
|
|
43
|
-
try {
|
|
43
|
+
try {
|
|
44
|
+
st = statSync(full);
|
|
45
|
+
} catch {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
44
48
|
if (st.isDirectory()) yield* walkSkills(full);
|
|
45
49
|
else if (entry === "SKILL.md") yield full;
|
|
46
50
|
}
|
|
@@ -56,7 +60,7 @@ function parseFrontmatter(raw) {
|
|
|
56
60
|
const m = line.match(/^([\w-]+):\s*(.*)$/);
|
|
57
61
|
if (!m) continue;
|
|
58
62
|
let value = m[2].trim();
|
|
59
|
-
if (value.startsWith("
|
|
63
|
+
if (value.startsWith('"') && value.endsWith('"')) value = value.slice(1, -1);
|
|
60
64
|
out[m[1]] = value;
|
|
61
65
|
}
|
|
62
66
|
return out;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* publish artifact.
|
|
11
11
|
*
|
|
12
12
|
* The authored lifecycle skills (index / reference / workflow / tools) live in the
|
|
13
|
-
* plugin repo and are NEVER touched here
|
|
13
|
+
* plugin repo and are NEVER touched here - only the `knowledge/` layer + plugin.json
|
|
14
14
|
* knowledge entries are regenerated.
|
|
15
15
|
*
|
|
16
16
|
* Routing uses the per-stack skill patterns (formerly carried by stack-swap.sh). Genuinely cross-stack
|
|
@@ -23,37 +23,83 @@
|
|
|
23
23
|
* Exit code 0 always (report-only); prints a JSON-ish summary + per-plugin diff.
|
|
24
24
|
*/
|
|
25
25
|
import {
|
|
26
|
-
readdirSync,
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
readdirSync,
|
|
27
|
+
existsSync,
|
|
28
|
+
rmSync,
|
|
29
|
+
cpSync,
|
|
30
|
+
readFileSync,
|
|
31
|
+
writeFileSync,
|
|
32
|
+
mkdirSync,
|
|
33
|
+
statSync,
|
|
34
|
+
} from "node:fs";
|
|
35
|
+
import { join } from "node:path";
|
|
29
36
|
|
|
30
37
|
const args = process.argv.slice(2);
|
|
31
|
-
const getArg = (k, d) => {
|
|
38
|
+
const getArg = (k, d) => {
|
|
39
|
+
const i = args.indexOf(k);
|
|
40
|
+
return i >= 0 ? args[i + 1] : d;
|
|
41
|
+
};
|
|
32
42
|
const HOME = process.env.HOME;
|
|
33
|
-
const PLUGINS_REPO = getArg(
|
|
34
|
-
const PIPE_ROOT = getArg(
|
|
35
|
-
const EXTERNAL = join(PIPE_ROOT,
|
|
36
|
-
const DRY = args.includes(
|
|
43
|
+
const PLUGINS_REPO = getArg("--plugins-repo", join(HOME, "multi-agent-plugins"));
|
|
44
|
+
const PIPE_ROOT = getArg("--pipeline", join(HOME, "multi-agent-pipeline"));
|
|
45
|
+
const EXTERNAL = join(PIPE_ROOT, "pipeline/skills/shared/external");
|
|
46
|
+
const DRY = args.includes("--dry-run");
|
|
37
47
|
|
|
38
|
-
const COMMON_PLUGIN =
|
|
39
|
-
const COMMON_SKILLS = [
|
|
48
|
+
const COMMON_PLUGIN = "ai-common-engineering-toolkit";
|
|
49
|
+
const COMMON_SKILLS = [
|
|
50
|
+
"accessibility-compliance-accessibility-audit",
|
|
51
|
+
"firebase",
|
|
52
|
+
"humanizer",
|
|
53
|
+
"council",
|
|
54
|
+
"search-first",
|
|
55
|
+
"agent-introspection-debugging",
|
|
56
|
+
"skill-creator",
|
|
57
|
+
"backlog",
|
|
58
|
+
];
|
|
40
59
|
|
|
41
60
|
// Apple/Xcode-only skills that match no stack pattern → iOS plugin only.
|
|
42
61
|
const APPLE_ONLY = [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
62
|
+
"avkit",
|
|
63
|
+
"cryptokit",
|
|
64
|
+
"metrickit-diagnostics",
|
|
65
|
+
"pdfkit",
|
|
66
|
+
"spm-build-analysis",
|
|
67
|
+
"swiftlint",
|
|
68
|
+
"xcode-build-benchmark",
|
|
69
|
+
"xcode-build-fixer",
|
|
70
|
+
"xcode-build-orchestrator",
|
|
71
|
+
"xcode-compilation-analyzer",
|
|
72
|
+
"xcode-project-analyzer",
|
|
46
73
|
];
|
|
47
74
|
|
|
48
75
|
// stack → matching pattern (per-stack routing patterns (formerly in stack-swap.sh))
|
|
76
|
+
//
|
|
77
|
+
// A skill lands in every plugin whose pattern it matches, so a bare substring
|
|
78
|
+
// alternative that is also a suffix of another stack's skill name silently ships
|
|
79
|
+
// that skill twice. `architecture` did exactly that: it pulled
|
|
80
|
+
// `android-architecture` and `swift-architecture` into ai-backend-toolkit
|
|
81
|
+
// alongside their correct plugins, so a backend project loading the toolkit got
|
|
82
|
+
// Compose and SwiftUI architecture skills. It is anchored to the exact name now.
|
|
83
|
+
// Keep any new single-word alternative anchored unless it genuinely reads as a
|
|
84
|
+
// substring across stacks.
|
|
49
85
|
const STACK_PATTERNS = {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
86
|
+
"ai-ios-engineering-toolkit":
|
|
87
|
+
/(swiftui|swift-|ios-|hig-|apple-|storekit|widgetkit|healthkit|homekit|mapkit|musickit|passkit|pencilkit|realitykit|weatherkit|alarmkit|callkit|cloudkit|coreml|core-|eventkit|energykit|permissionkit|tipkit|shareplay|live-activities|background-processing|app-store|app-clips|app-intents|authentication|contacts-framework|device-integrity|macos-|natural-language|photos-camera|push-notifications|speech-recognition|swiftdata|vision-framework|debugging-instruments|help-skills)/i,
|
|
88
|
+
"ai-android-engineering-toolkit":
|
|
89
|
+
/(android|compose-|kotlin-|room-database|retrofit-|gradle-|play-store)/i,
|
|
90
|
+
"ai-backend-toolkit":
|
|
91
|
+
/(fastapi|nodejs|docker|api-pattern|api-security|github-actions|observability|^architecture$|monorepo|clean-code|debugging-strategies|agentflow|closed-loop|context-compression|python-patterns|database-patterns|rest-api-design|testing-backend|ci-cd-pipelines)/i,
|
|
92
|
+
"ai-frontend-engineering-toolkit":
|
|
93
|
+
/(react-|nextjs-|typescript-|tailwind-|vue-|web-accessibility|web-performance|css-modern|web-testing|html-semantic)/i,
|
|
54
94
|
};
|
|
55
95
|
|
|
56
|
-
const isDir = (p) => {
|
|
96
|
+
const isDir = (p) => {
|
|
97
|
+
try {
|
|
98
|
+
return statSync(p).isDirectory();
|
|
99
|
+
} catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
57
103
|
const listDirs = (p) => (existsSync(p) ? readdirSync(p).filter((n) => isDir(join(p, n))) : []);
|
|
58
104
|
|
|
59
105
|
// --- 1. enumerate authoring source ---------------------------------------
|
|
@@ -69,22 +115,67 @@ for (const p of Object.keys(STACK_PATTERNS)) desired[p] = new Set();
|
|
|
69
115
|
|
|
70
116
|
const unrouted = [];
|
|
71
117
|
for (const skill of allSkills) {
|
|
72
|
-
if (COMMON_SKILLS.includes(skill)) {
|
|
73
|
-
|
|
118
|
+
if (COMMON_SKILLS.includes(skill)) {
|
|
119
|
+
desired[COMMON_PLUGIN].add(skill);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (APPLE_ONLY.includes(skill)) {
|
|
123
|
+
desired["ai-ios-engineering-toolkit"].add(skill);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
74
126
|
let matched = false;
|
|
75
127
|
for (const [plugin, re] of Object.entries(STACK_PATTERNS)) {
|
|
76
|
-
if (re.test(skill)) {
|
|
128
|
+
if (re.test(skill)) {
|
|
129
|
+
desired[plugin].add(skill);
|
|
130
|
+
matched = true;
|
|
131
|
+
}
|
|
77
132
|
}
|
|
78
133
|
if (!matched) unrouted.push(skill);
|
|
79
134
|
}
|
|
80
135
|
|
|
136
|
+
// --- 2b. routing audit ---------------------------------------------------
|
|
137
|
+
// The loop above adds a skill to EVERY plugin whose pattern matches, so a bare
|
|
138
|
+
// substring alternative that also reads as a suffix of another stack's skill
|
|
139
|
+
// name ships that skill into two plugins. `architecture` did that to
|
|
140
|
+
// android-architecture and swift-architecture, which is how ai-backend-toolkit
|
|
141
|
+
// came to carry Compose and SwiftUI guidance.
|
|
142
|
+
//
|
|
143
|
+
// --check-routing runs this audit alone. It reads nothing but the authoring
|
|
144
|
+
// source in this repo, so CI can gate it without a checkout of the plugins repo.
|
|
145
|
+
const multiRouted = [];
|
|
146
|
+
for (const skill of allSkills) {
|
|
147
|
+
if (COMMON_SKILLS.includes(skill) || APPLE_ONLY.includes(skill)) continue;
|
|
148
|
+
const owners = Object.entries(STACK_PATTERNS)
|
|
149
|
+
.filter(([, re]) => re.test(skill))
|
|
150
|
+
.map(([p]) => p);
|
|
151
|
+
if (owners.length > 1) multiRouted.push(`${skill} -> ${owners.join(" + ")}`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (args.includes("--check-routing")) {
|
|
155
|
+
if (multiRouted.length) {
|
|
156
|
+
console.error(
|
|
157
|
+
`check-routing: ${multiRouted.length} skill(s) routed to more than one stack plugin`,
|
|
158
|
+
);
|
|
159
|
+
for (const m of multiRouted) console.error(` FAIL ${m}`);
|
|
160
|
+
console.error("fix: anchor the offending STACK_PATTERNS alternative to the exact skill name");
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
console.log(
|
|
164
|
+
`check-routing: clean (${allSkills.length} skills, ${unrouted.length} unrouted, 0 multi-routed)`,
|
|
165
|
+
);
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
168
|
+
|
|
81
169
|
// --- 3. sync each plugin's knowledge/ + regenerate plugin.json -----------
|
|
82
170
|
const report = [];
|
|
83
171
|
for (const [plugin, want] of Object.entries(desired)) {
|
|
84
|
-
const pdir = join(PLUGINS_REPO,
|
|
85
|
-
const kdir = join(pdir,
|
|
86
|
-
const pjPath = join(pdir,
|
|
87
|
-
if (!existsSync(pjPath)) {
|
|
172
|
+
const pdir = join(PLUGINS_REPO, "plugins", plugin);
|
|
173
|
+
const kdir = join(pdir, "skills", "knowledge");
|
|
174
|
+
const pjPath = join(pdir, ".claude-plugin", "plugin.json");
|
|
175
|
+
if (!existsSync(pjPath)) {
|
|
176
|
+
report.push({ plugin, error: "plugin.json missing" });
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
88
179
|
|
|
89
180
|
const have = new Set(listDirs(kdir));
|
|
90
181
|
const toAdd = [...want].filter((s) => !have.has(s)).sort();
|
|
@@ -98,16 +189,16 @@ for (const [plugin, want] of Object.entries(desired)) {
|
|
|
98
189
|
}
|
|
99
190
|
|
|
100
191
|
// regenerate plugin.json skills[]: keep non-knowledge entries, rebuild knowledge set
|
|
101
|
-
const pj = JSON.parse(readFileSync(pjPath,
|
|
102
|
-
const nonKnowledge = (pj.skills || []).filter((s) => !s.startsWith(
|
|
192
|
+
const pj = JSON.parse(readFileSync(pjPath, "utf8"));
|
|
193
|
+
const nonKnowledge = (pj.skills || []).filter((s) => !s.startsWith("./skills/knowledge/"));
|
|
103
194
|
const finalKnowledge = (DRY ? [...want] : listDirs(kdir)).map((s) => `./skills/knowledge/${s}`);
|
|
104
195
|
const newSkills = [...new Set([...nonKnowledge, ...finalKnowledge])].sort();
|
|
105
196
|
const skillsChanged = JSON.stringify(pj.skills) !== JSON.stringify(newSkills);
|
|
106
197
|
|
|
107
|
-
const oldV = pj.version ||
|
|
198
|
+
const oldV = pj.version || "0.1.0";
|
|
108
199
|
let newV = oldV;
|
|
109
200
|
if (changed || skillsChanged) {
|
|
110
|
-
const [maj, min, patch] = oldV.split(
|
|
201
|
+
const [maj, min, patch] = oldV.split(".").map((n) => parseInt(n, 10) || 0);
|
|
111
202
|
newV = `${maj}.${min}.${patch + 1}`;
|
|
112
203
|
}
|
|
113
204
|
if (!DRY && (changed || skillsChanged)) {
|
|
@@ -115,23 +206,35 @@ for (const [plugin, want] of Object.entries(desired)) {
|
|
|
115
206
|
pj.version = newV;
|
|
116
207
|
writeFileSync(pjPath, `${JSON.stringify(pj, null, 2)}\n`);
|
|
117
208
|
}
|
|
118
|
-
report.push({
|
|
209
|
+
report.push({
|
|
210
|
+
plugin,
|
|
211
|
+
added: toAdd,
|
|
212
|
+
removed: toRemove,
|
|
213
|
+
skillCount: newSkills.length,
|
|
214
|
+
version: oldV === newV ? oldV : `${oldV} → ${newV}`,
|
|
215
|
+
bumped: oldV !== newV,
|
|
216
|
+
});
|
|
119
217
|
}
|
|
120
218
|
|
|
121
219
|
// --- 4. report ------------------------------------------------------------
|
|
122
|
-
console.log(`build-stack-plugins ${DRY ?
|
|
220
|
+
console.log(`build-stack-plugins ${DRY ? "(dry-run)" : ""}`);
|
|
123
221
|
console.log(`source: ${EXTERNAL} (${allSkills.length} skills)`);
|
|
124
222
|
console.log(`target: ${PLUGINS_REPO}`);
|
|
125
223
|
for (const r of report) {
|
|
126
|
-
if (r.error) {
|
|
127
|
-
|
|
224
|
+
if (r.error) {
|
|
225
|
+
console.log(` ✗ ${r.plugin}: ${r.error}`);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const flag = r.bumped ? "BUMPED" : "unchanged";
|
|
128
229
|
console.log(` ${r.plugin}: skills=${r.skillCount} version=${r.version} [${flag}]`);
|
|
129
|
-
if (r.added.length) console.log(` + ${r.added.join(
|
|
130
|
-
if (r.removed.length) console.log(` - ${r.removed.join(
|
|
230
|
+
if (r.added.length) console.log(` + ${r.added.join(", ")}`);
|
|
231
|
+
if (r.removed.length) console.log(` - ${r.removed.join(", ")}`);
|
|
131
232
|
}
|
|
132
233
|
if (unrouted.length) {
|
|
133
|
-
console.log(` ⚠ unrouted (matched no stack, not common/apple-only)
|
|
134
|
-
console.log(` ${unrouted.join(
|
|
234
|
+
console.log(` ⚠ unrouted (matched no stack, not common/apple-only) - NOT copied anywhere:`);
|
|
235
|
+
console.log(` ${unrouted.join(", ")}`);
|
|
135
236
|
}
|
|
136
237
|
const anyBump = report.some((r) => r.bumped);
|
|
137
|
-
console.log(
|
|
238
|
+
console.log(
|
|
239
|
+
anyBump ? "result: changes detected (versions bumped)" : "result: all plugins up to date",
|
|
240
|
+
);
|