@mmerterden/multi-agent-pipeline 8.6.1 → 10.0.6
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 +544 -2484
- package/README.md +117 -138
- 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 +5 -5
- package/pipeline/agents/backend-architect.md +4 -4
- package/pipeline/agents/code-reviewer.md +10 -10
- package/pipeline/agents/dev-critic.md +17 -17
- package/pipeline/agents/explorer.md +3 -3
- package/pipeline/agents/ios-architect.md +4 -4
- package/pipeline/agents/security-auditor.md +12 -12
- 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 +13 -9
- 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 +23 -23
- package/pipeline/commands/multi-agent/dev-local-autopilot.md +23 -23
- package/pipeline/commands/multi-agent/dev-local.md +25 -22
- package/pipeline/commands/multi-agent/dev.md +49 -49
- 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 +75 -66
- 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 +15 -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 +35 -33
- 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 +73 -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 +11 -11
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +93 -57
- package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +59 -28
- package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +115 -63
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +99 -36
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +160 -63
- 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 +9 -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 +66 -60
- 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 +3 -3
- package/pipeline/lib/fetch-crashlytics.sh +5 -5
- package/pipeline/lib/fetch-fortify.sh +5 -21
- package/pipeline/lib/fetch-swagger.sh +5 -5
- 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 +21 -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 +55 -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 +3 -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 +97 -13
- 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 +23 -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 +90 -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 +80 -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 +7 -4
- 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-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 +49 -11
- 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 +29 -29
- 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-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-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 +12 -12
- 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 +38 -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 +57 -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 +43 -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 +1 -1
- 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/.last-figma-sync-plan.json +0 -23
- 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 -82
- 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
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Advanced Testing Patterns
|
|
2
|
+
|
|
3
|
+
Warning-severity issues, programmatic test cancellation, and image attachments for Swift Testing.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- [Warning-Severity Issues](#warning-severity-issues)
|
|
8
|
+
- [Programmatic Test Cancellation](#programmatic-test-cancellation)
|
|
9
|
+
- [Exit Test Value Capturing](#exit-test-value-capturing)
|
|
10
|
+
- [Image Attachments](#image-attachments)
|
|
11
|
+
- [Version Gates](#version-gates)
|
|
12
|
+
- [Proposal Reference](#proposal-reference)
|
|
13
|
+
|
|
14
|
+
## Warning-Severity Issues
|
|
15
|
+
|
|
16
|
+
ST-0013 adds a `severity` parameter to `Issue.record()` in Swift 6.3 / Xcode 26.4 and newer. Warnings are surfaced in test output but do not cause the test to fail.
|
|
17
|
+
|
|
18
|
+
```swift
|
|
19
|
+
@Test func dataIntegrity() {
|
|
20
|
+
let result = loadData()
|
|
21
|
+
|
|
22
|
+
// Hard failure - test fails
|
|
23
|
+
#expect(result.isValid)
|
|
24
|
+
|
|
25
|
+
// Warning - logged but test still passes
|
|
26
|
+
if result.processingTime > 2.0 {
|
|
27
|
+
Issue.record(
|
|
28
|
+
"Processing took \(result.processingTime)s - exceeds 2s target",
|
|
29
|
+
severity: .warning
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Use warnings for:
|
|
36
|
+
- Performance regressions that aren't blocking
|
|
37
|
+
- Deprecated code paths that still work
|
|
38
|
+
- Non-critical data quality checks
|
|
39
|
+
- Flaky conditions you want to track without failing CI
|
|
40
|
+
|
|
41
|
+
## Programmatic Test Cancellation
|
|
42
|
+
|
|
43
|
+
ST-0016 adds `try Test.cancel()` in Swift 6.3 / Xcode 26.4 and newer to stop a test from within without marking it as passed or failed. The test is recorded as "cancelled."
|
|
44
|
+
|
|
45
|
+
```swift
|
|
46
|
+
@Test func requiresNetwork() async throws {
|
|
47
|
+
guard NetworkMonitor.shared.isConnected else {
|
|
48
|
+
try Test.cancel("No network - skipping integration test")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let response = try await APIClient.shared.healthCheck()
|
|
52
|
+
#expect(response.status == .ok)
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Key differences from other mechanisms:
|
|
57
|
+
- Throwing an error - marks the test as failed
|
|
58
|
+
- `withKnownIssue` - marks a failure as expected (test still runs)
|
|
59
|
+
- `try Test.cancel()` - marks the test as cancelled (neutral outcome, test stops)
|
|
60
|
+
|
|
61
|
+
## Exit Test Value Capturing
|
|
62
|
+
|
|
63
|
+
ST-0012 allows exit tests to capture values from the enclosing scope when using the Swift 6.3 compiler. Exit testing itself requires Swift 6.2 / Xcode 26.0 or newer and uses the `processExitsWith:` macros.
|
|
64
|
+
|
|
65
|
+
When an exit-test body reads values from the parent process, correct the sample to use an explicit capture list and mention the Swift 6.3 compiler requirement. Captured values must conform to `Sendable` and `Codable`.
|
|
66
|
+
|
|
67
|
+
```swift
|
|
68
|
+
@Test func exitCodeValidation() async {
|
|
69
|
+
let expectedCode: Int32 = 42
|
|
70
|
+
await #expect(processExitsWith: .failure) { [expectedCode] in
|
|
71
|
+
exit(expectedCode) // Can now capture `expectedCode`
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Image Attachments
|
|
77
|
+
|
|
78
|
+
ST-0014 adds image attachments in Swift 6.3 / Xcode 26.4 and newer. Import both `Testing` and the relevant UI framework, then record platform image values directly and specify `as:` when you need an explicit format.
|
|
79
|
+
|
|
80
|
+
```swift
|
|
81
|
+
import Testing
|
|
82
|
+
import UIKit
|
|
83
|
+
|
|
84
|
+
@Test func renderedOutput() async throws {
|
|
85
|
+
let view = ChartView(data: sampleData)
|
|
86
|
+
let renderer = UIGraphicsImageRenderer(size: CGSize(width: 400, height: 300))
|
|
87
|
+
let image = renderer.image { ctx in
|
|
88
|
+
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Attach UIImage directly
|
|
92
|
+
Attachment.record(image, named: "chart-output", as: .png)
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Supported Apple-platform image types include:
|
|
97
|
+
- `UIImage` on iOS, tvOS, visionOS, and watchOS when importing UIKit
|
|
98
|
+
- `CGImage` when importing CoreGraphics
|
|
99
|
+
- `CIImage` when importing CoreImage
|
|
100
|
+
- `NSImage` on macOS when importing AppKit
|
|
101
|
+
|
|
102
|
+
## Version Gates
|
|
103
|
+
|
|
104
|
+
| Feature | Minimum toolchain / platform |
|
|
105
|
+
|---|---|
|
|
106
|
+
| Attachments API for standard attachable values | Swift 6.2 / Xcode 26.0 |
|
|
107
|
+
| Exit testing with `processExitsWith:` | Swift 6.2 / Xcode 26.0; supported on macOS, Linux, FreeBSD, OpenBSD, and Windows runtime targets |
|
|
108
|
+
| Exit-test capture lists | Swift 6.3 compiler |
|
|
109
|
+
| `Issue.record(_:severity:)` warnings | Swift 6.3 / Xcode 26.4 |
|
|
110
|
+
| `Test.cancel(_:)` | Swift 6.3 / Xcode 26.4 |
|
|
111
|
+
| Image attachment recording | Swift 6.3 / Xcode 26.4 |
|
|
112
|
+
|
|
113
|
+
Do not use exit tests for iOS, tvOS, or watchOS runtime targets. For iOS app code that needs fatal-path coverage, move the exit behavior behind a smaller pure Swift API, test the non-exiting branches directly, and reserve exit tests for a supported host/tool target.
|
|
114
|
+
|
|
115
|
+
## Proposal Reference
|
|
116
|
+
|
|
117
|
+
| Proposal | Feature |
|
|
118
|
+
|---|---|
|
|
119
|
+
| ST-0009 | Attachments API (`Attachment` type, `.record()`) |
|
|
120
|
+
| ST-0012 | Exit test value capturing |
|
|
121
|
+
| ST-0013 | Warning-severity issues (`Issue.record` with `severity:`) |
|
|
122
|
+
| ST-0014 | Image attachments on Apple platforms (cross-import overlays) |
|
|
123
|
+
| ST-0016 | Programmatic test cancellation (`try Test.cancel()`) |
|
|
@@ -5,18 +5,21 @@
|
|
|
5
5
|
- Expectations and Requirements
|
|
6
6
|
- Suite Organization
|
|
7
7
|
- Parameterized Tests
|
|
8
|
+
- Execution Model
|
|
8
9
|
- Confirmation and Known Issues
|
|
9
10
|
- Tags
|
|
10
11
|
- TestScoping and Test Organization
|
|
12
|
+
- XCTest Migration Patterns
|
|
11
13
|
- Mocking and Test Doubles
|
|
12
14
|
- Testable Architecture
|
|
13
15
|
- Async and Concurrent Tests
|
|
14
|
-
- XCTest UI Tests
|
|
16
|
+
- XCTest UI Tests - Page Object Pattern
|
|
15
17
|
- Performance Testing
|
|
16
18
|
- Snapshot Testing
|
|
17
19
|
- Test Attachments
|
|
18
20
|
- Exit Testing
|
|
19
21
|
- Test File Organization
|
|
22
|
+
- What to Test
|
|
20
23
|
- Common Mistakes and Review Checklist
|
|
21
24
|
|
|
22
25
|
## Basic Tests and Traits
|
|
@@ -139,6 +142,26 @@ func currencySymbols(code: String, symbol: String) {
|
|
|
139
142
|
|
|
140
143
|
Each argument combination runs as an independent test case reported separately.
|
|
141
144
|
|
|
145
|
+
## Execution Model
|
|
146
|
+
|
|
147
|
+
Swift Testing uses Swift Concurrency and runs tests in parallel by default. Treat every test as isolated work unless you explicitly serialize a scope.
|
|
148
|
+
|
|
149
|
+
```swift
|
|
150
|
+
@Suite(.serialized, .tags(.database))
|
|
151
|
+
struct DatabaseTests {
|
|
152
|
+
@Test func insertsRecord() async throws { /* ... */ }
|
|
153
|
+
@Test func removesRecord() async throws { /* ... */ }
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Use `.serialized` when tests must not overlap because they touch shared external state like a keychain, database, singleton service, or filesystem location. It does not make unrelated tests outside the serialized scope run one-at-a-time.
|
|
158
|
+
|
|
159
|
+
Important implications:
|
|
160
|
+
- Each test gets its own suite instance.
|
|
161
|
+
- Declaration order is not a contract.
|
|
162
|
+
- If one logical workflow depends on previous state, keep that workflow inside one test.
|
|
163
|
+
- Prefer isolated fixtures over shared mutable globals.
|
|
164
|
+
|
|
142
165
|
## Confirmation and Known Issues
|
|
143
166
|
|
|
144
167
|
### Confirmation (Async Event Testing)
|
|
@@ -208,33 +231,89 @@ extension Tag {
|
|
|
208
231
|
func apiCallReturnsData() async throws { /* ... */ }
|
|
209
232
|
```
|
|
210
233
|
|
|
211
|
-
Filter tests by tag in Xcode test plans or CLI (
|
|
234
|
+
Filter tests by tag in Xcode test plans or CLI (tag-based filtering syntax varies by toolchain - verify for your Swift version).
|
|
212
235
|
|
|
213
236
|
## TestScoping and Test Organization
|
|
214
237
|
|
|
215
|
-
`TestScoping` consolidates per-test setup/teardown into reusable fixtures:
|
|
238
|
+
`TestScoping` consolidates per-test setup/teardown into reusable fixtures when attached through a custom trait:
|
|
216
239
|
|
|
217
240
|
```swift
|
|
218
|
-
struct
|
|
219
|
-
let db: TestDatabase
|
|
220
|
-
|
|
241
|
+
struct DatabaseScope: TestTrait, SuiteTrait, TestScoping {
|
|
221
242
|
func provideScope(
|
|
222
|
-
for test: Test,
|
|
243
|
+
for test: Test,
|
|
244
|
+
testCase: Test.Case?,
|
|
223
245
|
performing body: @Sendable () async throws -> Void
|
|
224
246
|
) async throws {
|
|
225
247
|
let db = try await TestDatabase.create()
|
|
226
|
-
|
|
227
|
-
|
|
248
|
+
do {
|
|
249
|
+
try await body()
|
|
250
|
+
try await db.destroy()
|
|
251
|
+
} catch {
|
|
252
|
+
try? await db.destroy()
|
|
253
|
+
throw error
|
|
254
|
+
}
|
|
228
255
|
}
|
|
229
256
|
}
|
|
230
257
|
|
|
231
|
-
|
|
232
|
-
|
|
258
|
+
extension Trait where Self == DatabaseScope {
|
|
259
|
+
static var databaseScope: Self { .init() }
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
@Test(.databaseScope, .tags(.database))
|
|
233
263
|
func insertsRecord() async throws {
|
|
234
|
-
//
|
|
264
|
+
// Test runs inside DatabaseScope.provideScope
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## XCTest Migration Patterns
|
|
269
|
+
|
|
270
|
+
Swift Testing tests are functions annotated with `@Test`; they do not need `XCTestCase`. Use the smallest shape that needs the fixture:
|
|
271
|
+
|
|
272
|
+
```swift
|
|
273
|
+
@Test func validatesTotal() {
|
|
274
|
+
#expect(Cart(items: [.sample]).total == 9.99)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@Suite("Checkout")
|
|
278
|
+
struct CheckoutTests {
|
|
279
|
+
let calculator = PriceCalculator()
|
|
280
|
+
|
|
281
|
+
@Test func appliesDiscount() {
|
|
282
|
+
#expect(calculator.total(discount: .percent(10)) == 8.99)
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
@Suite("Shared Cache")
|
|
287
|
+
actor CacheTests {
|
|
288
|
+
var cache = TestCache()
|
|
289
|
+
|
|
290
|
+
@Test func storesValue() async {
|
|
291
|
+
await cache.store("value", forKey: "key")
|
|
292
|
+
#expect(await cache.value(forKey: "key") == "value")
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
struct PureHelperTests {
|
|
297
|
+
@Test static func normalizesInput() {
|
|
298
|
+
#expect(normalize(" email@example.com ") == "email@example.com")
|
|
299
|
+
}
|
|
235
300
|
}
|
|
236
301
|
```
|
|
237
302
|
|
|
303
|
+
Common XCTest mappings:
|
|
304
|
+
|
|
305
|
+
| XCTest | Swift Testing |
|
|
306
|
+
|---|---|
|
|
307
|
+
| `XCTAssertTrue(x)` / `XCTAssert(x)` | `#expect(x)` |
|
|
308
|
+
| `XCTAssertFalse(x)` | `#expect(!x)` |
|
|
309
|
+
| `XCTAssertEqual(a, b)` | `#expect(a == b)` |
|
|
310
|
+
| `XCTAssertThrowsError(try f())` | `#expect(throws: (any Error).self) { try f() }` |
|
|
311
|
+
| `XCTAssertNoThrow(try f())` | `#expect(throws: Never.self) { try f() }` |
|
|
312
|
+
| `try XCTUnwrap(value)` | `try #require(value)` |
|
|
313
|
+
| `XCTFail("message")` | `Issue.record("message")` |
|
|
314
|
+
|
|
315
|
+
Convert `setUp` into isolated suite `init()` state. Avoid moving fixtures into singletons or shared globals; Swift Testing runs tests in parallel by default. Use actors or per-test fixtures for mutable test doubles, and use `.serialized` only when an external shared resource cannot be isolated.
|
|
316
|
+
|
|
238
317
|
## Mocking and Test Doubles
|
|
239
318
|
|
|
240
319
|
Define testable boundaries with protocols:
|
|
@@ -245,10 +324,15 @@ protocol UserRepository: Sendable {
|
|
|
245
324
|
func save(_ user: User) async throws
|
|
246
325
|
}
|
|
247
326
|
|
|
248
|
-
|
|
327
|
+
actor MockUserRepository: UserRepository {
|
|
249
328
|
var users: [String: User] = [:]
|
|
250
|
-
var fetchError: Error?
|
|
251
|
-
var savedUsers: [User] = []
|
|
329
|
+
var fetchError: (any Error)?
|
|
330
|
+
private(set) var savedUsers: [User] = []
|
|
331
|
+
|
|
332
|
+
init(users: [String: User] = [:], fetchError: (any Error)? = nil) {
|
|
333
|
+
self.users = users
|
|
334
|
+
self.fetchError = fetchError
|
|
335
|
+
}
|
|
252
336
|
|
|
253
337
|
func fetch(id: String) async throws -> User {
|
|
254
338
|
if let error = fetchError { throw error }
|
|
@@ -256,14 +340,14 @@ struct MockUserRepository: UserRepository {
|
|
|
256
340
|
return user
|
|
257
341
|
}
|
|
258
342
|
|
|
259
|
-
|
|
343
|
+
func save(_ user: User) async throws {
|
|
260
344
|
savedUsers.append(user)
|
|
261
345
|
users[user.id] = user
|
|
262
346
|
}
|
|
263
347
|
}
|
|
264
348
|
```
|
|
265
349
|
|
|
266
|
-
**Pattern:** Mocks conform to protocols, never subclass concrete types. Store call counts and arguments for verification.
|
|
350
|
+
**Pattern:** Mocks conform to protocols, never subclass concrete types. For parallel Swift Testing runs, keep mutable mock state isolated in an actor or another Sendable-safe fixture. Store call counts and arguments for verification behind that isolation boundary.
|
|
267
351
|
|
|
268
352
|
## Testable Architecture
|
|
269
353
|
|
|
@@ -274,9 +358,9 @@ Inject dependencies through initializers for testability:
|
|
|
274
358
|
class ProfileViewModel {
|
|
275
359
|
var user: User?
|
|
276
360
|
var error: Error?
|
|
277
|
-
private let repository: UserRepository
|
|
361
|
+
private let repository: any UserRepository
|
|
278
362
|
|
|
279
|
-
init(repository: UserRepository) {
|
|
363
|
+
init(repository: any UserRepository) {
|
|
280
364
|
self.repository = repository
|
|
281
365
|
}
|
|
282
366
|
|
|
@@ -298,8 +382,7 @@ class ProfileViewModel {
|
|
|
298
382
|
}
|
|
299
383
|
|
|
300
384
|
@Test @MainActor func viewModelHandlesError() async {
|
|
301
|
-
|
|
302
|
-
mock.fetchError = URLError(.notConnectedToInternet)
|
|
385
|
+
let mock = MockUserRepository(fetchError: URLError(.notConnectedToInternet))
|
|
303
386
|
let vm = ProfileViewModel(repository: mock)
|
|
304
387
|
await vm.load()
|
|
305
388
|
#expect(vm.user == nil)
|
|
@@ -329,15 +412,14 @@ class ProfileViewModel {
|
|
|
329
412
|
|
|
330
413
|
// Error path testing
|
|
331
414
|
@Test func fetchThrowsOnNetworkError() async {
|
|
332
|
-
|
|
333
|
-
mock.fetchError = URLError(.notConnectedToInternet)
|
|
415
|
+
let mock = MockUserRepository(fetchError: URLError(.notConnectedToInternet))
|
|
334
416
|
#expect(throws: URLError.self) {
|
|
335
417
|
try await mock.fetch(id: "1")
|
|
336
418
|
}
|
|
337
419
|
}
|
|
338
420
|
```
|
|
339
421
|
|
|
340
|
-
## XCTest UI Tests
|
|
422
|
+
## XCTest UI Tests - Page Object Pattern
|
|
341
423
|
|
|
342
424
|
Swift Testing does not support UI testing. Use XCTest with XCUITest for all UI tests.
|
|
343
425
|
|
|
@@ -398,11 +480,11 @@ class FeedPerformanceTests: XCTestCase {
|
|
|
398
480
|
}
|
|
399
481
|
```
|
|
400
482
|
|
|
401
|
-
Performance tests require XCTest
|
|
483
|
+
Performance tests require XCTest - not available in Swift Testing.
|
|
402
484
|
|
|
403
485
|
## Snapshot Testing
|
|
404
486
|
|
|
405
|
-
|
|
487
|
+
Add Point-Free's `SnapshotTesting` package to the test target via Swift Package Manager, then use it for visual regression. Requires XCTest:
|
|
406
488
|
|
|
407
489
|
```swift
|
|
408
490
|
import SnapshotTesting
|
|
@@ -434,23 +516,23 @@ Attach diagnostic data to test results for debugging failures:
|
|
|
434
516
|
@Test func generateReport() async throws {
|
|
435
517
|
let report = try generateReport()
|
|
436
518
|
// Attach the output for later inspection
|
|
437
|
-
Attachment(report.data, named: "report.json")
|
|
519
|
+
Attachment.record(report.data, named: "report.json")
|
|
438
520
|
#expect(report.isValid)
|
|
439
521
|
}
|
|
440
522
|
|
|
441
523
|
// Attach from a file URL
|
|
442
524
|
@Test func processImage() async throws {
|
|
443
525
|
let output = try processImage()
|
|
444
|
-
try await Attachment(contentsOf: output.url, named: "result.png")
|
|
445
|
-
|
|
526
|
+
let attachment = try await Attachment(contentsOf: output.url, named: "result.png")
|
|
527
|
+
Attachment.record(attachment)
|
|
446
528
|
}
|
|
447
529
|
```
|
|
448
530
|
|
|
449
|
-
Attachments support
|
|
531
|
+
Attachments support standard `Attachable` values such as `Data`, `[UInt8]`, strings, and Encodable values when Foundation is imported. Image attachments require Swift 6.3 / Xcode 26.4 or newer and support platform image types such as `UIImage`, `CGImage`, `CIImage`, and `NSImage`; pass `as: .png` or another supported format when the filename should be explicit.
|
|
450
532
|
|
|
451
533
|
## Exit Testing
|
|
452
534
|
|
|
453
|
-
Test code that calls `exit()`, `fatalError()`, or `preconditionFailure()
|
|
535
|
+
Test code that calls `exit()`, `fatalError()`, or `preconditionFailure()`. Exit testing requires Swift 6.2 / Xcode 26.0 or newer and is supported on macOS, Linux, FreeBSD, OpenBSD, and Windows runtime targets, not iOS, tvOS, or watchOS:
|
|
454
536
|
|
|
455
537
|
```swift
|
|
456
538
|
@Test func invalidInputCausesExit() async {
|
|
@@ -460,7 +542,7 @@ Test code that calls `exit()`, `fatalError()`, or `preconditionFailure()`:
|
|
|
460
542
|
}
|
|
461
543
|
```
|
|
462
544
|
|
|
463
|
-
Exit testing runs the closure in a subprocess. The test passes if the process exits with the expected status.
|
|
545
|
+
Exit testing runs the closure in a subprocess. The test passes if the process exits with the expected status. Capturing values from the parent process in an exit-test capture list requires the Swift 6.3 compiler.
|
|
464
546
|
|
|
465
547
|
## Test File Organization
|
|
466
548
|
|
|
@@ -479,17 +561,61 @@ Name test files `<TypeUnderTest>Tests.swift`. Describe behavior in function name
|
|
|
479
561
|
|
|
480
562
|
**Skip:** SwiftUI view body layout (use snapshots), simple property forwarding, Apple framework behavior, private methods (test through public API).
|
|
481
563
|
|
|
564
|
+
## CustomTestStringConvertible
|
|
565
|
+
|
|
566
|
+
When parameterized test arguments appear in test output, Swift Testing uses `String(describing:)` by default. Conform to `CustomTestStringConvertible` for better output:
|
|
567
|
+
|
|
568
|
+
```swift
|
|
569
|
+
enum Food: CaseIterable {
|
|
570
|
+
case paella, oden, ragu
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
extension Food: CustomTestStringConvertible {
|
|
574
|
+
var testDescription: String {
|
|
575
|
+
switch self {
|
|
576
|
+
case .paella: "paella valenciana"
|
|
577
|
+
case .oden: "おでん"
|
|
578
|
+
case .ragu: "ragù alla bolognese"
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
@Test(arguments: Food.allCases)
|
|
584
|
+
func isDelicious(_ food: Food) { /* output shows custom descriptions */ }
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
Use this for any type passed as a parameterized test argument where the default description is unclear - especially enums, IDs, or model types.
|
|
588
|
+
|
|
589
|
+
## Availability-Conditional Tests
|
|
590
|
+
|
|
591
|
+
Use `@available` on test functions to run tests only on specific OS versions:
|
|
592
|
+
|
|
593
|
+
```swift
|
|
594
|
+
@Test
|
|
595
|
+
@available(iOS 18, macOS 15, *)
|
|
596
|
+
func usesNewAPI() async throws {
|
|
597
|
+
let result = try await NewFramework.process()
|
|
598
|
+
#expect(result.isValid)
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
Swift Testing skips `@available`-gated tests when running on older OS versions. This replaces XCTest's `#available` guard + early return pattern.
|
|
603
|
+
|
|
604
|
+
Do not put `@available` on a suite type or a type that contains a suite; Swift Testing requires suite types to always be available. Put availability gates on individual `@Test` functions instead.
|
|
605
|
+
|
|
482
606
|
## Common Mistakes and Review Checklist
|
|
483
607
|
|
|
484
608
|
1. **Testing implementation, not behavior.** Test what the code does, not how.
|
|
485
609
|
2. **No error path tests.** If a function can throw, test the throw path.
|
|
486
610
|
3. **Flaky async tests.** Use `confirmation` with expected counts, not `sleep` calls.
|
|
487
|
-
4. **Shared mutable state between tests.** Each test sets up its own state via `init()` in `@Suite
|
|
611
|
+
4. **Shared mutable state between tests.** Each test sets up its own state via `init()` in `@Suite` or a fixture.
|
|
488
612
|
5. **Missing accessibility identifiers in UI tests.** XCUITest queries rely on them.
|
|
489
613
|
6. **Using `sleep` in tests.** Use `confirmation`, clock injection, or `withKnownIssue`.
|
|
490
614
|
7. **Not testing cancellation.** If code supports `Task` cancellation, verify it cancels cleanly.
|
|
491
|
-
8. **
|
|
615
|
+
8. **Unclear XCTest migration boundaries.** Apple allows XCTest and Swift Testing in one file during migration; prefer separate files when it keeps imports, ownership, and runner expectations clearer.
|
|
492
616
|
9. **Non-Sendable test helpers shared across tests.** Ensure test helper types are Sendable when shared across concurrent test cases.
|
|
617
|
+
10. **Assuming test order.** Parallel default execution means declaration order and suite nesting do not create a workflow.
|
|
618
|
+
11. **Using `.serialized` as a dependency chain.** Serialized scopes avoid overlap; they do not pass state from one test to the next.
|
|
493
619
|
|
|
494
620
|
### Review Checklist
|
|
495
621
|
|
|
@@ -501,4 +627,6 @@ Name test files `<TypeUnderTest>Tests.swift`. Describe behavior in function name
|
|
|
501
627
|
- [ ] Tags applied for filtering (`.critical`, `.slow`)
|
|
502
628
|
- [ ] Mocks conform to protocols, not subclass concrete types
|
|
503
629
|
- [ ] No shared mutable state between tests
|
|
630
|
+
- [ ] Tests do not rely on declaration order or shared suite instances
|
|
631
|
+
- [ ] `.serialized` is reserved for exclusive state, not workflow sequencing
|
|
504
632
|
- [ ] Cancellation tested for cancellable async operations
|
|
@@ -24,12 +24,12 @@ If doing partial work, load only the relevant reference files.
|
|
|
24
24
|
|
|
25
25
|
- Target Swift 6.2 or later, using modern Swift concurrency.
|
|
26
26
|
- As a Swift Testing developer, the user wants all new unit and integration tests to be written using Swift Testing, and they may ask for help migrating existing XCTest code to Swift Testing.
|
|
27
|
-
- Swift Testing does *not* support UI tests
|
|
27
|
+
- Swift Testing does *not* support UI tests - XCTest must be used there.
|
|
28
28
|
- Use a consistent project structure, with folder layout determined by app features.
|
|
29
29
|
|
|
30
30
|
Swift Testing evolves with each Swift release, so expect three to four releases each year, each introducing new features. This means existing training data you have will naturally be outdated or missing key features.
|
|
31
31
|
|
|
32
|
-
This skill specifically draws upon the very latest Swift and Swift Testing code, which means it will suggest things you are not aware of. Treat the user
|
|
32
|
+
This skill specifically draws upon the very latest Swift and Swift Testing code, which means it will suggest things you are not aware of. Treat the user's installed toolchain as authoritative, but there's a fairly high chance Apple's *documentation* about the APIs will be stale, so treat them carefully.
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
## Output Format
|
|
@@ -94,14 +94,14 @@ func workerRunsThreeTimes() async {
|
|
|
94
94
|
}
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
**Note:** `confirmation(expectedCount: 0)` is valid, and means
|
|
97
|
+
**Note:** `confirmation(expectedCount: 0)` is valid, and means "ensure the event we're watching never happens."
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
## How to set a time limit for concurrent tests
|
|
101
101
|
|
|
102
102
|
Time limits are adjusted through the `@Test` macro using `.timeLimit()`. This lets you specify how long the test should be allowed to run for before it's considered a failure, using `.minutes()` as appropriate.
|
|
103
103
|
|
|
104
|
-
**Important:** Many agents strongly believe that you can `.seconds()` here. You cannot use `.seconds()` here
|
|
104
|
+
**Important:** Many agents strongly believe that you can `.seconds()` here. You cannot use `.seconds()` here - it's `.minutes()` or nothing.
|
|
105
105
|
|
|
106
106
|
For example, we could apply a 1-minute maximum runtime like this:
|
|
107
107
|
|
|
@@ -154,7 +154,7 @@ func loadNames() async {
|
|
|
154
154
|
}
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
-
Finally, test targets can have default actor isolation enabled, which might force all tests onto a specific actor
|
|
157
|
+
Finally, test targets can have default actor isolation enabled, which might force all tests onto a specific actor - check for this carefully.
|
|
158
158
|
|
|
159
159
|
|
|
160
160
|
## Testing pre-concurrency code
|
|
@@ -31,8 +31,8 @@ This guide provides core rules you must always follow to ensure you're making na
|
|
|
31
31
|
- Parameterized tests are extremely powerful and allow tests to cover a wider range of ground without the code greatly expanding, so prefer them where possible. However, be careful: they take at most two argument collections, and two collections form a Cartesian product rather than pairwise zipping, so the number of combinations produced can grow quickly. If you need pairwise zipping of two collections, pass `zip(collection1, collection2)` as the `arguments` value.
|
|
32
32
|
- Swift Testing supports `@available` on individual tests, but *not* on test suites. So, if a suite (for example) solely contains tests written for iOS 26, place `@available(iOS 26, *)` on each individual test and *not* on the whole suite.
|
|
33
33
|
- If a test executes without reaching any `#expect` or `#require`, it is assumed to have passed.
|
|
34
|
-
- You should use `withKnownIssue` to wrap code with a known bug
|
|
35
|
-
- Never use `!` to negate Booleans in `#expect` or `#require`, because it defeats Swift Testing
|
|
34
|
+
- You should use `withKnownIssue` to wrap code with a known bug - it expects a test failure to occur, and *fails* the test if no issue is recorded. Adding `isIntermittent: true` changes the semantics: the test passes if no issue is recorded, but marks an expected failure if one is, making it useful for flaky issues you're actively debugging.
|
|
35
|
+
- Never use `!` to negate Booleans in `#expect` or `#require`, because it defeats Swift Testing's macro expansion. So, `#expect(!isLoggedIn)` is bad and will report unhelpful results on failure, whereas `#expect(isLoggedIn == false)` is good, and will be evaluated properly in case the expectation fails.
|
|
36
36
|
|
|
37
37
|
Finally, use `@Tag` to create custom Swift Testing tags like this:
|
|
38
38
|
|
package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md
CHANGED
|
@@ -7,11 +7,11 @@ Most things in XCTest have a direct equivalent in Swift Testing:
|
|
|
7
7
|
- `XCTAssertEqual(a, b)` maps to `#expect(a == b)`
|
|
8
8
|
- `XCTAssertLessThan(a, b)` maps to `#expect(a < b)`
|
|
9
9
|
- `XCTAssertThrowsError` maps to `#expect(throws:)`
|
|
10
|
-
- `XCTUnwrap(optional)` maps to `try #require(optional)`
|
|
11
|
-
- `XCTFail("message")` maps to `Issue.record("message")`
|
|
12
|
-
- `XCTAssertIdentical(a, b)` maps to `#expect(a === b)`
|
|
10
|
+
- `XCTUnwrap(optional)` maps to `try #require(optional)` - both unwrap or fail, but `#require` works with any Boolean condition too.
|
|
11
|
+
- `XCTFail("message")` maps to `Issue.record("message")` - use this to manually record a test failure.
|
|
12
|
+
- `XCTAssertIdentical(a, b)` maps to `#expect(a === b)` - for checking two references point to the same object instance.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
...and so on.
|
|
15
15
|
|
|
16
16
|
However, Swift Testing does *not* offer built-in float tolerance when checking if two floating-point values are *close enough* to be considered the same.
|
|
17
17
|
|
|
@@ -31,4 +31,4 @@ If you are tasked with converting XCTest code to Swift Testing, you should:
|
|
|
31
31
|
1. Start by keeping the same broad structure: the same type names (just going from a class to a struct), and the same test methods (just removing `test` from the names and using `@Test` instead), switching from old-style assertions to new-style expectations.
|
|
32
32
|
2. Look for places where parameterized tests can either cut down on test code or improve coverage.
|
|
33
33
|
3. Add any appropriate `#require` checks at the start of tests, for preconditions.
|
|
34
|
-
4. Finish by adding traits where appropriate
|
|
34
|
+
4. Finish by adding traits where appropriate - `.timeLimit()`, `.enabled(if:)`, `.tags()`, etc, to replace XCTest conventions such as skipping tests.
|
|
@@ -150,7 +150,7 @@ Then apply it to tests:
|
|
|
150
150
|
|
|
151
151
|
For multiple task local values, either nest `withValue()` calls inside a single scope, or create separate scopes and combine them: `@Test(.firstScope, .secondScope, .thirdScope)`. Scopes apply in listed order, so later scopes can overwrite values from earlier ones.
|
|
152
152
|
|
|
153
|
-
Test scopes complement `init()` and `deinit()`
|
|
153
|
+
Test scopes complement `init()` and `deinit()` - use scopes to opt into configurations for individual tests or whole suites as needed.
|
|
154
154
|
|
|
155
155
|
|
|
156
156
|
## Exit tests
|
|
@@ -181,7 +181,7 @@ To test this with Swift Testing, use `#expect(processExitsWith:)` to look for an
|
|
|
181
181
|
}
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
**Important:** This must be executed using `await`
|
|
184
|
+
**Important:** This must be executed using `await` - behind the scenes this starts a dedicated process for that test, then suspends the test until that process completes and can be evaluated.
|
|
185
185
|
|
|
186
186
|
|
|
187
187
|
## Attachments
|
|
@@ -269,7 +269,7 @@ func checkForSmokeTest() async throws {
|
|
|
269
269
|
|
|
270
270
|
**Requires Swift 6.1 or later.**
|
|
271
271
|
|
|
272
|
-
The macros `#expect(_:sourceLocation:performing:throws:)` and `#require(_:sourceLocation:performing:throws:)` are both deprecated
|
|
272
|
+
The macros `#expect(_:sourceLocation:performing:throws:)` and `#require(_:sourceLocation:performing:throws:)` are both deprecated - they used a trailing closure to run some code for evaluation, then used a second trailing closure to check whether the error that was thrown was expected or not.
|
|
273
273
|
|
|
274
274
|
Both `#expect(throws:)` and `#require(throws:)` have been updated to return an error of the type they are checking for, allowing you to run the expectation and error evaluation separately.
|
|
275
275
|
|
package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md
CHANGED
|
@@ -29,11 +29,11 @@ And, if appropriate, concurrency tests.
|
|
|
29
29
|
|
|
30
30
|
## Testing SwiftUI views
|
|
31
31
|
|
|
32
|
-
Never test views directly
|
|
32
|
+
Never test views directly - they use `@State` and are likely to behave unpredictably.
|
|
33
33
|
|
|
34
34
|
Instead, test view models or similar. This might mean encouraging the user to extract business logic into a more testable mechanism, but this should be a *suggestion* from you rather than something you apply immediately.
|
|
35
35
|
|
|
36
|
-
If the project uses `@Observable` view models, these are directly testable without needing a protocol wrapper
|
|
36
|
+
If the project uses `@Observable` view models, these are directly testable without needing a protocol wrapper - just create an instance and test its properties and methods. For more help with SwiftUI, suggest the [SwiftUI Pro agent skill](https://github.com/twostraws/swiftui-agent-skill).
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
## Structuring tests
|
|
@@ -119,7 +119,7 @@ This same concept applies to other things: aim to control time, randomness, and
|
|
|
119
119
|
|
|
120
120
|
Both `#expect` and `#require` evaluate a condition and fail the test if it's false. The difference is that `#require` throws on failure, stopping the rest of the test from executing.
|
|
121
121
|
|
|
122
|
-
**This makes `#require` the right choice for checking assumptions at the start of a test
|
|
122
|
+
**This makes `#require` the right choice for checking assumptions at the start of a test - if your assumptions are wrong, the rest of the test's results are meaningless.**
|
|
123
123
|
|
|
124
124
|
Using `#require` requires adding `throws` to your test method. For example, if your test depends on some setup being correct before the real assertion:
|
|
125
125
|
|
|
@@ -182,12 +182,12 @@ This approach gives fine-grained control: you can assert on the *specific* error
|
|
|
182
182
|
An alternative is using `#expect(throws:)`. Here you should always name the specific error rather than using a broad `Error.self`:
|
|
183
183
|
|
|
184
184
|
```swift
|
|
185
|
-
// Bad
|
|
185
|
+
// Bad - passes for any error
|
|
186
186
|
#expect(throws: Error.self) {
|
|
187
187
|
try game.play()
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
// Good
|
|
190
|
+
// Good - asserts the exact error case
|
|
191
191
|
#expect(throws: GameError.notInstalled) {
|
|
192
192
|
try game.play()
|
|
193
193
|
}
|