@mmerterden/multi-agent-pipeline 8.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2623 -0
- package/LICENSE +21 -0
- package/README.md +852 -0
- package/docs/FIGMA_PIPELINE.md +138 -0
- package/docs/GENERICITY-REVIEW.md +277 -0
- package/docs/STABILITY-FIX-PLAN.md +168 -0
- package/docs/adr/0001-three-model-triage.md +81 -0
- package/docs/adr/0002-instruction-driven-flag.md +62 -0
- package/docs/adr/0003-unified-shared-skills.md +55 -0
- package/docs/adr/0004-zero-dependency-philosophy.md +60 -0
- package/docs/adr/0005-lazy-phase-docs.md +68 -0
- package/docs/adr/0006-skills-core-external-split.md +52 -0
- package/docs/adr/0007-multi-tool-adapter-framework.md +110 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +98 -0
- package/docs/adr/README.md +33 -0
- package/docs/architecture.md +181 -0
- package/docs/best-practices.md +93 -0
- package/docs/features.md +274 -0
- package/docs/performance.md +116 -0
- package/docs/recovery-guide.md +479 -0
- package/index.js +76 -0
- package/install/_adapters.mjs +69 -0
- package/install/_common.mjs +150 -0
- package/install/_copilot-instructions.mjs +32 -0
- package/install/_dev-only-files.mjs +23 -0
- package/install/_platform-filter.mjs +132 -0
- package/install/_telemetry.mjs +79 -0
- package/install/claude.mjs +332 -0
- package/install/copilot.mjs +254 -0
- package/install/index.mjs +179 -0
- package/install/templates/copilot-instructions.md +319 -0
- package/install.js +24 -0
- package/package.json +78 -0
- package/pipeline/adapters/_base.mjs +288 -0
- package/pipeline/adapters/copilot-chat.mjs +158 -0
- package/pipeline/adapters/cursor.mjs +187 -0
- package/pipeline/agents/android-architect.md +42 -0
- package/pipeline/agents/backend-architect.md +43 -0
- package/pipeline/agents/code-reviewer.md +57 -0
- package/pipeline/agents/dev-critic.md +148 -0
- package/pipeline/agents/explorer.md +34 -0
- package/pipeline/agents/ios-architect.md +41 -0
- package/pipeline/agents/security-auditor.md +98 -0
- package/pipeline/agents/task-clarifier.md +113 -0
- package/pipeline/claude-md-template.md +55 -0
- package/pipeline/commands/archive-guard.md +45 -0
- package/pipeline/commands/deploy.md +54 -0
- package/pipeline/commands/figma-to-swiftui.md +295 -0
- package/pipeline/commands/multi-agent/_account-picker.md +90 -0
- package/pipeline/commands/multi-agent/_dev-context.md +111 -0
- package/pipeline/commands/multi-agent/_input-parser.md +43 -0
- package/pipeline/commands/multi-agent/_repo-picker.md +76 -0
- package/pipeline/commands/multi-agent/autopilot.md +116 -0
- package/pipeline/commands/multi-agent/channels.md +465 -0
- package/pipeline/commands/multi-agent/delete.md +66 -0
- package/pipeline/commands/multi-agent/dev-autopilot.md +120 -0
- package/pipeline/commands/multi-agent/dev-local-autopilot.md +110 -0
- package/pipeline/commands/multi-agent/dev-local.md +105 -0
- package/pipeline/commands/multi-agent/dev.md +246 -0
- package/pipeline/commands/multi-agent/diff-explain.md +68 -0
- package/pipeline/commands/multi-agent/help.md +422 -0
- package/pipeline/commands/multi-agent/issue.md +79 -0
- package/pipeline/commands/multi-agent/jira.md +132 -0
- package/pipeline/commands/multi-agent/kill.md +38 -0
- package/pipeline/commands/multi-agent/language.md +94 -0
- package/pipeline/commands/multi-agent/local-autopilot.md +139 -0
- package/pipeline/commands/multi-agent/local.md +117 -0
- package/pipeline/commands/multi-agent/log.md +25 -0
- package/pipeline/commands/multi-agent/manual-test.md +43 -0
- package/pipeline/commands/multi-agent/purge.md +39 -0
- package/pipeline/commands/multi-agent/refactor.md +188 -0
- package/pipeline/commands/multi-agent/refs/android-guide.md +250 -0
- package/pipeline/commands/multi-agent/refs/audit-guide.md +240 -0
- package/pipeline/commands/multi-agent/refs/backend-guide.md +135 -0
- package/pipeline/commands/multi-agent/refs/channels/confluence.md +153 -0
- package/pipeline/commands/multi-agent/refs/channels/issue-comment.md +141 -0
- package/pipeline/commands/multi-agent/refs/channels/jira.md +127 -0
- package/pipeline/commands/multi-agent/refs/channels/pr-review-actions.md +135 -0
- package/pipeline/commands/multi-agent/refs/channels/pr.md +139 -0
- package/pipeline/commands/multi-agent/refs/channels/wiki.md +66 -0
- package/pipeline/commands/multi-agent/refs/component-dispatch.md +92 -0
- package/pipeline/commands/multi-agent/refs/cross-cli-contract.md +326 -0
- package/pipeline/commands/multi-agent/refs/frontend-guide.md +136 -0
- package/pipeline/commands/multi-agent/refs/issue-jira-triad.md +104 -0
- package/pipeline/commands/multi-agent/refs/keychain.md +80 -0
- package/pipeline/commands/multi-agent/refs/knowledge.md +112 -0
- package/pipeline/commands/multi-agent/refs/multi-repo-integration-build.md +207 -0
- package/pipeline/commands/multi-agent/refs/phases/log-format.md +89 -0
- package/pipeline/commands/multi-agent/refs/phases/modes.md +156 -0
- package/pipeline/commands/multi-agent/refs/phases/operations.md +91 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-0-init.md +481 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-1-analysis.md +264 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-2-planning.md +278 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-3-dev.md +364 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-4-review.md +378 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-5-test.md +129 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-6-commit.md +339 -0
- package/pipeline/commands/multi-agent/refs/phases/phase-7-report.md +361 -0
- package/pipeline/commands/multi-agent/refs/phases.md +187 -0
- package/pipeline/commands/multi-agent/refs/progress-contract.md +155 -0
- package/pipeline/commands/multi-agent/refs/rules.md +189 -0
- package/pipeline/commands/multi-agent/refs/swiftui-guide.md +254 -0
- package/pipeline/commands/multi-agent/refs/tracker-contract.md +256 -0
- package/pipeline/commands/multi-agent/refs/wiki-capture.md +109 -0
- package/pipeline/commands/multi-agent/resume.md +28 -0
- package/pipeline/commands/multi-agent/review.md +228 -0
- package/pipeline/commands/multi-agent/scan.md +74 -0
- package/pipeline/commands/multi-agent/search.md +97 -0
- package/pipeline/commands/multi-agent/setup.md +767 -0
- package/pipeline/commands/multi-agent/stack.md +48 -0
- package/pipeline/commands/multi-agent/status.md +38 -0
- package/pipeline/commands/multi-agent/sync.md +319 -0
- package/pipeline/commands/multi-agent/test.md +39 -0
- package/pipeline/commands/multi-agent/update.md +88 -0
- package/pipeline/commands/multi-agent.md +293 -0
- package/pipeline/commands/security-review.md +6 -0
- package/pipeline/commands/sim-test.md +256 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +25 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +30 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +20 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +15 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +12 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +29 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +43 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +35 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +35 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +14 -0
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +12 -0
- package/pipeline/eval/golden-tasks/README.md +65 -0
- package/pipeline/eval/triage/01-empty-findings/expected.json +6 -0
- package/pipeline/eval/triage/01-empty-findings/input.json +5 -0
- package/pipeline/eval/triage/01-empty-findings/notes.md +7 -0
- package/pipeline/eval/triage/02-real-blocker/expected.json +15 -0
- package/pipeline/eval/triage/02-real-blocker/input.json +14 -0
- package/pipeline/eval/triage/02-real-blocker/notes.md +7 -0
- package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +18 -0
- package/pipeline/eval/triage/03-out-of-scope-defer/input.json +14 -0
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +10 -0
- package/pipeline/eval/triage/04-false-positive-reject/expected.json +18 -0
- package/pipeline/eval/triage/04-false-positive-reject/input.json +14 -0
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +10 -0
- package/pipeline/eval/triage/05-mixed-classification/expected.json +43 -0
- package/pipeline/eval/triage/05-mixed-classification/input.json +38 -0
- package/pipeline/eval/triage/05-mixed-classification/notes.md +17 -0
- package/pipeline/eval/triage/06-severity-mismatch/expected.json +15 -0
- package/pipeline/eval/triage/06-severity-mismatch/input.json +14 -0
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +9 -0
- package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +27 -0
- package/pipeline/eval/triage/07-duplicate-reviewers/input.json +22 -0
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +9 -0
- package/pipeline/eval/triage/08-style-misclassified/expected.json +18 -0
- package/pipeline/eval/triage/08-style-misclassified/input.json +14 -0
- package/pipeline/eval/triage/08-style-misclassified/notes.md +9 -0
- package/pipeline/eval/triage/09-cascading-finding/expected.json +23 -0
- package/pipeline/eval/triage/09-cascading-finding/input.json +22 -0
- package/pipeline/eval/triage/09-cascading-finding/notes.md +9 -0
- package/pipeline/eval/triage/10-deferred-crossref/expected.json +18 -0
- package/pipeline/eval/triage/10-deferred-crossref/input.json +14 -0
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +9 -0
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +27 -0
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +22 -0
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +14 -0
- package/pipeline/eval/triage/README.md +54 -0
- package/pipeline/lib/account-resolver.sh +204 -0
- package/pipeline/lib/channels-multi-repo.sh +218 -0
- package/pipeline/lib/context-link-extractor.sh +192 -0
- package/pipeline/lib/credential-store-resolver.sh +57 -0
- package/pipeline/lib/credential-store.sh +226 -0
- package/pipeline/lib/fetch-confluence.sh +358 -0
- package/pipeline/lib/fetch-crashlytics.sh +314 -0
- package/pipeline/lib/fetch-fortify.sh +321 -0
- package/pipeline/lib/fetch-swagger.sh +270 -0
- package/pipeline/lib/issue-fetcher.sh +333 -0
- package/pipeline/lib/multi-repo-pipeline.sh +252 -0
- package/pipeline/lib/plan-todos.sh +284 -0
- package/pipeline/lib/post-pr-review.sh +374 -0
- package/pipeline/lib/repo-cache.sh +231 -0
- package/pipeline/lib/review-watch.sh +244 -0
- package/pipeline/lib/shadow-git.sh +222 -0
- package/pipeline/lib/submodule-detector.sh +177 -0
- package/pipeline/lib/vercel-deploy.sh +170 -0
- package/pipeline/preferences-template.json +132 -0
- package/pipeline/rules/app-store-guidelines.md +59 -0
- package/pipeline/rules/code-review.md +27 -0
- package/pipeline/rules/code-style.md +37 -0
- package/pipeline/rules/debugging.md +24 -0
- package/pipeline/rules/figma-pipeline.md +190 -0
- package/pipeline/rules/git-conventions.md +29 -0
- package/pipeline/rules/kotlin-android.md +92 -0
- package/pipeline/rules/performance.md +23 -0
- package/pipeline/rules/security.md +39 -0
- package/pipeline/rules/swiftui-qa.md +32 -0
- package/pipeline/rules/tdd.md +25 -0
- package/pipeline/rules/testing.md +37 -0
- package/pipeline/schemas/agent-state.schema.json +273 -0
- package/pipeline/schemas/analysis-output.schema.json +59 -0
- package/pipeline/schemas/clarify-output.schema.json +74 -0
- package/pipeline/schemas/dev-critic-output.schema.json +104 -0
- package/pipeline/schemas/diff-risk.schema.json +78 -0
- package/pipeline/schemas/figma-project-config.schema.json +372 -0
- package/pipeline/schemas/migrations/README.md +73 -0
- package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +112 -0
- package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +75 -0
- package/pipeline/schemas/migrations/prefs-2.1.0-to-2.2.0.mjs +64 -0
- package/pipeline/schemas/migrations/prefs-2.2.0-to-2.3.0.mjs +36 -0
- package/pipeline/schemas/migrations/state-2.0.0-to-2.1.0.mjs +34 -0
- package/pipeline/schemas/plan-todos.schema.json +62 -0
- package/pipeline/schemas/planning-output.schema.json +57 -0
- package/pipeline/schemas/prefs.schema.json +1137 -0
- package/pipeline/schemas/reviewer-output.schema.json +55 -0
- package/pipeline/schemas/test-gap.schema.json +64 -0
- package/pipeline/schemas/token-budget.json +17 -0
- package/pipeline/schemas/triage-corpus.schema.json +31 -0
- package/pipeline/schemas/triage-output.schema.json +115 -0
- package/pipeline/scripts/.last-figma-sync-plan.json +23 -0
- package/pipeline/scripts/README-figma-smokes.md +34 -0
- package/pipeline/scripts/README.md +104 -0
- package/pipeline/scripts/aggregate-metrics.mjs +310 -0
- package/pipeline/scripts/audit-log-rotate.sh +61 -0
- package/pipeline/scripts/audit-log.sh +69 -0
- package/pipeline/scripts/benchmark-phase-0.sh +128 -0
- package/pipeline/scripts/build-skills-index.mjs +139 -0
- package/pipeline/scripts/classify-plan-safety.mjs +177 -0
- package/pipeline/scripts/cost-table.json +27 -0
- package/pipeline/scripts/diff-explain.mjs +276 -0
- package/pipeline/scripts/diff-risk-score.mjs +328 -0
- package/pipeline/scripts/eval-golden-tasks-live.mjs +294 -0
- package/pipeline/scripts/eval-golden-tasks.mjs +223 -0
- package/pipeline/scripts/eval-triage.mjs +171 -0
- package/pipeline/scripts/figma-placeholder-map.json +191 -0
- package/pipeline/scripts/fixtures/diff-risk-android.diff +40 -0
- package/pipeline/scripts/fixtures/diff-risk-ios.diff +48 -0
- package/pipeline/scripts/fixtures/install-layout.tsv +16 -0
- package/pipeline/scripts/fixtures/test-gap-node.diff +30 -0
- package/pipeline/scripts/fixtures/test-gap-python.diff +32 -0
- package/pipeline/scripts/gen-mode-dispatch.mjs +170 -0
- package/pipeline/scripts/gen-skills-index.mjs +90 -0
- package/pipeline/scripts/github-ssh-setup.sh +103 -0
- package/pipeline/scripts/import-figma-skills.sh +253 -0
- package/pipeline/scripts/keychain-save.sh +74 -0
- package/pipeline/scripts/keychain.py +294 -0
- package/pipeline/scripts/log-metric.sh +98 -0
- package/pipeline/scripts/match-skills.mjs +167 -0
- package/pipeline/scripts/memory-load.sh +46 -0
- package/pipeline/scripts/memory-save.sh +76 -0
- package/pipeline/scripts/migrate-prefs.mjs +390 -0
- package/pipeline/scripts/migrate-state.mjs +215 -0
- package/pipeline/scripts/output-quality-check.sh +125 -0
- package/pipeline/scripts/phase-banner.sh +158 -0
- package/pipeline/scripts/phase-tracker.sh +548 -0
- package/pipeline/scripts/pre-commit-check.sh +69 -0
- package/pipeline/scripts/pre-push-check.sh +77 -0
- package/pipeline/scripts/render-agent-log-cost.sh +149 -0
- package/pipeline/scripts/render-cost-summary.sh +137 -0
- package/pipeline/scripts/render-work-summary.sh +195 -0
- package/pipeline/scripts/repo-map.mjs +367 -0
- package/pipeline/scripts/run-aggregator.mjs +298 -0
- package/pipeline/scripts/scan-skills.sh +332 -0
- package/pipeline/scripts/search-logs.sh +291 -0
- package/pipeline/scripts/sign-skills.sh +67 -0
- package/pipeline/scripts/smoke-adapters.sh +207 -0
- package/pipeline/scripts/smoke-add-detail.sh +137 -0
- package/pipeline/scripts/smoke-agent-log-cost.sh +183 -0
- package/pipeline/scripts/smoke-agent-model-routing.sh +87 -0
- package/pipeline/scripts/smoke-bitbucket-contract.sh +223 -0
- package/pipeline/scripts/smoke-channels-flow.sh +130 -0
- package/pipeline/scripts/smoke-ci-workflows.sh +88 -0
- package/pipeline/scripts/smoke-clarify.sh +148 -0
- package/pipeline/scripts/smoke-commands-skills-parity.sh +87 -0
- package/pipeline/scripts/smoke-compliance-skills.sh +119 -0
- package/pipeline/scripts/smoke-cost-summary.sh +139 -0
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +198 -0
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +128 -0
- package/pipeline/scripts/smoke-delete-flow.sh +151 -0
- package/pipeline/scripts/smoke-dev-critic.sh +144 -0
- package/pipeline/scripts/smoke-diff-explain.sh +128 -0
- package/pipeline/scripts/smoke-diff-risk.sh +161 -0
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +160 -0
- package/pipeline/scripts/smoke-eval-live.sh +136 -0
- package/pipeline/scripts/smoke-existing-discovery-gate.sh +71 -0
- package/pipeline/scripts/smoke-figma-android-parity.sh +148 -0
- package/pipeline/scripts/smoke-figma-config-schema.sh +144 -0
- package/pipeline/scripts/smoke-figma-credential-store.sh +105 -0
- package/pipeline/scripts/smoke-figma-cross-cli-inventory.sh +177 -0
- package/pipeline/scripts/smoke-figma-dispatch.sh +123 -0
- package/pipeline/scripts/smoke-figma-skill-import.sh +174 -0
- package/pipeline/scripts/smoke-figma-sync.sh +149 -0
- package/pipeline/scripts/smoke-identity-isolation.sh +70 -0
- package/pipeline/scripts/smoke-install-layout.sh +241 -0
- package/pipeline/scripts/smoke-install-leak-gate.sh +125 -0
- package/pipeline/scripts/smoke-issue-comment-template.sh +86 -0
- package/pipeline/scripts/smoke-issue-jira-triad.sh +120 -0
- package/pipeline/scripts/smoke-keychain.sh +158 -0
- package/pipeline/scripts/smoke-language-axis.sh +109 -0
- package/pipeline/scripts/smoke-lib-scripts.sh +395 -0
- package/pipeline/scripts/smoke-migrate-state.sh +102 -0
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +158 -0
- package/pipeline/scripts/smoke-multi-repo-integration.sh +116 -0
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +61 -0
- package/pipeline/scripts/smoke-no-token-prompt.sh +69 -0
- package/pipeline/scripts/smoke-pat-audit.sh +107 -0
- package/pipeline/scripts/smoke-per-repo-memory.sh +156 -0
- package/pipeline/scripts/smoke-personal-data.sh +82 -0
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +170 -0
- package/pipeline/scripts/smoke-phase-6-multi.sh +79 -0
- package/pipeline/scripts/smoke-phase-banner.sh +101 -0
- package/pipeline/scripts/smoke-phase-tracker.sh +255 -0
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +241 -0
- package/pipeline/scripts/smoke-phase4-triage.sh +142 -0
- package/pipeline/scripts/smoke-plan-approval-gate.sh +71 -0
- package/pipeline/scripts/smoke-plan-safety.sh +139 -0
- package/pipeline/scripts/smoke-plan-todos.sh +193 -0
- package/pipeline/scripts/smoke-pr-review-actions.sh +152 -0
- package/pipeline/scripts/smoke-pre-commit.sh +138 -0
- package/pipeline/scripts/smoke-pref-migration.sh +224 -0
- package/pipeline/scripts/smoke-prefs-language.sh +134 -0
- package/pipeline/scripts/smoke-progress-contract.sh +118 -0
- package/pipeline/scripts/smoke-push-retry.sh +75 -0
- package/pipeline/scripts/smoke-readme-counts.sh +120 -0
- package/pipeline/scripts/smoke-repo-map.sh +300 -0
- package/pipeline/scripts/smoke-review-watch.sh +134 -0
- package/pipeline/scripts/smoke-run-aggregator.sh +216 -0
- package/pipeline/scripts/smoke-schema-validation.sh +173 -0
- package/pipeline/scripts/smoke-search.sh +187 -0
- package/pipeline/scripts/smoke-shadow-git.sh +175 -0
- package/pipeline/scripts/smoke-skill-authoring.sh +142 -0
- package/pipeline/scripts/smoke-skill-language.sh +83 -0
- package/pipeline/scripts/smoke-skill-manifest.sh +138 -0
- package/pipeline/scripts/smoke-skill-scan.sh +198 -0
- package/pipeline/scripts/smoke-stack-swap.sh +132 -0
- package/pipeline/scripts/smoke-subagent-validators.sh +105 -0
- package/pipeline/scripts/smoke-sync-delegation.sh +74 -0
- package/pipeline/scripts/smoke-sync-parity.sh +92 -0
- package/pipeline/scripts/smoke-tasklist-ordering.sh +111 -0
- package/pipeline/scripts/smoke-telemetry.sh +147 -0
- package/pipeline/scripts/smoke-test-gap.sh +183 -0
- package/pipeline/scripts/smoke-token-budget.sh +67 -0
- package/pipeline/scripts/smoke-tracker-contract.sh +129 -0
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +65 -0
- package/pipeline/scripts/smoke-triage-memory.sh +174 -0
- package/pipeline/scripts/smoke-url-enrichment.sh +70 -0
- package/pipeline/scripts/smoke-validator-contradiction.sh +67 -0
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +129 -0
- package/pipeline/scripts/smoke-wiki-integration.sh +146 -0
- package/pipeline/scripts/smoke-work-summary.sh +163 -0
- package/pipeline/scripts/smoke-worktree-path-convention.sh +86 -0
- package/pipeline/scripts/smoke-write-state.sh +115 -0
- package/pipeline/scripts/stack-swap.sh +182 -0
- package/pipeline/scripts/sync-figma-source.sh +228 -0
- package/pipeline/scripts/sync-parity-check.sh +135 -0
- package/pipeline/scripts/test-gap-rules/android.json +25 -0
- package/pipeline/scripts/test-gap-rules/ios.json +29 -0
- package/pipeline/scripts/test-gap-rules/node.json +17 -0
- package/pipeline/scripts/test-gap-rules/python.json +19 -0
- package/pipeline/scripts/test-gap-scan.mjs +343 -0
- package/pipeline/scripts/token-budget-report.mjs +145 -0
- package/pipeline/scripts/triage-memory.mjs +258 -0
- package/pipeline/scripts/ui-tree-dumper.swift +122 -0
- package/pipeline/scripts/uninstall.mjs +331 -0
- package/pipeline/scripts/update-issue-progress.sh +146 -0
- package/pipeline/scripts/validate-analysis.mjs +132 -0
- package/pipeline/scripts/validate-diff-risk.mjs +117 -0
- package/pipeline/scripts/validate-planning.mjs +180 -0
- package/pipeline/scripts/validate-reviewer.mjs +131 -0
- package/pipeline/scripts/validate-schemas.mjs +88 -0
- package/pipeline/scripts/validate-test-gap.mjs +90 -0
- package/pipeline/scripts/validate-triage.mjs +175 -0
- package/pipeline/scripts/verify-skills.sh +126 -0
- package/pipeline/scripts/write-state.mjs +175 -0
- package/pipeline/skills/.skill-manifest.json +779 -0
- package/pipeline/skills/.skills-index.json +1771 -0
- package/pipeline/skills/figma-android/README.md +36 -0
- package/pipeline/skills/figma-android/figma-component-code-connect/SKILL.md +62 -0
- package/pipeline/skills/figma-android/figma-component-implement/SKILL.md +158 -0
- package/pipeline/skills/figma-android/figma-component-test/SKILL.md +120 -0
- package/pipeline/skills/figma-android/figma-component-wiki/SKILL.md +35 -0
- package/pipeline/skills/figma-android/figma-to-component/SKILL.md +124 -0
- package/pipeline/skills/figma-common/README.md +57 -0
- package/pipeline/skills/figma-common/figma-cli-iterate/SKILL.md +277 -0
- package/pipeline/skills/figma-common/figma-cli-iterate-mend/SKILL.md +498 -0
- package/pipeline/skills/figma-common/figma-cli-lean-iterate/SKILL.md +283 -0
- package/pipeline/skills/figma-common/figma-cli-skip/SKILL.md +362 -0
- package/pipeline/skills/figma-common/figma-commit/COMMON_REBASE.md +206 -0
- package/pipeline/skills/figma-common/figma-commit/REVIEW.md +337 -0
- package/pipeline/skills/figma-common/figma-commit/SKILL.md +211 -0
- package/pipeline/skills/figma-common/figma-component-confluence-sync/SKILL.md +218 -0
- package/pipeline/skills/figma-common/figma-component-start/SKILL.md +246 -0
- package/pipeline/skills/figma-common/figma-component-status-update/SKILL.md +73 -0
- package/pipeline/skills/figma-common/figma-fix/SKILL.md +316 -0
- package/pipeline/skills/figma-common/figma-form-integration/SKILL.md +542 -0
- package/pipeline/skills/figma-common/figma-issue/SKILL.md +745 -0
- package/pipeline/skills/figma-common/figma-iterate/SKILL.md +203 -0
- package/pipeline/skills/figma-common/figma-iteration-commit/SKILL.md +1015 -0
- package/pipeline/skills/figma-common/figma-mend/SKILL.md +331 -0
- package/pipeline/skills/figma-common/figma-price-integration/SKILL.md +398 -0
- package/pipeline/skills/figma-common/figma-remote-mcp-auth/SKILL.md +104 -0
- package/pipeline/skills/figma-common/figma-review/SKILL.md +395 -0
- package/pipeline/skills/figma-common/figma-setup/SKILL.md +514 -0
- package/pipeline/skills/figma-common/figma-setup/scripts/fetch-mcp-token.py +592 -0
- package/pipeline/skills/figma-common/figma-skip/SKILL.md +129 -0
- package/pipeline/skills/figma-common/figma-ui-patterns/SKILL.md +104 -0
- package/pipeline/skills/figma-common/figma-utility/SKILL.md +274 -0
- package/pipeline/skills/figma-common/figma-utility/scripts/figma-utility.py +808 -0
- package/pipeline/skills/figma-common/figma-validate/SKILL.md +633 -0
- package/pipeline/skills/figma-common/performance-iteration-commit-all/SKILL.md +711 -0
- package/pipeline/skills/figma-common/performance-review-next/SKILL.md +233 -0
- package/pipeline/skills/figma-common/performance-start/SKILL.md +425 -0
- package/pipeline/skills/figma-common/performance-swiftui/SKILL.md +706 -0
- package/pipeline/skills/figma-common/performance-tour/SKILL.md +418 -0
- package/pipeline/skills/figma-ios/REVIEW_CHECKLIST.md +67 -0
- package/pipeline/skills/figma-ios/figma-component-code-connect/SKILL.md +178 -0
- package/pipeline/skills/figma-ios/figma-component-implement/SKILL.md +184 -0
- package/pipeline/skills/figma-ios/figma-component-test/SKILL.md +219 -0
- package/pipeline/skills/figma-ios/figma-component-wiki/SKILL.md +274 -0
- package/pipeline/skills/figma-ios/figma-to-component/SKILL.md +401 -0
- package/pipeline/skills/figma-ios/figma-to-component/halt-return-protocol.md +57 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-0-init.md +307 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1-gathering.md +119 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-1.5-existing-discovery.md +174 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2-orchestrator.md +333 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2a-testing-identifiers.md +368 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2b-localization.md +393 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2c-accessibility.md +617 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-2d-analytics.md +352 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3-orchestrator.md +337 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3a-location.md +206 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3b-tokens.md +235 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3c-nested.md +214 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3d-patterns.md +871 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3e-assets.md +156 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3f-utilities.md +175 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3g-property-coverage.md +176 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-3h-variant-config.md +333 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4-orchestrator.md +412 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4a-configuration.md +336 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4b-view.md +695 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4c-documentation.md +332 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4d-preview.md +380 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-4e-modifiers.md +262 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5-orchestrator.md +482 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5a-viewinspector.md +274 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5b-snapshot.md +636 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-5c-unit.md +142 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-6-code-connect.md +547 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7-wiki.md +39 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-confluence-generate.md +659 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-7a-wiki-generate.md +580 -0
- package/pipeline/skills/figma-ios/figma-to-component/phases/phase-8-cleanup.md +51 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/accessibility.md +129 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/analytics-events.md +64 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/code-connect.md +531 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-api.md +89 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/confluence-xhtml.md +155 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/figma-to-swiftui-effects.md +196 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/halt-return-protocol.md +57 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/localization-naming.md +89 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/macros.md +227 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/missing-tokens.md +157 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/orchestrator-discipline.md +90 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/registry.md +116 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/remote-mcp-script.md +153 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/rest-api-script.md +130 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/scripts-inventory.md +218 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/snapshot-testing.md +188 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/subcomponent-graph.md +93 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/testing-identifiers-naming.md +98 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/tools.md +261 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/viewinspector.md +147 -0
- package/pipeline/skills/figma-ios/figma-to-component/reference/wiki-to-confluence-mapping.md +182 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/apply-author-login-map.py +185 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/backfill-status.py +609 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/build-author-registry.py +332 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/bulk-sync-issues.py +261 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-data-gather.py +184 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/code-connect-publish.sh +188 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status-upload.py +768 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-component-status.py +191 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-data-gather.py +420 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-page-ids.json +94 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/confluence-publish.py +336 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-subcomponent-graph.py +391 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/figma-update.py +292 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/__init__.py +1 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/issue_sync_propagate.py +93 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/registry_writer.py +299 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_backfill_status.py +343 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update.py +206 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_figma_update_http.py +149 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_phase_clis.py +281 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_registry_writer.py +332 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_issue.py +176 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_skill_figma_review.py +98 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue.py +298 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/lib/test_update_issue_gh.py +195 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase1-gather.py +1298 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase2-finalize.py +228 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase3-scripts.py +1089 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase4-finalize.py +141 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase5-finalize.py +106 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase6-finalize.py +162 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/phase7-finalize.py +105 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/register-icons-codeconnect.py +179 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/remote-mcp-fetch.py +260 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/resolve-author-logins.py +260 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/run-uicomponents-tests.sh +86 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/sidebar-generator.py +321 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/update-issue-from-registry.py +1470 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase4.sh +176 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase6.sh +147 -0
- package/pipeline/skills/figma-ios/figma-to-component/scripts/validate-phase7a.py +629 -0
- package/pipeline/skills/shared/README.md +212 -0
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +315 -0
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +348 -0
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +944 -0
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +51 -0
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +300 -0
- package/pipeline/skills/shared/core/multi-agent-delete/SKILL.md +63 -0
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +64 -0
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +56 -0
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +36 -0
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +42 -0
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +66 -0
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +292 -0
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +38 -0
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +41 -0
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +87 -0
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +37 -0
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +53 -0
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +28 -0
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +47 -0
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +42 -0
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +191 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +31 -0
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +61 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +61 -0
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +62 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +309 -0
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +55 -0
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +41 -0
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +184 -0
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +44 -0
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +34 -0
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +45 -0
- package/pipeline/skills/shared/external/agentflow/SKILL.md +199 -0
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +438 -0
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +584 -0
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +407 -0
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +153 -0
- package/pipeline/skills/shared/external/android-performance/SKILL.md +736 -0
- package/pipeline/skills/shared/external/android-security/SKILL.md +577 -0
- package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +66 -0
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +85 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +910 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +436 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +489 -0
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +1076 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +75 -0
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +409 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +411 -0
- package/pipeline/skills/shared/external/app-store-review/references/code-signing.md +259 -0
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +90 -0
- package/pipeline/skills/shared/external/app-store-review/references/rejection-patterns.md +152 -0
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +118 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +500 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +425 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +344 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +508 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +285 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +60 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +496 -0
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +211 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +499 -0
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +390 -0
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +461 -0
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +425 -0
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +462 -0
- package/pipeline/skills/shared/external/clean-code/SKILL.md +94 -0
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +116 -0
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +492 -0
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +461 -0
- package/pipeline/skills/shared/external/compose-components/SKILL.md +441 -0
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +436 -0
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +527 -0
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +425 -0
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +409 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +266 -0
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +491 -0
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +435 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +388 -0
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +405 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +495 -0
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +420 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +458 -0
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +765 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +467 -0
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +335 -0
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +422 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +387 -0
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +298 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +37 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +477 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +413 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +460 -0
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +541 -0
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +483 -0
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +326 -0
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +190 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +61 -0
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +348 -0
- package/pipeline/skills/shared/external/gradle-kotlin-dsl/SKILL.md +552 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +498 -0
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +602 -0
- package/pipeline/skills/shared/external/help-skills/SKILL.md +166 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +81 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +95 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +82 -0
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +101 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +94 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +110 -0
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +99 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +81 -0
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +125 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +496 -0
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +455 -0
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +301 -0
- package/pipeline/skills/shared/external/humanizer/SKILL.md +118 -0
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +301 -0
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +140 -0
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +59 -0
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +217 -0
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +418 -0
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +627 -0
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +462 -0
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +441 -0
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +862 -0
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -0
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +563 -0
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +1116 -0
- package/pipeline/skills/shared/external/ios-security/SKILL.md +496 -0
- package/pipeline/skills/shared/external/ios-security/references/app-review-guidelines.md +174 -0
- package/pipeline/skills/shared/external/ios-security/references/cryptokit-advanced.md +297 -0
- package/pipeline/skills/shared/external/ios-security/references/file-storage-patterns.md +354 -0
- package/pipeline/skills/shared/external/ios-security/references/privacy-manifest.md +117 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +101 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +500 -0
- package/pipeline/skills/shared/external/live-activities/references/live-activity-patterns.md +868 -0
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +109 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +110 -0
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +485 -0
- package/pipeline/skills/shared/external/mapkit-location/references/corelocation-patterns.md +730 -0
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +748 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +479 -0
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +64 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +395 -0
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +363 -0
- package/pipeline/skills/shared/external/natural-language/SKILL.md +412 -0
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +311 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +418 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +38 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +235 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +398 -0
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +254 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +387 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/paperkit-integration.md +376 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +302 -0
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +446 -0
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +435 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +501 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +701 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +774 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +869 -0
- package/pipeline/skills/shared/external/photos-camera-media/references/photospicker-patterns.md +597 -0
- package/pipeline/skills/shared/external/play-store-review/SKILL.md +350 -0
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +501 -0
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +677 -0
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +745 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +383 -0
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +290 -0
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +479 -0
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +480 -0
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +386 -0
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +506 -0
- package/pipeline/skills/shared/external/room-database/SKILL.md +564 -0
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +483 -0
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +544 -0
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +485 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +478 -0
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +58 -0
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +755 -0
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +487 -0
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +895 -0
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +467 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +408 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +80 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swift-6-2-concurrency.md +233 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +187 -0
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +341 -0
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +113 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +124 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/actors.md +155 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/async-streams.md +67 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bridging.md +52 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/bug-patterns.md +100 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/cancellation.md +107 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/diagnostics.md +70 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/hotspots.md +47 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/interop.md +129 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/new-features.md +224 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/structured.md +101 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/testing.md +218 -0
- package/pipeline/skills/shared/external/swift-concurrency-pro/references/unstructured.md +61 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +498 -0
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +505 -0
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +462 -0
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +504 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +97 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/async-tests.md +252 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/core-rules.md +52 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/migrating-from-xctest.md +34 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +318 -0
- package/pipeline/skills/shared/external/swift-testing-pro/references/writing-better-tests.md +254 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +334 -0
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +504 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +975 -0
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +675 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +102 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/class-inheritance.md +104 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/cloudkit.md +10 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/core-rules.md +20 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/indexing.md +27 -0
- package/pipeline/skills/shared/external/swiftdata-pro/references/predicates.md +73 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +503 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +821 -0
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +553 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +102 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/accessibility-patterns.md +215 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-advanced.md +403 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts-accessibility.md +135 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/charts.md +602 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/image-optimization.md +203 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/latest-apis.md +464 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/layout-best-practices.md +266 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/liquid-glass.md +416 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/list-patterns.md +394 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-scenes.md +318 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-views.md +357 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/macos-window-styling.md +303 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/performance-patterns.md +403 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/scroll-patterns.md +293 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/sheet-navigation-patterns.md +363 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/state-management.md +417 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/references/view-structure.md +389 -0
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +450 -0
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +425 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +336 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +97 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +69 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +99 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +147 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +98 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +262 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +207 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +177 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +169 -0
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +178 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +371 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +486 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +1097 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +780 -0
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +696 -0
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +487 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +46 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +29 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +33 -0
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +52 -0
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +114 -0
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +108 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/accessibility.md +13 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/api.md +39 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/data.md +43 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/design.md +31 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/hygiene.md +9 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/navigation.md +14 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/performance.md +46 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/swift.md +56 -0
- package/pipeline/skills/shared/external/swiftui-pro/references/views.md +35 -0
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +103 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +428 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +534 -0
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +948 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +210 -0
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +273 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +151 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +95 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +51 -0
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +111 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +309 -0
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +393 -0
- package/pipeline/skills/shared/external/tipkit/SKILL.md +494 -0
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +782 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +336 -0
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +475 -0
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +736 -0
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +738 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +371 -0
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +410 -0
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +567 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +373 -0
- package/pipeline/skills/shared/external/web-performance/SKILL.md +345 -0
- package/pipeline/skills/shared/external/web-testing/SKILL.md +385 -0
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +497 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +871 -0
- package/pipeline/skills/skills-index.md +205 -0
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
# PHASE 2C — Accessibility Keys
|
|
2
|
+
|
|
3
|
+
Accessibility key integration for VoiceOver labels, hints, and values.
|
|
4
|
+
REF: `reference/accessibility.md`
|
|
5
|
+
|
|
6
|
+
required — always execute this phase.
|
|
7
|
+
PARALLEL WITH: Phase 2A, Phase 2B (all read from pass1/_index.md independently)
|
|
8
|
+
NEXT: Phase 2D (after all parallel phases complete)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## CORE PRINCIPLE: ACCESSIBILITY IS FOR VISION-IMPAIRED USERS
|
|
13
|
+
|
|
14
|
+
Accessibility exists to help vision-impaired people **navigate and use** the app. Every annotation must pass this test:
|
|
15
|
+
|
|
16
|
+
**"Does a vision-impaired person need this information to navigate or use the app?"**
|
|
17
|
+
|
|
18
|
+
- If YES → add it (e.g., a button's purpose, a meaningful image description)
|
|
19
|
+
- If NO → do not add it. You are cluttering the experience with useless noise.
|
|
20
|
+
|
|
21
|
+
Visual state indicators (colors, gradients, tier badges) are information that sighted users consume visually. A vision-impaired user already knows their own loyalty tier, their own account status, their own membership level. Announcing "Elite" or "Classic Plus" on a profile avatar adds zero navigational or functional value — it is noise.
|
|
22
|
+
|
|
23
|
+
Do NOT generate per-enum-variant accessibility keys for state that the user already knows or that adds no navigational value. An avatar is "Passenger avatar". A status badge with visible text is just the text. A colored indicator is decorative context, not actionable information.
|
|
24
|
+
|
|
25
|
+
### How VoiceOver actually works
|
|
26
|
+
|
|
27
|
+
VoiceOver reads the accessibility tree, NOT the view tree. SwiftUI builds this tree automatically:
|
|
28
|
+
|
|
29
|
+
1. **`Text("Hello")` is already accessible.** VoiceOver reads "Hello" with no modifiers. SwiftUI knows it's static text. Adding `.accessibilityLabel("Hello")` duplicates what's already there. Adding `.accessibilityAddTraits(.isStaticText)` adds a trait SwiftUI already assigned.
|
|
30
|
+
|
|
31
|
+
2. **`Button("Save") { ... }` is already accessible.** VoiceOver reads "Save, Button" — the label AND the trait. Adding `.accessibilityLabel("Save")` or `.accessibilityAddTraits(.isButton)` is redundant.
|
|
32
|
+
|
|
33
|
+
3. **`Image(decorative: "bg")` is already hidden.** No modifier needed.
|
|
34
|
+
|
|
35
|
+
4. **`.accessibilityElement(children: .combine)` merges children.** If an HStack contains `Image` + `Text("Confirmed")`, combining them makes VoiceOver read "Confirmed" as one stop — because SwiftUI concatenates the accessible text of all non-hidden children. You do NOT need `.accessibilityLabel("Confirmed")` on top of this — SwiftUI already reads the `Text`.
|
|
36
|
+
|
|
37
|
+
5. **`.accessibilityLabel` OVERRIDES, it does not supplement.** When you add `.accessibilityLabel("Confirmed, Success")` to a combined element, VoiceOver reads ONLY "Confirmed, Success" — it ignores the children's text. This is useful when children text is wrong or insufficient. It is HARMFUL when children text is already correct, because now you're maintaining a redundant string.
|
|
38
|
+
|
|
39
|
+
### When to add NOTHING
|
|
40
|
+
|
|
41
|
+
If a component is:
|
|
42
|
+
- Non-interactive (no taps, no toggles, no gestures)
|
|
43
|
+
- Contains visible `Text` that VoiceOver reads correctly
|
|
44
|
+
- Has only decorative images (hidden with `.accessibilityHidden(true)`)
|
|
45
|
+
|
|
46
|
+
Then you need ZERO accessibility modifiers on the container. Maybe `.accessibilityElement(children: .combine)` to group children into one stop. That's it. No `.accessibilityLabel`. No `.accessibilityAddTraits`. No `.accessibilityRemoveTraits`. No `.accessibilityHint`.
|
|
47
|
+
|
|
48
|
+
A non-interactive badge that shows "Confirmed" in green does NOT need `.accessibilityLabel("Confirmed, Success")`. The user hears "Confirmed" — that's sufficient. "Success" is a visual color cue, not information the VoiceOver user needs or cares about.
|
|
49
|
+
|
|
50
|
+
### The question to ask for EVERY modifier
|
|
51
|
+
|
|
52
|
+
**"What breaks if I remove this?"**
|
|
53
|
+
|
|
54
|
+
- Remove `.accessibilityLabel` → VoiceOver reads children text instead → if that's correct, the label was redundant
|
|
55
|
+
- Remove `.accessibilityAddTraits(.isStaticText)` → SwiftUI already assigns it to `Text` → nothing breaks
|
|
56
|
+
- Remove `.accessibilityRemoveTraits(.isButton)` → there was no Button, so there was no `.isButton` trait → nothing breaks
|
|
57
|
+
- Remove `.accessibilityHidden(true)` on decorative icon → VoiceOver reads the icon as an image → this DOES break, keep it
|
|
58
|
+
|
|
59
|
+
If removing a modifier changes nothing, the modifier should not exist.
|
|
60
|
+
|
|
61
|
+
### Decision hierarchy (apply in order, STOP as soon as resolved)
|
|
62
|
+
|
|
63
|
+
1. **Does the component need ANY accessibility work?** If SwiftUI reads it correctly as-is → add NOTHING.
|
|
64
|
+
2. **Are there decorative elements?** → `.accessibilityHidden(true)` on those elements only.
|
|
65
|
+
3. **Should children be grouped?** → `.accessibilityElement(children: .combine)` — then STOP. SwiftUI reads the combined text.
|
|
66
|
+
4. **Is the combined text wrong or missing?** → ONLY then add `.accessibilityLabel` with the correct text.
|
|
67
|
+
5. **Is there interactive state VoiceOver can't infer?** (custom toggle, not SwiftUI Toggle) → `.accessibilityValue`.
|
|
68
|
+
6. **Is there a trait SwiftUI can't infer?** (custom tappable view, not Button) → `.accessibilityAddTraits`.
|
|
69
|
+
7. **Only as last resort** → generate a `LocalizedAccessibilityStringKey`.
|
|
70
|
+
|
|
71
|
+
Most components stop at step 2 or 3. If you reach step 4+, justify WHY in the artifact.
|
|
72
|
+
|
|
73
|
+
### Anti-patterns (NEVER do these)
|
|
74
|
+
|
|
75
|
+
| Anti-pattern | Why it's wrong |
|
|
76
|
+
|---|---|
|
|
77
|
+
| Adding `.isButton` to a `Button` | SwiftUI already provides it |
|
|
78
|
+
| Adding `.isStaticText` to a `Text` | SwiftUI already provides it |
|
|
79
|
+
| `.accessibilityRemoveTraits(.isButton)` when no Button exists | Removing a trait that was never there — nonsensical |
|
|
80
|
+
| `.accessibilityLabel` that duplicates visible text | Overrides SwiftUI's correct reading with a redundant string you now maintain |
|
|
81
|
+
| `.accessibilityLabel("\(text), \(state.rawValue)")` on a non-interactive badge | State name ("Success") is a color cue, not information. VoiceOver user doesn't need it |
|
|
82
|
+
| Adding accessibility modifiers "just in case" | Every modifier is code to maintain. If it adds no value, it adds cost |
|
|
83
|
+
| Labeling every child in a group | VoiceOver stops at each child separately — use `.accessibilityElement(children: .combine)` |
|
|
84
|
+
| Separate key per enum variant | Key bloat — 5+ keys for trivially translatable names |
|
|
85
|
+
| `.accessibilityHint` when label is self-explanatory | "Close" button doesn't need hint "Closes this dialog" |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## IMPORTS
|
|
90
|
+
|
|
91
|
+
Components consume accessibility via these modules:
|
|
92
|
+
|
|
93
|
+
```swift
|
|
94
|
+
import UIComponentUtilities // View extensions
|
|
95
|
+
import AccessibilityStringKeys // LocalizedAccessibilityStringKey
|
|
96
|
+
import UITestingIdentifiers // UITestingIdentifierKey
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## KEY TYPES
|
|
102
|
+
|
|
103
|
+
| Type | Purpose | Source |
|
|
104
|
+
|------|---------|--------|
|
|
105
|
+
| `LocalizedAccessibilityStringKey` | Labels, hints, values (localized) | AccessibilityStringKeys |
|
|
106
|
+
| `UITestingIdentifierKey` | Identifiers (not localized) | UITestingIdentifiers |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## MODIFIERS
|
|
111
|
+
|
|
112
|
+
Only use when the modifier adds information SwiftUI cannot infer:
|
|
113
|
+
|
|
114
|
+
| Modifier | Use ONLY when | Key Type |
|
|
115
|
+
|----------|---------------|----------|
|
|
116
|
+
| `.accessibilityLabel(_:)` | Visible text is insufficient or absent | `LocalizedAccessibilityStringKey` or runtime string |
|
|
117
|
+
| `.accessibilityHint(_:)` | Action is ambiguous from label alone | `LocalizedAccessibilityStringKey` |
|
|
118
|
+
| `.accessibilityValue(_:)` | Interactive element with changing state (toggle, slider) | `LocalizedAccessibilityStringKey` or runtime string |
|
|
119
|
+
| `.accessibilityIdentifier(_:)` | Always (UI testing, not VoiceOver) | `UITestingIdentifierKey` |
|
|
120
|
+
| `.accessibilityAddTraits(_:)` | SwiftUI doesn't already provide the correct trait | `AccessibilityTraits` |
|
|
121
|
+
| `.accessibilityRemoveTraits(_:)` | SwiftUI inferred a wrong trait | `AccessibilityTraits` |
|
|
122
|
+
| `.accessibilityHidden(_:)` | Element is decorative or redundant | `Bool` |
|
|
123
|
+
| `.accessibilityElement(children:)` | Group multiple children into one VoiceOver stop | `.combine` or `.contain` |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## TRAITS
|
|
128
|
+
|
|
129
|
+
Only add traits SwiftUI cannot infer. Do NOT add `.isButton` to `Button`, `.isStaticText` to `Text`, etc.
|
|
130
|
+
|
|
131
|
+
| Trait | Add ONLY when |
|
|
132
|
+
|-------|---------------|
|
|
133
|
+
| `.isButton` | Custom tappable view (not SwiftUI `Button`) |
|
|
134
|
+
| `.isLink` | Custom link view (not SwiftUI `Link`) |
|
|
135
|
+
| `.isHeader` | Section header (SwiftUI doesn't auto-detect) |
|
|
136
|
+
| `.isImage` | Meaningful image needing description |
|
|
137
|
+
| `.isSelected` | Custom selection (not SwiftUI `Toggle`) |
|
|
138
|
+
| `.updatesFrequently` | Live data (timers, scores) |
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## RULES
|
|
143
|
+
|
|
144
|
+
| Rule | Implementation |
|
|
145
|
+
|------|----------------|
|
|
146
|
+
| Add nothing unless it breaks without it | Ask "what breaks if I remove this?" — if nothing, don't add it |
|
|
147
|
+
| No redundant labels | Don't add `.accessibilityLabel` when SwiftUI reads visible text correctly |
|
|
148
|
+
| No redundant traits | Don't add `.isStaticText` to `Text`, `.isButton` to `Button` |
|
|
149
|
+
| No phantom trait removal | Don't `.accessibilityRemoveTraits(.isButton)` when no Button exists |
|
|
150
|
+
| No state announcement for display components | Visual state (color) is not VoiceOver information |
|
|
151
|
+
| No "button" in label | Trait handles it |
|
|
152
|
+
| No "tap to" in hint | VoiceOver adds "double tap to" |
|
|
153
|
+
| No hint for obvious actions | "Close" button needs no hint |
|
|
154
|
+
| Group related content | `.accessibilityElement(children: .combine)` — then STOP |
|
|
155
|
+
| Hide decorative | `.accessibilityHidden(true)` |
|
|
156
|
+
| One stop per logical element | Group children, don't label each |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## IDENTIFIER CONTEXT FOR VOICEOVER AUTOMATION
|
|
161
|
+
|
|
162
|
+
`.accessibilityIdentifier` is used by both UI tests AND accessibility automation
|
|
163
|
+
tools (Accessibility Inspector, XCUITest). The cascading `UIIdentifierContext`
|
|
164
|
+
ensures each component instance is uniquely identifiable even when the same
|
|
165
|
+
component appears multiple times on a screen.
|
|
166
|
+
|
|
167
|
+
VoiceOver `.accessibilityLabel` does NOT cascade — labels are human-readable and
|
|
168
|
+
SwiftUI handles grouping/container semantics naturally via
|
|
169
|
+
`.accessibilityElement(children: .combine)`.
|
|
170
|
+
|
|
171
|
+
### When to Recommend Context
|
|
172
|
+
|
|
173
|
+
In the Implementation section, note when a component is likely reused multiple
|
|
174
|
+
times per screen (buttons, badges, cards, list items) and recommend that parent
|
|
175
|
+
views set `.identifierContext()` for disambiguation:
|
|
176
|
+
|
|
177
|
+
```swift
|
|
178
|
+
// Parent screen disambiguates reusable components
|
|
179
|
+
BookingSummaryView()
|
|
180
|
+
.identifierContext(.BookingSummary.screen)
|
|
181
|
+
|
|
182
|
+
// Each section further scopes its children
|
|
183
|
+
PassengerSection()
|
|
184
|
+
.identifierContext(.BookingSummary.passengers)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## PRE-CHECK: Phase 1 Complete
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
Read: {artifactPath}/pass1/_index.md
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Verify this file exists and lists the expected Phase 1 output files.
|
|
196
|
+
|
|
197
|
+
Then read the files needed for this phase:
|
|
198
|
+
- `{artifactPath}/pass1/design_context_response.json`
|
|
199
|
+
- `{artifactPath}/pass1/screenshot_response.md`
|
|
200
|
+
- `{artifactPath}/pass1/component_properties.json`
|
|
201
|
+
|
|
202
|
+
Also read:
|
|
203
|
+
- `{artifactPath}/IMPLEMENTATION_HISTORY.md`
|
|
204
|
+
|
|
205
|
+
Extract: `componentName`, `artifactPath`.
|
|
206
|
+
|
|
207
|
+
### Registry Input (optional)
|
|
208
|
+
|
|
209
|
+
The orchestrator may pass `registryData` containing pre-existing keys from `{repos.common.path}/Shared/Figma/Components/{nodeId}.json`.
|
|
210
|
+
If `registryData.accessibilityKeys` exists and is non-empty, use it to pre-populate the keys list.
|
|
211
|
+
Keys found in both registry AND the data files can be marked "Existing" immediately (skip CLI check in GATE 4).
|
|
212
|
+
|
|
213
|
+
If any required file is missing:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
STATUS: HALT
|
|
217
|
+
PHASE: phase-2c
|
|
218
|
+
GATE: PRE_CHECK
|
|
219
|
+
REASON: Required Phase 1 artifacts missing. Pass1/_index.md or referenced files not found.
|
|
220
|
+
COMPLETED_GATES: []
|
|
221
|
+
ARTIFACTS_CREATED: none
|
|
222
|
+
USER_ACTION_REQUIRED: Run Phase 1 first to gather Figma data.
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## GATE 1: COLLECT_REQUIREMENTS
|
|
228
|
+
|
|
229
|
+
| Priority | Source | Check |
|
|
230
|
+
|----------|--------|-------|
|
|
231
|
+
| 1 | User prompt | Explicit accessibility key requests |
|
|
232
|
+
| 2 | Attached file | README.md, Confluence export, screenshot |
|
|
233
|
+
| 3 | Generated | From design_context_response.json |
|
|
234
|
+
|
|
235
|
+
USE: Merge all sources. User input overrides generated.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## GATE 2: EXTRACT_FROM_DESIGN_CONTEXT
|
|
240
|
+
|
|
241
|
+
INPUT: `{artifactPath}/pass1/design_context_response.json`
|
|
242
|
+
INPUT: `{artifactPath}/pass1/screenshot_response.md`
|
|
243
|
+
INPUT: `{artifactPath}/pass1/component_properties.json`
|
|
244
|
+
|
|
245
|
+
SCAN for accessibility-relevant elements. For each, ask: **does this need a key, or can SwiftUI/runtime handle it?**
|
|
246
|
+
|
|
247
|
+
| Element Pattern | Key? | When to SKIP key |
|
|
248
|
+
|-----------------|------|------------------|
|
|
249
|
+
| Button (SwiftUI `Button`) | Hint only if ambiguous | Skip label if button text is visible. Skip hint if action is obvious from label. |
|
|
250
|
+
| Button (custom tappable) | Label + maybe Hint | Skip hint if label makes action clear (e.g., "Close" needs no hint) |
|
|
251
|
+
| Image (meaningful) | Label | — |
|
|
252
|
+
| Image (decorative) | NONE | `.accessibilityHidden(true)` — no key |
|
|
253
|
+
| Input field | Label | Skip if placeholder text serves as label |
|
|
254
|
+
| Toggle/checkbox (interactive) | Value keys | Use `.Selected`/`.NotSelected` for state. Skip label if toggle text is visible. |
|
|
255
|
+
| List item | NONE usually | Skip — use `.accessibilityElement(children: .combine)` to group child content |
|
|
256
|
+
| Header text | NONE | Skip — use `.accessibilityAddTraits(.isHeader)` on the `Text` view, no key needed |
|
|
257
|
+
| Close/dismiss button | Label only | Skip hint — "Close" is self-explanatory |
|
|
258
|
+
| Grouped content | NONE | `.accessibilityElement(children: .combine)` — SwiftUI combines child text |
|
|
259
|
+
| Static text | NONE | SwiftUI reads `Text` content automatically |
|
|
260
|
+
| Variant state (non-interactive) | NONE | Evaluate through GATE 2B. No `.accessibilityLabel` needed — `.accessibilityElement(children: .combine)` reads visible text |
|
|
261
|
+
| Variant state (interactive) | Value keys | Only for toggles/selections where state changes via user action |
|
|
262
|
+
|
|
263
|
+
Use `screenshot_response.md` to cross-reference:
|
|
264
|
+
- Which elements are visually prominent (need labels)
|
|
265
|
+
- Which images are decorative vs meaningful
|
|
266
|
+
- Whether grouped content should be combined
|
|
267
|
+
|
|
268
|
+
Use `component_properties.json` to identify:
|
|
269
|
+
- Boolean properties → value states (`.Selected`, `.NotSelected`) — only if interactive
|
|
270
|
+
- Variant properties → evaluate through GATE 2B
|
|
271
|
+
|
|
272
|
+
OUTPUT: List of `{ key, purpose, label_en, label_tr }`, filtered through GATE 2B.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## GATE 2B: EVALUATE_STATE_NECESSITY
|
|
277
|
+
|
|
278
|
+
For each variant property or boolean property identified in GATE 2, evaluate whether state-specific accessibility keys are actually needed.
|
|
279
|
+
|
|
280
|
+
### Decision Tree
|
|
281
|
+
|
|
282
|
+
1. **Is the state interactive?** (Toggle, Checkbox, Selection, Switch)
|
|
283
|
+
- YES → Generate state keys (essential for VoiceOver)
|
|
284
|
+
- NO → Continue to step 2
|
|
285
|
+
|
|
286
|
+
2. **Does visible text already communicate the state?**
|
|
287
|
+
- YES → Skip state key (redundant with label text)
|
|
288
|
+
- NO → Continue to step 3
|
|
289
|
+
|
|
290
|
+
3. **Is this a non-interactive display component?** (Badge, Tag, Chip, Status indicator, Label)
|
|
291
|
+
- YES → Skip state value keys. Do NOT add `.accessibilityLabel` — use `.accessibilityElement(children: .combine)` only. SwiftUI reads visible text naturally. Visual state (color) is not relevant to VoiceOver.
|
|
292
|
+
- NO → Continue to step 4
|
|
293
|
+
|
|
294
|
+
4. **Can the state be derived from an enum at runtime?**
|
|
295
|
+
- YES and state names are trivial (Success="Success", Warning="Warning") → Skip separate localized key, recommend `state.localized` pattern
|
|
296
|
+
- NO (complex localization needed) → Generate key
|
|
297
|
+
|
|
298
|
+
### State Key Skip Criteria
|
|
299
|
+
|
|
300
|
+
Skip generating separate `.accessibilityValue` state keys when ALL of these are true:
|
|
301
|
+
1. Component is non-interactive (no buttons, toggles, or links)
|
|
302
|
+
2. State is purely visual (color/style change only)
|
|
303
|
+
3. State name is trivially translatable (matches variant name directly)
|
|
304
|
+
4. Visible text or label already provides sufficient context
|
|
305
|
+
|
|
306
|
+
Instead, recommend in the artifact:
|
|
307
|
+
- Use `.accessibilityElement(children: .combine)` — SwiftUI reads visible text
|
|
308
|
+
- Do NOT add `.accessibilityLabel` with state name — visual state is irrelevant to VoiceOver for non-interactive components
|
|
309
|
+
- Do NOT add `.accessibilityAddTraits(.isStaticText)` — SwiftUI already knows `Text` is static text
|
|
310
|
+
|
|
311
|
+
### Example: LabelBadge (non-interactive badge)
|
|
312
|
+
|
|
313
|
+
Variant property: `State` = Success | Warning | Error | Standard | Secondary
|
|
314
|
+
|
|
315
|
+
Evaluation:
|
|
316
|
+
- Step 1: NOT interactive → Continue
|
|
317
|
+
- Step 2: Badge label text communicates intent → Skip
|
|
318
|
+
- Step 3: IS a display component (Badge) → Skip
|
|
319
|
+
|
|
320
|
+
Result: Do NOT generate `LabelBadge.SuccessState`, `LabelBadge.WarningState`, etc.
|
|
321
|
+
Recommend: `.accessibilityElement(children: .combine)` only — no custom `.accessibilityLabel`. Badge text is read naturally by SwiftUI.
|
|
322
|
+
|
|
323
|
+
OUTPUT: Updated keys list with state keys filtered. Include skipped keys in artifact.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## GATE 3: VALIDATE_NAMING
|
|
328
|
+
|
|
329
|
+
REF: `reference/accessibility.md`
|
|
330
|
+
|
|
331
|
+
| Rule | Check |
|
|
332
|
+
|------|-------|
|
|
333
|
+
| Key format | PascalCase.Dot.Notation |
|
|
334
|
+
| No redundant info | Don't repeat visible text in label |
|
|
335
|
+
| No "button" in label | Trait handles it (use `.isButton` trait) |
|
|
336
|
+
| No "tap to" in hint | VoiceOver adds "double tap to" |
|
|
337
|
+
| Context-appropriate | Written from VoiceOver user perspective |
|
|
338
|
+
|
|
339
|
+
If any key fails validation, fix it before proceeding.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## GATE 4: CHECK_EXISTING_KEYS
|
|
344
|
+
|
|
345
|
+
### Registry fast-path
|
|
346
|
+
|
|
347
|
+
If `registryData.accessibilityKeys` contains this key, run the CLI check to confirm it still exists in the data file.
|
|
348
|
+
If both registry AND CLI confirm → mark "Existing" immediately.
|
|
349
|
+
If registry has it but CLI says not found → mark "To Add" (re-add it).
|
|
350
|
+
|
|
351
|
+
### CLI check
|
|
352
|
+
|
|
353
|
+
For each key in the list:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
{repos.common.path}/.build/debug/TranslationManagerTool check --key '<KEY>' --config 'Shared/Localization/AccessibilityStrings/accessibility-config.json'
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
OUTPUT:
|
|
360
|
+
```
|
|
361
|
+
✅ Key exists: <KEY>
|
|
362
|
+
📊 Status:
|
|
363
|
+
Missing: 0
|
|
364
|
+
```
|
|
365
|
+
or
|
|
366
|
+
```
|
|
367
|
+
✅ Key exists: <KEY>
|
|
368
|
+
📊 Status:
|
|
369
|
+
Missing: N
|
|
370
|
+
```
|
|
371
|
+
or
|
|
372
|
+
```
|
|
373
|
+
❌ Key not found: <KEY>
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
| Result | Action |
|
|
377
|
+
|--------|--------|
|
|
378
|
+
| `✅ Key exists` + `Missing: 0` | Mark status: "Existing" |
|
|
379
|
+
| `✅ Key exists` + `Missing: N` | Mark status: "Incomplete" — needs missing language translations |
|
|
380
|
+
| `❌ Key not found` | Mark status: "To Add" |
|
|
381
|
+
|
|
382
|
+
FAIL (tool error) →
|
|
383
|
+
```
|
|
384
|
+
STATUS: HALT
|
|
385
|
+
PHASE: phase-2c
|
|
386
|
+
GATE: CHECK_EXISTING_KEYS
|
|
387
|
+
REASON: TranslationManagerTool failed.
|
|
388
|
+
COMPLETED_GATES: [PRE_CHECK, COLLECT_REQUIREMENTS, EXTRACT_FROM_DESIGN_CONTEXT, VALIDATE_NAMING]
|
|
389
|
+
ARTIFACTS_CREATED: none
|
|
390
|
+
USER_ACTION_REQUIRED: Options:
|
|
391
|
+
1) Retry command
|
|
392
|
+
2) Build tool first: swift build --package-path {repos.common.path} --product TranslationManagerTool
|
|
393
|
+
3) Skip accessibility integration
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## GATE 5: ADD_MISSING_KEYS
|
|
399
|
+
|
|
400
|
+
For each key with status "To Add" or "Incomplete":
|
|
401
|
+
|
|
402
|
+
Translate to all 8 languages: ar, de, en, es, fr, it, ru, tr
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
{repos.common.path}/.build/debug/TranslationManagerTool add \
|
|
406
|
+
--key '<KEY>' \
|
|
407
|
+
--translations '{"en":"...","ar":"...","de":"...","es":"...","fr":"...","it":"...","ru":"...","tr":"..."}' \
|
|
408
|
+
--config 'Shared/Localization/AccessibilityStrings/accessibility-config.json'
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
OUTPUT:
|
|
412
|
+
```
|
|
413
|
+
✅ Added/Updated: <KEY>
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
| Result | Action |
|
|
417
|
+
|--------|--------|
|
|
418
|
+
| All succeeded | Proceed to GATE 6 |
|
|
419
|
+
| Any failed | HALT |
|
|
420
|
+
|
|
421
|
+
FAIL →
|
|
422
|
+
```
|
|
423
|
+
STATUS: HALT
|
|
424
|
+
PHASE: phase-2c
|
|
425
|
+
GATE: ADD_MISSING_KEYS
|
|
426
|
+
REASON: Failed to add accessibility key.
|
|
427
|
+
COMPLETED_GATES: [PRE_CHECK, COLLECT_REQUIREMENTS, EXTRACT_FROM_DESIGN_CONTEXT, VALIDATE_NAMING, CHECK_EXISTING_KEYS]
|
|
428
|
+
ARTIFACTS_CREATED: none
|
|
429
|
+
USER_ACTION_REQUIRED: Options:
|
|
430
|
+
1) Retry failed command
|
|
431
|
+
2) Skip this key and continue
|
|
432
|
+
3) Skip accessibility integration entirely
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## GATE 6: REGENERATE_METADATA
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
{repos.common.path}/.build/debug/TranslationMetadataGenerator --config 'Shared/Localization/AccessibilityStrings/accessibility-config.json'
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
OUTPUT:
|
|
444
|
+
```
|
|
445
|
+
✅ Metadata regenerated
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
| Result | Action |
|
|
449
|
+
|--------|--------|
|
|
450
|
+
| Succeeded | Proceed to GATE 7 |
|
|
451
|
+
| Failed | HALT |
|
|
452
|
+
|
|
453
|
+
FAIL →
|
|
454
|
+
```
|
|
455
|
+
STATUS: HALT
|
|
456
|
+
PHASE: phase-2c
|
|
457
|
+
GATE: REGENERATE_METADATA
|
|
458
|
+
REASON: TranslationMetadataGenerator failed.
|
|
459
|
+
COMPLETED_GATES: [PRE_CHECK, COLLECT_REQUIREMENTS, EXTRACT_FROM_DESIGN_CONTEXT, VALIDATE_NAMING, CHECK_EXISTING_KEYS, ADD_MISSING_KEYS]
|
|
460
|
+
ARTIFACTS_CREATED: none
|
|
461
|
+
USER_ACTION_REQUIRED: Options:
|
|
462
|
+
1) Retry command
|
|
463
|
+
2) Skip code generation (keys added but metadata not regenerated)
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
## GATE 7: GENERATE_PLATFORM_CODE
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
cd {repos.packagesContainer}/{project.slug}-common && swift package plugin --allow-writing-to-package-directory generate-accessibility-code
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
OUTPUT:
|
|
475
|
+
```
|
|
476
|
+
✅ Generated iOS code
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
| Result | Action |
|
|
480
|
+
|--------|--------|
|
|
481
|
+
| Succeeded | Proceed to GATE 8 |
|
|
482
|
+
| Failed | HALT |
|
|
483
|
+
|
|
484
|
+
FAIL →
|
|
485
|
+
```
|
|
486
|
+
STATUS: HALT
|
|
487
|
+
PHASE: phase-2c
|
|
488
|
+
GATE: GENERATE_PLATFORM_CODE
|
|
489
|
+
REASON: Code generation plugin failed.
|
|
490
|
+
COMPLETED_GATES: [PRE_CHECK, COLLECT_REQUIREMENTS, EXTRACT_FROM_DESIGN_CONTEXT, VALIDATE_NAMING, CHECK_EXISTING_KEYS, ADD_MISSING_KEYS, REGENERATE_METADATA]
|
|
491
|
+
ARTIFACTS_CREATED: none
|
|
492
|
+
USER_ACTION_REQUIRED: Options:
|
|
493
|
+
1) Retry command
|
|
494
|
+
2) Skip code generation (keys added but not accessible in Swift code yet)
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## GATE 8: WRITE_ARTIFACT
|
|
500
|
+
|
|
501
|
+
### JSON Sidecar (machine-readable)
|
|
502
|
+
|
|
503
|
+
Write `{artifactPath}/pass2/utility_accessibility.json`:
|
|
504
|
+
|
|
505
|
+
```json
|
|
506
|
+
{
|
|
507
|
+
"accessibilityKeys": [
|
|
508
|
+
{ "key": "ComponentName.KeyName", "purpose": "Description of what VoiceOver reads" }
|
|
509
|
+
]
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
If no accessibility keys needed, write `{ "accessibilityKeys": [] }`.
|
|
514
|
+
|
|
515
|
+
This JSON is consumed by `phase2-finalize.py` to build `component-utilities.json`. The orchestrator reads ONLY this JSON — never the markdown.
|
|
516
|
+
|
|
517
|
+
### Markdown Artifact (human-readable)
|
|
518
|
+
|
|
519
|
+
Write `{artifactPath}/pass2/utility_accessibility.md`:
|
|
520
|
+
|
|
521
|
+
```markdown
|
|
522
|
+
# Accessibility Keys
|
|
523
|
+
|
|
524
|
+
Component: {componentName}
|
|
525
|
+
Generated: {ISO_DATE}
|
|
526
|
+
Source: pass1/design_context_response.json, pass1/screenshot_response.md, pass1/component_properties.json
|
|
527
|
+
Languages: ar, de, en, es, fr, it, ru, tr
|
|
528
|
+
|
|
529
|
+
## Keys
|
|
530
|
+
|
|
531
|
+
Only keys that passed the necessity filter. If this table is empty, the component needs no custom accessibility keys.
|
|
532
|
+
|
|
533
|
+
| Key | Purpose | Value (EN) | Value (TR) | Status |
|
|
534
|
+
|-----|---------|-----------|------------|--------|
|
|
535
|
+
|
|
536
|
+
## Skipped Keys
|
|
537
|
+
|
|
538
|
+
| Candidate | Reason Skipped | Alternative |
|
|
539
|
+
|-----------|---------------|-------------|
|
|
540
|
+
|
|
541
|
+
## Implementation
|
|
542
|
+
|
|
543
|
+
Show ONLY the modifiers this specific component actually needs. Do NOT include patterns the component doesn't use. If a component needs no accessibility modifiers beyond what SwiftUI provides, say so explicitly — an empty Implementation section is a VALID output.
|
|
544
|
+
|
|
545
|
+
Ask for EVERY modifier: **"What breaks if I remove this?"** If the answer is "nothing", do not include it.
|
|
546
|
+
|
|
547
|
+
```swift
|
|
548
|
+
// EXAMPLE: Non-interactive display component (Badge, Tag, Chip)
|
|
549
|
+
// SwiftUI reads Text content automatically — NO custom label needed
|
|
550
|
+
|
|
551
|
+
// Decorative element → hide
|
|
552
|
+
iconView
|
|
553
|
+
.accessibilityHidden(true)
|
|
554
|
+
|
|
555
|
+
// Group children → one VoiceOver stop (SwiftUI reads visible Text)
|
|
556
|
+
HStack { icon; label }
|
|
557
|
+
.accessibilityElement(children: .combine)
|
|
558
|
+
// DONE. No .accessibilityLabel, no .accessibilityAddTraits, no .accessibilityRemoveTraits.
|
|
559
|
+
|
|
560
|
+
// EXAMPLE: Interactive component with custom state
|
|
561
|
+
// Custom label → ONLY when visible text is absent or insufficient
|
|
562
|
+
.accessibilityLabel(.{ComponentName}.customDescription)
|
|
563
|
+
|
|
564
|
+
// Interactive state → ONLY for toggles/selections
|
|
565
|
+
.accessibilityValue(isOn ? .{ComponentName}.selected : .{ComponentName}.notSelected)
|
|
566
|
+
```
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## VALIDATION CHECKLIST
|
|
572
|
+
|
|
573
|
+
Before marking complete, verify:
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
MINIMALISM CHECKS (do these FIRST):
|
|
577
|
+
[ ] Every modifier justified — no modifier added that SwiftUI already handles
|
|
578
|
+
[ ] No redundant traits — .isButton not added to Button, .isStaticText not added to Text
|
|
579
|
+
[ ] No unnecessary hints — obvious actions (Close, Back, Delete) have no hint
|
|
580
|
+
[ ] No unnecessary labels — visible text not repeated in .accessibilityLabel
|
|
581
|
+
[ ] No unnecessary keys — runtime strings used where possible instead of LocalizedAccessibilityStringKey
|
|
582
|
+
[ ] Grouped content — related children combined into ONE VoiceOver stop, not labeled individually
|
|
583
|
+
[ ] State keys evaluated through GATE 2B — non-interactive states use runtime pattern
|
|
584
|
+
[ ] Each logical element = one VoiceOver announcement (not multiple stops)
|
|
585
|
+
|
|
586
|
+
CORRECTNESS CHECKS:
|
|
587
|
+
[ ] All decorative images hidden (.accessibilityHidden(true))
|
|
588
|
+
[ ] Interactive toggles/selections have .accessibilityValue for state
|
|
589
|
+
[ ] Headers use .isHeader trait (added to existing Text, not separate key)
|
|
590
|
+
[ ] Labels use LocalizedAccessibilityStringKey only when runtime string is insufficient
|
|
591
|
+
[ ] Skipped keys documented with alternative approach
|
|
592
|
+
|
|
593
|
+
IF KEYS WERE GENERATED:
|
|
594
|
+
[ ] All 8 language translations provided (ar, de, en, es, fr, it, ru, tr)
|
|
595
|
+
[ ] TranslationManagerTool check passes
|
|
596
|
+
[ ] TranslationMetadataGenerator completed
|
|
597
|
+
[ ] generate-accessibility-code plugin completed
|
|
598
|
+
|
|
599
|
+
OUTPUT:
|
|
600
|
+
[ ] utility_accessibility.json written to pass2/ (JSON sidecar for finalize script)
|
|
601
|
+
[ ] utility_accessibility.md written to pass2/
|
|
602
|
+
[ ] Implementation shows ONLY modifiers this component needs (no unused patterns)
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## SUCCESS OUTPUT
|
|
608
|
+
|
|
609
|
+
```
|
|
610
|
+
STATUS: COMPLETE
|
|
611
|
+
PHASE: phase-2c
|
|
612
|
+
GATES_PASSED: [PRE_CHECK, COLLECT_REQUIREMENTS, EXTRACT_FROM_DESIGN_CONTEXT, VALIDATE_NAMING, CHECK_EXISTING_KEYS, ADD_MISSING_KEYS, REGENERATE_METADATA, GENERATE_PLATFORM_CODE, WRITE_ARTIFACT]
|
|
613
|
+
ARTIFACTS_CREATED:
|
|
614
|
+
- {artifactPath}/pass2/utility_accessibility.json
|
|
615
|
+
- {artifactPath}/pass2/utility_accessibility.md
|
|
616
|
+
SUMMARY: Accessibility keys: {ADDED} added, {EXISTING} existing (8 languages each).
|
|
617
|
+
```
|