@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
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# PHASE 4D
|
|
1
|
+
# PHASE 4D - Preview (LTR + RTL)
|
|
2
2
|
|
|
3
|
-
Write two preview structs
|
|
3
|
+
Write two preview structs - `{ComponentName}Preview` (LTR) and `{ComponentName}RTLPreview` (RTL with Arabic text) - and their `#Preview` entry points at the bottom of `{ComponentName}.swift`.
|
|
4
4
|
|
|
5
|
-
required
|
|
5
|
+
required - always execute this phase.
|
|
6
6
|
SEQUENTIAL: Runs AFTER Phase 4A (Configuration) and Phase 4B (View) complete.
|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -10,10 +10,10 @@ SEQUENTIAL: Runs AFTER Phase 4A (Configuration) and Phase 4B (View) complete.
|
|
|
10
10
|
## CONTEXT VARIABLES
|
|
11
11
|
|
|
12
12
|
These are provided by the orchestrator in the dispatch prompt:
|
|
13
|
-
- `componentName`
|
|
14
|
-
- `componentLocation`
|
|
15
|
-
- `artifactPath`
|
|
16
|
-
- `complexity`
|
|
13
|
+
- `componentName` - e.g., "LabelBadge"
|
|
14
|
+
- `componentLocation` - e.g., "Sources/UIComponents/.../LabelBadge/"
|
|
15
|
+
- `artifactPath` - path to implementation artifacts
|
|
16
|
+
- `complexity` - SIMPLE or COMPLEX
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
@@ -47,11 +47,11 @@ USER_ACTION_REQUIRED: Run Phase 4B first.
|
|
|
47
47
|
|
|
48
48
|
## WHY A SEPARATE PREVIEW STRUCT
|
|
49
49
|
|
|
50
|
-
`#Preview` is a freestanding macro. `@GenerateViewConfiguration` is a member macro that generates `configured()` and forwarding modifiers. When the component is placed directly inside `#Preview { ... }`, the freestanding macro expansion may not resolve members generated by the member macro
|
|
50
|
+
`#Preview` is a freestanding macro. `@GenerateViewConfiguration` is a member macro that generates `configured()` and forwarding modifiers. When the component is placed directly inside `#Preview { ... }`, the freestanding macro expansion may not resolve members generated by the member macro - the compiler reports "no accessible initializers." This is a known Apple bug.
|
|
51
51
|
|
|
52
52
|
The workaround:
|
|
53
|
-
1. Create `{ComponentName}Preview: View`
|
|
54
|
-
2. `#Preview` instantiates `{ComponentName}Preview()`
|
|
53
|
+
1. Create `{ComponentName}Preview: View` - a plain struct with NO macros, auto-synthesized `init()`
|
|
54
|
+
2. `#Preview` instantiates `{ComponentName}Preview()` - it only needs to see the plain `init()`, which has no macro dependency
|
|
55
55
|
3. Inside `{ComponentName}Preview.body`, the custom init and chain modifiers ARE visible because `body` is evaluated during normal type-checking, not during freestanding macro expansion
|
|
56
56
|
|
|
57
57
|
---
|
|
@@ -125,13 +125,13 @@ Append to the bottom of `{componentLocation}/{ComponentName}.swift`:
|
|
|
125
125
|
**Preferred style:** Use the custom init with required props + chain modifiers for optional props.
|
|
126
126
|
|
|
127
127
|
For components with required props + closure dependencies:
|
|
128
|
-
- `{ComponentName}(title: "Book Now") { /* action */ }`
|
|
129
|
-
- `.style(.primary).size(.xlarge)`
|
|
128
|
+
- `{ComponentName}(title: "Book Now") { /* action */ }` - required props + trailing closure in init
|
|
129
|
+
- `.style(.primary).size(.xlarge)` - optional config via chain modifiers
|
|
130
130
|
|
|
131
131
|
For components with paired modifiers:
|
|
132
|
-
- `{ComponentName}(title: "OK") { primaryAction() }`
|
|
133
|
-
- `.secondaryButton("Cancel") { cancel() }`
|
|
134
|
-
- `.state(.scroll)`
|
|
132
|
+
- `{ComponentName}(title: "OK") { primaryAction() }` - required in init
|
|
133
|
+
- `.secondaryButton("Cancel") { cancel() }` - paired modifier
|
|
134
|
+
- `.state(.scroll)` - optional config via chain modifier
|
|
135
135
|
|
|
136
136
|
```swift
|
|
137
137
|
// MARK: - Preview
|
|
@@ -182,7 +182,7 @@ struct {ComponentName}RTLPreview: View {
|
|
|
182
182
|
var body: some View {
|
|
183
183
|
ScrollView {
|
|
184
184
|
VStack(alignment: .leading, spacing: .Spacing.spacing16) {
|
|
185
|
-
Text("{ComponentName}
|
|
185
|
+
Text("{ComponentName} - RTL")
|
|
186
186
|
.typographyStyle(.bodyBold)
|
|
187
187
|
.foregroundStyle(Color.Text.textPrimary)
|
|
188
188
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
@@ -268,7 +268,7 @@ struct {ComponentName}RTLPreview: View {
|
|
|
268
268
|
var body: some View {
|
|
269
269
|
ScrollView {
|
|
270
270
|
VStack(alignment: .leading, spacing: .Spacing.spacing16) {
|
|
271
|
-
Text("{ComponentName}
|
|
271
|
+
Text("{ComponentName} - RTL")
|
|
272
272
|
.typographyStyle(.bodyBold)
|
|
273
273
|
.foregroundStyle(Color.Text.textPrimary)
|
|
274
274
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
@@ -322,7 +322,7 @@ Verify ALL variants from `pass3/04_patterns.md` → Variant Examples are rendere
|
|
|
322
322
|
- ALL explanatory texts (titles, labels) must be **leading aligned** (`.frame(maxWidth: .infinity, alignment: .leading)`)
|
|
323
323
|
- Sections separated by `Divider()`
|
|
324
324
|
- RTL preview has `.environment(\.layoutDirection, .rightToLeft)` and `.environment(\.locale, Locale(identifier: "ar"))` on the outermost container
|
|
325
|
-
- RTL preview title includes `"
|
|
325
|
+
- RTL preview title includes `" - RTL"` suffix for visual identification
|
|
326
326
|
|
|
327
327
|
### Width handling
|
|
328
328
|
|
|
@@ -348,7 +348,7 @@ Without this, white components are invisible on the white Xcode canvas.
|
|
|
348
348
|
```
|
|
349
349
|
[ ] {ComponentName}Preview struct appended to {ComponentName}.swift (not a separate file)
|
|
350
350
|
[ ] {ComponentName}RTLPreview struct appended to {ComponentName}.swift (not a separate file)
|
|
351
|
-
[ ] Both preview structs have NO macros
|
|
351
|
+
[ ] Both preview structs have NO macros - plain structs
|
|
352
352
|
[ ] #Preview instantiates {ComponentName}Preview() (unnamed = LTR default)
|
|
353
353
|
[ ] #Preview("RTL") instantiates {ComponentName}RTLPreview()
|
|
354
354
|
[ ] Inside Preview body, COMPLEX uses custom init + chain modifiers: {ComponentName}(requiredProp: val) { action }.prop1(val)
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
# PHASE 4E
|
|
1
|
+
# PHASE 4E - View Modifiers Extension (+Modifiers)
|
|
2
2
|
|
|
3
|
-
Generate `{ComponentName}+Modifiers.swift`
|
|
3
|
+
Generate `{ComponentName}+Modifiers.swift` - a thin extension on the View that forwards each Configuration property as a discoverable chain modifier method.
|
|
4
4
|
|
|
5
5
|
CONDITIONAL: Only for COMPLEX components with `@GenerateViewConfiguration` + Configuration pattern.
|
|
6
6
|
SEQUENTIAL: Runs AFTER Phase 4A (Configuration) and Phase 4B (View) complete.
|
|
7
7
|
|
|
8
|
-
**NOTE:** `@GenerateViewConfiguration` generates ONLY the `configured()` method. It CANNOT generate View-level forwarding modifiers because Swift macros cannot introspect types other than the one they're attached to
|
|
8
|
+
**NOTE:** `@GenerateViewConfiguration` generates ONLY the `configured()` method. It CANNOT generate View-level forwarding modifiers because Swift macros cannot introspect types other than the one they're attached to - the Configuration struct's properties are invisible to a macro on the View. This phase (AI-written +Modifiers) is ALWAYS required for COMPLEX components.
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
## CONTEXT VARIABLES
|
|
13
13
|
|
|
14
14
|
Provided by the orchestrator:
|
|
15
|
-
- `componentName`
|
|
16
|
-
- `componentLocation`
|
|
17
|
-
- `artifactPath`
|
|
18
|
-
- `complexity`
|
|
19
|
-
- `gitUser`
|
|
20
|
-
- `date`
|
|
15
|
+
- `componentName` - e.g., "TurkishButton"
|
|
16
|
+
- `componentLocation` - e.g., "{repos.components.path}/Sources/UIComponents/Components/DesignSystemCore/Button/TurkishButton"
|
|
17
|
+
- `artifactPath` - path to implementation artifacts
|
|
18
|
+
- `complexity` - must be COMPLEX (skip if SIMPLE)
|
|
19
|
+
- `gitUser` - git user name for file header
|
|
20
|
+
- `date` - DD.MM.YYYY format
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -27,8 +27,8 @@ Provided by the orchestrator:
|
|
|
27
27
|
|
|
28
28
|
2. **Verify files exist**:
|
|
29
29
|
```
|
|
30
|
-
{componentLocation}/{ComponentName}.swift
|
|
31
|
-
{componentLocation}/{ComponentName}Configuration.swift
|
|
30
|
+
{componentLocation}/{ComponentName}.swift - View (Phase 4B)
|
|
31
|
+
{componentLocation}/{ComponentName}Configuration.swift - Configuration (Phase 4A)
|
|
32
32
|
```
|
|
33
33
|
Both must exist. Missing → HALT.
|
|
34
34
|
|
|
@@ -47,11 +47,11 @@ REASON: {ComponentName}Configuration.swift not found. Phase 4A must complete fir
|
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
50
|
-
## ARCHITECTURAL RULE
|
|
50
|
+
## ARCHITECTURAL RULE - Configuration Purity
|
|
51
51
|
|
|
52
52
|
**Configuration structs hold ONLY declarative, value-type properties.**
|
|
53
53
|
|
|
54
|
-
The following MUST NOT be in Configuration
|
|
54
|
+
The following MUST NOT be in Configuration - they are direct View dependencies:
|
|
55
55
|
|
|
56
56
|
| Excluded Type | Reason | Where It Lives |
|
|
57
57
|
|---------------|--------|----------------|
|
|
@@ -62,7 +62,7 @@ The following MUST NOT be in Configuration — they are direct View dependencies
|
|
|
62
62
|
|
|
63
63
|
**Consequence for +Modifiers:** Only Configuration properties get forwarding methods. View dependencies (closures, bindings) are set at init time or via paired modifiers (Phase 4B). Paired modifiers (data+closure combined) live in the View file, not in +Modifiers.
|
|
64
64
|
|
|
65
|
-
**CRITICAL
|
|
65
|
+
**CRITICAL - Skip rules for forwarding modifiers:**
|
|
66
66
|
1. **Coexistent/paired properties (PAIRED_ACTION_SUBCOMPONENT):** Do NOT generate forwarding modifiers for config properties that are the data half of a paired modifier (e.g., `secondaryButtonTitle`). Setting title without action creates a nonsensical state. These are ONLY set via paired modifiers in the View file (e.g., `.secondaryButton(title) { action }`).
|
|
67
67
|
2. **Init-param properties:** Do NOT generate forwarding modifiers for config properties that are required init parameters (e.g., `primaryButtonTitle`). These are set once at construction and should not be modified after init.
|
|
68
68
|
|
|
@@ -155,7 +155,7 @@ Do NOT generate a modifier for properties marked with `@IgnoreChainModifier` in
|
|
|
155
155
|
|
|
156
156
|
## GATE 3: UPDATE_PREVIEW
|
|
157
157
|
|
|
158
|
-
After generating the +Modifiers file, check if the Preview structs in `{ComponentName}.swift` can benefit from the new API. Do NOT change Preview
|
|
158
|
+
After generating the +Modifiers file, check if the Preview structs in `{ComponentName}.swift` can benefit from the new API. Do NOT change Preview - it should continue using the `{ config in ... }` pattern for clarity. The +Modifiers API is for call-site usage, not previews.
|
|
159
159
|
|
|
160
160
|
---
|
|
161
161
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# PHASE 5
|
|
1
|
+
# PHASE 5 - Testing Orchestrator
|
|
2
2
|
|
|
3
3
|
Orchestrates Phase 5 sub-phases: dispatches sub-agents to write test files, collects results.
|
|
4
4
|
PREV: Phase 4 (Implementation)
|
|
@@ -54,7 +54,7 @@ USER_ACTION_REQUIRED: Run Phase 4 first.
|
|
|
54
54
|
## GATE 1: CREATE_TEST_INDEX
|
|
55
55
|
|
|
56
56
|
Create a single index file that maps to all artifact paths used by test sub-phases.
|
|
57
|
-
This is the ONLY file that knows where artifacts live
|
|
57
|
+
This is the ONLY file that knows where artifacts live - sub-phases read this index.
|
|
58
58
|
|
|
59
59
|
### 1.1 Write `{artifactPath}/pass5/_test_index.md`
|
|
60
60
|
|
|
@@ -111,7 +111,7 @@ Generated: {DD.MM.YYYY}
|
|
|
111
111
|
|-----------|------|---------|----------|
|
|
112
112
|
| 5A | `phase-5a-viewinspector.md` | ViewInspector structure + accessibility tests | **ALWAYS** |
|
|
113
113
|
| 5B | `phase-5b-snapshot.md` | Snapshot tests for ALL Figma variants | **ALWAYS** |
|
|
114
|
-
| 5C | `phase-5c-unit.md` | Unit tests for ViewModel/model logic | **CONDITIONAL**
|
|
114
|
+
| 5C | `phase-5c-unit.md` | Unit tests for ViewModel/model logic | **CONDITIONAL** - only if testable logic exists |
|
|
115
115
|
|
|
116
116
|
### Execution Flow
|
|
117
117
|
|
|
@@ -119,15 +119,15 @@ Generated: {DD.MM.YYYY}
|
|
|
119
119
|
GATE 1: CREATE_TEST_INDEX
|
|
120
120
|
↓
|
|
121
121
|
Wave 1 (parallel):
|
|
122
|
-
5A
|
|
123
|
-
5B
|
|
122
|
+
5A - ViewInspector structure tests
|
|
123
|
+
5B - Snapshot visual tests
|
|
124
124
|
↓
|
|
125
125
|
Wave 2 (conditional):
|
|
126
|
-
5C
|
|
126
|
+
5C - Unit tests (ONLY if component has ViewModel/model logic)
|
|
127
127
|
↓
|
|
128
128
|
GATE 2: UPDATE_TEST_INDEX
|
|
129
129
|
↓
|
|
130
|
-
GATE 3: TEST_EXECUTION (xcodebuild test
|
|
130
|
+
GATE 3: TEST_EXECUTION (xcodebuild test - builds + runs, zero warnings, all tests pass)
|
|
131
131
|
↓
|
|
132
132
|
GATE 4: TEST_FILE_VALIDATION
|
|
133
133
|
↓
|
|
@@ -139,7 +139,7 @@ PHASE OUTPUT
|
|
|
139
139
|
### Sub-Phase Inputs
|
|
140
140
|
|
|
141
141
|
All sub-phases read from `{artifactPath}/pass5/_test_index.md` for paths.
|
|
142
|
-
They then read the actual artifact files listed in the index
|
|
142
|
+
They then read the actual artifact files listed in the index - no data duplication.
|
|
143
143
|
|
|
144
144
|
| Sub-Phase | Reads From (via index) |
|
|
145
145
|
|-----------|----------------------|
|
|
@@ -159,7 +159,7 @@ After all sub-phases complete, update `pass5/_test_index.md`:
|
|
|
159
159
|
|
|
160
160
|
## GATE 3: TEST_EXECUTION
|
|
161
161
|
|
|
162
|
-
Build and run tests using the `run-uicomponents-tests.sh` script. The script uses `xcodebuild test` which builds before testing
|
|
162
|
+
Build and run tests using the `run-uicomponents-tests.sh` script. The script uses `xcodebuild test` which builds before testing - no separate build gate is needed. This gate requires **zero build warnings** and **all tests passing**.
|
|
163
163
|
|
|
164
164
|
### How it works
|
|
165
165
|
|
|
@@ -195,21 +195,21 @@ bash "${REPO_ROOT}/.instructions/figma/figma-to-swiftui/scripts/run-uicomponents
|
|
|
195
195
|
|
|
196
196
|
After all tests pass, uncomment the original `.package(url: ...)` line and remove the `.package(path: ...)` line in `Package.swift`.
|
|
197
197
|
|
|
198
|
-
**Important:** Do NOT run multiple test filters in parallel
|
|
198
|
+
**Important:** Do NOT run multiple test filters in parallel - they share the same DerivedData build database and will fail with a database lock error. Run them sequentially.
|
|
199
199
|
|
|
200
|
-
**Note on first-run snapshots:** When snapshot tests run for the first time, `record: .missing` mode will **record** reference images (not fail). The test passes but creates new `__Snapshots__/` directories with `.png` files. These reference images are **gitignored** and must NOT be committed
|
|
200
|
+
**Note on first-run snapshots:** When snapshot tests run for the first time, `record: .missing` mode will **record** reference images (not fail). The test passes but creates new `__Snapshots__/` directories with `.png` files. These reference images are **gitignored** and must NOT be committed - they are re-recorded automatically on each machine. The wiki/Confluence skill copies them from disk for documentation before they are discarded.
|
|
201
201
|
|
|
202
|
-
### required GATE
|
|
202
|
+
### required GATE - SNAPSHOT_DESIGN_FIDELITY
|
|
203
203
|
|
|
204
|
-
Snapshot tests passing does NOT mean the rendered component matches the Figma design. It only means "the pixels we recorded match the pixels we recorded". A broken test scaffold (missing image prefetch per `phase-5b-snapshot.md
|
|
204
|
+
Snapshot tests passing does NOT mean the rendered component matches the Figma design. It only means "the pixels we recorded match the pixels we recorded". A broken test scaffold (missing image prefetch per `phase-5b-snapshot.md section GATE 3.0.1`, wrong hosting frame, clipped layout, misapplied modifier) records a broken render as "ground truth" and every subsequent run compares broken-vs-broken and reports PASS. The test infrastructure CANNOT catch this class of failure by itself.
|
|
205
205
|
|
|
206
|
-
This gate runs automatically after `TEST_EXECUTION` succeeds, every time Phase 5B recorded or re-recorded snapshots (first run or after a test-file change). It is performed by the orchestrator itself
|
|
206
|
+
This gate runs automatically after `TEST_EXECUTION` succeeds, every time Phase 5B recorded or re-recorded snapshots (first run or after a test-file change). It is performed by the orchestrator itself - no user involvement, no pause for confirmation.
|
|
207
207
|
|
|
208
208
|
**Procedure** (automated fix-and-retry loop, up to 4 attempts):
|
|
209
209
|
|
|
210
|
-
1. Read `{artifactPath}/pass1/screenshot.png`
|
|
210
|
+
1. Read `{artifactPath}/pass1/screenshot.png` - the Figma reference captured in Phase 1. (Claude is multimodal and sees images via the Read tool.)
|
|
211
211
|
2. Read the LTR light variant from `__Snapshots__/{componentName}SnapshotTests/test_snapshot_light_default.light_default.png` (or the equivalent default-variant filename).
|
|
212
|
-
3. Compare them directly in the orchestrator's own visual judgement
|
|
212
|
+
3. Compare them directly in the orchestrator's own visual judgement - layout, proportions, hierarchy, typography, colors, gradients, background content, text legibility.
|
|
213
213
|
4. **If match** (all match criteria hold): proceed to Phase 6.
|
|
214
214
|
5. **If mismatch** (any non-match criterion triggers): do NOT halt on the first failure. Instead enter the fix-and-retry loop:
|
|
215
215
|
|
|
@@ -242,7 +242,7 @@ This gate runs automatically after `TEST_EXECUTION` succeeds, every time Phase 5
|
|
|
242
242
|
USER_ACTION_REQUIRED: The mismatch is beyond automated repair. Review pass5/fidelity_attempt_*.md to see what was tried, then inspect the component manually.
|
|
243
243
|
```
|
|
244
244
|
|
|
245
|
-
7. **Counter tracking**: the attempt counter lives in the orchestrator's own task state
|
|
245
|
+
7. **Counter tracking**: the attempt counter lives in the orchestrator's own task state - do NOT rely on grepping files. Increment after every mismatch-driven fix. Reset only on successful match.
|
|
246
246
|
|
|
247
247
|
**Match criteria** (all must hold):
|
|
248
248
|
- Overall layout, proportions, and hierarchy match Figma
|
|
@@ -259,16 +259,16 @@ This gate runs automatically after `TEST_EXECUTION` succeeds, every time Phase 5
|
|
|
259
259
|
- Colors that look "close enough" but don't match Figma tokens
|
|
260
260
|
- Any case where the recorded snapshot is visibly different from `pass1/screenshot.png` beyond expected aspect-ratio or sample-data differences
|
|
261
261
|
|
|
262
|
-
**Never ask the user to confirm the match**. The orchestrator is multimodal and has direct visual access to both images. Surfacing the images to the user and asking for confirmation is forbidden
|
|
262
|
+
**Never ask the user to confirm the match**. The orchestrator is multimodal and has direct visual access to both images. Surfacing the images to the user and asking for confirmation is forbidden - it wastes a round-trip and makes the gate advisory instead of blocking. The orchestrator makes the judgement itself, enters the fix loop on mismatch, and only HALTs after the 4-attempt budget is exhausted.
|
|
263
263
|
|
|
264
|
-
**Never explain away a mismatch**. If the visual comparison shows a clear difference, enter the fix loop
|
|
264
|
+
**Never explain away a mismatch**. If the visual comparison shows a clear difference, enter the fix loop - do not rationalise that the snapshot is "close enough" or that the difference is "just the sample image". Ambiguous cases also enter the fix loop and surface the specific concern in the `fidelity_attempt_{N}.md` diagnosis.
|
|
265
265
|
|
|
266
266
|
### Pass criteria
|
|
267
267
|
|
|
268
268
|
Both conditions must be met:
|
|
269
269
|
|
|
270
|
-
1. **All tests pass**
|
|
271
|
-
2. **Zero build warnings**
|
|
270
|
+
1. **All tests pass** - exit code 0, no test failures
|
|
271
|
+
2. **Zero build warnings** - review xcodebuild output for warnings in the component's test files. Fix any warnings before proceeding.
|
|
272
272
|
|
|
273
273
|
### Exit codes
|
|
274
274
|
|
|
@@ -294,7 +294,7 @@ After tests pass (exit 0), review the output for any warnings in the component's
|
|
|
294
294
|
|
|
295
295
|
| Warning | Fix |
|
|
296
296
|
|---------|-----|
|
|
297
|
-
| `'Inspectable' is deprecated` | Remove the `extension {ComponentName}: Inspectable {}` line
|
|
297
|
+
| `'Inspectable' is deprecated` | Remove the `extension {ComponentName}: Inspectable {}` line - no longer required by ViewInspector |
|
|
298
298
|
| `main actor-isolated property` | Add `@MainActor` to the test class |
|
|
299
299
|
| Unused variable | Remove or use the variable |
|
|
300
300
|
|
|
@@ -318,7 +318,7 @@ USER_ACTION_REQUIRED: Fix the failing tests and re-run.
|
|
|
318
318
|
|
|
319
319
|
Validate that all generated test files follow the required patterns and that no tests are skipped.
|
|
320
320
|
|
|
321
|
-
### 5.1 Structural validation
|
|
321
|
+
### 5.1 Structural validation - ViewInspector test file
|
|
322
322
|
|
|
323
323
|
Check the ViewInspector test file at `Tests/{sourceModule}Tests/ViewInspector/{componentPath}/{componentName}ViewInspectorTests.swift`:
|
|
324
324
|
|
|
@@ -334,11 +334,11 @@ Check the ViewInspector test file at `Tests/{sourceModule}Tests/ViewInspector/{c
|
|
|
334
334
|
[ ] Has `test_containsExpectedSubviews()` test
|
|
335
335
|
[ ] Has variant rendering tests (e.g., `test_allStatesRender`)
|
|
336
336
|
[ ] Has accessibility identifier tests for each testing ID
|
|
337
|
-
[ ] No `XCTSkip`
|
|
338
|
-
[ ] No `throw XCTSkip`
|
|
337
|
+
[ ] No `XCTSkip` - all tests must execute
|
|
338
|
+
[ ] No `throw XCTSkip` - no conditional skipping
|
|
339
339
|
```
|
|
340
340
|
|
|
341
|
-
### 5.2 Structural validation
|
|
341
|
+
### 5.2 Structural validation - Snapshot test file
|
|
342
342
|
|
|
343
343
|
Check the Snapshot test file at `Tests/{sourceModule}Tests/Snapshot/{componentPath}/{componentName}SnapshotTests.swift`:
|
|
344
344
|
|
|
@@ -356,7 +356,7 @@ Check the Snapshot test file at `Tests/{sourceModule}Tests/Snapshot/{componentPa
|
|
|
356
356
|
[ ] Each helper uses `.image(precision: 0.99, perceptualPrecision: 0.98)`
|
|
357
357
|
[ ] RTL helpers set `.semanticContentAttribute = .forceRightToLeft`
|
|
358
358
|
[ ] Dark helpers set `.overrideUserInterfaceStyle = .dark`
|
|
359
|
-
[ ] No `XCTSkip`
|
|
359
|
+
[ ] No `XCTSkip` - all tests must execute
|
|
360
360
|
```
|
|
361
361
|
|
|
362
362
|
### 5.3 Test naming convention
|
|
@@ -411,10 +411,10 @@ python3 .instructions/figma/figma-to-swiftui/scripts/phase5-finalize.py \
|
|
|
411
411
|
|
|
412
412
|
| Result | Action |
|
|
413
413
|
|--------|--------|
|
|
414
|
-
| Exit 0, `"action": "updated"` | `status.ios.tested` set green, `against = implemented.version`
|
|
415
|
-
| Exit 0, `"action": "already_current"` | Already marked against current implemented.version
|
|
416
|
-
| Exit 0, `"action": "created"` | New registry file created
|
|
417
|
-
| Exit 1 | HALT
|
|
414
|
+
| Exit 0, `"action": "updated"` | `status.ios.tested` set green, `against = implemented.version` - proceed |
|
|
415
|
+
| Exit 0, `"action": "already_current"` | Already marked against current implemented.version - proceed |
|
|
416
|
+
| Exit 0, `"action": "created"` | New registry file created - proceed |
|
|
417
|
+
| Exit 1 | HALT - registry update failed |
|
|
418
418
|
|
|
419
419
|
**Why this matters:** This is the single source of truth for `status.ios.tested`. The script records `against = status.ios.implemented.version` so when the next Phase 4 bumps `implemented.version`, this flag automatically drops to yellow until tests are re-run. `figma-iteration-commit` reads this and syncs the GitHub issue via `update-issue-from-registry.py`.
|
|
420
420
|
|
|
@@ -439,10 +439,10 @@ GATES_PASSED: [PRE_CHECK, CREATE_TEST_INDEX, ROUTING, UPDATE_TEST_INDEX, TEST_EX
|
|
|
439
439
|
ARTIFACTS_CREATED:
|
|
440
440
|
- {artifactPath}/pass5/_test_index.md
|
|
441
441
|
SUB_PHASES:
|
|
442
|
-
- 5A ViewInspector: {COUNT} tests
|
|
443
|
-
- 5B Snapshot: {COUNT} tests ({LIGHT} light + {DARK} dark + {RTL} RTL)
|
|
444
|
-
- 5C Unit: {COUNT} tests or N/A
|
|
445
|
-
TESTS: ✅ PASS (xcodebuild test
|
|
442
|
+
- 5A ViewInspector: {COUNT} tests - {testFilePath}
|
|
443
|
+
- 5B Snapshot: {COUNT} tests ({LIGHT} light + {DARK} dark + {RTL} RTL) - {testFilePath}
|
|
444
|
+
- 5C Unit: {COUNT} tests or N/A - {testFilePath or N/A}
|
|
445
|
+
TESTS: ✅ PASS (xcodebuild test - zero warnings, all tests green)
|
|
446
446
|
VALIDATION: ✅ PASS (structure + naming + variant coverage)
|
|
447
447
|
SUMMARY: Phase 5 testing complete. {TOTAL} tests across {FILE_COUNT} test files. Zero warnings. All tests passing.
|
|
448
448
|
```
|
|
@@ -453,19 +453,19 @@ SUMMARY: Phase 5 testing complete. {TOTAL} tests across {FILE_COUNT} test files.
|
|
|
453
453
|
|
|
454
454
|
```
|
|
455
455
|
[ ] pass5/_test_index.md created with all artifact paths
|
|
456
|
-
[ ] 5A ViewInspector test file created
|
|
457
|
-
[ ] 5B Snapshot test file created
|
|
456
|
+
[ ] 5A ViewInspector test file created - structure, accessibility, variant rendering tests
|
|
457
|
+
[ ] 5B Snapshot test file created - light/dark/RTL variants, snapshot helpers
|
|
458
458
|
[ ] 5C Unit tests created OR marked N/A (no testable logic)
|
|
459
459
|
[ ] Test index updated with final status
|
|
460
460
|
[ ] All test files follow existing project patterns (XCTest, makeSUT, closure init)
|
|
461
461
|
[ ] xcodebuild test passed (exit 0, all tests green)
|
|
462
462
|
[ ] Zero build warnings in component test files
|
|
463
|
-
[ ] No XCTSkip in any test file
|
|
463
|
+
[ ] No XCTSkip in any test file - all tests must execute
|
|
464
464
|
[ ] Snapshot test naming follows test_snapshot_{mode}_{variant} convention
|
|
465
465
|
[ ] ViewInspector tests cover all accessibility identifiers
|
|
466
466
|
[ ] Snapshot tests cover ALL Figma variant dimensions (light + dark minimum)
|
|
467
467
|
[ ] RTL snapshot tests present for components with text/localized content
|
|
468
|
-
[ ] Snapshot reference images generated locally (NOT committed
|
|
468
|
+
[ ] Snapshot reference images generated locally (NOT committed - gitignored)
|
|
469
469
|
[ ] phase5-finalize.py passed (status.ios.tested updated)
|
|
470
470
|
```
|
|
471
471
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# PHASE 5A
|
|
1
|
+
# PHASE 5A - ViewInspector Structure Tests
|
|
2
2
|
|
|
3
3
|
ViewInspector-based tests verifying view hierarchy, text content, and accessibility identifiers.
|
|
4
4
|
|
|
5
5
|
PARENT: `phase-5-orchestrator.md`
|
|
6
|
-
required
|
|
6
|
+
required - always execute this sub-phase.
|
|
7
7
|
|
|
8
|
-
**FRAMEWORK**: XCTest (NOT Swift Testing
|
|
8
|
+
**FRAMEWORK**: XCTest (NOT Swift Testing - ViewInspector has issues with `@Test`, see GitHub #319)
|
|
9
9
|
|
|
10
10
|
### Naming Convention
|
|
11
11
|
|
|
12
|
-
REF: [Kodeco
|
|
12
|
+
REF: [Kodeco - iOS Test-Driven Development by Tutorials](https://www.kodeco.com/books/ios-test-driven-development-by-tutorials/v2.0/chapters/3-tdd-app-setup)
|
|
13
13
|
|
|
14
14
|
Pattern: `test_{systemUnderTest}_{whenCondition}_{expectedResult}`
|
|
15
15
|
|
|
@@ -49,7 +49,7 @@ Test File: {componentName}ViewInspectorTests.swift
|
|
|
49
49
|
|
|
50
50
|
| Check | Pass | Fail |
|
|
51
51
|
|-------|------|------|
|
|
52
|
-
| `{sourceModule}Tests` target exists | Proceed | HALT
|
|
52
|
+
| `{sourceModule}Tests` target exists | Proceed | HALT - add test target first |
|
|
53
53
|
| Dependencies include ExternalViewInspector, ExternalSnapshotTesting | Proceed | HALT |
|
|
54
54
|
|
|
55
55
|
---
|
|
@@ -73,7 +73,7 @@ import ViewInspector
|
|
|
73
73
|
import XCTest
|
|
74
74
|
@testable import {sourceModule}
|
|
75
75
|
|
|
76
|
-
// NOTE: Do NOT add `extension {componentName}: Inspectable {}`
|
|
76
|
+
// NOTE: Do NOT add `extension {componentName}: Inspectable {}` - deprecated since ViewInspector 0.10+
|
|
77
77
|
|
|
78
78
|
@MainActor
|
|
79
79
|
final class {componentName}ViewInspectorTests: XCTestCase {
|
|
@@ -270,5 +270,5 @@ PHASE: phase-5a
|
|
|
270
270
|
GATES_PASSED: [PRE_CHECK, DETERMINE_TEST_LOCATION, CREATE_TEST_FILE, IMPLEMENT_STRUCTURE_TESTS, IMPLEMENT_ACCESSIBILITY_TESTS, RUN_TESTS]
|
|
271
271
|
ARTIFACTS_CREATED:
|
|
272
272
|
- Tests/{sourceModule}Tests/ViewInspector/{componentPath}/{componentName}ViewInspectorTests.swift
|
|
273
|
-
SUMMARY: {COUNT} ViewInspector tests
|
|
273
|
+
SUMMARY: {COUNT} ViewInspector tests - structure ({STRUCT_COUNT}), accessibility identifiers ({ID_COUNT}), variants ({VARIANT_COUNT}).
|
|
274
274
|
```
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# PHASE 5B
|
|
1
|
+
# PHASE 5B - Snapshot Tests
|
|
2
2
|
|
|
3
3
|
Snapshot visual regression tests for ALL Figma variants in light and dark mode.
|
|
4
4
|
|
|
5
5
|
PARENT: `phase-5-orchestrator.md`
|
|
6
|
-
required
|
|
6
|
+
required - always execute this sub-phase.
|
|
7
7
|
PARALLEL WITH: Phase 5A (both read from pass5/_test_index.md independently)
|
|
8
8
|
|
|
9
9
|
**FRAMEWORK**: XCTest with swift-snapshot-testing (via ExternalSnapshotTesting)
|
|
@@ -100,30 +100,30 @@ Without this, white components are invisible against the default white snapshot
|
|
|
100
100
|
|
|
101
101
|
### 3.0.1 Remote Image Initialization (required if the component uses `RemoteImage` / Kingfisher)
|
|
102
102
|
|
|
103
|
-
**CRITICAL
|
|
103
|
+
**CRITICAL - this gate is easy to miss and produces silent false positives.**
|
|
104
104
|
|
|
105
|
-
If the component (or any nested component it composes) renders images via `CoreUI.RemoteImage` / Kingfisher / any async image loader, the snapshot test MUST include image-initialization scaffolding. Without it, the snapshot captures the KFImage **placeholder state**
|
|
105
|
+
If the component (or any nested component it composes) renders images via `CoreUI.RemoteImage` / Kingfisher / any async image loader, the snapshot test MUST include image-initialization scaffolding. Without it, the snapshot captures the KFImage **placeholder state** - the first and every subsequent run compare placeholder to placeholder, so the tests "pass" while the reference PNGs contain no real image pixels at all.
|
|
106
106
|
|
|
107
|
-
**How to detect the need**: if `pass3/04b_component_architecture.md` / `pass3/04_patterns.md` / `pass3/06_assets.md` mentions `RemoteImage`, `Kingfisher`, `KFImage`, image URL, remote image, or the component consumes any protocol/config with an `imageURL: URL` field, you MUST apply this gate. Also check if any **nested** component uses remote images
|
|
107
|
+
**How to detect the need**: if `pass3/04b_component_architecture.md` / `pass3/04_patterns.md` / `pass3/06_assets.md` mentions `RemoteImage`, `Kingfisher`, `KFImage`, image URL, remote image, or the component consumes any protocol/config with an `imageURL: URL` field, you MUST apply this gate. Also check if any **nested** component uses remote images - the parent inherits the requirement transitively.
|
|
108
108
|
|
|
109
|
-
**NEVER use `usleep` on the main thread in either the prefetch or the image wait.** Kingfisher dispatches its `retrieveImage` completion handlers and KFImage's view-delivery updates back to the **main queue**. `usleep` blocks the main runloop, so those callbacks never fire, the cache never warms, and the snapshot captures a placeholder. Use `RunLoop.main.run(until:)` to spin the runloop instead
|
|
109
|
+
**NEVER use `usleep` on the main thread in either the prefetch or the image wait.** Kingfisher dispatches its `retrieveImage` completion handlers and KFImage's view-delivery updates back to the **main queue**. `usleep` blocks the main runloop, so those callbacks never fire, the cache never warms, and the snapshot captures a placeholder. Use `RunLoop.main.run(until:)` to spin the runloop instead - that allows queued main-actor work to drain while you wait. See the sibling `Homepage3rdPartyCardSnapshotTests.swift` for the canonical 20 ms pattern, and `HomepageAdditionalServices3rdPartyGroupSnapshotTests.swift` for the composite-view 4 s pattern (same rule, longer deadline).
|
|
110
110
|
|
|
111
111
|
**Required scaffolding** (both references together show the full pattern):
|
|
112
112
|
|
|
113
|
-
1. **Module imports**
|
|
114
|
-
2. **Deterministic seeded URLs**
|
|
115
|
-
3. **`@MainActor private func prefetchVariantImages(timeout:)`**
|
|
116
|
-
4. **`override class func setUp()`**
|
|
117
|
-
5. **`override func setUp()`**
|
|
118
|
-
6. **`waitForImages()` helper**
|
|
113
|
+
1. **Module imports** - `@testable import CoreUI` + `import Kingfisher` in addition to the usual `SnapshotTesting` / `SwiftUI` / `XCTest`.
|
|
114
|
+
2. **Deterministic seeded URLs** - file-scope `let`s like `URL(string: "https://picsum.photos/seed/{slug}/{W}/{H}")!`. Seeds return the same image bytes for identical URLs → stable snapshots. Do NOT use unseeded picsum, placehold.it, or any URL that returns different bytes per request.
|
|
115
|
+
3. **`@MainActor private func prefetchVariantImages(timeout:)`** - kicks `KingfisherManager.shared.retrieveImage(with:)` for every URL and **spins `RunLoop.main.run(until:)`** until every completion callback has fired (not `usleep`, not `isCached` polling). Use a `@MainActor final class` counter (`MainActor.assumeIsolated { counter.remaining -= 1 }` inside the completion) to satisfy Swift 6 concurrency rules - a captured `var Int` inside the closure will not compile. 20 s timeout is safe; the runloop exits early once the counter hits zero.
|
|
116
|
+
4. **`override class func setUp()`** - after `TestDependencies.registerAll()`, set `RemoteImageConfiguration.shared.fadeDuration = 0`. This disables KFImage's crossfade animation so cached pixels appear on the first layout pass instead of fading in mid-snapshot.
|
|
117
|
+
5. **`override func setUp()`** - call `prefetchVariantImages()` before every test, so each test sees warm cache.
|
|
118
|
+
6. **`waitForImages()` helper** - **`RunLoop.main.run(until: Date().addingTimeInterval({seconds}))`**, NOT `usleep`. Call it in every assert helper AFTER `vc.view.layoutIfNeeded()` and BEFORE `SnapshotTesting.assertSnapshot(...)`. Duration depends on how many `RemoteImage` instances the view composes **simultaneously**:
|
|
119
119
|
|
|
120
120
|
| Simultaneous async-image views | `waitForImages` duration | Canonical reference |
|
|
121
121
|
|---|---|---|
|
|
122
122
|
| 1 (single card, single banner, etc.) | 20 ms (`usleep(20_000)` is OK for single-view, but `RunLoop.main.run` is still safer) | `Homepage3rdPartyCardSnapshotTests.swift` |
|
|
123
|
-
| 2
|
|
124
|
-
| 5+ (lists, grids, large composites) | 4
|
|
123
|
+
| 2-4 (group / row / carousel composing multiple cards) | 2-4 s via `RunLoop.main.run(until:)` | `HomepageAdditionalServices3rdPartyGroupSnapshotTests.swift` |
|
|
124
|
+
| 5+ (lists, grids, large composites) | 4-6 s via `RunLoop.main.run(until:)`; consider also capping list length to 3-5 in `makeSUT` |
|
|
125
125
|
|
|
126
|
-
7. **Frame width sanity**
|
|
126
|
+
7. **Frame width sanity** - if the SUT renders a section title or horizontal carousel, make sure the snapshot frame width is wide enough to include the title and at least one full card. Clipped titles are a visible smoke signal that the frame is too narrow.
|
|
127
127
|
|
|
128
128
|
**Skeleton** (adapt to single-view OR composite-view shape per the table above):
|
|
129
129
|
|
|
@@ -147,7 +147,7 @@ private final class PrefetchCounter {
|
|
|
147
147
|
|
|
148
148
|
/// Warms Kingfisher's memory cache for all variant URLs and spins the main
|
|
149
149
|
/// runloop until every completion callback fires (or the deadline expires).
|
|
150
|
-
/// Spinning the runloop is required
|
|
150
|
+
/// Spinning the runloop is required - usleep on main would starve the
|
|
151
151
|
/// Kingfisher callbacks and the cache would never warm.
|
|
152
152
|
@MainActor
|
|
153
153
|
private func prefetchVariantImages(timeout: TimeInterval = 20.0) {
|
|
@@ -178,10 +178,10 @@ final class {ComponentName}SnapshotTests: XCTestCase {
|
|
|
178
178
|
prefetchVariantImages() // required
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
/// required
|
|
181
|
+
/// required - uses RunLoop.main.run(until:), never usleep.
|
|
182
182
|
/// Duration scales with # of simultaneous RemoteImage views (see table
|
|
183
|
-
/// in phase-5b
|
|
184
|
-
/// 2
|
|
183
|
+
/// in phase-5b section 3.0.1). 20 ms is enough for a single-card SUT;
|
|
184
|
+
/// 2-4 s is required for composite views that render multiple cards
|
|
185
185
|
/// at once.
|
|
186
186
|
private func waitForImages() {
|
|
187
187
|
RunLoop.main.run(until: Date().addingTimeInterval(/* single: 0.02 | composite: 4.0 */))
|
|
@@ -202,25 +202,25 @@ final class {ComponentName}SnapshotTests: XCTestCase {
|
|
|
202
202
|
1. Delete any pre-existing PNGs under `__Snapshots__/{ComponentName}SnapshotTests/`.
|
|
203
203
|
2. Run the suite once. Expect failures on first run (`.missing` mode auto-records).
|
|
204
204
|
3. Open at least one recorded PNG visually and confirm every card/image slot shows **real photographic content**, not a Kingfisher placeholder (light gradient + activity spinner) and not an all-blank background.
|
|
205
|
-
4. Check file sizes: real photographic snapshots are typically 100 KB
|
|
206
|
-
5. Run the suite a second time
|
|
205
|
+
4. Check file sizes: real photographic snapshots are typically 100 KB - 2 MB. A composite PNG at <50 KB is a strong signal of placeholder capture.
|
|
206
|
+
5. Run the suite a second time - it MUST pass on the regression run. If not, increase `waitForImages` duration.
|
|
207
207
|
6. Only commit PNGs (if tracked) and the test file together, never separately.
|
|
208
208
|
|
|
209
|
-
**Root-cause note (why this gate exists):** the template in
|
|
209
|
+
**Root-cause note (why this gate exists):** the template in section 3.1 below references `ExploreCityDetailAboutCitySnapshotTests.swift`, which does NOT use remote images. A subagent that copies only the section 3.1 template will silently omit the scaffolding above and produce tests that lock in placeholder reference PNGs. This has happened in real runs:
|
|
210
210
|
|
|
211
|
-
- `HomepageAdditionalServices3rdPartyGroupSnapshotTests` ({jira.projectKey}-132403): first fix copied the sibling's `usleep(20_000)` wait verbatim
|
|
211
|
+
- `HomepageAdditionalServices3rdPartyGroupSnapshotTests` ({jira.projectKey}-132403): first fix copied the sibling's `usleep(20_000)` wait verbatim - the composite renders **three** `Homepage3rdPartyCard` instances simultaneously, and 20 ms wasn't enough for all three to drain. Second fix replaced both the prefetch poll AND the image wait with `RunLoop.main.run(until:)` and extended the wait to 4 s. Reference PNGs went from 65 KB (placeholder) to 750 KB - 1.76 MB (real photos).
|
|
212
212
|
|
|
213
|
-
**If the component renders a single `RemoteImage`, the canonical reference is `Homepage3rdPartyCardSnapshotTests.swift`. If the component composes multiple `RemoteImage` instances simultaneously, the canonical reference is `HomepageAdditionalServices3rdPartyGroupSnapshotTests.swift`.** Neither the Explore reference nor the generic
|
|
213
|
+
**If the component renders a single `RemoteImage`, the canonical reference is `Homepage3rdPartyCardSnapshotTests.swift`. If the component composes multiple `RemoteImage` instances simultaneously, the canonical reference is `HomepageAdditionalServices3rdPartyGroupSnapshotTests.swift`.** Neither the Explore reference nor the generic section 3.1 template is appropriate for remote-image components.
|
|
214
214
|
|
|
215
215
|
### 3.1 Template
|
|
216
216
|
|
|
217
217
|
Pick the canonical reference based on what the component renders:
|
|
218
218
|
|
|
219
|
-
| Component shape | Canonical reference |
|
|
219
|
+
| Component shape | Canonical reference | section 3.0.1 scaffolding |
|
|
220
220
|
|---|---|---|
|
|
221
221
|
| Pure SwiftUI, no remote images | `ExploreCityDetailAboutCitySnapshotTests.swift` | Not required |
|
|
222
222
|
| Single `RemoteImage` / Kingfisher instance | `Homepage3rdPartyCardSnapshotTests.swift` | **Required** (single-view variant) |
|
|
223
|
-
| Composite view with 2+ `RemoteImage` instances rendered simultaneously | `HomepageAdditionalServices3rdPartyGroupSnapshotTests.swift` | **Required** (composite variant, 2
|
|
223
|
+
| Composite view with 2+ `RemoteImage` instances rendered simultaneously | `HomepageAdditionalServices3rdPartyGroupSnapshotTests.swift` | **Required** (composite variant, 2-4 s `RunLoop.main.run` wait) |
|
|
224
224
|
|
|
225
225
|
Then follow the established project pattern from the chosen reference:
|
|
226
226
|
|
|
@@ -564,7 +564,7 @@ func test_snapshot_en_dark_{caseName}() {
|
|
|
564
564
|
|
|
565
565
|
## GATE 6: RUN_AND_RECORD
|
|
566
566
|
|
|
567
|
-
### 6.1 First Run
|
|
567
|
+
### 6.1 First Run - Record Reference Snapshots
|
|
568
568
|
|
|
569
569
|
**IMPORTANT:** Use `xcodebuild`, NOT `swift test`. The project uses Xcode-specific features (`ColorResource`, `ImageResource`, asset catalogs) that are unavailable in SPM's `swift build`/`swift test`.
|
|
570
570
|
|
|
@@ -590,7 +590,7 @@ Tests/{sourceModule}Tests/__Snapshots__/{componentName}SnapshotTests/
|
|
|
590
590
|
|----------|--------|--------|
|
|
591
591
|
| {EXPECTED_COUNT} total | {ACTUAL_COUNT} recorded | pass/fail |
|
|
592
592
|
|
|
593
|
-
### 6.3 Second Run
|
|
593
|
+
### 6.3 Second Run - Verify Regression
|
|
594
594
|
|
|
595
595
|
```bash
|
|
596
596
|
cd {repos.components.path} && \
|
|
@@ -632,5 +632,5 @@ GATES_PASSED: [PRE_CHECK, DETERMINE_VARIANT_MATRIX, DETERMINE_TEST_LOCATION, CRE
|
|
|
632
632
|
ARTIFACTS_CREATED:
|
|
633
633
|
- Tests/{sourceModule}Tests/Snapshot/{componentPath}/{componentName}SnapshotTests.swift
|
|
634
634
|
- Tests/{sourceModule}Tests/__Snapshots__/{componentName}SnapshotTests/*.png
|
|
635
|
-
SUMMARY: {COUNT} snapshot tests
|
|
635
|
+
SUMMARY: {COUNT} snapshot tests - {ENUM_COUNT} enum variants × 2 themes + {OPTIONAL_COUNT} optional variants × 2 themes + {RTL_COUNT} RTL variants × 2 themes + {LOCALE_COUNT} locale variants (TR/EN) × 2 themes = {TOTAL} snapshots.
|
|
636
636
|
```
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# PHASE 5C
|
|
1
|
+
# PHASE 5C - Unit Tests
|
|
2
2
|
|
|
3
3
|
Unit tests for component logic: ViewModel, model computed properties, data transformations.
|
|
4
4
|
|
|
5
5
|
PARENT: `phase-5-orchestrator.md`
|
|
6
|
-
CONDITIONAL
|
|
6
|
+
CONDITIONAL - only execute if component has testable logic.
|
|
7
7
|
|
|
8
8
|
**FRAMEWORK**: Swift Testing (`@Test`, `#expect`, `@Suite`)
|
|
9
9
|
|
|
@@ -15,15 +15,15 @@ Read the component source file. Determine if testable logic exists.
|
|
|
15
15
|
|
|
16
16
|
| Component Has | Action |
|
|
17
17
|
|---------------|--------|
|
|
18
|
-
| ViewModel class (`ObservableObject`) | Execute
|
|
19
|
-
| Model with computed properties | Execute
|
|
20
|
-
| Data transformation functions | Execute
|
|
21
|
-
| Action handlers with branching logic | Execute
|
|
22
|
-
| Pure View only (configuration + body) | **N/A
|
|
18
|
+
| ViewModel class (`ObservableObject`) | Execute - test state mutations |
|
|
19
|
+
| Model with computed properties | Execute - test computations |
|
|
20
|
+
| Data transformation functions | Execute - test transformations |
|
|
21
|
+
| Action handlers with branching logic | Execute - test branches |
|
|
22
|
+
| Pure View only (configuration + body) | **N/A - skip this sub-phase** |
|
|
23
23
|
|
|
24
24
|
Most Figma-generated components are pure Views with a Configuration struct and a body.
|
|
25
25
|
Configuration structs with only stored properties have no testable logic.
|
|
26
|
-
`@GenerateChainModifiers` and `@GenerateConfiguredInit` are macro-generated
|
|
26
|
+
`@GenerateChainModifiers` and `@GenerateConfiguredInit` are macro-generated - tested by UIMacrosTests, not here.
|
|
27
27
|
|
|
28
28
|
N/A →
|
|
29
29
|
```
|
|
@@ -138,5 +138,5 @@ PHASE: phase-5c
|
|
|
138
138
|
GATES_PASSED: [LOGIC_CHECK, PRE_CHECK, DETERMINE_TEST_LOCATION, IDENTIFY_TESTABLE_UNITS, CREATE_TEST_FILE, RUN_TESTS]
|
|
139
139
|
ARTIFACTS_CREATED:
|
|
140
140
|
- Tests/{sourceModule}Tests/Unit/{componentPath}/{componentName}Tests.swift
|
|
141
|
-
SUMMARY: {COUNT} unit tests
|
|
141
|
+
SUMMARY: {COUNT} unit tests - ViewModel ({VM_COUNT}), Model ({MODEL_COUNT}).
|
|
142
142
|
```
|