@mmerterden/multi-agent-pipeline 20.2.0 → 20.3.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 +923 -1
- package/README.md +104 -81
- package/README.tr.md +103 -62
- package/docs/FIGMA_PIPELINE.md +35 -35
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
- package/docs/architecture.md +50 -14
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +56 -32
- package/docs/facts.json +10 -10
- package/docs/features.md +97 -5
- package/docs/recovery-guide.md +7 -14
- package/docs/server-readiness.md +31 -24
- package/index.js +1 -1
- package/install/_common.mjs +3 -5
- package/install/_platform-filter.mjs +23 -1
- package/install/_unattended-profile.mjs +321 -75
- package/install/claude.mjs +51 -10
- package/install/codex.mjs +2 -0
- package/install/copilot.mjs +2 -0
- package/install/index.mjs +30 -17
- package/install/templates/claude-hooks.json +16 -5
- package/install/templates/copilot-instructions.md +1 -1
- package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
- package/install/templates/multi-agent-autopilot.plist.template +12 -5
- package/install/unattended-profile-legacy.json +80 -0
- package/manifest.json +616 -483
- package/package.json +8 -3
- package/pipeline/agents/code-reviewer.md +10 -0
- package/pipeline/agents/plan-critic.md +98 -0
- package/pipeline/agents/security-auditor.md +10 -0
- package/pipeline/agents/task-clarifier.md +10 -0
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
- package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
- package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
- package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
- package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
- package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
- package/pipeline/contract/CHANGELOG.md +74 -0
- package/pipeline/contract/README.md +126 -0
- package/pipeline/contract/build.mjs +427 -0
- package/pipeline/contract/fixtures/answer-result.json +11 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
- package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
- package/pipeline/contract/fixtures/error-unsigned.json +5 -0
- package/pipeline/contract/fixtures/issues-empty.json +18 -0
- package/pipeline/contract/fixtures/launch-plan.json +31 -0
- package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
- package/pipeline/contract/fixtures/runs-empty.json +6 -0
- package/pipeline/contract/fixtures/runs-failed.json +84 -0
- package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
- package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
- package/pipeline/contract/fixtures/runs-running.json +84 -0
- package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
- package/pipeline/contract/frozen/toolbox.json +107 -0
- package/pipeline/contract/manifest.json +263 -0
- package/pipeline/contract/types/index.d.ts +343 -0
- package/pipeline/lib/_jira-auth.sh +6 -2
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/autopilot-state.sh +19 -0
- package/pipeline/lib/context-link-extractor.sh +12 -5
- package/pipeline/lib/credential-inventory.sh +12 -5
- package/pipeline/lib/credential-store.sh +116 -185
- package/pipeline/lib/fetch-confluence.sh +44 -3
- package/pipeline/lib/fetch-document.sh +3 -4
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/figma-mcp-refresh.sh +2 -2
- package/pipeline/lib/figma-token.sh +5 -1
- package/pipeline/lib/issue-fetcher.sh +233 -16
- package/pipeline/lib/json-file-lock.mjs +172 -0
- package/pipeline/lib/model-dispatch.sh +21 -12
- package/pipeline/lib/model-rung.sh +6 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/outbound-gate.mjs +46 -16
- package/pipeline/lib/parse-complaints.sh +14 -7
- package/pipeline/lib/plan-todos.sh +3 -3
- package/pipeline/lib/post-pr-review.sh +9 -9
- package/pipeline/lib/pr-request-location.mjs +85 -0
- package/pipeline/lib/regular-file.mjs +153 -0
- package/pipeline/lib/repo-hygiene.sh +17 -0
- package/pipeline/lib/route-state.sh +5 -1
- package/pipeline/lib/run-paths.sh +3 -2
- package/pipeline/lib/stack-detect.sh +19 -1
- package/pipeline/lib/unattended-profile-check.mjs +178 -0
- package/pipeline/lib/unattended-settings-location.mjs +28 -0
- package/pipeline/lib/unattended.mjs +76 -0
- package/pipeline/lib/unattended.sh +32 -0
- package/pipeline/lib/untrusted.mjs +76 -0
- package/pipeline/lib/user-facing.mjs +82 -0
- package/pipeline/lib/user-facing.sh +58 -0
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
- package/pipeline/multi-agent-refs/analysis/render.md +4 -3
- package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
- package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
- package/pipeline/multi-agent-refs/analysis-template.md +10 -17
- package/pipeline/multi-agent-refs/channels/jira.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
- package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
- package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
- package/pipeline/multi-agent-refs/features/constitution.md +196 -0
- package/pipeline/multi-agent-refs/features/doctor.md +6 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
- package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
- package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
- package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
- package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
- package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
- package/pipeline/multi-agent-refs/features/research.md +150 -0
- package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
- package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
- package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
- package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
- package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
- package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
- package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
- package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -31
- package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
- package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
- package/pipeline/multi-agent-refs/keychain.md +6 -11
- package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
- package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
- package/pipeline/multi-agent-refs/phases/modes.md +10 -12
- package/pipeline/multi-agent-refs/phases/operations.md +11 -5
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
- package/pipeline/multi-agent-refs/phases.md +1 -1
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/progress-contract.md +13 -16
- package/pipeline/multi-agent-refs/readiness-review.md +1 -1
- package/pipeline/multi-agent-refs/research/engine.md +91 -0
- package/pipeline/multi-agent-refs/rules.md +6 -4
- package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
- package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
- package/pipeline/rules/figma-pipeline.md +12 -12
- package/pipeline/schemas/agent-state.schema.json +480 -18
- package/pipeline/schemas/analysis-spec.schema.json +4 -4
- package/pipeline/schemas/answer-request.schema.json +24 -0
- package/pipeline/schemas/answer-result.schema.json +28 -0
- package/pipeline/schemas/autopilot-config.schema.json +111 -13
- package/pipeline/schemas/command-parameters.schema.json +99 -0
- package/pipeline/schemas/constitution.schema.json +56 -0
- package/pipeline/schemas/contract-error.schema.json +52 -0
- package/pipeline/schemas/design-check-config.schema.json +5 -1
- package/pipeline/schemas/issues.schema.json +61 -0
- package/pipeline/schemas/launch-plan.schema.json +46 -0
- package/pipeline/schemas/launch-request.schema.json +45 -0
- package/pipeline/schemas/launch.json +61 -0
- package/pipeline/schemas/launch.schema.json +84 -0
- package/pipeline/schemas/phases.json +2 -2
- package/pipeline/schemas/phases.schema.json +68 -0
- package/pipeline/schemas/phone-devices.schema.json +61 -0
- package/pipeline/schemas/phone-signed-request.schema.json +67 -0
- package/pipeline/schemas/plan-critique.schema.json +99 -0
- package/pipeline/schemas/plan-todos.schema.json +7 -7
- package/pipeline/schemas/planning-output.schema.json +5 -0
- package/pipeline/schemas/pr-request.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +82 -7
- package/pipeline/schemas/research-output.schema.json +118 -0
- package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
- package/pipeline/schemas/reviewer-output.schema.json +40 -4
- package/pipeline/schemas/run-questions.json +392 -0
- package/pipeline/schemas/run-questions.schema.json +118 -0
- package/pipeline/schemas/runs-index.schema.json +189 -0
- package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
- package/pipeline/schemas/secret-patterns.schema.json +28 -0
- package/pipeline/schemas/stack-adapters.json +527 -0
- package/pipeline/schemas/stack-adapters.schema.json +184 -0
- package/pipeline/schemas/token-budget.json +1 -1
- package/pipeline/schemas/token-budget.schema.json +26 -0
- package/pipeline/schemas/triage-output.schema.json +64 -3
- package/pipeline/schemas/unattended-policy.json +139 -0
- package/pipeline/schemas/unattended-policy.schema.json +73 -0
- package/pipeline/schemas/unattended-profile.json +248 -0
- package/pipeline/schemas/unattended-profile.schema.json +198 -0
- package/pipeline/schemas/worktrees.schema.json +51 -0
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/_autopilot-config.mjs +130 -0
- package/pipeline/scripts/_autopilot-ops.mjs +567 -0
- package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
- package/pipeline/scripts/_command-contract.mjs +384 -0
- package/pipeline/scripts/_cost.mjs +40 -0
- package/pipeline/scripts/_notices.mjs +160 -0
- package/pipeline/scripts/_phone-auth.mjs +485 -0
- package/pipeline/scripts/_pre-existing.mjs +294 -0
- package/pipeline/scripts/_redact.mjs +77 -0
- package/pipeline/scripts/_run-paths.mjs +4 -2
- package/pipeline/scripts/_stack-adapter.mjs +678 -0
- package/pipeline/scripts/_stack-routing.mjs +1 -1
- package/pipeline/scripts/agent-guard.py +348 -37
- package/pipeline/scripts/agent-guard.sh +41 -13
- package/pipeline/scripts/analysis-story-tree.mjs +79 -3
- package/pipeline/scripts/answer-question.mjs +181 -0
- package/pipeline/scripts/audit-log-rotate.sh +1 -4
- package/pipeline/scripts/audit-log.sh +4 -4
- package/pipeline/scripts/autopilot-arming.mjs +389 -21
- package/pipeline/scripts/autopilot-awake.mjs +255 -0
- package/pipeline/scripts/autopilot-intake.mjs +137 -36
- package/pipeline/scripts/autopilot-menubar.swift +156 -44
- package/pipeline/scripts/autopilot-publish.mjs +1625 -0
- package/pipeline/scripts/autopilot-runner.mjs +1678 -222
- package/pipeline/scripts/autopilot-status.sh +198 -33
- package/pipeline/scripts/build-lock.sh +120 -0
- package/pipeline/scripts/build-references.mjs +4 -1
- package/pipeline/scripts/build-stack-plugins.mjs +59 -22
- package/pipeline/scripts/capture-flush.sh +1 -1
- package/pipeline/scripts/capture-resume.sh +13 -9
- package/pipeline/scripts/check-derived-drift.mjs +52 -11
- package/pipeline/scripts/commands.mjs +88 -0
- package/pipeline/scripts/constitution.mjs +362 -0
- package/pipeline/scripts/contract-server.mjs +776 -0
- package/pipeline/scripts/cost-analyze.mjs +89 -39
- package/pipeline/scripts/diff-explain.mjs +12 -1
- package/pipeline/scripts/doctor.mjs +77 -28
- package/pipeline/scripts/evidence-gate.mjs +192 -12
- package/pipeline/scripts/feedback-send.mjs +4 -2
- package/pipeline/scripts/gate-ledger.mjs +449 -0
- package/pipeline/scripts/gc-abandoned.sh +132 -13
- package/pipeline/scripts/gen-facts.mjs +31 -15
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/github-ssh-setup.sh +140 -29
- package/pipeline/scripts/graph-mermaid.mjs +4 -1
- package/pipeline/scripts/issues.mjs +236 -0
- package/pipeline/scripts/jira-attach.sh +6 -2
- package/pipeline/scripts/jira-search.sh +4 -3
- package/pipeline/scripts/keychain-save.sh +125 -24
- package/pipeline/scripts/keychain.py +63 -93
- package/pipeline/scripts/launch-request.mjs +747 -0
- package/pipeline/scripts/localize-commands.mjs +4 -10
- package/pipeline/scripts/log-metric.sh +6 -5
- package/pipeline/scripts/maturity-followup.mjs +13 -4
- package/pipeline/scripts/memory-save.sh +25 -0
- package/pipeline/scripts/migrate-prefs.mjs +4 -3
- package/pipeline/scripts/open-questions-gate.mjs +276 -0
- package/pipeline/scripts/phase-tracker.sh +41 -27
- package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
- package/pipeline/scripts/phone-devices.mjs +224 -0
- package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
- package/pipeline/scripts/plan-critique-gate.mjs +591 -0
- package/pipeline/scripts/pr-request.mjs +188 -0
- package/pipeline/scripts/pre-commit-check.sh +115 -4
- package/pipeline/scripts/probe-evidence-capability.sh +44 -5
- package/pipeline/scripts/record-phase.mjs +71 -0
- package/pipeline/scripts/render-agent-log-cost.sh +17 -2
- package/pipeline/scripts/render-cost-summary.sh +1 -1
- package/pipeline/scripts/render-work-summary.sh +1 -1
- package/pipeline/scripts/require-supported-version.sh +4 -1
- package/pipeline/scripts/research-gate.mjs +704 -0
- package/pipeline/scripts/review-decision-gate.mjs +403 -0
- package/pipeline/scripts/routine-registry.mjs +5 -2
- package/pipeline/scripts/runs-index.mjs +135 -27
- package/pipeline/scripts/scaffold-gate.mjs +393 -0
- package/pipeline/scripts/skill-conformance.mjs +25 -8
- package/pipeline/scripts/skill-siblings.mjs +2 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
- package/pipeline/scripts/smoke-schema-validation.sh +6 -2
- package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
- package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
- package/pipeline/scripts/test-gap-scan.mjs +40 -2
- package/pipeline/scripts/test-integrity-gate.mjs +20 -4
- package/pipeline/scripts/test-strength.mjs +484 -0
- package/pipeline/scripts/test-summary.mjs +651 -0
- package/pipeline/scripts/triage-memory.mjs +49 -9
- package/pipeline/scripts/unattended_policy.py +2786 -0
- package/pipeline/scripts/uninstall.mjs +10 -10
- package/pipeline/scripts/update-issue-progress.sh +1 -1
- package/pipeline/scripts/usage-identity.mjs +288 -0
- package/pipeline/scripts/usage-register.mjs +185 -63
- package/pipeline/scripts/usage-report.mjs +230 -66
- package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
- package/pipeline/scripts/validate-planning.mjs +6 -0
- package/pipeline/scripts/verify-citations.mjs +151 -38
- package/pipeline/scripts/verify.mjs +58 -18
- package/pipeline/scripts/worktree-prepare.sh +126 -0
- package/pipeline/scripts/worktrees.mjs +124 -0
- package/pipeline/scripts/write-state.mjs +48 -17
- package/pipeline/skills/.skill-manifest.json +222 -226
- package/pipeline/skills/.skills-index.json +77 -88
- package/pipeline/skills/shared/README.md +44 -45
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
- package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
- package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
- package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
- package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
- package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
- package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
- package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
- package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
- package/pipeline/skills/shared/external/council/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
- package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
- package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
- package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
- package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
- package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
- package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
- package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
- package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
- package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
- package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
- package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
- package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
- package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
- package/pipeline/skills/skills-index.md +40 -41
- package/docs/token-budget-history.md +0 -24
- package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
- package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
- package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
- package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
- package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
|
@@ -1,58 +1,125 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: architecture
|
|
3
|
-
description: "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: "Stack-neutral architecture decisions: quality drivers, options with a trade-off matrix, reversibility, ADRs, fitness checks. Use when making or reviewing a significant design decision or writing an ADR."
|
|
4
|
+
metadata:
|
|
5
|
+
risk: safe
|
|
6
|
+
source: multi-agent-pipeline
|
|
7
|
+
date_added: "2026-09-25"
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
# Architecture
|
|
10
|
+
# Architecture Decisions
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
An architecture decision is any choice that is expensive to undo once other
|
|
13
|
+
code depends on it. This skill is the procedure for making one deliberately and
|
|
14
|
+
leaving a record a later reader can argue with.
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
It is stack-neutral. For app-level patterns on a specific platform, load
|
|
17
|
+
`swift-architecture` (MV, MVVM, TCA and friends on Apple platforms) or
|
|
18
|
+
`android-architecture` (layered modules with Hilt). For line-level readability
|
|
19
|
+
use `clean-code`. For a contested call that needs several independent opinions,
|
|
20
|
+
`council` runs that debate; this skill supplies the frame it argues inside.
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
|------|-------------|--------------|
|
|
17
|
-
| Context discovery | Questions to ask, project classification | Starting architecture design |
|
|
18
|
-
| Trade-off analysis | ADR templates, trade-off framework | Documenting decisions |
|
|
19
|
-
| Pattern selection | Decision trees, anti-patterns | Choosing patterns |
|
|
20
|
-
| Worked examples | MVP, SaaS, Enterprise examples | Reference implementations |
|
|
21
|
-
| Patterns reference | Quick lookup for patterns | Pattern comparison |
|
|
22
|
+
## When a decision deserves this process
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
Run the full procedure when at least one is true:
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
- Undoing it later would touch more than one team, service or release.
|
|
27
|
+
- It fixes a data format, a public contract or a storage engine.
|
|
28
|
+
- Two competent people on the team already disagree about it.
|
|
29
|
+
- It trades one quality attribute against another (for example latency for
|
|
30
|
+
consistency).
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
| `@[skills/database-design]` | Database schema design |
|
|
30
|
-
| `@[skills/api-patterns]` | API design patterns |
|
|
31
|
-
| `@[skills/deployment-procedures]` | Deployment architecture |
|
|
32
|
+
A choice that one engineer can reverse in an afternoon does not need an ADR.
|
|
33
|
+
Make it, note it in the pull request, move on.
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
## Step 1: Write the forces down
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
Before any option is named, list what the design has to satisfy. Options chosen
|
|
38
|
+
before the forces are written tend to be justified backwards.
|
|
36
39
|
|
|
37
|
-
**
|
|
40
|
+
**Functional scope.** One or two sentences: what must the system do that it does
|
|
41
|
+
not do today.
|
|
38
42
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- Removing complexity is MUCH harder than adding it
|
|
43
|
+
**Quality drivers.** Pick the three to five that actually bind, and make each
|
|
44
|
+
one measurable. "Fast" is not a driver; "p95 order lookup under 200 ms at 500
|
|
45
|
+
requests per second" is.
|
|
43
46
|
|
|
44
|
-
|
|
47
|
+
| Attribute | Typical measurable form |
|
|
48
|
+
|-----------|-------------------------|
|
|
49
|
+
| Performance | p95/p99 latency at a stated load |
|
|
50
|
+
| Availability | allowed downtime per month, recovery time objective |
|
|
51
|
+
| Consistency | which reads may be stale, and for how long |
|
|
52
|
+
| Scalability | growth factor the design must absorb without rework |
|
|
53
|
+
| Security | data classes handled, trust boundaries crossed |
|
|
54
|
+
| Operability | who is paged, what they can see, how they roll back |
|
|
55
|
+
| Changeability | which parts are expected to change often |
|
|
56
|
+
| Cost | monthly run cost ceiling, build effort ceiling |
|
|
57
|
+
|
|
58
|
+
**Constraints.** Things that are not up for debate: an existing platform, a
|
|
59
|
+
compliance rule, a deadline, the skills the team has today. Write them as
|
|
60
|
+
constraints so nobody spends an hour optimising them away.
|
|
61
|
+
|
|
62
|
+
**Assumptions.** What you believe but have not checked (traffic shape, data
|
|
63
|
+
volume, number of clients). Each one is a risk; mark the ones that would flip the
|
|
64
|
+
decision if they turned out wrong.
|
|
65
|
+
|
|
66
|
+
## Step 2: Generate real options
|
|
67
|
+
|
|
68
|
+
Aim for three options, and make sure they differ in kind, not only in brand.
|
|
69
|
+
"Postgres versus MySQL" is one option with two vendors; "relational store versus
|
|
70
|
+
event log with projections versus keep the current document store and add an
|
|
71
|
+
index" is three.
|
|
72
|
+
|
|
73
|
+
Always include:
|
|
74
|
+
|
|
75
|
+
- **Do the least.** Extend what exists. It is often right, and it is the
|
|
76
|
+
baseline every other option must beat.
|
|
77
|
+
- **The option someone is excited about.** Give it a fair hearing in writing
|
|
78
|
+
instead of a hallway argument.
|
|
79
|
+
- **One option that optimises a different driver** than the favourite does.
|
|
80
|
+
|
|
81
|
+
Sketch each option at the level of boxes and arrows: components, who owns the
|
|
82
|
+
data, how requests and failures flow. If an option cannot be sketched, it is not
|
|
83
|
+
yet an option.
|
|
84
|
+
|
|
85
|
+
## Step 3: Compare in a trade-off matrix
|
|
86
|
+
|
|
87
|
+
Score each option against each driver from Step 1. Use a small scale (for
|
|
88
|
+
example minus, zero, plus) and a sentence of evidence per cell; the evidence is
|
|
89
|
+
the valuable part, the score is a summary.
|
|
90
|
+
|
|
91
|
+
Example for a notes service that must add full-text search:
|
|
92
|
+
|
|
93
|
+
| Driver | A: DB full-text index | B: Dedicated search engine | C: Client-side search |
|
|
94
|
+
|--------|----------------------|----------------------------|-----------------------|
|
|
95
|
+
| p95 search under 300 ms on 5M notes | 0 - fine to ~10M rows per benchmark on staging | + - built for it | - - only works for small accounts |
|
|
96
|
+
| Operability | + - no new system | - - new cluster, new on-call runbook | + - nothing server-side |
|
|
97
|
+
| Consistency with writes | + - same transaction | 0 - seconds of lag via change feed | + - local |
|
|
98
|
+
| Build effort | + - days | - - weeks, plus sync pipeline | 0 - moderate, per client |
|
|
99
|
+
|
|
100
|
+
Read the matrix for two things:
|
|
101
|
+
|
|
102
|
+
1. **Dominated options.** If one option is no better than another on any driver,
|
|
103
|
+
drop it and say why.
|
|
104
|
+
2. **The deciding driver.** Usually one row decides. Name it explicitly in the
|
|
105
|
+
ADR; it is what a future reader needs to re-open the decision when that
|
|
106
|
+
driver changes.
|
|
107
|
+
|
|
108
|
+
## Step 4: Judge reversibility
|
|
109
|
+
|
|
110
|
+
For each surviving option ask: if this turns out wrong in a year, what does
|
|
111
|
+
backing out cost?
|
|
45
112
|
|
|
46
|
-
|
|
113
|
+
- **Two-way door.** Behind an interface, data easily migrated, few callers.
|
|
114
|
+
Decide quickly, bias to the simplest option.
|
|
115
|
+
- **One-way door.** Public contracts, persisted formats, vendor lock-in, team
|
|
116
|
+
boundaries. Slow down, prototype the riskiest assumption, get a second review.
|
|
47
117
|
|
|
48
|
-
|
|
118
|
+
You can often turn a one-way door into a two-way one cheaply: put an interface
|
|
119
|
+
in front of the new component, dual-write for a period, version the contract
|
|
120
|
+
from day one, keep the old path behind a flag. Note such mitigations as part of
|
|
121
|
+
the option, because they change its cost.
|
|
49
122
|
|
|
50
|
-
|
|
51
|
-
- [ ] Constraints identified
|
|
52
|
-
- [ ] Each decision has trade-off analysis
|
|
53
|
-
- [ ] Simpler alternatives considered
|
|
54
|
-
- [ ] ADRs written for significant decisions
|
|
55
|
-
- [ ] Team expertise matches chosen patterns
|
|
123
|
+
## Details on demand
|
|
56
124
|
|
|
57
|
-
|
|
58
|
-
This skill is applicable to execute the workflow or actions described in the overview.
|
|
125
|
+
Load `references/adr-and-review.md` for step 5 (the ADR template), step 6 (fitness checks), questions for reviewing a design, and common failure shapes.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# ADRs, fitness checks and design review
|
|
2
|
+
|
|
3
|
+
Companion to `../SKILL.md` for the `architecture` skill.
|
|
4
|
+
|
|
5
|
+
## Step 5: Record it as an ADR
|
|
6
|
+
|
|
7
|
+
Store ADRs next to the code (`docs/adr/NNNN-short-title.md`), numbered, never
|
|
8
|
+
rewritten. A reversed decision gets a new ADR that supersedes the old one.
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
# NNNN. Short imperative title
|
|
12
|
+
|
|
13
|
+
Status: proposed | accepted | superseded by NNNN
|
|
14
|
+
Date: YYYY-MM-DD
|
|
15
|
+
Deciders: names or roles
|
|
16
|
+
|
|
17
|
+
## Situation
|
|
18
|
+
What changed, and the forces from Step 1 that bind (drivers with numbers,
|
|
19
|
+
constraints, risky assumptions).
|
|
20
|
+
|
|
21
|
+
## Options considered
|
|
22
|
+
One paragraph per option, including "do the least".
|
|
23
|
+
|
|
24
|
+
## Decision
|
|
25
|
+
The chosen option in one sentence, then the deciding driver.
|
|
26
|
+
|
|
27
|
+
## Consequences
|
|
28
|
+
What becomes easier, what becomes harder, what new work this creates,
|
|
29
|
+
and which assumption would make us revisit it.
|
|
30
|
+
|
|
31
|
+
## Checks
|
|
32
|
+
How we will know the decision still holds (see fitness checks).
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Keep an ADR short enough to read in five minutes. Link to benchmarks and
|
|
36
|
+
spikes rather than pasting them.
|
|
37
|
+
|
|
38
|
+
## Step 6: Add fitness checks
|
|
39
|
+
|
|
40
|
+
A decision that nothing enforces decays. For each deciding driver, add an
|
|
41
|
+
automated or scheduled check that fails when the decision stops being true:
|
|
42
|
+
|
|
43
|
+
- **Dependency rules.** A test or lint rule that fails when the `orders` module
|
|
44
|
+
imports from `billing` internals, or when a layer skips another.
|
|
45
|
+
- **Performance budgets.** A load test in CI or a production SLO alert tied to
|
|
46
|
+
the latency number in the ADR.
|
|
47
|
+
- **Contract tests.** Consumer-driven tests that pin the public API shape.
|
|
48
|
+
- **Cost alerts.** A budget alarm at the ceiling the ADR assumed.
|
|
49
|
+
- **Review date.** For decisions resting on an unverified assumption, a dated
|
|
50
|
+
reminder to check it.
|
|
51
|
+
|
|
52
|
+
## Reviewing someone else's design
|
|
53
|
+
|
|
54
|
+
Work through the same steps in order and ask for whatever is missing:
|
|
55
|
+
|
|
56
|
+
1. Are the drivers measurable, and are there five or fewer?
|
|
57
|
+
2. Was "do the least" considered and beaten on evidence?
|
|
58
|
+
3. Does each claim in the comparison cite a measurement, a spike or a documented
|
|
59
|
+
limit, or is it opinion?
|
|
60
|
+
4. Is the one-way-door part identified, and is there a mitigation?
|
|
61
|
+
5. What fails first under ten times the load, and who notices?
|
|
62
|
+
6. What is the rollback plan on day one?
|
|
63
|
+
|
|
64
|
+
## Common failure shapes
|
|
65
|
+
|
|
66
|
+
- **Resume-driven design.** The option is interesting rather than needed. The
|
|
67
|
+
"do the least" row usually exposes it.
|
|
68
|
+
- **Premature distribution.** Splitting into services before the module
|
|
69
|
+
boundaries are proven inside one deployable. Prove the seam in-process first.
|
|
70
|
+
- **Hidden shared database.** Two services that write the same tables are one
|
|
71
|
+
service with two deploy pipelines.
|
|
72
|
+
- **Undocumented driver.** The decision was right, but nobody wrote down why, so
|
|
73
|
+
the next team reverses it when the context is gone.
|
|
74
|
+
- **Architecture by accretion.** No single decision was wrong, but nobody ever
|
|
75
|
+
recorded the cumulative shape. A periodic diagram-plus-ADR-index review
|
|
76
|
+
catches this.
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: authentication
|
|
3
3
|
description: "Implement iOS authentication flows with AuthenticationServices and LocalAuthentication. Use when building Sign in with Apple, passkey/WebAuthn registration or sign-in with ASAuthorizationPlatformPublicKeyCredentialProvider, ASAuthorizationController credential state and revocation handling, ASWebAuthenticationSession OAuth or third-party login, Password AutoFill, identity-token server validation, or local biometric re-authentication with LAContext."
|
|
4
|
+
metadata:
|
|
5
|
+
source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# Authentication
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: avkit
|
|
3
3
|
description: "Create media playback experiences using AVKit. Use when adding video players with AVPlayerViewController, enabling Picture-in-Picture, routing media with AirPlay, using SwiftUI VideoPlayer views, configuring transport controls, displaying subtitles and closed captions, or integrating AVFoundation playback with system UI."
|
|
4
|
+
metadata:
|
|
5
|
+
source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# AVKit
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: background-processing
|
|
3
3
|
description: "Schedule and execute background work on iOS using BGTaskScheduler. Use when registering BGAppRefreshTask for short background fetches, BGProcessingTask for long-running maintenance, BGContinuedProcessingTask (iOS 26+) for foreground-started work that continues in background, background URLSession downloads, or background push notifications. Covers Info.plist configuration, expiration handling, task completion, and debugging with simulated launches."
|
|
4
|
+
metadata:
|
|
5
|
+
source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
|
|
4
6
|
---
|
|
5
|
-
|
|
6
7
|
# Background Processing
|
|
7
8
|
|
|
8
9
|
Register, schedule, and execute background work on iOS using the BackgroundTasks
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: backlog
|
|
3
|
-
|
|
4
|
-
description: "The engineering backlog registry for deferred-but-approved work in this codebase. Every job the user defers ('defer it', 'add it to the list', 'later', 'not now') lands HERE with its full spec, origin, and unblock condition, so deferral never means loss. Load when the user defers work, asks 'what's on the backlog / the list', says 'work the backlog' / 'pick up <item>', or when completing an item. The bundled BACKLOG.md is the registry; entries move deferred -> ready -> in-progress -> done, and the registry is re-audited against live code - a rotted entry deletes, a done record retires once what it taught is re-homed in the skill that owns it. This records WHAT IS OWED; git history records what happened."
|
|
3
|
+
description: "The engineering backlog registry for deferred-but-approved work: each deferred job lands here with its spec, origin and unblock condition. Use when the user says 'defer it', 'add it to the list', 'later' or 'not now', asks what is on the backlog, says 'pick up {id}', or completes an item. BACKLOG.md is the registry; entries move deferred, ready, in-progress, done, and a re-audit deletes rotted ones."
|
|
5
4
|
user-invocable: true
|
|
6
5
|
argument-hint: [list | add | pick <id> | done <id> | re-audit]
|
|
7
6
|
allowed-tools: Read, Grep, Glob, Edit, Write
|
|
7
|
+
metadata:
|
|
8
|
+
version: 1.0.0
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# backlog - deferred work, kept whole
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: callkit-voip
|
|
3
3
|
description: "Implement VoIP calling with CallKit and PushKit. Use when building incoming/outgoing call flows, registering for VoIP push notifications, configuring CXProvider and CXCallController, handling call actions, coordinating audio sessions, or creating Call Directory extensions for caller ID and call blocking."
|
|
4
|
+
metadata:
|
|
5
|
+
source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# CallKit
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ci-cd-pipelines
|
|
3
3
|
description: "CI/CD pipelines: GitHub Actions workflows, Docker multi-stage builds, environment management, secret management, deployment strategies. Use when setting up or fixing a build, test or deploy pipeline."
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
metadata:
|
|
5
|
+
tags: [ci-cd, github-actions, docker, deployment, devops, backend]
|
|
6
|
+
version: "2025.1"
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
# CI/CD Pipelines
|
|
@@ -1,94 +1,196 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: clean-code
|
|
3
|
-
description: "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: "Readability checks for code in any language: names, function focus, control flow, side effects, errors, comments, duplication. Use when writing, refactoring or reviewing code for quality and naming."
|
|
4
|
+
metadata:
|
|
5
|
+
risk: safe
|
|
6
|
+
source: multi-agent-pipeline
|
|
7
|
+
date_added: "2026-09-24"
|
|
7
8
|
---
|
|
8
9
|
|
|
9
|
-
# Clean Code
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
##
|
|
78
|
-
|
|
79
|
-
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
10
|
+
# Clean Code
|
|
11
|
+
|
|
12
|
+
Code is read far more often than it is written, and every later change starts
|
|
13
|
+
with someone working out what the current code does. This skill is a set of
|
|
14
|
+
questions to ask of a piece of code, in the order that finds the expensive
|
|
15
|
+
problems first, plus the move that fixes each one.
|
|
16
|
+
|
|
17
|
+
The repository's own conventions win. A linter rule, a module guide or a coding
|
|
18
|
+
standard registry that says otherwise overrides anything here; this skill fills
|
|
19
|
+
the gaps they leave.
|
|
20
|
+
|
|
21
|
+
## Order of questions
|
|
22
|
+
|
|
23
|
+
Work from the outside in. A clear name on a muddled body is cheaper to fix than
|
|
24
|
+
a tidy body behind a misleading name, because callers only ever see the name.
|
|
25
|
+
|
|
26
|
+
1. Does each name tell a caller what they get, without opening the body?
|
|
27
|
+
2. Does each unit do one job at one level of detail?
|
|
28
|
+
3. Can the control flow be followed top to bottom without holding state in mind?
|
|
29
|
+
4. Is every change to state visible at the call site?
|
|
30
|
+
5. Does every failure reach someone who can act on it?
|
|
31
|
+
6. Does each comment say something the code cannot?
|
|
32
|
+
7. Is each rule written down in exactly one place?
|
|
33
|
+
8. Would a test fail if the behaviour broke?
|
|
34
|
+
|
|
35
|
+
## 1. Names
|
|
36
|
+
|
|
37
|
+
- Name by role in this domain, not by type or storage: `overdueInvoices`, not
|
|
38
|
+
`invoiceList` or `data2`.
|
|
39
|
+
- A boolean reads as a claim: `isExpired`, `hasShippingAddress`, `canRetry`.
|
|
40
|
+
- A function that returns something is named for what it returns
|
|
41
|
+
(`remainingBalance()`); one that acts is named for the action (`cancelOrder()`).
|
|
42
|
+
- Units belong in the name when the type does not carry them: `timeoutSeconds`,
|
|
43
|
+
`distanceKm`.
|
|
44
|
+
- One word per concept across the codebase. If `fetch`, `load` and `get` all mean
|
|
45
|
+
"read from the network", pick one.
|
|
46
|
+
- Length follows scope: `i` is fine in a three-line loop; a module-level value
|
|
47
|
+
needs a full phrase.
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
# Before
|
|
51
|
+
def calc(d, f):
|
|
52
|
+
return d * (1 - f)
|
|
53
|
+
|
|
54
|
+
# After
|
|
55
|
+
def discounted_price(list_price: Decimal, discount_rate: Decimal) -> Decimal:
|
|
56
|
+
return list_price * (1 - discount_rate)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 2. Units of work
|
|
60
|
+
|
|
61
|
+
- One job per function. The test: describe it in one sentence without "and" or
|
|
62
|
+
"then". If you cannot, split at the conjunction.
|
|
63
|
+
- One level of detail per function. A function that validates an order should
|
|
64
|
+
not also format a currency string; call a function that does.
|
|
65
|
+
- Few parameters. Three or more, or any boolean flag that switches behaviour,
|
|
66
|
+
usually means a missing type or two functions sharing a name.
|
|
67
|
+
- A body longer than a screen is a prompt to look for the seams, not a rule.
|
|
68
|
+
|
|
69
|
+
```swift
|
|
70
|
+
// Before: the flag hides two behaviours
|
|
71
|
+
func export(_ report: Report, asPDF: Bool) -> Data
|
|
72
|
+
|
|
73
|
+
// After: two names, no flag
|
|
74
|
+
func exportPDF(_ report: Report) -> Data
|
|
75
|
+
func exportCSV(_ report: Report) -> Data
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 3. Control flow
|
|
79
|
+
|
|
80
|
+
- Handle the exits first. Guard clauses at the top keep the main path at one
|
|
81
|
+
indentation level.
|
|
82
|
+
- Replace a chain of `if`/`else if` on the same value with a `switch`/`match`
|
|
83
|
+
that the compiler can check for completeness.
|
|
84
|
+
- Name a compound condition: `let isEligible = age >= 18 && hasConsent` reads
|
|
85
|
+
better than the raw expression inside an `if`.
|
|
86
|
+
- Nesting past two levels almost always hides a function waiting to be extracted.
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
// Before
|
|
90
|
+
function shippingCost(order: Order): number {
|
|
91
|
+
if (order.items.length > 0) {
|
|
92
|
+
if (!order.isDigital) {
|
|
93
|
+
return order.weightKg * RATE_PER_KG;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// After
|
|
100
|
+
function shippingCost(order: Order): number {
|
|
101
|
+
if (order.items.length === 0 || order.isDigital) return 0;
|
|
102
|
+
return order.weightKg * RATE_PER_KG;
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 4. State and side effects
|
|
107
|
+
|
|
108
|
+
- A function either answers a question or changes something. When one does both,
|
|
109
|
+
a caller who only wanted the answer triggers the change.
|
|
110
|
+
- Pass what a function needs; do not let it reach into globals, singletons or
|
|
111
|
+
the clock. Inject the dependency so a test can replace it.
|
|
112
|
+
- Prefer values that cannot change once built. Mutation belongs in a small,
|
|
113
|
+
named place.
|
|
114
|
+
- Keep a variable's scope as small as its use.
|
|
115
|
+
|
|
116
|
+
## 5. Errors and edge values
|
|
117
|
+
|
|
118
|
+
- Fail where the problem is detected, with a message that names the input and
|
|
119
|
+
the expectation.
|
|
120
|
+
- Do not swallow an error to keep going. Catch it only where something useful
|
|
121
|
+
can be done: retry, fall back, or report to the user.
|
|
122
|
+
- Represent "no value" in the type (`Optional`, `Result`, a sealed type) instead
|
|
123
|
+
of returning a sentinel such as `-1`, an empty string or `null` by convention.
|
|
124
|
+
- Check the boundaries every time: empty input, one element, the maximum, and
|
|
125
|
+
values that are present but invalid.
|
|
126
|
+
|
|
127
|
+
```kotlin
|
|
128
|
+
// Before: the caller cannot tell "not found" from "zero"
|
|
129
|
+
fun itemCount(orderId: String): Int = repository.find(orderId)?.items ?: 0
|
|
130
|
+
|
|
131
|
+
// After
|
|
132
|
+
fun itemCount(orderId: String): Int? = repository.find(orderId)?.items
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 6. Comments
|
|
136
|
+
|
|
137
|
+
- Write down why, never what. The code already says what it does; a comment that
|
|
138
|
+
repeats it goes stale the first time the code changes.
|
|
139
|
+
- A comment that explains a confusing block is a request to rename or extract
|
|
140
|
+
until the comment is unnecessary.
|
|
141
|
+
- Keep: the reason behind a non-obvious choice, a link to the spec or bug a
|
|
142
|
+
workaround exists for, the legal header a file must carry, and public API docs.
|
|
143
|
+
- Delete: commented-out code (version control keeps it), change logs inside the
|
|
144
|
+
file, and section banners that restate the structure.
|
|
145
|
+
|
|
146
|
+
## 7. Duplication and abstraction
|
|
147
|
+
|
|
148
|
+
- A business rule written in two places will eventually disagree with itself.
|
|
149
|
+
Give it one home and call it.
|
|
150
|
+
- Two blocks that look alike but change for different reasons are not
|
|
151
|
+
duplication; merging them couples unrelated features.
|
|
152
|
+
- Wait for the third occurrence before extracting a general helper, unless the
|
|
153
|
+
repeated thing is a rule rather than a shape.
|
|
154
|
+
- An abstraction earns its place when it removes decisions from callers. One that
|
|
155
|
+
only forwards arguments adds a hop and a name to learn.
|
|
156
|
+
|
|
157
|
+
## 8. Tests as the specification
|
|
158
|
+
|
|
159
|
+
- Each test states one behaviour in its name: `refundIsRejectedAfterShipment`.
|
|
160
|
+
- Arrange, act, assert, with the act step a single call.
|
|
161
|
+
- A test that cannot fail when the behaviour breaks is worse than none, because
|
|
162
|
+
it reports coverage that does not exist.
|
|
163
|
+
- Fast, isolated and repeatable: no network, no shared state between tests, no
|
|
164
|
+
dependence on the clock or execution order.
|
|
165
|
+
|
|
166
|
+
## Problem to move
|
|
167
|
+
|
|
168
|
+
| Problem you see | Move |
|
|
169
|
+
|---|---|
|
|
170
|
+
| A name needs a comment to explain it | Rename |
|
|
171
|
+
| A block has a comment heading it | Extract a function named after the comment |
|
|
172
|
+
| A boolean parameter | Split into two functions, or pass an enum |
|
|
173
|
+
| Three or more related parameters | Introduce a parameter type |
|
|
174
|
+
| Deep nesting | Guard clauses, then extract the inner block |
|
|
175
|
+
| A `switch` on type repeated in several places | Move the behaviour onto the types |
|
|
176
|
+
| A literal with meaning (`86400`, `0.2`) | Named constant or configuration |
|
|
177
|
+
| The same rule in two places | Extract once, call from both |
|
|
178
|
+
| A function that reads and writes | Separate the query from the command |
|
|
179
|
+
| A hard-coded dependency | Inject it |
|
|
180
|
+
|
|
181
|
+
Refactor in small steps with the tests green between each, and keep a
|
|
182
|
+
behaviour change out of a refactoring commit.
|
|
183
|
+
|
|
184
|
+
## Reporting in a review
|
|
185
|
+
|
|
186
|
+
For each finding give the location, what the problem is, why it costs the next
|
|
187
|
+
reader or maintainer, and the concrete change. Rank by cost: a misleading name
|
|
188
|
+
or a swallowed error outranks a long function, which outranks a style nit.
|
|
189
|
+
Leave formatting to the formatter and say nothing about it.
|
|
190
|
+
|
|
191
|
+
## Out of scope
|
|
192
|
+
|
|
193
|
+
- Security weaknesses: use `security-review`.
|
|
194
|
+
- Speed and memory: profile first, then use the stack's performance skill.
|
|
195
|
+
- Module boundaries and system design: use `architecture`.
|
|
196
|
+
- Language style rules a linter enforces: follow the linter.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cloudkit-sync
|
|
3
3
|
description: "Implement, review, or improve CloudKit and iCloud sync in iOS/macOS apps. Use when working with CKContainer, CKRecord, CKQuery, CKSubscription, CKSyncEngine, CKShare, NSUbiquitousKeyValueStore, or iCloud Drive file coordination; when syncing SwiftData models via ModelConfiguration with cloudKitDatabase; when handling CKError codes for conflict resolution, network failures, or quota limits; or when checking iCloud account status before performing sync operations."
|
|
4
|
+
metadata:
|
|
5
|
+
source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
|
|
4
6
|
---
|
|
5
|
-
|
|
6
7
|
# CloudKit
|
|
7
8
|
|
|
8
9
|
Sync data across devices using CloudKit, iCloud key-value storage, and iCloud
|