@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
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
// 2 - usage / arg error
|
|
27
27
|
// 3 - root directory missing / not a repo
|
|
28
28
|
|
|
29
|
-
import { promises as fs } from
|
|
30
|
-
import { existsSync, statSync } from
|
|
31
|
-
import path from
|
|
32
|
-
import process from
|
|
29
|
+
import { promises as fs } from "node:fs";
|
|
30
|
+
import { existsSync, statSync } from "node:fs";
|
|
31
|
+
import path from "node:path";
|
|
32
|
+
import process from "node:process";
|
|
33
33
|
|
|
34
34
|
// ---- CLI args --------------------------------------------------------------
|
|
35
35
|
|
|
@@ -38,25 +38,25 @@ function parseArgs(argv) {
|
|
|
38
38
|
root: process.cwd(),
|
|
39
39
|
budget: 2000,
|
|
40
40
|
top: 25,
|
|
41
|
-
format:
|
|
41
|
+
format: "md",
|
|
42
42
|
include: null,
|
|
43
43
|
exclude: null,
|
|
44
44
|
verbose: false,
|
|
45
45
|
};
|
|
46
46
|
for (let i = 2; i < argv.length; i++) {
|
|
47
47
|
const a = argv[i];
|
|
48
|
-
if (a ===
|
|
49
|
-
else if (a ===
|
|
50
|
-
else if (a ===
|
|
51
|
-
else if (a ===
|
|
52
|
-
else if (a ===
|
|
53
|
-
else if (a ===
|
|
54
|
-
else if (a ===
|
|
55
|
-
else if (a ===
|
|
48
|
+
if (a === "--root") args.root = path.resolve(argv[++i]);
|
|
49
|
+
else if (a === "--budget") args.budget = parseInt(argv[++i], 10);
|
|
50
|
+
else if (a === "--top") args.top = parseInt(argv[++i], 10);
|
|
51
|
+
else if (a === "--format") args.format = argv[++i];
|
|
52
|
+
else if (a === "--include") args.include = argv[++i].split(",").filter(Boolean);
|
|
53
|
+
else if (a === "--exclude") args.exclude = argv[++i].split(",").filter(Boolean);
|
|
54
|
+
else if (a === "--verbose" || a === "-v") args.verbose = true;
|
|
55
|
+
else if (a === "--help" || a === "-h") {
|
|
56
56
|
console.log(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
"usage: repo-map.mjs [--root DIR] [--budget TOKENS] [--top N]\n" +
|
|
58
|
+
" [--format md|json] [--include GLOB,...]\n" +
|
|
59
|
+
" [--exclude GLOB,...] [--verbose]",
|
|
60
60
|
);
|
|
61
61
|
process.exit(0);
|
|
62
62
|
} else {
|
|
@@ -64,16 +64,16 @@ function parseArgs(argv) {
|
|
|
64
64
|
process.exit(2);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
if (![
|
|
67
|
+
if (!["md", "json"].includes(args.format)) {
|
|
68
68
|
console.error(`repo-map: --format must be md or json (got "${args.format}")`);
|
|
69
69
|
process.exit(2);
|
|
70
70
|
}
|
|
71
71
|
if (!Number.isFinite(args.budget) || args.budget < 100) {
|
|
72
|
-
console.error(
|
|
72
|
+
console.error("repo-map: --budget must be an integer >= 100");
|
|
73
73
|
process.exit(2);
|
|
74
74
|
}
|
|
75
75
|
if (!Number.isFinite(args.top) || args.top < 1) {
|
|
76
|
-
console.error(
|
|
76
|
+
console.error("repo-map: --top must be >= 1");
|
|
77
77
|
process.exit(2);
|
|
78
78
|
}
|
|
79
79
|
return args;
|
|
@@ -82,24 +82,38 @@ function parseArgs(argv) {
|
|
|
82
82
|
// ---- File walking ----------------------------------------------------------
|
|
83
83
|
|
|
84
84
|
const DEFAULT_IGNORE = new Set([
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
".git",
|
|
86
|
+
".worktrees",
|
|
87
|
+
"node_modules",
|
|
88
|
+
"Pods",
|
|
89
|
+
".build",
|
|
90
|
+
"DerivedData",
|
|
91
|
+
".next",
|
|
92
|
+
"dist",
|
|
93
|
+
"build",
|
|
94
|
+
"__pycache__",
|
|
95
|
+
".venv",
|
|
96
|
+
"venv",
|
|
97
|
+
".cache",
|
|
98
|
+
".gradle",
|
|
99
|
+
".idea",
|
|
100
|
+
".vscode",
|
|
101
|
+
"target",
|
|
88
102
|
]);
|
|
89
103
|
|
|
90
104
|
const LANG_EXT = {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
105
|
+
".swift": "swift",
|
|
106
|
+
".kt": "kotlin",
|
|
107
|
+
".kts": "kotlin",
|
|
108
|
+
".ts": "ts",
|
|
109
|
+
".tsx": "ts",
|
|
110
|
+
".js": "js",
|
|
111
|
+
".mjs": "js",
|
|
112
|
+
".cjs": "js",
|
|
113
|
+
".jsx": "js",
|
|
114
|
+
".py": "python",
|
|
115
|
+
".sh": "bash",
|
|
116
|
+
".bash": "bash",
|
|
103
117
|
};
|
|
104
118
|
|
|
105
119
|
async function walk(root, args) {
|
|
@@ -112,7 +126,7 @@ async function walk(root, args) {
|
|
|
112
126
|
return;
|
|
113
127
|
}
|
|
114
128
|
for (const e of entries) {
|
|
115
|
-
if (e.name.startsWith(
|
|
129
|
+
if (e.name.startsWith(".") && DEFAULT_IGNORE.has(e.name)) continue;
|
|
116
130
|
if (DEFAULT_IGNORE.has(e.name)) continue;
|
|
117
131
|
const full = path.join(dir, e.name);
|
|
118
132
|
if (e.isDirectory()) {
|
|
@@ -151,8 +165,8 @@ const EXTRACTORS = {
|
|
|
151
165
|
while ((m = re.exec(src))) {
|
|
152
166
|
const kind = m[1];
|
|
153
167
|
const name = m[2];
|
|
154
|
-
const rest = (m[3] ||
|
|
155
|
-
const signature = `${kind} ${name}${rest ?
|
|
168
|
+
const rest = (m[3] || "").trim();
|
|
169
|
+
const signature = `${kind} ${name}${rest ? " " + rest : ""}`.trim();
|
|
156
170
|
out.push({ kind, name, signature: truncateSig(signature) });
|
|
157
171
|
}
|
|
158
172
|
return out;
|
|
@@ -165,8 +179,8 @@ const EXTRACTORS = {
|
|
|
165
179
|
while ((m = re.exec(src))) {
|
|
166
180
|
const kind = m[1];
|
|
167
181
|
const name = m[2];
|
|
168
|
-
const rest = (m[3] ||
|
|
169
|
-
const signature = `${kind} ${name}${rest ?
|
|
182
|
+
const rest = (m[3] || "").trim();
|
|
183
|
+
const signature = `${kind} ${name}${rest ? " " + rest : ""}`.trim();
|
|
170
184
|
out.push({ kind, name, signature: truncateSig(signature) });
|
|
171
185
|
}
|
|
172
186
|
return out;
|
|
@@ -179,8 +193,8 @@ const EXTRACTORS = {
|
|
|
179
193
|
while ((m = re.exec(src))) {
|
|
180
194
|
const kind = m[1];
|
|
181
195
|
const name = m[2];
|
|
182
|
-
const rest = (m[3] ||
|
|
183
|
-
const signature = `export ${kind} ${name}${rest ?
|
|
196
|
+
const rest = (m[3] || "").trim();
|
|
197
|
+
const signature = `export ${kind} ${name}${rest ? " " + rest : ""}`.trim();
|
|
184
198
|
out.push({ kind, name, signature: truncateSig(signature) });
|
|
185
199
|
}
|
|
186
200
|
return out;
|
|
@@ -188,13 +202,12 @@ const EXTRACTORS = {
|
|
|
188
202
|
js: (src) => EXTRACTORS.ts(src),
|
|
189
203
|
python: (src) => {
|
|
190
204
|
const out = [];
|
|
191
|
-
const re =
|
|
192
|
-
/^(?:\s{0,4})(?:async\s+)?(class|def)\s+([A-Za-z_][A-Za-z0-9_]*)(\([^)]*\))?/gm;
|
|
205
|
+
const re = /^(?:\s{0,4})(?:async\s+)?(class|def)\s+([A-Za-z_][A-Za-z0-9_]*)(\([^)]*\))?/gm;
|
|
193
206
|
let m;
|
|
194
207
|
while ((m = re.exec(src))) {
|
|
195
208
|
const kind = m[1];
|
|
196
209
|
const name = m[2];
|
|
197
|
-
const rest = (m[3] ||
|
|
210
|
+
const rest = (m[3] || "").trim();
|
|
198
211
|
const signature = `${kind} ${name}${rest}`.trim();
|
|
199
212
|
out.push({ kind, name, signature: truncateSig(signature) });
|
|
200
213
|
}
|
|
@@ -207,15 +220,15 @@ const EXTRACTORS = {
|
|
|
207
220
|
let m;
|
|
208
221
|
while ((m = re.exec(src))) {
|
|
209
222
|
const name = m[1];
|
|
210
|
-
out.push({ kind:
|
|
223
|
+
out.push({ kind: "fn", name, signature: `${name}()` });
|
|
211
224
|
}
|
|
212
225
|
return out;
|
|
213
226
|
},
|
|
214
227
|
};
|
|
215
228
|
|
|
216
229
|
function truncateSig(s, max = 100) {
|
|
217
|
-
s = s.replace(/\s+/g,
|
|
218
|
-
return s.length > max ? s.slice(0, max - 1) +
|
|
230
|
+
s = s.replace(/\s+/g, " ").trim();
|
|
231
|
+
return s.length > max ? s.slice(0, max - 1) + "..." : s;
|
|
219
232
|
}
|
|
220
233
|
|
|
221
234
|
// ---- Pipeline --------------------------------------------------------------
|
|
@@ -228,8 +241,8 @@ async function buildMap(args) {
|
|
|
228
241
|
const files = await walk(args.root, args);
|
|
229
242
|
if (args.verbose) console.error(`repo-map: scanned ${files.length} source files`);
|
|
230
243
|
if (files.length === 0) {
|
|
231
|
-
if (args.format ===
|
|
232
|
-
else console.log(
|
|
244
|
+
if (args.format === "json") console.log("[]");
|
|
245
|
+
else console.log("");
|
|
233
246
|
return;
|
|
234
247
|
}
|
|
235
248
|
|
|
@@ -239,7 +252,7 @@ async function buildMap(args) {
|
|
|
239
252
|
for (const f of files) {
|
|
240
253
|
let src;
|
|
241
254
|
try {
|
|
242
|
-
src = await fs.readFile(f.abs,
|
|
255
|
+
src = await fs.readFile(f.abs, "utf8");
|
|
243
256
|
} catch {
|
|
244
257
|
continue;
|
|
245
258
|
}
|
|
@@ -266,16 +279,49 @@ async function buildMap(args) {
|
|
|
266
279
|
|
|
267
280
|
// Hard stop-list for sub-3-char + universally-shared shell helpers.
|
|
268
281
|
const STOP_IDENTIFIERS = new Set([
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
282
|
+
"init",
|
|
283
|
+
"main",
|
|
284
|
+
"run",
|
|
285
|
+
"start",
|
|
286
|
+
"stop",
|
|
287
|
+
"pass",
|
|
288
|
+
"fail",
|
|
289
|
+
"warn",
|
|
290
|
+
"need",
|
|
291
|
+
"check",
|
|
292
|
+
"log",
|
|
293
|
+
"set",
|
|
294
|
+
"get",
|
|
295
|
+
"add",
|
|
296
|
+
"new",
|
|
297
|
+
"fix",
|
|
298
|
+
"has",
|
|
299
|
+
"is",
|
|
300
|
+
"on",
|
|
301
|
+
"self",
|
|
302
|
+
"this",
|
|
303
|
+
"next",
|
|
304
|
+
"prev",
|
|
305
|
+
"data",
|
|
306
|
+
"item",
|
|
307
|
+
"name",
|
|
308
|
+
"type",
|
|
309
|
+
"value",
|
|
310
|
+
"count",
|
|
311
|
+
"list",
|
|
312
|
+
"map",
|
|
313
|
+
"each",
|
|
314
|
+
"reduce",
|
|
315
|
+
"true",
|
|
316
|
+
"false",
|
|
317
|
+
"null",
|
|
318
|
+
"undefined",
|
|
273
319
|
]);
|
|
274
320
|
|
|
275
321
|
for (const f of files) {
|
|
276
322
|
let src;
|
|
277
323
|
try {
|
|
278
|
-
src = await fs.readFile(f.abs,
|
|
324
|
+
src = await fs.readFile(f.abs, "utf8");
|
|
279
325
|
} catch {
|
|
280
326
|
continue;
|
|
281
327
|
}
|
|
@@ -283,7 +329,7 @@ async function buildMap(args) {
|
|
|
283
329
|
if (name.length < 3) continue;
|
|
284
330
|
if (STOP_IDENTIFIERS.has(name.toLowerCase())) continue;
|
|
285
331
|
if (owners.size === 1 && owners.has(f.path)) continue;
|
|
286
|
-
const re = new RegExp(`\\b${escapeRe(name)}\\b`,
|
|
332
|
+
const re = new RegExp(`\\b${escapeRe(name)}\\b`, "g");
|
|
287
333
|
const matches = src.match(re);
|
|
288
334
|
if (!matches) continue;
|
|
289
335
|
// TF-IDF: credit per occurrence is divided by the number of owners.
|
|
@@ -313,7 +359,7 @@ async function buildMap(args) {
|
|
|
313
359
|
ranks.sort((a, b) => b.score - a.score);
|
|
314
360
|
const top = ranks.slice(0, args.top);
|
|
315
361
|
|
|
316
|
-
if (args.format ===
|
|
362
|
+
if (args.format === "json") {
|
|
317
363
|
const obj = top.map((r) => ({
|
|
318
364
|
path: r.path,
|
|
319
365
|
lang: r.lang,
|
|
@@ -329,7 +375,7 @@ async function buildMap(args) {
|
|
|
329
375
|
const charBudget = args.budget * 4;
|
|
330
376
|
const header = `# Repo Map (top ${args.top}, budget ${args.budget} tokens)\n`;
|
|
331
377
|
let used = header.length;
|
|
332
|
-
let out = header +
|
|
378
|
+
let out = header + "\n";
|
|
333
379
|
let printed = 0;
|
|
334
380
|
|
|
335
381
|
for (const r of top) {
|
|
@@ -338,16 +384,16 @@ async function buildMap(args) {
|
|
|
338
384
|
const block =
|
|
339
385
|
`## ${r.path} [rank ${r.normScore.toFixed(3)}, in_refs ${r.ins}]\n` +
|
|
340
386
|
(filteredDecls.length === 0
|
|
341
|
-
?
|
|
342
|
-
: filteredDecls.map((d) => `- ${d.signature}`).join(
|
|
343
|
-
|
|
387
|
+
? "_no top-level declarations extracted_\n"
|
|
388
|
+
: filteredDecls.map((d) => `- ${d.signature}`).join("\n") + "\n") +
|
|
389
|
+
"\n";
|
|
344
390
|
if (used + block.length > charBudget && printed > 0) break;
|
|
345
391
|
out += block;
|
|
346
392
|
used += block.length;
|
|
347
393
|
printed += 1;
|
|
348
394
|
}
|
|
349
395
|
if (printed === 0) {
|
|
350
|
-
out +=
|
|
396
|
+
out += "_no files extracted within budget_\n";
|
|
351
397
|
} else if (printed < top.length) {
|
|
352
398
|
out += `_truncated to ${printed} files (token budget)_\n`;
|
|
353
399
|
}
|
|
@@ -355,13 +401,13 @@ async function buildMap(args) {
|
|
|
355
401
|
}
|
|
356
402
|
|
|
357
403
|
function escapeRe(s) {
|
|
358
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g,
|
|
404
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
359
405
|
}
|
|
360
406
|
|
|
361
407
|
// ---- Main ------------------------------------------------------------------
|
|
362
408
|
|
|
363
409
|
const args = parseArgs(process.argv);
|
|
364
410
|
buildMap(args).catch((err) => {
|
|
365
|
-
console.error(
|
|
411
|
+
console.error("repo-map: fatal - ", err.message);
|
|
366
412
|
process.exit(1);
|
|
367
413
|
});
|
|
@@ -63,7 +63,13 @@ function main() {
|
|
|
63
63
|
try {
|
|
64
64
|
report = JSON.parse(readInput());
|
|
65
65
|
} catch {
|
|
66
|
-
emit({
|
|
66
|
+
emit({
|
|
67
|
+
scope: "full",
|
|
68
|
+
reason: "no-risk-data-fail-safe",
|
|
69
|
+
churn: null,
|
|
70
|
+
maxScore: null,
|
|
71
|
+
blockers: [],
|
|
72
|
+
});
|
|
67
73
|
return;
|
|
68
74
|
}
|
|
69
75
|
|
|
@@ -25,14 +25,7 @@
|
|
|
25
25
|
//
|
|
26
26
|
// Exit: 0 ok, 1 error (validation / collision / not-found), 64 usage.
|
|
27
27
|
|
|
28
|
-
import {
|
|
29
|
-
existsSync,
|
|
30
|
-
readFileSync,
|
|
31
|
-
writeFileSync,
|
|
32
|
-
mkdirSync,
|
|
33
|
-
rmSync,
|
|
34
|
-
renameSync,
|
|
35
|
-
} from "node:fs";
|
|
28
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, renameSync } from "node:fs";
|
|
36
29
|
import { join, dirname } from "node:path";
|
|
37
30
|
|
|
38
31
|
const NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
|
|
@@ -200,7 +193,9 @@ function cmdRemove(home, name) {
|
|
|
200
193
|
prefs.global.routines = routines;
|
|
201
194
|
writePrefs(home, prefs);
|
|
202
195
|
}
|
|
203
|
-
console.log(
|
|
196
|
+
console.log(
|
|
197
|
+
`routine-registry: removed "${name}" (clears from autocomplete on next session reload)`,
|
|
198
|
+
);
|
|
204
199
|
}
|
|
205
200
|
|
|
206
201
|
function main() {
|
|
@@ -120,7 +120,9 @@ function loadCostTable() {
|
|
|
120
120
|
const path = flags["cost-table"] || join(__dirname, "cost-table.json");
|
|
121
121
|
const tbl = loadJson(path);
|
|
122
122
|
if (!tbl?.prices) {
|
|
123
|
-
process.stderr.write(
|
|
123
|
+
process.stderr.write(
|
|
124
|
+
`run-aggregator: cost table missing or malformed at ${path}, costs will be 0\n`,
|
|
125
|
+
);
|
|
124
126
|
return { prices: {} };
|
|
125
127
|
}
|
|
126
128
|
return tbl;
|
|
@@ -211,8 +213,8 @@ for (const phase of tracker.phases || []) {
|
|
|
211
213
|
phase.status === "completed"
|
|
212
214
|
? "phase.complete"
|
|
213
215
|
: phase.status === "failed"
|
|
214
|
-
|
|
215
|
-
|
|
216
|
+
? "phase.failed"
|
|
217
|
+
: "phase.transition";
|
|
216
218
|
events.push({
|
|
217
219
|
kind: eventKind,
|
|
218
220
|
ts: phase.completed_at,
|
|
@@ -262,7 +264,9 @@ const lastTs =
|
|
|
262
264
|
.filter((e) => e.kind.startsWith("phase.complete") || e.kind === "phase.failed")
|
|
263
265
|
.map((e) => e.ts)
|
|
264
266
|
.sort()
|
|
265
|
-
.pop() ||
|
|
267
|
+
.pop() ||
|
|
268
|
+
tracker.started_at ||
|
|
269
|
+
"";
|
|
266
270
|
|
|
267
271
|
events.push({
|
|
268
272
|
kind: "run.end",
|
|
@@ -286,7 +290,9 @@ const summary = {
|
|
|
286
290
|
};
|
|
287
291
|
|
|
288
292
|
// ─────────────────────────────────────────────────────────────────────────
|
|
289
|
-
const outLines = (flags["summary-only"] ? [summary] : [...events, summary]).map((e) =>
|
|
293
|
+
const outLines = (flags["summary-only"] ? [summary] : [...events, summary]).map((e) =>
|
|
294
|
+
JSON.stringify(e),
|
|
295
|
+
);
|
|
290
296
|
const outContent = outLines.join("\n") + "\n";
|
|
291
297
|
|
|
292
298
|
if (flags.stdout) {
|
|
@@ -48,7 +48,9 @@ try {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
let state;
|
|
51
|
-
try {
|
|
51
|
+
try {
|
|
52
|
+
state = JSON.parse(raw);
|
|
53
|
+
} catch (e) {
|
|
52
54
|
console.error(`run-metrics: bad JSON: ${e.message}`);
|
|
53
55
|
process.exit(2);
|
|
54
56
|
}
|
|
@@ -58,7 +60,7 @@ try { state = JSON.parse(raw); } catch (e) {
|
|
|
58
60
|
const iterations = Array.isArray(state.reviewIterations)
|
|
59
61
|
? state.reviewIterations.filter((it) => it && typeof it === "object")
|
|
60
62
|
: [];
|
|
61
|
-
const lastTriage = iterations.length ?
|
|
63
|
+
const lastTriage = iterations.length ? iterations[iterations.length - 1].triage || {} : {};
|
|
62
64
|
|
|
63
65
|
const accepted = Array.isArray(lastTriage.accepted) ? lastTriage.accepted : [];
|
|
64
66
|
const deferred = Array.isArray(lastTriage.deferred) ? lastTriage.deferred : [];
|
|
@@ -78,18 +80,21 @@ let rawFindings = 0;
|
|
|
78
80
|
let acceptedAll = 0;
|
|
79
81
|
let classifiedAll = 0;
|
|
80
82
|
for (const it of iterations) {
|
|
81
|
-
for (const r of
|
|
83
|
+
for (const r of Array.isArray(it.reviewers) ? it.reviewers : []) {
|
|
82
84
|
rawFindings += Array.isArray(r?.findings) ? r.findings.length : 0;
|
|
83
85
|
}
|
|
84
86
|
const t = it.triage || {};
|
|
85
87
|
acceptedAll += Array.isArray(t.accepted) ? t.accepted.length : 0;
|
|
86
|
-
classifiedAll +=
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
classifiedAll +=
|
|
89
|
+
(Array.isArray(t.accepted) ? t.accepted.length : 0) +
|
|
90
|
+
(Array.isArray(t.deferred) ? t.deferred.length : 0) +
|
|
91
|
+
(Array.isArray(t.rejected) ? t.rejected.length : 0);
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
// Build outcome across repos (multi-repo aware).
|
|
92
|
-
const projects = Array.isArray(state.projects)
|
|
95
|
+
const projects = Array.isArray(state.projects)
|
|
96
|
+
? state.projects.filter((p) => p && typeof p === "object")
|
|
97
|
+
: [];
|
|
93
98
|
let buildPassed = null;
|
|
94
99
|
if (projects.length) {
|
|
95
100
|
buildPassed = projects.every((p) => {
|
|
@@ -100,7 +105,7 @@ if (projects.length) {
|
|
|
100
105
|
});
|
|
101
106
|
} else if (state.buildStatus !== undefined) {
|
|
102
107
|
const b = state.buildStatus;
|
|
103
|
-
buildPassed = typeof b === "string" ? b === "passed" :
|
|
108
|
+
buildPassed = typeof b === "string" ? b === "passed" : b && b.ok === true;
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
const metrics = {
|
|
@@ -190,22 +190,36 @@ fi
|
|
|
190
190
|
# (the orchestrator dispatches per the doc), so lock the CONTRACT here against
|
|
191
191
|
# drift across the phase doc, the schema, and the consensus block.
|
|
192
192
|
echo "→ reviewer-count contract (Claude=2, Copilot=3)"
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
193
|
+
# `/multi-agent:update` runs this smoke on the user's machine, where the tree is
|
|
194
|
+
# ~/.claude/{schemas,multi-agent-refs} and NOT <root>/pipeline/*. Resolving the
|
|
195
|
+
# root by hand here reported three phantom failures in an install, which reads as
|
|
196
|
+
# a broken installation. _smoke-root.sh handles both layouts.
|
|
197
|
+
# shellcheck source=pipeline/scripts/_smoke-root.sh
|
|
198
|
+
. "$(dirname "${BASH_SOURCE[0]}")/_smoke-root.sh"
|
|
199
|
+
P4="${MA_REFS:+$MA_REFS/phases/phase-4-review.md}"
|
|
200
|
+
REVSCHEMA="${MA_SCHEMAS:+$MA_SCHEMAS/reviewer-output.schema.json}"
|
|
201
|
+
TRSCHEMA="${MA_SCHEMAS:+$MA_SCHEMAS/triage-output.schema.json}"
|
|
202
|
+
|
|
203
|
+
if [ -z "$P4" ] || [ ! -f "$P4" ]; then
|
|
204
|
+
echo " ↷ SKIP: phase-4-review.md not present in this $MA_LAYOUT layout"
|
|
205
|
+
elif grep -qiE "Claude Code (dispatches|=|:) ?2|2-model" "$P4" && grep -qiE "Copilot CLI (dispatches|=|:) ?3|3-model" "$P4"; then
|
|
198
206
|
pass "phase-4-review declares Claude=2 / Copilot=3 reviewers"
|
|
199
207
|
else
|
|
200
208
|
fail "phase-4-review does not declare the CLI-aware reviewer count"
|
|
201
209
|
fi
|
|
202
|
-
|
|
210
|
+
|
|
211
|
+
if [ -z "$REVSCHEMA" ] || [ ! -f "$REVSCHEMA" ]; then
|
|
212
|
+
echo " ↷ SKIP: reviewer-output.schema.json not present in this $MA_LAYOUT layout"
|
|
213
|
+
elif grep -qi "Copilot CLI" "$REVSCHEMA" && grep -qi "Claude" "$REVSCHEMA"; then
|
|
203
214
|
pass "reviewer-output schema notes the CLI-aware reviewer set"
|
|
204
215
|
else
|
|
205
216
|
fail "reviewer-output schema missing the CLI-aware note"
|
|
206
217
|
fi
|
|
218
|
+
|
|
207
219
|
# consensus.reviewerCount must accommodate both 2 and 3 (min 1, no max < 3)
|
|
208
|
-
if
|
|
220
|
+
if [ -z "$TRSCHEMA" ] || [ ! -f "$TRSCHEMA" ]; then
|
|
221
|
+
echo " ↷ SKIP: triage-output.schema.json not present in this $MA_LAYOUT layout"
|
|
222
|
+
elif grep -q '"reviewerCount"' "$TRSCHEMA" && grep -qi "Claude Code = 2, Copilot CLI = 3" "$TRSCHEMA"; then
|
|
209
223
|
pass "triage consensus.reviewerCount documents 2 (Claude) and 3 (Copilot)"
|
|
210
224
|
else
|
|
211
225
|
fail "triage consensus.reviewerCount does not document the 2/3 split"
|
|
@@ -90,11 +90,20 @@ function git(args) {
|
|
|
90
90
|
|
|
91
91
|
function resolveBase() {
|
|
92
92
|
if (BASE) return BASE;
|
|
93
|
-
for (const ref of [
|
|
93
|
+
for (const ref of [
|
|
94
|
+
"origin/main",
|
|
95
|
+
"main",
|
|
96
|
+
"origin/master",
|
|
97
|
+
"master",
|
|
98
|
+
"develop",
|
|
99
|
+
"origin/develop",
|
|
100
|
+
]) {
|
|
94
101
|
try {
|
|
95
102
|
execFileSync("git", ["-C", ROOT, "rev-parse", "--verify", ref], { stdio: "ignore" });
|
|
96
103
|
return ref;
|
|
97
|
-
} catch {
|
|
104
|
+
} catch {
|
|
105
|
+
/* continue */
|
|
106
|
+
}
|
|
98
107
|
}
|
|
99
108
|
throw new Error("no base ref found");
|
|
100
109
|
}
|
|
@@ -133,9 +142,15 @@ function isExcluded(path) {
|
|
|
133
142
|
}
|
|
134
143
|
|
|
135
144
|
function isTestPath(path) {
|
|
136
|
-
if (Array.isArray(rules.testPathSuffixes) && rules.testPathSuffixes.some((s) => path.endsWith(s)))
|
|
137
|
-
|
|
138
|
-
if (
|
|
145
|
+
if (Array.isArray(rules.testPathSuffixes) && rules.testPathSuffixes.some((s) => path.endsWith(s)))
|
|
146
|
+
return true;
|
|
147
|
+
if (
|
|
148
|
+
Array.isArray(rules.testPathPrefixes) &&
|
|
149
|
+
rules.testPathPrefixes.some((p) => basename(path).startsWith(p))
|
|
150
|
+
)
|
|
151
|
+
return true;
|
|
152
|
+
if (Array.isArray(rules.testPathContains) && rules.testPathContains.some((c) => path.includes(c)))
|
|
153
|
+
return true;
|
|
139
154
|
return false;
|
|
140
155
|
}
|
|
141
156
|
|
|
@@ -227,8 +242,11 @@ function scanTreeForTests() {
|
|
|
227
242
|
if (!SCAN_TREE) return hits;
|
|
228
243
|
const visit = (dir) => {
|
|
229
244
|
let entries;
|
|
230
|
-
try {
|
|
231
|
-
|
|
245
|
+
try {
|
|
246
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
247
|
+
} catch {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
232
250
|
for (const ent of entries) {
|
|
233
251
|
const full = join(dir, ent.name);
|
|
234
252
|
const rel = full.replace(ROOT + "/", "");
|
|
@@ -238,7 +256,11 @@ function scanTreeForTests() {
|
|
|
238
256
|
visit(full);
|
|
239
257
|
} else if (ent.isFile() && isTestPath(rel)) {
|
|
240
258
|
let body;
|
|
241
|
-
try {
|
|
259
|
+
try {
|
|
260
|
+
body = readFileSync(full, "utf8");
|
|
261
|
+
} catch {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
242
264
|
// crude symbol mention: any Identifier-ish token. Cap body size.
|
|
243
265
|
const slice = body.slice(0, 400_000);
|
|
244
266
|
const tokens = slice.match(/[A-Za-z_][A-Za-z0-9_]{2,}/g) || [];
|
|
@@ -258,7 +280,14 @@ function severityFor(symbol, kind) {
|
|
|
258
280
|
// Public API additions without tests are important; pure boolean exports
|
|
259
281
|
// (e.g. const FLAG = true) tend to be suggestion-tier.
|
|
260
282
|
if (kind === "objc_export" || kind === "interface" || kind === "public_proto") return "important";
|
|
261
|
-
if (
|
|
283
|
+
if (
|
|
284
|
+
kind.startsWith("public_") ||
|
|
285
|
+
kind === "open_class" ||
|
|
286
|
+
kind === "open_fun" ||
|
|
287
|
+
kind === "named_export" ||
|
|
288
|
+
kind === "default_export"
|
|
289
|
+
)
|
|
290
|
+
return "suggestion";
|
|
262
291
|
if (kind === "view_struct" || kind === "config_struct") return "important";
|
|
263
292
|
if (kind === "composable_fun") return "important";
|
|
264
293
|
if (kind === "top_def" || kind === "top_class" || kind === "async_def") return "suggestion";
|
|
@@ -272,7 +301,10 @@ function symbolMentionedInTest(diffText, symbol) {
|
|
|
272
301
|
let inTestFile = false;
|
|
273
302
|
for (const line of lines) {
|
|
274
303
|
const fm = line.match(/^diff --git a\/(.+?) b\/(.+)$/);
|
|
275
|
-
if (fm) {
|
|
304
|
+
if (fm) {
|
|
305
|
+
inTestFile = isTestPath(fm[2]);
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
276
308
|
if (!inTestFile) continue;
|
|
277
309
|
if (!line.startsWith("+")) continue;
|
|
278
310
|
if (re.test(line)) return true;
|
|
@@ -327,8 +359,8 @@ function main() {
|
|
|
327
359
|
testsScanned: tests.length,
|
|
328
360
|
gapCount: gaps.length,
|
|
329
361
|
gapBySeverity: {
|
|
330
|
-
blocking:
|
|
331
|
-
important:
|
|
362
|
+
blocking: gaps.filter((g) => g.severity === "blocking").length,
|
|
363
|
+
important: gaps.filter((g) => g.severity === "important").length,
|
|
332
364
|
suggestion: gaps.filter((g) => g.severity === "suggestion").length,
|
|
333
365
|
},
|
|
334
366
|
};
|
|
@@ -76,7 +76,11 @@ function main() {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
process.stdout.write(
|
|
79
|
-
JSON.stringify(
|
|
79
|
+
JSON.stringify(
|
|
80
|
+
{ schemaVersion: "1.0.0", count: findings.length, findings },
|
|
81
|
+
null,
|
|
82
|
+
PRETTY ? 2 : 0,
|
|
83
|
+
),
|
|
80
84
|
);
|
|
81
85
|
}
|
|
82
86
|
|