@mmerterden/multi-agent-pipeline 8.6.2 → 10.2.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 +660 -2483
- package/README.md +100 -101
- package/docs/features.md +1 -1
- package/index.js +8 -10
- package/install/_adapters.mjs +5 -1
- package/install/_common.mjs +63 -0
- package/install/claude.mjs +14 -14
- package/install/copilot.mjs +14 -8
- package/install/index.mjs +85 -19
- package/install/templates/claude-hooks.json +18 -0
- package/install/templates/copilot-instructions.md +3 -3
- package/package.json +21 -6
- package/pipeline/adapters/_base.mjs +366 -14
- package/pipeline/adapters/antigravity.mjs +140 -0
- package/pipeline/adapters/codex.mjs +159 -0
- package/pipeline/adapters/copilot-chat-orchestration.mjs +148 -0
- package/pipeline/adapters/copilot-chat.mjs +34 -68
- package/pipeline/adapters/cursor-orchestration.mjs +152 -0
- package/pipeline/adapters/cursor.mjs +49 -90
- package/pipeline/agents/android-architect.md +3 -3
- package/pipeline/agents/backend-architect.md +2 -2
- package/pipeline/agents/code-reviewer.md +8 -8
- package/pipeline/agents/dev-critic.md +17 -17
- package/pipeline/agents/explorer.md +3 -3
- package/pipeline/agents/ios-architect.md +2 -2
- package/pipeline/agents/security-auditor.md +10 -10
- package/pipeline/agents/task-clarifier.md +18 -18
- package/pipeline/claude-md-template.md +3 -3
- package/pipeline/commands/archive-guard.md +3 -3
- package/pipeline/commands/figma-to-swiftui.md +10 -10
- package/pipeline/commands/multi-agent/_account-picker.md +12 -8
- package/pipeline/commands/multi-agent/_dev-context.md +15 -15
- package/pipeline/commands/multi-agent/_input-parser.md +4 -4
- package/pipeline/commands/multi-agent/_repo-picker.md +9 -9
- package/pipeline/commands/multi-agent/analysis-resolve.md +129 -0
- package/pipeline/commands/multi-agent/analysis.md +667 -0
- package/pipeline/commands/multi-agent/autopilot.md +22 -22
- package/pipeline/commands/multi-agent/build-optimize.md +77 -0
- package/pipeline/commands/multi-agent/channels.md +96 -96
- package/pipeline/commands/multi-agent/delete.md +19 -17
- package/pipeline/commands/multi-agent/dev-autopilot.md +20 -20
- package/pipeline/commands/multi-agent/dev-local-autopilot.md +22 -22
- package/pipeline/commands/multi-agent/dev-local.md +23 -20
- package/pipeline/commands/multi-agent/dev.md +43 -43
- package/pipeline/commands/multi-agent/diff-explain.md +4 -4
- package/pipeline/commands/multi-agent/garbage-collect.md +58 -0
- package/pipeline/commands/multi-agent/help.md +65 -56
- package/pipeline/commands/multi-agent/issue.md +3 -3
- package/pipeline/commands/multi-agent/jira.md +12 -12
- package/pipeline/commands/multi-agent/kill.md +6 -6
- package/pipeline/commands/multi-agent/language.md +12 -12
- package/pipeline/commands/multi-agent/local-autopilot.md +34 -34
- package/pipeline/commands/multi-agent/local.md +24 -25
- package/pipeline/commands/multi-agent/log.md +6 -6
- package/pipeline/commands/multi-agent/manual-test.md +3 -3
- package/pipeline/commands/multi-agent/prune-logs.md +60 -0
- package/pipeline/commands/multi-agent/purge.md +10 -7
- package/pipeline/commands/multi-agent/refactor.md +9 -9
- package/pipeline/commands/multi-agent/refs/analysis-template.md +1062 -0
- package/pipeline/commands/multi-agent/refs/android-guide.md +15 -13
- package/pipeline/commands/multi-agent/refs/audit-guide.md +20 -20
- package/pipeline/commands/multi-agent/refs/backend-guide.md +9 -9
- package/pipeline/commands/multi-agent/refs/channels/confluence.md +17 -17
- package/pipeline/commands/multi-agent/refs/channels/issue-comment.md +30 -30
- package/pipeline/commands/multi-agent/refs/channels/jira.md +16 -15
- package/pipeline/commands/multi-agent/refs/channels/pr-review-actions.md +19 -17
- package/pipeline/commands/multi-agent/refs/channels/pr.md +22 -22
- package/pipeline/commands/multi-agent/refs/channels/wiki.md +19 -19
- package/pipeline/commands/multi-agent/refs/component-dispatch.md +11 -11
- package/pipeline/commands/multi-agent/refs/conventions-defaults.md +179 -0
- package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +41 -35
- package/pipeline/commands/multi-agent/refs/features/dev-critic.md +5 -5
- package/pipeline/commands/multi-agent/refs/features/external-context-injection.md +6 -6
- package/pipeline/commands/multi-agent/refs/features/model-fallback.md +91 -0
- package/pipeline/commands/multi-agent/refs/features/plan-todos.md +1 -1
- package/pipeline/commands/multi-agent/refs/features/prior-fix-detection.md +4 -4
- package/pipeline/commands/multi-agent/refs/features/repo-map.md +6 -6
- package/pipeline/commands/multi-agent/refs/features/shadow-git.md +2 -2
- package/pipeline/commands/multi-agent/refs/frontend-guide.md +16 -16
- package/pipeline/commands/multi-agent/refs/issue-jira-triad.md +18 -18
- package/pipeline/commands/multi-agent/refs/keychain.md +18 -8
- package/pipeline/commands/multi-agent/refs/knowledge.md +9 -9
- package/pipeline/commands/multi-agent/refs/multi-repo-integration-build.md +19 -19
- package/pipeline/commands/multi-agent/refs/phases/log-format.md +29 -9
- package/pipeline/commands/multi-agent/refs/phases/modes.md +33 -33
- package/pipeline/commands/multi-agent/refs/phases/operations.md +24 -14
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +107 -57
- package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +65 -29
- package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +114 -62
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +99 -36
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +181 -62
- package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +33 -18
- package/pipeline/commands/multi-agent/refs/phases/phase-6-commit.md +45 -43
- package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +54 -28
- package/pipeline/commands/multi-agent/refs/phases.md +17 -17
- package/pipeline/commands/multi-agent/refs/picker-contract.md +65 -0
- package/pipeline/commands/multi-agent/refs/progress-contract.md +37 -21
- package/pipeline/commands/multi-agent/refs/rules.md +83 -25
- package/pipeline/commands/multi-agent/refs/swiftui-guide.md +32 -30
- package/pipeline/commands/multi-agent/refs/tracker-contract.md +54 -30
- package/pipeline/commands/multi-agent/refs/wiki-capture.md +36 -33
- package/pipeline/commands/multi-agent/resume.md +12 -9
- package/pipeline/commands/multi-agent/review.md +24 -24
- package/pipeline/commands/multi-agent/scan.md +10 -10
- package/pipeline/commands/multi-agent/search.md +8 -8
- package/pipeline/commands/multi-agent/setup.md +111 -84
- package/pipeline/commands/multi-agent/stack.md +5 -5
- package/pipeline/commands/multi-agent/status.md +5 -5
- package/pipeline/commands/multi-agent/sync.md +123 -111
- package/pipeline/commands/multi-agent/test.md +6 -6
- package/pipeline/commands/multi-agent/update.md +1 -1
- package/pipeline/commands/multi-agent.md +64 -58
- package/pipeline/commands/sim-test.md +14 -14
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +1 -1
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +2 -2
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +2 -2
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +1 -1
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +2 -2
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +3 -3
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +4 -4
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +1 -1
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +1 -1
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +42 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +20 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +15 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +12 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +40 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +20 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +15 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +12 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +42 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +28 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +27 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +12 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +41 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +12 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +6 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +12 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +42 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +28 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +27 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +12 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +25 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +31 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +12 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +18 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +12 -0
- package/pipeline/eval/golden-tasks/README.md +14 -14
- package/pipeline/eval/intent-cases.json +40 -0
- package/pipeline/eval/run-metrics-fixture.json +46 -0
- package/pipeline/eval/triage/01-empty-findings/notes.md +1 -1
- package/pipeline/eval/triage/02-real-blocker/notes.md +2 -2
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +1 -1
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +1 -1
- package/pipeline/eval/triage/05-mixed-classification/notes.md +2 -2
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +2 -2
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +1 -1
- package/pipeline/eval/triage/08-style-misclassified/notes.md +1 -1
- package/pipeline/eval/triage/09-cascading-finding/notes.md +2 -2
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +2 -2
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +3 -3
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +2 -2
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +5 -5
- package/pipeline/eval/triage/README.md +4 -4
- package/pipeline/lib/account-resolver.sh +3 -3
- package/pipeline/lib/ask-choice.sh +98 -0
- package/pipeline/lib/channels-multi-repo.sh +3 -3
- package/pipeline/lib/classify-intent.sh +110 -0
- package/pipeline/lib/context-link-extractor.sh +3 -3
- package/pipeline/lib/credential-store-resolver.sh +3 -3
- package/pipeline/lib/credential-store.sh +9 -5
- package/pipeline/lib/extract-conventions.sh +1034 -0
- package/pipeline/lib/fetch-confluence.sh +5 -5
- package/pipeline/lib/fetch-crashlytics.sh +7 -7
- package/pipeline/lib/fetch-fortify.sh +6 -22
- package/pipeline/lib/fetch-swagger.sh +6 -6
- package/pipeline/lib/figma-screenshot.sh +536 -0
- package/pipeline/lib/issue-fetcher.sh +46 -20
- package/pipeline/lib/md2confluence-v3.py +1076 -0
- package/pipeline/lib/multi-repo-pipeline.sh +13 -22
- package/pipeline/lib/plan-todos.sh +7 -7
- package/pipeline/lib/post-pr-review.sh +53 -21
- package/pipeline/lib/repo-cache.sh +5 -5
- package/pipeline/lib/review-watch.sh +17 -13
- package/pipeline/lib/shadow-git.sh +7 -7
- package/pipeline/lib/submodule-detector.sh +3 -3
- package/pipeline/lib/vercel-deploy.sh +28 -15
- package/pipeline/preferences-template.json +28 -4
- package/pipeline/rules/app-store-guidelines.md +2 -2
- package/pipeline/rules/code-style.md +6 -6
- package/pipeline/rules/figma-pipeline.md +100 -2
- package/pipeline/rules/kotlin-android.md +8 -8
- package/pipeline/rules/security.md +4 -4
- package/pipeline/rules/tdd.md +1 -1
- package/pipeline/rules/testing.md +5 -5
- package/pipeline/schemas/agent-state.schema.json +63 -20
- package/pipeline/schemas/analysis-output.schema.json +7 -2
- package/pipeline/schemas/analysis-spec.schema.json +484 -0
- package/pipeline/schemas/clarify-output.schema.json +5 -5
- package/pipeline/schemas/conventions-output.schema.json +70 -0
- package/pipeline/schemas/dev-critic-output.schema.json +2 -2
- package/pipeline/schemas/diff-risk.schema.json +3 -3
- package/pipeline/schemas/figma-project-config.schema.json +42 -3
- package/pipeline/schemas/learnings-ledger.schema.json +39 -0
- package/pipeline/schemas/migrations/README.md +2 -2
- package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +5 -5
- package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +3 -3
- package/pipeline/schemas/migrations/prefs-2.1.0-to-2.2.0.mjs +4 -4
- package/pipeline/schemas/migrations/prefs-2.2.0-to-2.3.0.mjs +5 -5
- package/pipeline/schemas/migrations/state-2.0.0-to-2.1.0.mjs +3 -3
- package/pipeline/schemas/plan-todos.schema.json +4 -4
- package/pipeline/schemas/planning-output.schema.json +3 -3
- package/pipeline/schemas/prefs.schema.json +95 -11
- package/pipeline/schemas/reviewer-output.schema.json +7 -3
- package/pipeline/schemas/test-gap.schema.json +1 -1
- package/pipeline/schemas/token-budget.json +8 -8
- package/pipeline/schemas/triage-corpus.schema.json +1 -1
- package/pipeline/schemas/triage-output.schema.json +44 -6
- package/pipeline/scripts/README.md +64 -64
- package/pipeline/scripts/aggregate-metrics.mjs +55 -16
- package/pipeline/scripts/audit-log-rotate.sh +3 -3
- package/pipeline/scripts/audit-log.sh +20 -7
- package/pipeline/scripts/benchmark-phase-0.sh +6 -6
- package/pipeline/scripts/build-skills-index.mjs +15 -15
- package/pipeline/scripts/check-md-links.mjs +59 -0
- package/pipeline/scripts/classify-plan-safety.mjs +24 -18
- package/pipeline/scripts/cost-budget-check.mjs +160 -0
- package/pipeline/scripts/cost-table.json +17 -13
- package/pipeline/scripts/diff-explain.mjs +12 -12
- package/pipeline/scripts/diff-risk-score.mjs +18 -17
- package/pipeline/scripts/eval-golden-tasks-live.mjs +13 -10
- package/pipeline/scripts/eval-golden-tasks.mjs +3 -14
- package/pipeline/scripts/eval-intent.mjs +103 -0
- package/pipeline/scripts/eval-triage.mjs +3 -3
- package/pipeline/scripts/evidence-gate.mjs +155 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +9 -9
- package/pipeline/scripts/gc-tmp.sh +102 -0
- package/pipeline/scripts/gen-mode-dispatch.mjs +27 -21
- package/pipeline/scripts/gen-skills-index.mjs +6 -6
- package/pipeline/scripts/github-ssh-setup.sh +1 -1
- package/pipeline/scripts/keychain-save.sh +1 -1
- package/pipeline/scripts/keychain.py +6 -6
- package/pipeline/scripts/learnings-ledger.mjs +284 -0
- package/pipeline/scripts/lint-skills.mjs +80 -0
- package/pipeline/scripts/log-metric.sh +18 -9
- package/pipeline/scripts/match-skills.mjs +13 -8
- package/pipeline/scripts/memory-load.sh +3 -3
- package/pipeline/scripts/memory-save.sh +5 -5
- package/pipeline/scripts/migrate-prefs.mjs +17 -17
- package/pipeline/scripts/migrate-state.mjs +12 -12
- package/pipeline/scripts/output-quality-check.sh +7 -7
- package/pipeline/scripts/phase-banner.sh +5 -5
- package/pipeline/scripts/phase-tracker.sh +97 -53
- package/pipeline/scripts/pre-commit-check.sh +45 -5
- package/pipeline/scripts/pre-push-check.sh +7 -7
- package/pipeline/scripts/prune-logs.sh +118 -0
- package/pipeline/scripts/render-agent-log-cost.sh +55 -18
- package/pipeline/scripts/render-cost-summary.sh +9 -9
- package/pipeline/scripts/render-work-summary.sh +4 -4
- package/pipeline/scripts/repo-map.mjs +9 -9
- package/pipeline/scripts/run-aggregator.mjs +7 -6
- package/pipeline/scripts/run-metrics.mjs +129 -0
- package/pipeline/scripts/run-smokes.mjs +76 -0
- package/pipeline/scripts/scan-skills.sh +11 -11
- package/pipeline/scripts/search-logs.sh +8 -8
- package/pipeline/scripts/sign-skills.sh +2 -2
- package/pipeline/scripts/smoke-adapters.sh +79 -10
- package/pipeline/scripts/smoke-add-detail.sh +5 -5
- package/pipeline/scripts/smoke-agent-log-cost.sh +85 -6
- package/pipeline/scripts/smoke-agent-model-routing.sh +3 -3
- package/pipeline/scripts/smoke-ask-choice.sh +42 -0
- package/pipeline/scripts/smoke-bitbucket-contract.sh +19 -3
- package/pipeline/scripts/smoke-changelog-version.sh +47 -0
- package/pipeline/scripts/smoke-channels-flow.sh +1 -1
- package/pipeline/scripts/smoke-ci-workflows.sh +5 -5
- package/pipeline/scripts/smoke-clarify.sh +3 -3
- package/pipeline/scripts/smoke-commands-skills-parity.sh +4 -4
- package/pipeline/scripts/smoke-community-gates.sh +75 -0
- package/pipeline/scripts/smoke-compliance-skills.sh +5 -5
- package/pipeline/scripts/smoke-cost-budget.sh +70 -0
- package/pipeline/scripts/smoke-cost-summary.sh +4 -4
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +50 -9
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +5 -5
- package/pipeline/scripts/smoke-delete-flow.sh +5 -5
- package/pipeline/scripts/smoke-dev-critic.sh +2 -2
- package/pipeline/scripts/smoke-diff-explain.sh +22 -3
- package/pipeline/scripts/smoke-diff-risk.sh +1 -1
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +1 -1
- package/pipeline/scripts/smoke-eval-live.sh +4 -4
- package/pipeline/scripts/smoke-evidence-gate.sh +93 -0
- package/pipeline/scripts/smoke-existing-discovery-gate.sh +1 -1
- package/pipeline/scripts/smoke-extract-conventions.sh +163 -0
- package/pipeline/scripts/smoke-figma-android-parity.sh +1 -1
- package/pipeline/scripts/smoke-figma-credential-store.sh +3 -3
- package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +12 -12
- package/pipeline/scripts/smoke-figma-dispatch.sh +5 -5
- package/pipeline/scripts/smoke-figma-sync.sh +1 -1
- package/pipeline/scripts/smoke-gate-hooks.sh +56 -0
- package/pipeline/scripts/smoke-gc-tmp.sh +84 -0
- package/pipeline/scripts/smoke-identity-isolation.sh +7 -7
- package/pipeline/scripts/smoke-install-layout.sh +10 -10
- package/pipeline/scripts/smoke-intent-guard.sh +86 -0
- package/pipeline/scripts/smoke-issue-comment-template.sh +3 -3
- package/pipeline/scripts/smoke-issue-jira-triad.sh +1 -1
- package/pipeline/scripts/smoke-keychain.sh +6 -6
- package/pipeline/scripts/smoke-language-axis.sh +2 -2
- package/pipeline/scripts/smoke-learnings-ledger.sh +86 -0
- package/pipeline/scripts/smoke-lib-scripts.sh +2 -2
- package/pipeline/scripts/smoke-mcp-gate.sh +68 -0
- package/pipeline/scripts/smoke-md-links.sh +8 -0
- package/pipeline/scripts/smoke-md2confluence.sh +126 -0
- package/pipeline/scripts/smoke-metrics-cache-ratio.sh +72 -0
- package/pipeline/scripts/smoke-migrate-state.sh +10 -10
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +7 -4
- package/pipeline/scripts/smoke-model-fallback.sh +88 -0
- package/pipeline/scripts/smoke-multi-repo-integration.sh +3 -3
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +1 -1
- package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +115 -0
- package/pipeline/scripts/smoke-no-token-prompt.sh +31 -15
- package/pipeline/scripts/smoke-pat-audit.sh +26 -5
- package/pipeline/scripts/smoke-per-repo-memory.sh +1 -1
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +1 -1
- package/pipeline/scripts/smoke-phase-6-multi.sh +2 -2
- package/pipeline/scripts/smoke-phase-banner.sh +1 -1
- package/pipeline/scripts/smoke-phase-tracker.sh +1 -1
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +4 -4
- package/pipeline/scripts/smoke-phase4-triage.sh +94 -7
- package/pipeline/scripts/smoke-plan-approval-gate.sh +3 -3
- package/pipeline/scripts/smoke-plan-safety.sh +1 -1
- package/pipeline/scripts/smoke-plan-todos.sh +2 -2
- package/pipeline/scripts/smoke-pr-review-actions.sh +2 -2
- package/pipeline/scripts/smoke-pre-commit.sh +34 -2
- package/pipeline/scripts/smoke-pref-migration.sh +1 -1
- package/pipeline/scripts/smoke-prefs-language.sh +5 -5
- package/pipeline/scripts/smoke-progress-contract.sh +3 -3
- package/pipeline/scripts/smoke-prune-logs.sh +87 -0
- package/pipeline/scripts/smoke-push-retry.sh +1 -1
- package/pipeline/scripts/smoke-readme-counts.sh +1 -1
- package/pipeline/scripts/smoke-repo-map.sh +9 -9
- package/pipeline/scripts/smoke-review-watch.sh +12 -0
- package/pipeline/scripts/smoke-run-aggregator.sh +7 -7
- package/pipeline/scripts/smoke-run-metrics.sh +50 -0
- package/pipeline/scripts/smoke-schema-validation.sh +18 -11
- package/pipeline/scripts/smoke-search.sh +5 -5
- package/pipeline/scripts/smoke-shared-runtime.sh +108 -0
- package/pipeline/scripts/smoke-skill-authoring.sh +13 -13
- package/pipeline/scripts/smoke-skill-language.sh +4 -4
- package/pipeline/scripts/smoke-skill-manifest.sh +2 -2
- package/pipeline/scripts/smoke-skill-scan.sh +2 -2
- package/pipeline/scripts/smoke-stack-swap.sh +2 -2
- package/pipeline/scripts/smoke-subagent-validators.sh +8 -5
- package/pipeline/scripts/smoke-sync-adapters.sh +1 -1
- package/pipeline/scripts/smoke-sync-delegation.sh +7 -7
- package/pipeline/scripts/smoke-sync-parity.sh +1 -1
- package/pipeline/scripts/smoke-tasklist-ordering.sh +7 -7
- package/pipeline/scripts/smoke-telemetry.sh +1 -1
- package/pipeline/scripts/smoke-test-gap.sh +5 -5
- package/pipeline/scripts/smoke-token-budget.sh +1 -1
- package/pipeline/scripts/smoke-tracker-contract.sh +6 -6
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +9 -1
- package/pipeline/scripts/smoke-triage-memory.sh +2 -2
- package/pipeline/scripts/smoke-url-enrichment.sh +2 -2
- package/pipeline/scripts/smoke-validator-contradiction.sh +1 -1
- package/pipeline/scripts/smoke-validator-gates.sh +164 -0
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +11 -11
- package/pipeline/scripts/smoke-wiki-integration.sh +2 -2
- package/pipeline/scripts/smoke-work-summary.sh +3 -3
- package/pipeline/scripts/smoke-worktree-path-convention.sh +4 -4
- package/pipeline/scripts/smoke-write-state.sh +2 -2
- package/pipeline/scripts/stack-swap.sh +3 -3
- package/pipeline/scripts/sync-adapters.mjs +37 -10
- package/pipeline/scripts/sync-parity-check.sh +6 -6
- package/pipeline/scripts/test-gap-scan.mjs +11 -13
- package/pipeline/scripts/token-budget-report.mjs +4 -4
- package/pipeline/scripts/triage-memory.mjs +6 -6
- package/pipeline/scripts/uninstall.mjs +42 -4
- package/pipeline/scripts/update-issue-progress.sh +2 -2
- package/pipeline/scripts/validate-analysis.mjs +19 -21
- package/pipeline/scripts/validate-diff-risk.mjs +4 -4
- package/pipeline/scripts/validate-planning.mjs +3 -3
- package/pipeline/scripts/validate-reviewer.mjs +4 -4
- package/pipeline/scripts/validate-schemas.mjs +4 -4
- package/pipeline/scripts/validate-state.mjs +108 -0
- package/pipeline/scripts/validate-test-gap.mjs +4 -4
- package/pipeline/scripts/validate-triage.mjs +68 -9
- package/pipeline/scripts/verify-skills.sh +7 -7
- package/pipeline/scripts/write-state.mjs +62 -13
- package/pipeline/skills/.skill-manifest.json +245 -149
- package/pipeline/skills/.skills-index.json +236 -47
- package/pipeline/skills/figma-android/README.md +5 -5
- package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +3 -3
- package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +8 -8
- package/pipeline/skills/figma-android/figma-component-test/SKILL.md +4 -4
- package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +5 -5
- package/pipeline/skills/figma-android/figma-to-component/SKILL.md +14 -14
- package/pipeline/skills/figma-common/README.md +37 -30
- package/pipeline/skills/figma-common/figma-bottom-sheets/SKILL.md +137 -0
- package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +20 -15
- package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +35 -30
- package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +35 -30
- package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +20 -20
- package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +32 -32
- package/pipeline/skills/figma-common/figma-commit/REVIEW.md +9 -9
- package/pipeline/skills/figma-common/figma-commit/SKILL.md +25 -20
- package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +11 -6
- package/pipeline/skills/figma-common/figma-component-start/SKILL.md +30 -25
- package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +9 -4
- package/pipeline/skills/figma-common/figma-evolve-component/SKILL.md +61 -0
- package/pipeline/skills/figma-common/figma-fix/SKILL.md +27 -22
- package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +38 -38
- package/pipeline/skills/figma-common/figma-issue/SKILL.md +39 -34
- package/pipeline/skills/figma-common/figma-iterate/SKILL.md +20 -15
- package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +44 -39
- package/pipeline/skills/figma-common/figma-mend/SKILL.md +6 -6
- package/pipeline/skills/figma-common/figma-navigation/SKILL.md +142 -0
- package/pipeline/skills/figma-common/figma-overlays/SKILL.md +128 -0
- package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +30 -30
- package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +1 -1
- package/pipeline/skills/figma-common/figma-review/SKILL.md +31 -26
- package/pipeline/skills/figma-common/figma-setup/SKILL.md +11 -11
- package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +5 -5
- package/pipeline/skills/figma-common/figma-skip/SKILL.md +6 -6
- package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +13 -12
- package/pipeline/skills/figma-common/figma-ui-patterns/patterns/animated-gradient-border.md +112 -0
- package/pipeline/skills/figma-common/figma-utility/SKILL.md +4 -4
- package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +1 -1
- package/pipeline/skills/figma-common/figma-validate/SKILL.md +48 -48
- package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +42 -37
- package/pipeline/skills/figma-common/performance-review-next/SKILL.md +23 -18
- package/pipeline/skills/figma-common/performance-start/SKILL.md +52 -47
- package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +68 -68
- package/pipeline/skills/figma-common/performance-tour/SKILL.md +42 -37
- package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +16 -16
- package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +15 -15
- package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +9 -9
- package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +15 -15
- package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +53 -38
- package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +12 -12
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +19 -19
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +25 -25
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +7 -7
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +38 -38
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +29 -29
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +12 -12
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +88 -57
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +10 -10
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +16 -16
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +23 -23
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +26 -26
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +53 -43
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +17 -17
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +19 -19
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +15 -15
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +39 -39
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +7 -7
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +29 -29
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +9 -9
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +31 -31
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +16 -16
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +56 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +49 -49
- package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +8 -8
- package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +9 -9
- package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +10 -10
- package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +11 -11
- package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +14 -14
- package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +6 -6
- package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +9 -9
- package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +18 -18
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.example.json +9 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +12 -12
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +3 -3
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +26 -26
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +4 -4
- package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +2 -2
- package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +1 -1
- package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +5 -5
- package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +41 -41
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +8 -8
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +7 -7
- package/pipeline/skills/shared/README.md +62 -41
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +39 -39
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +44 -44
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +182 -176
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +55 -0
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +48 -0
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +16 -16
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +48 -0
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +40 -40
- package/pipeline/skills/shared/core/multi-agent-delete/SKILL.md +33 -30
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +26 -26
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +22 -22
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +6 -6
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +12 -12
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +20 -20
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +61 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +22 -22
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +15 -15
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +12 -12
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +14 -14
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +12 -12
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +18 -18
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +9 -9
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +20 -20
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +63 -0
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +16 -13
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +110 -110
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +13 -13
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +22 -22
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +18 -18
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +13 -13
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +33 -30
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +14 -14
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +9 -9
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +79 -79
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +5 -5
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +10 -10
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +41 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +53 -0
- package/pipeline/skills/shared/external/agentflow/SKILL.md +9 -9
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +113 -52
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +41 -0
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +23 -16
- package/pipeline/skills/shared/external/app-clips/SKILL.md +85 -354
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +50 -0
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +135 -0
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +125 -0
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +113 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +152 -59
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +161 -118
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +289 -392
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +174 -0
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +191 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +57 -107
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +35 -12
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +28 -26
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +53 -62
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +7 -1
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +4 -1
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +32 -12
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +34 -30
- package/pipeline/skills/shared/external/authentication/SKILL.md +134 -138
- package/pipeline/skills/shared/external/authentication/evals/evals.json +48 -0
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +56 -29
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +183 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +497 -0
- package/pipeline/skills/shared/external/avkit/evals/evals.json +55 -0
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +668 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +29 -29
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +44 -19
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +136 -99
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +27 -8
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +7 -6
- package/pipeline/skills/shared/external/clean-code/SKILL.md +2 -2
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +63 -56
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +7 -4
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +31 -11
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +41 -0
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +51 -51
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +70 -65
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +25 -1
- package/pipeline/skills/shared/external/core-data/SKILL.md +496 -0
- package/pipeline/skills/shared/external/core-data/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +47 -14
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +47 -16
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +43 -54
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +32 -2
- package/pipeline/skills/shared/external/coreml/SKILL.md +89 -48
- package/pipeline/skills/shared/external/coreml/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +82 -37
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +493 -0
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +602 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +6 -5
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +77 -47
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +42 -34
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +2 -2
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +136 -176
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +240 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +73 -34
- package/pipeline/skills/shared/external/energykit/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +80 -38
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +67 -53
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +53 -3
- package/pipeline/skills/shared/external/healthkit/SKILL.md +57 -124
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +82 -1
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +43 -41
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +13 -8
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +5 -4
- package/pipeline/skills/shared/external/humanizer/SKILL.md +4 -4
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +174 -18
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +262 -4
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +117 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +141 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +67 -14
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +20 -3
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +131 -22
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +69 -22
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +50 -0
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +28 -16
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +354 -0
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +69 -44
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +35 -69
- package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +8 -8
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +485 -0
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +316 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +120 -131
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/live-activities/references/{live-activity-patterns.md → activitykit-patterns.md} +148 -63
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +40 -21
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/mapkit-location/references/{corelocation-patterns.md → mapkit-corelocation-patterns.md} +88 -41
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +27 -24
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +129 -172
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +180 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +45 -18
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +26 -6
- package/pipeline/skills/shared/external/natural-language/SKILL.md +48 -18
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +20 -7
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +4 -3
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +156 -66
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +51 -0
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +69 -19
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +499 -0
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +42 -0
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +844 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +122 -28
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +49 -18
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +100 -51
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +48 -8
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +13 -15
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +4 -4
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +2 -2
- package/pipeline/skills/shared/external/photos-camera-media/references/{photospicker-patterns.md → photokit-patterns.md} +3 -3
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +45 -48
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +46 -0
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +22 -33
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +56 -37
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +4 -3
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -0
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +74 -53
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +10 -10
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +21 -20
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +81 -64
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +48 -9
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +118 -104
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +49 -0
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +171 -0
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +93 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/build-optimization-sources.md +155 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/spm-build-analysis/references/spm-analysis-checks.md +105 -0
- package/pipeline/skills/shared/external/spm-build-analysis/scripts/check_spm_pins.py +118 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +110 -44
- package/pipeline/skills/shared/external/storekit/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +94 -43
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +82 -33
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +449 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +50 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +164 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +219 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +184 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +158 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +499 -0
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +45 -0
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +52 -40
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +92 -11
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +43 -16
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +43 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +50 -30
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +11 -4
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +113 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +150 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/{swift-6-2-concurrency.md → concurrency-patterns.md} +22 -11
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +52 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +21 -15
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/async-streams.md +1 -1
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bridging.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bug-patterns.md +3 -3
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +8 -8
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/diagnostics.md +1 -1
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/hotspots.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +4 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +1 -1
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +2 -2
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/unstructured.md +3 -3
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +339 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +33 -34
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +97 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +19 -6
- package/pipeline/skills/shared/external/swift-security/SKILL.md +195 -0
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +48 -0
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +595 -0
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +611 -0
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +708 -0
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +573 -0
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +752 -0
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +538 -0
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +530 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +543 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +620 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +515 -0
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +496 -0
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +747 -0
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +566 -0
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +813 -0
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +97 -297
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +44 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +123 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +162 -34
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +3 -3
- package/pipeline/skills/shared/external/swift-testing-pro/references/core-rules.md +2 -2
- package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md +5 -5
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +3 -3
- package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +5 -5
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +44 -23
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +47 -0
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +3 -3
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +75 -0
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +54 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +14 -10
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +5 -5
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swiftdata-pro/references/class-inheritance.md +2 -2
- package/pipeline/skills/shared/external/swiftdata-pro/references/cloudkit.md +1 -1
- package/pipeline/skills/shared/external/swiftdata-pro/references/core-rules.md +6 -6
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +337 -0
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +297 -0
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +170 -0
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +307 -0
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +35 -0
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +306 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +56 -65
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +48 -44
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +6 -6
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +13 -13
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +3 -3
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +1 -1
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +4 -4
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +2 -2
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +1 -1
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +16 -16
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +11 -11
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +7 -7
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +5 -5
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +6 -6
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +38 -16
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +13 -3
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +32 -28
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +1 -1
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +202 -41
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +16 -25
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +71 -26
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +284 -65
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +387 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +10 -10
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +15 -3
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +2 -2
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +1 -1
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +51 -25
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +78 -6
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +161 -16
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +85 -27
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +37 -33
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +39 -51
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +204 -30
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +226 -21
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +220 -20
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +159 -34
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +27 -0
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/accessibility.md +4 -4
- package/pipeline/skills/shared/external/swiftui-pro/references/api.md +1 -1
- package/pipeline/skills/shared/external/swiftui-pro/references/data.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/design.md +4 -4
- package/pipeline/skills/shared/external/swiftui-pro/references/hygiene.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/navigation.md +1 -1
- package/pipeline/skills/shared/external/swiftui-pro/references/performance.md +1 -1
- package/pipeline/skills/shared/external/swiftui-pro/references/swift.md +2 -2
- package/pipeline/skills/shared/external/swiftui-pro/references/views.md +2 -2
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +12 -12
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +3 -3
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +1 -1
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +11 -11
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +124 -10
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +2 -1
- package/pipeline/skills/shared/external/tipkit/SKILL.md +3 -3
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +9 -9
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +17 -16
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +11 -11
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +1 -1
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +5 -5
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +7 -6
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +3 -3
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +9 -9
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +8 -7
- package/pipeline/skills/shared/external/web-testing/SKILL.md +7 -6
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +23 -17
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +99 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +89 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/references/benchmark-artifacts.md +94 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/references/benchmarking-workflow.md +67 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +230 -0
- package/pipeline/skills/shared/external/xcode-build-benchmark/scripts/benchmark_builds.py +308 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +219 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/build-settings-best-practices.md +216 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/fix-patterns.md +290 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/scripts/benchmark_builds.py +308 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +157 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/benchmark-artifacts.md +94 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/build-settings-best-practices.md +216 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/orchestration-report-template.md +143 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/scripts/benchmark_builds.py +308 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/scripts/diagnose_compilation.py +273 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/scripts/generate_optimization_report.py +533 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +90 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/build-optimization-sources.md +155 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/code-compilation-checks.md +106 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/references/recommendation-format.md +85 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/scripts/diagnose_compilation.py +273 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +77 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-optimization-sources.md +155 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/build-settings-best-practices.md +216 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/project-audit-checks.md +101 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/references/recommendation-format.md +85 -0
- package/pipeline/skills/skills-index.md +213 -192
- package/docs/GENERICITY-REVIEW.md +0 -277
- package/docs/STABILITY-FIX-PLAN.md +0 -168
- package/pipeline/scripts/README-figma-smokes.md +0 -34
- package/pipeline/scripts/figma-placeholder-map.json +0 -191
- package/pipeline/scripts/import-figma-skills.sh +0 -253
- package/pipeline/scripts/smoke-figma-config-schema.sh +0 -144
- package/pipeline/scripts/smoke-figma-skill-import.sh +0 -174
- package/pipeline/scripts/smoke-install-leak-gate.sh +0 -125
- package/pipeline/scripts/smoke-personal-data.sh +0 -84
- package/pipeline/scripts/sync-figma-source.sh +0 -228
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.json +0 -94
- package/pipeline/skills/shared/external/app-store-review/references/code-signing.md +0 -259
- package/pipeline/skills/shared/external/app-store-review/references/rejection-patterns.md +0 -152
- package/pipeline/skills/shared/external/pencilkit-drawing/references/paperkit-integration.md +0 -376
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// migrate-prefs.mjs
|
|
2
|
+
// migrate-prefs.mjs - migrates multi-agent-preferences.json v2.0.0 → v2.1.0
|
|
3
3
|
//
|
|
4
4
|
// Usage:
|
|
5
5
|
// node migrate-prefs.mjs [--dry-run] [--file <path>]
|
|
@@ -52,12 +52,12 @@ function defaultKeychainMapping() {
|
|
|
52
52
|
figma: null,
|
|
53
53
|
figma_mcp: null,
|
|
54
54
|
fortify: null,
|
|
55
|
-
firebase: null, // unified
|
|
55
|
+
firebase: null, // unified - project_id is parsed from the decoded SA JSON; no separate firebase_project
|
|
56
56
|
jenkins: null,
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
// v2.1.0 sub-migration
|
|
60
|
+
// v2.1.0 sub-migration - always runs (even on already-v2.1.0 files) to consolidate
|
|
61
61
|
// early-v2.1.0 drift: firebase_sa+firebase_project → firebase.
|
|
62
62
|
function consolidateFirebase(out, changes) {
|
|
63
63
|
const km = out?.global?.keychainMapping;
|
|
@@ -76,7 +76,7 @@ function consolidateFirebase(out, changes) {
|
|
|
76
76
|
}
|
|
77
77
|
if ("firebase_project" in km) {
|
|
78
78
|
delete km.firebase_project;
|
|
79
|
-
changes.push("keychainMapping: removed firebase_project (redundant
|
|
79
|
+
changes.push("keychainMapping: removed firebase_project (redundant - project_id lives inside the SA JSON)");
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
if (Array.isArray(out?.global?.identities)) {
|
|
@@ -98,7 +98,7 @@ function consolidateFirebase(out, changes) {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
// v2.1.0 sub-migration
|
|
101
|
+
// v2.1.0 sub-migration - consolidate figma_pat → figma, remove figma_user.
|
|
102
102
|
function consolidateFigma(out, changes) {
|
|
103
103
|
const km = out?.global?.keychainMapping;
|
|
104
104
|
if (km && typeof km === "object") {
|
|
@@ -137,14 +137,14 @@ function migrate(prefs) {
|
|
|
137
137
|
const changes = [];
|
|
138
138
|
const out = JSON.parse(JSON.stringify(prefs)); // deep clone
|
|
139
139
|
|
|
140
|
-
// 1. schemaVersion
|
|
140
|
+
// 1. schemaVersion - detect whether a v2.0.0 → 2.1.0 → 2.2.0 → 2.3.0 bump chain is needed.
|
|
141
141
|
// Sub-migrations run regardless (they're idempotent), so early-return is avoided.
|
|
142
|
-
// v2.3.0 is the v7.4.0 target
|
|
142
|
+
// v2.3.0 is the v7.4.0 target - adds optional `accounts[]` (per-account host
|
|
143
143
|
// overrides) and `recentAccounts[]` (LRU for autopilot account picker).
|
|
144
144
|
// Both default to empty arrays; old prefs continue to validate without them.
|
|
145
145
|
const TARGET = "2.3.0";
|
|
146
146
|
if (out.schemaVersion === TARGET) {
|
|
147
|
-
// already on target
|
|
147
|
+
// already on target - skip version bump, but still run sub-migrations below
|
|
148
148
|
} else if (out.schemaVersion === "2.2.0") {
|
|
149
149
|
out.schemaVersion = TARGET;
|
|
150
150
|
changes.push(`schemaVersion: 2.2.0 → ${TARGET}`);
|
|
@@ -173,7 +173,7 @@ function migrate(prefs) {
|
|
|
173
173
|
out.global.identities = out.global.gitIdentities;
|
|
174
174
|
changes.push(`renamed gitIdentities → identities (${out.global.identities.length} entries)`);
|
|
175
175
|
} else {
|
|
176
|
-
changes.push("gitIdentities present but identities also exists
|
|
176
|
+
changes.push("gitIdentities present but identities also exists - keeping identities, dropping gitIdentities");
|
|
177
177
|
}
|
|
178
178
|
delete out.global.gitIdentities;
|
|
179
179
|
} else if (!Array.isArray(out.global.identities)) {
|
|
@@ -181,7 +181,7 @@ function migrate(prefs) {
|
|
|
181
181
|
changes.push("initialized empty identities array");
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
// 4. keychainMapping
|
|
184
|
+
// 4. keychainMapping - expand to 12 services
|
|
185
185
|
const km = out.global.keychainMapping || {};
|
|
186
186
|
const kmDefaults = defaultKeychainMapping();
|
|
187
187
|
let kmChanged = false;
|
|
@@ -212,7 +212,7 @@ function migrate(prefs) {
|
|
|
212
212
|
changes.push("added empty recentGroups");
|
|
213
213
|
}
|
|
214
214
|
// v7.4.0: account picker LRU + per-account host overrides.
|
|
215
|
-
// Both optional
|
|
215
|
+
// Both optional - installer initializes to empty arrays so the schema
|
|
216
216
|
// validator sees them, but downstream code treats undefined as empty too.
|
|
217
217
|
if (!Array.isArray(out.global.recentAccounts)) {
|
|
218
218
|
out.global.recentAccounts = [];
|
|
@@ -277,7 +277,7 @@ function migrate(prefs) {
|
|
|
277
277
|
consolidateFigma(out, changes);
|
|
278
278
|
|
|
279
279
|
// 12. v5.7+ sub-migration: promote legacy channel defaults to the new reportChannels /
|
|
280
|
-
// reportContent / wikiScope structure. Idempotent
|
|
280
|
+
// reportContent / wikiScope structure. Idempotent - safe to re-run.
|
|
281
281
|
migrateReportChannels(out, changes);
|
|
282
282
|
|
|
283
283
|
return { out, changes, alreadyMigrated: changes.length === 0 };
|
|
@@ -314,7 +314,7 @@ function migrateReportChannels(out, changes) {
|
|
|
314
314
|
};
|
|
315
315
|
changes.push("added reportContent defaults {normalAnalysis,technicalAnalysis,testScenarios,autoDiff,manualNote}");
|
|
316
316
|
} else if (!("technicalAnalysis" in g.reportContent)) {
|
|
317
|
-
// v5.7.3+
|
|
317
|
+
// v5.7.3+ - backfill technicalAnalysis onto already-initialized reportContent
|
|
318
318
|
g.reportContent.technicalAnalysis = false;
|
|
319
319
|
changes.push("added reportContent.technicalAnalysis: false (v5.7.3 backfill)");
|
|
320
320
|
}
|
|
@@ -323,7 +323,7 @@ function migrateReportChannels(out, changes) {
|
|
|
323
323
|
if (!Array.isArray(g.wikiScope)) {
|
|
324
324
|
if (g.wikiDefault === false) {
|
|
325
325
|
g.wikiScope = [];
|
|
326
|
-
changes.push("added wikiScope: [] (legacy wikiDefault=false
|
|
326
|
+
changes.push("added wikiScope: [] (legacy wikiDefault=false - opt out of all wiki artifacts)");
|
|
327
327
|
} else {
|
|
328
328
|
g.wikiScope = ["main", "ios", "screenshots", "index"];
|
|
329
329
|
changes.push("added wikiScope: [main,ios,screenshots,index] (legacy wikiDefault=true or unset)");
|
|
@@ -333,7 +333,7 @@ function migrateReportChannels(out, changes) {
|
|
|
333
333
|
// --- autopilotReportTimeoutSeconds ---
|
|
334
334
|
if (typeof g.autopilotReportTimeoutSeconds !== "number") {
|
|
335
335
|
g.autopilotReportTimeoutSeconds = 1800;
|
|
336
|
-
changes.push("added autopilotReportTimeoutSeconds: 1800 (30 min)
|
|
336
|
+
changes.push("added autopilotReportTimeoutSeconds: 1800 (30 min) - Phase 7 always-pause timeout");
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
// --- prune deprecated booleans ---
|
|
@@ -371,7 +371,7 @@ function main() {
|
|
|
371
371
|
const { out, changes, alreadyMigrated } = migrate(prefs);
|
|
372
372
|
|
|
373
373
|
if (alreadyMigrated) {
|
|
374
|
-
console.log(`✓ already v2.1.0
|
|
374
|
+
console.log(`✓ already v2.1.0 - no changes: ${args.file}`);
|
|
375
375
|
process.exit(0);
|
|
376
376
|
}
|
|
377
377
|
|
|
@@ -379,7 +379,7 @@ function main() {
|
|
|
379
379
|
for (const c of changes) console.log(` • ${c}`);
|
|
380
380
|
|
|
381
381
|
if (args.dryRun) {
|
|
382
|
-
console.log("--- DRY RUN
|
|
382
|
+
console.log("--- DRY RUN - no write ---");
|
|
383
383
|
process.exit(0);
|
|
384
384
|
}
|
|
385
385
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* migrate-state.mjs
|
|
3
|
+
* migrate-state.mjs - apply forward migrations to agent-state.json or
|
|
4
4
|
* multi-agent-preferences.json when the on-disk schemaVersion is older
|
|
5
5
|
* than the repo's current schema.
|
|
6
6
|
*
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
* node migrate-state.mjs --dry-run <path> # preview, no write
|
|
16
16
|
*
|
|
17
17
|
* Exit codes:
|
|
18
|
-
* 0
|
|
19
|
-
* 1
|
|
20
|
-
* 2
|
|
21
|
-
* 3
|
|
18
|
+
* 0 - migration applied (or file already current)
|
|
19
|
+
* 1 - invalid input (unreadable file, malformed JSON, missing schemaVersion)
|
|
20
|
+
* 2 - no migration path (gap in the chain)
|
|
21
|
+
* 3 - migration failed (module error, schemaVersion not set in output)
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { readFileSync, writeFileSync, readdirSync, existsSync } from "fs";
|
|
@@ -47,7 +47,7 @@ function readSchemaVersion(filename) {
|
|
|
47
47
|
if (!v) throw new Error(`schemaVersion.const or .enum[-1] missing in ${filename}`);
|
|
48
48
|
return v;
|
|
49
49
|
} catch (err) {
|
|
50
|
-
console.error(`migrate-state: cannot read ${filename}
|
|
50
|
+
console.error(`migrate-state: cannot read ${filename} - ${err.message}`);
|
|
51
51
|
process.exit(1);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
@@ -83,7 +83,7 @@ function resolveType(forced, path) {
|
|
|
83
83
|
if (/agent-state\.json$/.test(path)) return "state";
|
|
84
84
|
if (/preferences\.json$/.test(path)) return "prefs";
|
|
85
85
|
console.error(
|
|
86
|
-
`migrate-state: cannot infer type from ${path}
|
|
86
|
+
`migrate-state: cannot infer type from ${path} - pass --type=state or --type=prefs`,
|
|
87
87
|
);
|
|
88
88
|
process.exit(1);
|
|
89
89
|
}
|
|
@@ -142,7 +142,7 @@ async function main() {
|
|
|
142
142
|
const { type: forced, dryRun, path } = parseArgs();
|
|
143
143
|
|
|
144
144
|
if (!existsSync(path)) {
|
|
145
|
-
console.error(`migrate-state: file not found
|
|
145
|
+
console.error(`migrate-state: file not found - ${path}`);
|
|
146
146
|
process.exit(1);
|
|
147
147
|
}
|
|
148
148
|
|
|
@@ -151,7 +151,7 @@ async function main() {
|
|
|
151
151
|
try {
|
|
152
152
|
doc = JSON.parse(readFileSync(path, "utf-8"));
|
|
153
153
|
} catch (err) {
|
|
154
|
-
console.error(`migrate-state: invalid JSON in ${path}
|
|
154
|
+
console.error(`migrate-state: invalid JSON in ${path} - ${err.message}`);
|
|
155
155
|
process.exit(1);
|
|
156
156
|
}
|
|
157
157
|
|
|
@@ -165,7 +165,7 @@ async function main() {
|
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
if (from === to) {
|
|
168
|
-
console.log(`${path} already at schemaVersion ${to}
|
|
168
|
+
console.log(`${path} already at schemaVersion ${to} - no migration needed`);
|
|
169
169
|
process.exit(0);
|
|
170
170
|
}
|
|
171
171
|
|
|
@@ -193,7 +193,7 @@ async function main() {
|
|
|
193
193
|
);
|
|
194
194
|
}
|
|
195
195
|
} catch (err) {
|
|
196
|
-
console.error(`migrate-state: migration failed
|
|
196
|
+
console.error(`migrate-state: migration failed - ${err.message}`);
|
|
197
197
|
process.exit(3);
|
|
198
198
|
}
|
|
199
199
|
}
|
|
@@ -210,6 +210,6 @@ async function main() {
|
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
main().catch((err) => {
|
|
213
|
-
console.error(`migrate-state: unhandled
|
|
213
|
+
console.error(`migrate-state: unhandled - ${err.message}`);
|
|
214
214
|
process.exit(3);
|
|
215
215
|
});
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# output-quality-check.sh
|
|
2
|
+
# output-quality-check.sh - runs all output validators against the latest
|
|
3
3
|
# task's artifacts (commit message, PR body, Jira comment) and reports a
|
|
4
4
|
# pass/fail summary suitable for pre-push gating.
|
|
5
5
|
#
|
|
6
|
-
# Validators (best-effort
|
|
7
|
-
# 1. Commit message format (regex from
|
|
8
|
-
# 2. PR body
|
|
9
|
-
# 3. Jira comment format
|
|
10
|
-
# 4. Reviewer JSON
|
|
11
|
-
# 5. Triage JSON
|
|
6
|
+
# Validators (best-effort - skips silently when a target is absent):
|
|
7
|
+
# 1. Commit message format (regex from section15 of REFACTOR_PLAN_v3.7.md)
|
|
8
|
+
# 2. PR body - real newlines, no HTML entities, required sections present
|
|
9
|
+
# 3. Jira comment format - real newlines, no \n literal, no HTML entities
|
|
10
|
+
# 4. Reviewer JSON - runs validate-reviewer.mjs (already exists)
|
|
11
|
+
# 5. Triage JSON - runs validate-triage.mjs (already exists)
|
|
12
12
|
#
|
|
13
13
|
# Usage:
|
|
14
14
|
# output-quality-check.sh [--task <task_id>] [--strict]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# phase-banner.sh
|
|
2
|
+
# phase-banner.sh - print a phase / sub-phase progress banner to the terminal.
|
|
3
3
|
#
|
|
4
4
|
# Cross-CLI: works identically from Claude Code, Copilot CLI, or a plain shell.
|
|
5
5
|
# Claude Code ALSO uses TaskCreate/TaskUpdate for inline UI cards, but those
|
|
6
|
-
# are Claude-only
|
|
6
|
+
# are Claude-only - Copilot users wouldn't see anything without this script.
|
|
7
7
|
#
|
|
8
8
|
# Usage:
|
|
9
9
|
# phase-banner.sh start <phase> [name] [detail]
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
# Status values for `end`: done | failed | skipped
|
|
20
20
|
#
|
|
21
21
|
# Localization:
|
|
22
|
-
# PHASE_LANG=en (default) | tr
|
|
22
|
+
# PHASE_LANG=en (default) | tr - when set to tr, canonical labels resolve to
|
|
23
23
|
# Turkish. The `auto` sentinel in place of [name] triggers a table lookup.
|
|
24
24
|
# Canonical label set mirrors pipeline/commands/multi-agent/refs/phases.md.
|
|
25
25
|
#
|
|
26
26
|
# Output is colored when stdout is a TTY (TERM != dumb). Plain otherwise so
|
|
27
|
-
# logs and CI artifacts stay readable. Always written to stdout
|
|
27
|
+
# logs and CI artifacts stay readable. Always written to stdout - log
|
|
28
28
|
# capture is the caller's responsibility.
|
|
29
29
|
|
|
30
30
|
set -uo pipefail
|
|
@@ -136,7 +136,7 @@ case "$ACTION" in
|
|
|
136
136
|
echo "phase-banner: unknown status '$STATUS' (use done|failed|skipped)" >&2
|
|
137
137
|
exit 64 ;;
|
|
138
138
|
esac
|
|
139
|
-
printf "${C_BOLD}${COLOR}└─ %s %s%s
|
|
139
|
+
printf "${C_BOLD}${COLOR}└─ %s %s%s - %s %s${C_RESET}" \
|
|
140
140
|
"$PHASE_WORD" "$PHASE" "${NAME:+: $NAME}" "$GLYPH" "$STATUS"
|
|
141
141
|
[ -n "$DETAIL" ] && printf " ${C_DIM}(%s)${C_RESET}" "$DETAIL"
|
|
142
142
|
printf " ${C_DIM}%s${C_RESET}\n\n" "$(ts)"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# phase-tracker.sh
|
|
2
|
+
# phase-tracker.sh - stateful card-stack pipeline tracker, cross-CLI.
|
|
3
3
|
#
|
|
4
4
|
# Why this exists: Claude Code has TaskCreate/TaskUpdate which renders
|
|
5
5
|
# native UI cards. Copilot CLI has nothing equivalent. This script gives
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
# Each line is an OTLP-compatible JSON span with trace_id/span_id derived
|
|
32
32
|
# from the task_id, phase_id, and timestamp. Format intentionally simple
|
|
33
33
|
# so an OTel Collector's `filelog` receiver can tail + forward without a
|
|
34
|
-
# protobuf build step. Emission is never fatal
|
|
34
|
+
# protobuf build step. Emission is never fatal - if jq is missing or the
|
|
35
35
|
# log dir isn't writable, we silently skip. Default OFF so users without
|
|
36
36
|
# an observability stack see zero behavior change.
|
|
37
37
|
#
|
|
@@ -74,6 +74,13 @@ if [ -z "$TRACKER_FILE" ]; then
|
|
|
74
74
|
TASK_ID_FROM_ENV="$1"
|
|
75
75
|
fi
|
|
76
76
|
if [ -z "$TASK_ID_FROM_ENV" ]; then
|
|
77
|
+
# Strict mode: refuse the global pointer fallback entirely. Concurrent-safe by
|
|
78
|
+
# construction - the orchestrator must export MULTI_AGENT_TASK_ID. Opt in with
|
|
79
|
+
# MULTI_AGENT_STRICT_TASK_ID=1 (recommended whenever more than one run can be live).
|
|
80
|
+
if [ "${MULTI_AGENT_STRICT_TASK_ID:-0}" = "1" ]; then
|
|
81
|
+
echo "phase-tracker: MULTI_AGENT_STRICT_TASK_ID=1 but no MULTI_AGENT_TASK_ID in scope; refusing global pointer fallback. Export MULTI_AGENT_TASK_ID=<id>." >&2
|
|
82
|
+
exit 64
|
|
83
|
+
fi
|
|
77
84
|
# Fallback to the file written by the most recent init.
|
|
78
85
|
# WARNING: this pointer is global and flips when ANY shell on this user account runs
|
|
79
86
|
# `phase-tracker.sh init <other-task>`. In concurrent multi-agent runs (two terminals,
|
|
@@ -84,7 +91,7 @@ if [ -z "$TRACKER_FILE" ]; then
|
|
|
84
91
|
TRACKER_FILE="$(cat "$POINTER")"
|
|
85
92
|
if [ "${MULTI_AGENT_QUIET:-0}" != "1" ]; then
|
|
86
93
|
POINTER_TASK=$(basename "$(dirname "$TRACKER_FILE")")
|
|
87
|
-
echo "phase-tracker: WARN
|
|
94
|
+
echo "phase-tracker: WARN - using pointer fallback (task=$POINTER_TASK). Pass MULTI_AGENT_TASK_ID=<id> for concurrent-safe resolution." >&2
|
|
88
95
|
fi
|
|
89
96
|
else
|
|
90
97
|
echo "phase-tracker: no task in scope; run 'init <task_id>' first or set MULTI_AGENT_TASK_ID" >&2
|
|
@@ -103,14 +110,14 @@ need_jq() {
|
|
|
103
110
|
}
|
|
104
111
|
}
|
|
105
112
|
|
|
106
|
-
# OTel-compatible span emission
|
|
113
|
+
# OTel-compatible span emission - v6.1.0+, opt-in via $MULTI_AGENT_OTEL_SPANS.
|
|
107
114
|
# Appends one JSON line to otel-spans.jsonl. Never fatal on failure.
|
|
108
115
|
#
|
|
109
116
|
# Args:
|
|
110
117
|
# $1 = event_name (e.g. "phase.update", "phase.sub", "phase.tokens")
|
|
111
118
|
# $2 = phase_id (required)
|
|
112
119
|
# $3 = status or subject (string, optional)
|
|
113
|
-
# $4 = attributes (JSON object string, optional
|
|
120
|
+
# $4 = attributes (JSON object string, optional - merged into span.attributes)
|
|
114
121
|
emit_otel_span() {
|
|
115
122
|
[ "${MULTI_AGENT_OTEL_SPANS:-0}" = "1" ] || return 0
|
|
116
123
|
command -v jq >/dev/null 2>&1 || return 0
|
|
@@ -180,7 +187,7 @@ glyph_for() {
|
|
|
180
187
|
esac
|
|
181
188
|
}
|
|
182
189
|
|
|
183
|
-
# Current time in epoch seconds (portable
|
|
190
|
+
# Current time in epoch seconds (portable - works on both BSD and GNU date).
|
|
184
191
|
now_epoch() {
|
|
185
192
|
date +%s
|
|
186
193
|
}
|
|
@@ -252,11 +259,48 @@ render() {
|
|
|
252
259
|
state="$(load_state)"
|
|
253
260
|
local task_id
|
|
254
261
|
task_id=$(echo "$state" | jq -r '.task_id') || {
|
|
255
|
-
echo "phase-tracker: corrupted state file
|
|
262
|
+
echo "phase-tracker: corrupted state file - cannot parse task_id" >&2
|
|
256
263
|
exit 65
|
|
257
264
|
}
|
|
258
|
-
|
|
259
|
-
|
|
265
|
+
|
|
266
|
+
# Batched extraction: one jq pass emits all phase fields so the render loop
|
|
267
|
+
# does not spawn ~16 jq subprocesses per phase. Sub-phases, meta entries,
|
|
268
|
+
# and the total-tokens footer are batched separately below.
|
|
269
|
+
#
|
|
270
|
+
# Separator: U+001F (ASCII Unit Separator), a non-whitespace control char.
|
|
271
|
+
# Tab cannot be used here because bash `read` with `IFS=$'\t'` collapses
|
|
272
|
+
# consecutive tabs (tab is in the default whitespace IFS class), which
|
|
273
|
+
# silently drops empty middle columns and shifts later fields.
|
|
274
|
+
# Column order: status, started_at, completed_at, id, name,
|
|
275
|
+
# tokens_in, tokens_out, sub_count, meta_keys_csv
|
|
276
|
+
local phase_data
|
|
277
|
+
phase_data=$(echo "$state" | jq -r '
|
|
278
|
+
.phases // [] | .[] | [
|
|
279
|
+
(.status // ""),
|
|
280
|
+
(.started_at // ""),
|
|
281
|
+
(.completed_at // ""),
|
|
282
|
+
(.id // ""),
|
|
283
|
+
(.name // ""),
|
|
284
|
+
((.tokens_in // 0) | tostring),
|
|
285
|
+
((.tokens_out // 0) | tostring),
|
|
286
|
+
((.subs // []) | length | tostring),
|
|
287
|
+
((.meta // {}) | keys_unsorted | join(","))
|
|
288
|
+
] | join("")
|
|
289
|
+
')
|
|
290
|
+
|
|
291
|
+
local phase_count=0
|
|
292
|
+
local -a row_status=() row_started=() row_completed=() row_id=() row_name=()
|
|
293
|
+
local -a row_tin=() row_tout=() row_subcount=() row_metakeys=()
|
|
294
|
+
if [ -n "$phase_data" ]; then
|
|
295
|
+
local _s _st _ed _id _nm _ti _to _sc _mk
|
|
296
|
+
while IFS=$'\x1f' read -r _s _st _ed _id _nm _ti _to _sc _mk; do
|
|
297
|
+
row_status+=("$_s"); row_started+=("$_st"); row_completed+=("$_ed")
|
|
298
|
+
row_id+=("$_id"); row_name+=("$_nm")
|
|
299
|
+
row_tin+=("$_ti"); row_tout+=("$_to")
|
|
300
|
+
row_subcount+=("$_sc"); row_metakeys+=("$_mk")
|
|
301
|
+
phase_count=$((phase_count + 1))
|
|
302
|
+
done <<< "$phase_data"
|
|
303
|
+
fi
|
|
260
304
|
|
|
261
305
|
# Elapsed seconds per phase. No bar; just label.
|
|
262
306
|
# completed/failed/skipped → completed_at - started_at (stamped)
|
|
@@ -266,10 +310,10 @@ render() {
|
|
|
266
310
|
local -a elapsed_arr=()
|
|
267
311
|
local i=0
|
|
268
312
|
while [ "$i" -lt "$phase_count" ]; do
|
|
269
|
-
local pstatus
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
313
|
+
local pstatus="${row_status[$i]}"
|
|
314
|
+
local s_iso="${row_started[$i]}"
|
|
315
|
+
local e_iso="${row_completed[$i]}"
|
|
316
|
+
local s_ep e_ep el=""
|
|
273
317
|
s_ep=$(iso_to_epoch "$s_iso")
|
|
274
318
|
e_ep=$(iso_to_epoch "$e_iso")
|
|
275
319
|
if [ -n "$s_ep" ]; then
|
|
@@ -299,10 +343,9 @@ render() {
|
|
|
299
343
|
# Iterate phases.
|
|
300
344
|
i=0
|
|
301
345
|
while [ "$i" -lt "$phase_count" ]; do
|
|
302
|
-
local pid
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
pstatus=$(echo "$state" | jq -r ".phases[$i].status")
|
|
346
|
+
local pid="${row_id[$i]}"
|
|
347
|
+
local pname="${row_name[$i]}"
|
|
348
|
+
local pstatus="${row_status[$i]}"
|
|
306
349
|
local g
|
|
307
350
|
g=$(glyph_for "$pstatus")
|
|
308
351
|
|
|
@@ -318,10 +361,10 @@ render() {
|
|
|
318
361
|
skipped) el_color="${C_YELLOW}" ;;
|
|
319
362
|
esac
|
|
320
363
|
|
|
321
|
-
local p_tin
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
364
|
+
local p_tin="${row_tin[$i]}"
|
|
365
|
+
local p_tout="${row_tout[$i]}"
|
|
366
|
+
local p_ttotal=$((p_tin + p_tout))
|
|
367
|
+
local tok_label=""
|
|
325
368
|
[ "$p_ttotal" -gt 0 ] && tok_label="$(format_tokens $p_ttotal) tok"
|
|
326
369
|
|
|
327
370
|
local right_block=""
|
|
@@ -338,43 +381,43 @@ render() {
|
|
|
338
381
|
|
|
339
382
|
# Meta block: only for active (in_progress) phase. Pretty-print key/value
|
|
340
383
|
# in insertion order so the pipeline's narrative sequence is preserved.
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
384
|
+
# Meta values are fetched in a single jq pass per active phase (rare).
|
|
385
|
+
# Same Unit Separator rationale as the phase batch above.
|
|
386
|
+
if [ "$pstatus" = "in_progress" ] && [ -n "${row_metakeys[$i]}" ]; then
|
|
387
|
+
local meta_data key val
|
|
388
|
+
meta_data=$(echo "$state" | jq -r --argjson idx "$i" '
|
|
389
|
+
.phases[$idx].meta // {} | to_entries[] | [.key, (.value | tostring)] | join("")
|
|
390
|
+
')
|
|
391
|
+
while IFS=$'\x1f' read -r key val; do
|
|
392
|
+
[ -z "$key" ] && continue
|
|
393
|
+
printf "${C_BOLD}${C_BLUE}│${C_RESET} ${C_DIM}%-10s${C_RESET} %s\n" "${key}:" "$val"
|
|
394
|
+
done <<< "$meta_data"
|
|
352
395
|
fi
|
|
353
396
|
|
|
354
|
-
# Sub-phases
|
|
355
|
-
|
|
356
|
-
sub_count
|
|
357
|
-
if [ "$sub_count" != "0" ]; then
|
|
397
|
+
# Sub-phases - batched per parent phase via a single jq call. Same
|
|
398
|
+
# Unit Separator rationale as the phase batch above.
|
|
399
|
+
local sub_count="${row_subcount[$i]}"
|
|
400
|
+
if [ "$sub_count" != "0" ] && [ "$sub_count" -gt 0 ] 2>/dev/null; then
|
|
401
|
+
local sub_data
|
|
402
|
+
sub_data=$(echo "$state" | jq -r --argjson idx "$i" '
|
|
403
|
+
.phases[$idx].subs // [] | .[] | [(.id // ""), (.name // ""), (.status // "")] | join("")
|
|
404
|
+
')
|
|
358
405
|
local j=0
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
sid=$(echo "$state" | jq -r ".phases[$i].subs[$j].id")
|
|
362
|
-
sname=$(echo "$state" | jq -r ".phases[$i].subs[$j].name")
|
|
363
|
-
sstatus=$(echo "$state" | jq -r ".phases[$i].subs[$j].status")
|
|
364
|
-
local sg
|
|
406
|
+
local sid sname sstatus sg connector
|
|
407
|
+
while IFS=$'\x1f' read -r sid sname sstatus; do
|
|
365
408
|
sg=$(glyph_for "$sstatus")
|
|
366
|
-
|
|
409
|
+
connector="├─"
|
|
367
410
|
if [ "$j" = "$((sub_count - 1))" ]; then connector="└─"; fi
|
|
368
411
|
printf "${C_BOLD}${C_BLUE}│${C_RESET} ${connector} %b ${C_DIM}%s.%s${C_RESET} %s\n" \
|
|
369
412
|
"$sg" "$pid" "$sid" "$sname"
|
|
370
413
|
j=$((j+1))
|
|
371
|
-
done
|
|
414
|
+
done <<< "$sub_data"
|
|
372
415
|
fi
|
|
373
416
|
i=$((i+1))
|
|
374
417
|
done
|
|
375
418
|
fi
|
|
376
419
|
|
|
377
|
-
# Total-tokens footer (v5.5.0)
|
|
420
|
+
# Total-tokens footer (v5.5.0) - sum phases[].tokens_in + tokens_out.
|
|
378
421
|
local total_tokens
|
|
379
422
|
total_tokens=$(echo "$state" | jq '[.phases[] | ((.tokens_in // 0) + (.tokens_out // 0))] | add // 0')
|
|
380
423
|
if [ "$total_tokens" -gt 0 ]; then
|
|
@@ -406,7 +449,7 @@ case "$ACTION" in
|
|
|
406
449
|
render
|
|
407
450
|
if [ "${MULTI_AGENT_QUIET:-0}" != "1" ]; then
|
|
408
451
|
echo "phase-tracker: tracker initialized for task=$TASK_ID" >&2
|
|
409
|
-
echo "phase-tracker: TIP
|
|
452
|
+
echo "phase-tracker: TIP - for concurrent-safe resolution, set:" >&2
|
|
410
453
|
echo " export MULTI_AGENT_TASK_ID=$TASK_ID" >&2
|
|
411
454
|
fi
|
|
412
455
|
;;
|
|
@@ -477,24 +520,25 @@ case "$ACTION" in
|
|
|
477
520
|
|
|
478
521
|
tokens)
|
|
479
522
|
need_jq
|
|
480
|
-
[ "$#" -ge 3 ] || { echo "tokens needs <phase_id> <in> <out>" >&2; exit 64; }
|
|
481
|
-
PID="$1"; T_IN="$2"; T_OUT="$3"
|
|
482
|
-
# Validate integers.
|
|
483
|
-
case "$T_IN$T_OUT" in
|
|
484
|
-
*[!0-9]*) echo "tokens: in/out must be non-negative integers" >&2; exit 64 ;;
|
|
523
|
+
[ "$#" -ge 3 ] || { echo "tokens needs <phase_id> <in> <out> [cached]" >&2; exit 64; }
|
|
524
|
+
PID="$1"; T_IN="$2"; T_OUT="$3"; T_CACHED="${4:-0}"
|
|
525
|
+
# Validate integers (cached is optional, defaults to 0 for back-compat).
|
|
526
|
+
case "$T_IN$T_OUT$T_CACHED" in
|
|
527
|
+
*[!0-9]*) echo "tokens: in/out/cached must be non-negative integers" >&2; exit 64 ;;
|
|
485
528
|
esac
|
|
486
529
|
state=$(load_state)
|
|
487
530
|
# Additive: add to existing totals so multiple LLM calls accumulate.
|
|
488
|
-
new=$(echo "$state" | jq --arg id "$PID" --argjson ti "$T_IN" --argjson to "$T_OUT" '
|
|
531
|
+
new=$(echo "$state" | jq --arg id "$PID" --argjson ti "$T_IN" --argjson to "$T_OUT" --argjson tc "$T_CACHED" '
|
|
489
532
|
.phases |= map(
|
|
490
533
|
if .id == $id then
|
|
491
534
|
.tokens_in = ((.tokens_in // 0) + $ti)
|
|
492
535
|
| .tokens_out = ((.tokens_out // 0) + $to)
|
|
536
|
+
| (if $tc > 0 then .tokens_cached = ((.tokens_cached // 0) + $tc) else . end)
|
|
493
537
|
else . end
|
|
494
538
|
)
|
|
495
539
|
')
|
|
496
540
|
save_state "$new"
|
|
497
|
-
emit_otel_span "phase.tokens" "$PID" "" "{\"multi_agent.tokens_in_delta\": $T_IN, \"multi_agent.tokens_out_delta\": $T_OUT}"
|
|
541
|
+
emit_otel_span "phase.tokens" "$PID" "" "{\"multi_agent.tokens_in_delta\": $T_IN, \"multi_agent.tokens_out_delta\": $T_OUT, \"multi_agent.tokens_cached_delta\": $T_CACHED}"
|
|
498
542
|
# Re-render so live token count is visible on the active phase. Callers
|
|
499
543
|
# that want silent accumulation (e.g. tight loops) can suppress with
|
|
500
544
|
# TRACKER_QUIET=1 to skip the re-render but still write state.
|
|
@@ -5,15 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
set -uo pipefail
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if [ -z "$STAGED_FILES" ]; then
|
|
8
|
+
if [ -z "$(git diff --cached --name-only 2>/dev/null)" ]; then
|
|
11
9
|
exit 0
|
|
12
10
|
fi
|
|
13
11
|
|
|
14
12
|
FOUND=0
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
# NUL-delimited so filenames with spaces are scanned (a space-split loop would
|
|
15
|
+
# silently skip them - a secret false-negative). Process substitution keeps the
|
|
16
|
+
# loop in the current shell so FOUND survives.
|
|
17
|
+
while IFS= read -r -d '' file; do
|
|
18
|
+
[ -z "$file" ] && continue
|
|
17
19
|
[ ! -f "$file" ] && continue
|
|
18
20
|
file "$file" 2>/dev/null | grep -q "binary" && continue
|
|
19
21
|
|
|
@@ -58,7 +60,45 @@ for file in $STAGED_FILES; do
|
|
|
58
60
|
echo "BLOCKED: Service account JSON in $file"
|
|
59
61
|
FOUND=1
|
|
60
62
|
fi
|
|
61
|
-
|
|
63
|
+
|
|
64
|
+
# High-signal provider token prefixes (low false-positive rate)
|
|
65
|
+
if echo "$content" | grep -qE '(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{60,}|xox[baprs]-[A-Za-z0-9-]{12,}|sk_live_[A-Za-z0-9]{20,}|rk_live_[A-Za-z0-9]{20,}|AIza[0-9A-Za-z_-]{35}|npm_[A-Za-z0-9]{36}|glpat-[A-Za-z0-9_-]{20,}'; then
|
|
66
|
+
echo "BLOCKED: Provider access token in $file"
|
|
67
|
+
FOUND=1
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# JWT (three base64url segments - header.payload.signature)
|
|
71
|
+
if echo "$content" | grep -qE 'eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}'; then
|
|
72
|
+
echo "BLOCKED: JWT in $file"
|
|
73
|
+
FOUND=1
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# High-entropy string scan - catches custom/unknown secrets the prefix
|
|
77
|
+
# patterns miss. Skips lockfiles, integrity hashes, source maps, and snapshot
|
|
78
|
+
# fixtures, which legitimately carry high-entropy non-secret content.
|
|
79
|
+
if ! echo "$file" | grep -qiE '(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|Podfile\.lock|Cartfile\.resolved|Package\.resolved|\.lock$|\.map$|__snapshots__|\.snap$|\.min\.(js|css)$)'; then
|
|
80
|
+
candidates=$(echo "$content" | grep -oE '[A-Za-z0-9+/=_-]{40,}' || true)
|
|
81
|
+
if [ -n "$candidates" ]; then
|
|
82
|
+
entropy_hit=$(printf '%s\n' "$candidates" | awk '
|
|
83
|
+
{
|
|
84
|
+
s=$0; n=length(s);
|
|
85
|
+
if (n < 40) next;
|
|
86
|
+
if (s ~ /^[0-9]+$/) next; # pure digits
|
|
87
|
+
if (s ~ /^[0-9a-f]+$/) next; # lowercase hex (git sha / md5 / sha-*)
|
|
88
|
+
if (s ~ /^[0-9A-F]+$/) next; # uppercase hex
|
|
89
|
+
delete freq;
|
|
90
|
+
for (i = 1; i <= n; i++) { c = substr(s, i, 1); freq[c]++ }
|
|
91
|
+
H = 0;
|
|
92
|
+
for (c in freq) { p = freq[c] / n; H -= p * log(p) / log(2) }
|
|
93
|
+
if (H >= 4.2) { print s; exit }
|
|
94
|
+
}')
|
|
95
|
+
if [ -n "$entropy_hit" ]; then
|
|
96
|
+
echo "BLOCKED: High-entropy string (possible secret) in $file"
|
|
97
|
+
FOUND=1
|
|
98
|
+
fi
|
|
99
|
+
fi
|
|
100
|
+
fi
|
|
101
|
+
done < <(git diff --cached --name-only -z 2>/dev/null)
|
|
62
102
|
|
|
63
103
|
if [ $FOUND -eq 1 ]; then
|
|
64
104
|
echo ""
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# pre-push-check.sh
|
|
2
|
+
# pre-push-check.sh - primary gate before every push.
|
|
3
3
|
#
|
|
4
4
|
# Purpose:
|
|
5
|
-
# This repo has no GitHub Actions workflow
|
|
5
|
+
# This repo has no GitHub Actions workflow - every push is validated
|
|
6
6
|
# locally. Unit tests, smoke suites, eval fixtures, schema validation,
|
|
7
7
|
# and the personal-data leak check all run here before `git push` is
|
|
8
8
|
# allowed to proceed.
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# bash pipeline/scripts/pre-push-check.sh
|
|
16
16
|
#
|
|
17
17
|
# Exit codes:
|
|
18
|
-
# 0
|
|
19
|
-
# 1
|
|
20
|
-
# 2
|
|
18
|
+
# 0 - all gates passed, safe to push
|
|
19
|
+
# 1 - a gate failed (test, lint, schema, or personal-data leak)
|
|
20
|
+
# 2 - environment problem (node missing, npm missing, wrong cwd)
|
|
21
21
|
|
|
22
22
|
set -uo pipefail
|
|
23
23
|
|
|
@@ -33,7 +33,7 @@ if ! command -v npm >/dev/null 2>&1; then
|
|
|
33
33
|
exit 2
|
|
34
34
|
fi
|
|
35
35
|
|
|
36
|
-
echo "→ Running local CI gate (primary
|
|
36
|
+
echo "→ Running local CI gate (primary - no GitHub Actions workflow exists)"
|
|
37
37
|
echo ""
|
|
38
38
|
|
|
39
39
|
FAILED=0
|
|
@@ -73,5 +73,5 @@ if [ "$FAILED" -gt 0 ]; then
|
|
|
73
73
|
exit 1
|
|
74
74
|
fi
|
|
75
75
|
|
|
76
|
-
echo "✓ All gates passed
|
|
76
|
+
echo "✓ All gates passed - safe to push"
|
|
77
77
|
exit 0
|