@mmerterden/multi-agent-pipeline 20.2.1 → 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 +912 -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 -35
- 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 +79 -8
- 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 -65
- 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,334 +1,192 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-actions-templates
|
|
3
|
-
description: "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: "Authoring GitHub Actions workflows: triggers, matrices, caching, concurrency, least-privilege permissions, SHA pinning, OIDC, reusable workflows, composite actions, Xcode runners. Use when writing or hardening a workflow file."
|
|
4
|
+
metadata:
|
|
5
|
+
risk: safe
|
|
6
|
+
source: multi-agent-pipeline
|
|
7
|
+
date_added: "2026-09-25"
|
|
8
|
+
not-for: ci-cd-pipelines
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
# GitHub Actions
|
|
11
|
+
# GitHub Actions Authoring
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
This skill covers the YAML itself: how a workflow is triggered, how jobs are
|
|
14
|
+
wired, and how it is kept fast and safe. Deciding what a delivery pipeline
|
|
15
|
+
should contain (stages, promotion, rollback) is `ci-cd-pipelines`; building the
|
|
16
|
+
container image is `docker-expert`.
|
|
12
17
|
|
|
13
|
-
##
|
|
18
|
+
## Workflow skeleton
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
- You need a different domain or tool outside this scope
|
|
17
|
-
|
|
18
|
-
## Instructions
|
|
19
|
-
|
|
20
|
-
- Clarify goals, constraints, and required inputs.
|
|
21
|
-
- Apply relevant best practices and validate outcomes.
|
|
22
|
-
- Provide actionable steps and verification.
|
|
23
|
-
|
|
24
|
-
## Purpose
|
|
25
|
-
|
|
26
|
-
Create efficient, secure GitHub Actions workflows for continuous integration and deployment across various tech stacks.
|
|
27
|
-
|
|
28
|
-
## Use this skill when
|
|
29
|
-
|
|
30
|
-
- Automate testing and deployment
|
|
31
|
-
- Build Docker images and push to registries
|
|
32
|
-
- Deploy to Kubernetes clusters
|
|
33
|
-
- Run security scans
|
|
34
|
-
- Implement matrix builds for multiple environments
|
|
35
|
-
|
|
36
|
-
## Common Workflow Patterns
|
|
37
|
-
|
|
38
|
-
### Pattern 1: Test Workflow
|
|
20
|
+
Start every workflow from the same frame and add to it:
|
|
39
21
|
|
|
40
22
|
```yaml
|
|
41
|
-
name:
|
|
23
|
+
name: products-api
|
|
42
24
|
|
|
43
25
|
on:
|
|
44
|
-
push:
|
|
45
|
-
branches: [ main, develop ]
|
|
46
26
|
pull_request:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
jobs:
|
|
50
|
-
test:
|
|
51
|
-
runs-on: ubuntu-latest
|
|
52
|
-
|
|
53
|
-
strategy:
|
|
54
|
-
matrix:
|
|
55
|
-
node-version: [18.x, 20.x]
|
|
56
|
-
|
|
57
|
-
steps:
|
|
58
|
-
- uses: actions/checkout@v4
|
|
59
|
-
|
|
60
|
-
- name: Use Node.js ${{ matrix.node-version }}
|
|
61
|
-
uses: actions/setup-node@v4
|
|
62
|
-
with:
|
|
63
|
-
node-version: ${{ matrix.node-version }}
|
|
64
|
-
cache: 'npm'
|
|
65
|
-
|
|
66
|
-
- name: Install dependencies
|
|
67
|
-
run: npm ci
|
|
68
|
-
|
|
69
|
-
- name: Run linter
|
|
70
|
-
run: npm run lint
|
|
71
|
-
|
|
72
|
-
- name: Run tests
|
|
73
|
-
run: npm test
|
|
74
|
-
|
|
75
|
-
- name: Upload coverage
|
|
76
|
-
uses: codecov/codecov-action@v3
|
|
77
|
-
with:
|
|
78
|
-
files: ./coverage/lcov.info
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Pattern 2: Build and Push Docker Image
|
|
82
|
-
|
|
83
|
-
```yaml
|
|
84
|
-
name: Build and Push
|
|
85
|
-
|
|
86
|
-
on:
|
|
27
|
+
paths: ["services/products/**", ".github/workflows/products-api.yml"]
|
|
87
28
|
push:
|
|
88
|
-
branches: [
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
env:
|
|
92
|
-
REGISTRY: ghcr.io
|
|
93
|
-
IMAGE_NAME: ${{ github.repository }}
|
|
29
|
+
branches: [main]
|
|
30
|
+
workflow_dispatch:
|
|
94
31
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
runs-on: ubuntu-latest
|
|
98
|
-
permissions:
|
|
99
|
-
contents: read
|
|
100
|
-
packages: write
|
|
32
|
+
permissions:
|
|
33
|
+
contents: read
|
|
101
34
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
- name: Log in to Container Registry
|
|
106
|
-
uses: docker/login-action@v3
|
|
107
|
-
with:
|
|
108
|
-
registry: ${{ env.REGISTRY }}
|
|
109
|
-
username: ${{ github.actor }}
|
|
110
|
-
password: ${{ secrets.GITHUB_TOKEN }}
|
|
111
|
-
|
|
112
|
-
- name: Extract metadata
|
|
113
|
-
id: meta
|
|
114
|
-
uses: docker/metadata-action@v5
|
|
115
|
-
with:
|
|
116
|
-
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
117
|
-
tags: |
|
|
118
|
-
type=ref,event=branch
|
|
119
|
-
type=ref,event=pr
|
|
120
|
-
type=semver,pattern={{version}}
|
|
121
|
-
type=semver,pattern={{major}}.{{minor}}
|
|
122
|
-
|
|
123
|
-
- name: Build and push
|
|
124
|
-
uses: docker/build-push-action@v5
|
|
125
|
-
with:
|
|
126
|
-
context: .
|
|
127
|
-
push: true
|
|
128
|
-
tags: ${{ steps.meta.outputs.tags }}
|
|
129
|
-
labels: ${{ steps.meta.outputs.labels }}
|
|
130
|
-
cache-from: type=gha
|
|
131
|
-
cache-to: type=gha,mode=max
|
|
132
|
-
```
|
|
35
|
+
concurrency:
|
|
36
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
37
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
133
38
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
on:
|
|
140
|
-
push:
|
|
141
|
-
branches: [ main ]
|
|
39
|
+
defaults:
|
|
40
|
+
run:
|
|
41
|
+
shell: bash
|
|
42
|
+
working-directory: services/products
|
|
142
43
|
|
|
143
44
|
jobs:
|
|
144
|
-
|
|
145
|
-
runs-on: ubuntu-
|
|
146
|
-
|
|
45
|
+
test:
|
|
46
|
+
runs-on: ubuntu-24.04
|
|
47
|
+
timeout-minutes: 15
|
|
147
48
|
steps:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
uses:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
run: |
|
|
159
|
-
aws eks update-kubeconfig --name production-cluster --region us-west-2
|
|
160
|
-
|
|
161
|
-
- name: Deploy to Kubernetes
|
|
162
|
-
run: |
|
|
163
|
-
kubectl apply -f k8s/
|
|
164
|
-
kubectl rollout status deployment/my-app -n production
|
|
165
|
-
kubectl get services -n production
|
|
166
|
-
|
|
167
|
-
- name: Verify deployment
|
|
168
|
-
run: |
|
|
169
|
-
kubectl get pods -n production
|
|
170
|
-
kubectl describe deployment my-app -n production
|
|
49
|
+
- uses: actions/checkout@<full-40-char-sha> # v4.2.2
|
|
50
|
+
with:
|
|
51
|
+
persist-credentials: false
|
|
52
|
+
- uses: actions/setup-node@<full-40-char-sha> # v4.1.0
|
|
53
|
+
with:
|
|
54
|
+
node-version-file: services/products/.nvmrc
|
|
55
|
+
cache: npm
|
|
56
|
+
cache-dependency-path: services/products/package-lock.json
|
|
57
|
+
- run: npm ci
|
|
58
|
+
- run: npm test
|
|
171
59
|
```
|
|
172
60
|
|
|
173
|
-
|
|
61
|
+
Why each piece is there:
|
|
62
|
+
|
|
63
|
+
- `permissions: contents: read` at the top makes the token read-only; jobs that
|
|
64
|
+
need more ask for it themselves.
|
|
65
|
+
- `concurrency` cancels superseded PR runs but lets every push to `main` finish.
|
|
66
|
+
- `timeout-minutes` stops a hung job before it burns the default six hours.
|
|
67
|
+
- `paths` keeps unrelated changes from running this workflow. A required status
|
|
68
|
+
check on a path-filtered workflow blocks PRs that never trigger it; gate on
|
|
69
|
+
an always-running summary job instead.
|
|
70
|
+
|
|
71
|
+
## Security rules
|
|
72
|
+
|
|
73
|
+
1. **Pin third-party actions to a full commit SHA** and keep the tag in a
|
|
74
|
+
comment. Tags are mutable. Dependabot (`package-ecosystem: github-actions`)
|
|
75
|
+
updates SHA pins.
|
|
76
|
+
2. **Grant permissions per job.** Typical needs:
|
|
77
|
+
|
|
78
|
+
| Job does | Needs |
|
|
79
|
+
|----------|-------|
|
|
80
|
+
| comment on a PR | `pull-requests: write` |
|
|
81
|
+
| push a tag or release | `contents: write` |
|
|
82
|
+
| publish to GHCR | `packages: write` |
|
|
83
|
+
| OIDC to a cloud | `id-token: write` |
|
|
84
|
+
| attestations | `id-token: write`, `attestations: write` |
|
|
85
|
+
|
|
86
|
+
3. **Never interpolate untrusted input into `run:`.** A PR title or branch name
|
|
87
|
+
can contain shell. Pass it through `env:` and quote it:
|
|
88
|
+
|
|
89
|
+
```yaml
|
|
90
|
+
- env:
|
|
91
|
+
TITLE: ${{ github.event.pull_request.title }}
|
|
92
|
+
run: echo "Checking: $TITLE"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
4. **`pull_request_target` runs with secrets on fork PRs.** Do not check out
|
|
96
|
+
and execute the PR head under it. Use `pull_request` for untrusted code and
|
|
97
|
+
a separate `workflow_run` job for privileged follow-ups.
|
|
98
|
+
5. **Prefer OIDC to long-lived cloud keys.** The runner exchanges a short-lived
|
|
99
|
+
token scoped to repo, branch or environment.
|
|
100
|
+
|
|
101
|
+
```yaml
|
|
102
|
+
deploy:
|
|
103
|
+
permissions:
|
|
104
|
+
id-token: write
|
|
105
|
+
contents: read
|
|
106
|
+
environment: production
|
|
107
|
+
steps:
|
|
108
|
+
- uses: aws-actions/configure-aws-credentials@<sha> # v4
|
|
109
|
+
with:
|
|
110
|
+
role-to-assume: arn:aws:iam::123456789012:role/products-deploy
|
|
111
|
+
aws-region: eu-central-1
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The cloud trust policy should match the `sub` claim, for example
|
|
115
|
+
`repo:acme/shop:environment:production`, not just the repository.
|
|
116
|
+
6. **Keep secrets in environments** when only the deploy job needs them, so
|
|
117
|
+
test jobs cannot read them.
|
|
118
|
+
|
|
119
|
+
## Matrices
|
|
174
120
|
|
|
175
121
|
```yaml
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
os:
|
|
187
|
-
python-version: ['3.9', '3.10', '3.11', '3.12']
|
|
188
|
-
|
|
189
|
-
steps:
|
|
190
|
-
- uses: actions/checkout@v4
|
|
191
|
-
|
|
192
|
-
- name: Set up Python
|
|
193
|
-
uses: actions/setup-python@v5
|
|
194
|
-
with:
|
|
195
|
-
python-version: ${{ matrix.python-version }}
|
|
196
|
-
|
|
197
|
-
- name: Install dependencies
|
|
198
|
-
run: |
|
|
199
|
-
python -m pip install --upgrade pip
|
|
200
|
-
pip install -r requirements.txt
|
|
201
|
-
|
|
202
|
-
- name: Run tests
|
|
203
|
-
run: pytest
|
|
122
|
+
strategy:
|
|
123
|
+
fail-fast: false
|
|
124
|
+
matrix:
|
|
125
|
+
node: [20, 22]
|
|
126
|
+
os: [ubuntu-24.04]
|
|
127
|
+
include:
|
|
128
|
+
- node: 22
|
|
129
|
+
os: macos-15
|
|
130
|
+
exclude:
|
|
131
|
+
- node: 20
|
|
132
|
+
os: macos-15
|
|
204
133
|
```
|
|
205
134
|
|
|
206
|
-
|
|
135
|
+
- `fail-fast: false` shows every failing combination instead of the first.
|
|
136
|
+
- `max-parallel` protects shared resources such as a test database.
|
|
137
|
+
- A dynamic matrix comes from a previous job's output with `fromJSON(...)`,
|
|
138
|
+
useful for "test only the packages that changed" in a monorepo.
|
|
207
139
|
|
|
208
|
-
|
|
209
|
-
2. **Cache dependencies** to speed up builds
|
|
210
|
-
3. **Use secrets** for sensitive data
|
|
211
|
-
4. **Implement status checks** on PRs
|
|
212
|
-
5. **Use matrix builds** for multi-version testing
|
|
213
|
-
6. **Set appropriate permissions**
|
|
214
|
-
7. **Use reusable workflows** for common patterns
|
|
215
|
-
8. **Implement approval gates** for production
|
|
216
|
-
9. **Add notification steps** for failures
|
|
217
|
-
10. **Use self-hosted runners** for sensitive workloads
|
|
140
|
+
## Caching
|
|
218
141
|
|
|
219
|
-
|
|
142
|
+
- Use the setup action's built-in `cache:` first (npm, pnpm, yarn, pip, poetry,
|
|
143
|
+
gradle, maven, go).
|
|
144
|
+
- Otherwise `actions/cache` with a key that hashes the lockfile and a
|
|
145
|
+
`restore-keys` prefix for partial hits.
|
|
146
|
+
- Caches are scoped per branch with fallback to the default branch; a PR can
|
|
147
|
+
read `main`'s cache but not write to it.
|
|
148
|
+
- Docker layers: `docker/build-push-action` with `cache-from: type=gha` and
|
|
149
|
+
`cache-to: type=gha,mode=max`.
|
|
220
150
|
|
|
221
|
-
|
|
222
|
-
# .github/workflows/reusable-test.yml
|
|
223
|
-
name: Reusable Test Workflow
|
|
151
|
+
## Environments and approvals
|
|
224
152
|
|
|
225
|
-
on:
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
required: true
|
|
230
|
-
type: string
|
|
231
|
-
secrets:
|
|
232
|
-
NPM_TOKEN:
|
|
233
|
-
required: true
|
|
153
|
+
An `environment:` on a job applies its protection rules: required reviewers,
|
|
154
|
+
wait timer, allowed branches, and environment-scoped secrets and variables.
|
|
155
|
+
Model staging and production as separate environments and let the production
|
|
156
|
+
job `needs:` the staging one.
|
|
234
157
|
|
|
235
|
-
|
|
236
|
-
test:
|
|
237
|
-
runs-on: ubuntu-latest
|
|
238
|
-
steps:
|
|
239
|
-
- uses: actions/checkout@v4
|
|
240
|
-
- uses: actions/setup-node@v4
|
|
241
|
-
with:
|
|
242
|
-
node-version: ${{ inputs.node-version }}
|
|
243
|
-
- run: npm ci
|
|
244
|
-
- run: npm test
|
|
245
|
-
```
|
|
158
|
+
## Provenance
|
|
246
159
|
|
|
247
|
-
**Use reusable workflow:**
|
|
248
160
|
```yaml
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
161
|
+
permissions:
|
|
162
|
+
id-token: write
|
|
163
|
+
attestations: write
|
|
164
|
+
contents: read
|
|
165
|
+
steps:
|
|
166
|
+
- uses: actions/attest-build-provenance@<sha>
|
|
252
167
|
with:
|
|
253
|
-
|
|
254
|
-
secrets:
|
|
255
|
-
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
168
|
+
subject-path: dist/products-api.tar.gz
|
|
256
169
|
```
|
|
257
170
|
|
|
258
|
-
|
|
171
|
+
Consumers verify with `gh attestation verify <file> --repo acme/shop`.
|
|
259
172
|
|
|
260
|
-
|
|
261
|
-
name: Security Scan
|
|
173
|
+
## Debugging a workflow
|
|
262
174
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
175
|
+
- Re-run with debug logging (`ACTIONS_STEP_DEBUG` secret or the re-run option).
|
|
176
|
+
- Lint locally with `actionlint`; it catches expression and shell errors.
|
|
177
|
+
- `act` runs many workflows locally, but not macOS jobs or OIDC.
|
|
178
|
+
- Expressions in `if:` without `${{ }}` are evaluated anyway; a string that
|
|
179
|
+
starts with `!` must be wrapped in `${{ }}`.
|
|
268
180
|
|
|
269
|
-
|
|
270
|
-
security:
|
|
271
|
-
runs-on: ubuntu-latest
|
|
181
|
+
## Review checklist
|
|
272
182
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
scan-type: 'fs'
|
|
280
|
-
scan-ref: '.'
|
|
281
|
-
format: 'sarif'
|
|
282
|
-
output: 'trivy-results.sarif'
|
|
283
|
-
|
|
284
|
-
- name: Upload Trivy results to GitHub Security
|
|
285
|
-
uses: github/codeql-action/upload-sarif@v2
|
|
286
|
-
with:
|
|
287
|
-
sarif_file: 'trivy-results.sarif'
|
|
288
|
-
|
|
289
|
-
- name: Run Snyk Security Scan
|
|
290
|
-
uses: snyk/actions/node@master
|
|
291
|
-
env:
|
|
292
|
-
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
## Deployment with Approvals
|
|
296
|
-
|
|
297
|
-
```yaml
|
|
298
|
-
name: Deploy to Production
|
|
299
|
-
|
|
300
|
-
on:
|
|
301
|
-
push:
|
|
302
|
-
tags: [ 'v*' ]
|
|
303
|
-
|
|
304
|
-
jobs:
|
|
305
|
-
deploy:
|
|
306
|
-
runs-on: ubuntu-latest
|
|
307
|
-
environment:
|
|
308
|
-
name: production
|
|
309
|
-
url: https://app.example.com
|
|
310
|
-
|
|
311
|
-
steps:
|
|
312
|
-
- uses: actions/checkout@v4
|
|
313
|
-
|
|
314
|
-
- name: Deploy application
|
|
315
|
-
run: |
|
|
316
|
-
echo "Deploying to production..."
|
|
317
|
-
# Deployment commands here
|
|
318
|
-
|
|
319
|
-
- name: Notify Slack
|
|
320
|
-
if: success()
|
|
321
|
-
uses: slackapi/slack-github-action@v1
|
|
322
|
-
with:
|
|
323
|
-
webhook-url: ${{ secrets.SLACK_WEBHOOK }}
|
|
324
|
-
payload: |
|
|
325
|
-
{
|
|
326
|
-
"text": "Deployment to production completed successfully!"
|
|
327
|
-
}
|
|
328
|
-
```
|
|
183
|
+
- Top-level `permissions` is read-only; every write scope is job-level and used.
|
|
184
|
+
- Every non-GitHub action is SHA-pinned.
|
|
185
|
+
- No `${{ github.event.* }}` inside a `run:` script body.
|
|
186
|
+
- Each job has `timeout-minutes`; PR runs cancel on new pushes.
|
|
187
|
+
- Cloud access goes through OIDC with a subject-restricted trust policy.
|
|
188
|
+
- Deploy jobs use an environment with reviewers.
|
|
329
189
|
|
|
330
|
-
##
|
|
190
|
+
## References
|
|
331
191
|
|
|
332
|
-
- `
|
|
333
|
-
- `deployment-pipeline-design` - For pipeline architecture
|
|
334
|
-
- `secrets-management` - For secrets handling
|
|
192
|
+
- `references/patterns.md`: reusable workflows versus composite actions, passing outputs and artifacts between jobs, and Xcode builds on macOS runners. Load it when the task reaches those topics.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# GitHub Actions patterns
|
|
2
|
+
|
|
3
|
+
Loaded on demand from `../SKILL.md`.
|
|
4
|
+
|
|
5
|
+
## Sharing logic
|
|
6
|
+
|
|
7
|
+
| Need | Use |
|
|
8
|
+
|------|-----|
|
|
9
|
+
| A few steps repeated across jobs | composite action in `.github/actions/<name>/action.yml` |
|
|
10
|
+
| Whole jobs repeated across repos | reusable workflow with `on: workflow_call` |
|
|
11
|
+
| Logic that needs its own runtime or tests | JavaScript or container action in its own repo |
|
|
12
|
+
|
|
13
|
+
Reusable workflow:
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
# .github/workflows/node-service.yml
|
|
17
|
+
on:
|
|
18
|
+
workflow_call:
|
|
19
|
+
inputs:
|
|
20
|
+
path: { type: string, required: true }
|
|
21
|
+
secrets:
|
|
22
|
+
NPM_TOKEN: { required: false }
|
|
23
|
+
jobs:
|
|
24
|
+
test:
|
|
25
|
+
runs-on: ubuntu-24.04
|
|
26
|
+
defaults: { run: { working-directory: "${{ inputs.path }}" } }
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@<sha>
|
|
29
|
+
- run: npm ci && npm test
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
# caller
|
|
34
|
+
jobs:
|
|
35
|
+
notes-service:
|
|
36
|
+
uses: acme/platform/.github/workflows/node-service.yml@<sha>
|
|
37
|
+
with: { path: services/notes }
|
|
38
|
+
secrets: inherit
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Composite action:
|
|
42
|
+
|
|
43
|
+
```yaml
|
|
44
|
+
# .github/actions/setup-pnpm/action.yml
|
|
45
|
+
name: setup-pnpm
|
|
46
|
+
inputs:
|
|
47
|
+
node-version: { default: "22" }
|
|
48
|
+
runs:
|
|
49
|
+
using: composite
|
|
50
|
+
steps:
|
|
51
|
+
- uses: pnpm/action-setup@<sha>
|
|
52
|
+
- uses: actions/setup-node@<sha>
|
|
53
|
+
with: { node-version: "${{ inputs.node-version }}", cache: pnpm }
|
|
54
|
+
- run: pnpm install --frozen-lockfile
|
|
55
|
+
shell: bash
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Composite steps must declare `shell:` on every `run`.
|
|
59
|
+
|
|
60
|
+
## Passing data
|
|
61
|
+
|
|
62
|
+
- Step to step: `echo "version=$VERSION" >> "$GITHUB_OUTPUT"`, read as
|
|
63
|
+
`steps.<id>.outputs.version`.
|
|
64
|
+
- Job to job: declare `outputs:` on the job and read `needs.<job>.outputs.x`.
|
|
65
|
+
- Files: `actions/upload-artifact` / `download-artifact` (v4 artifacts are
|
|
66
|
+
immutable per name; use unique names per matrix leg).
|
|
67
|
+
- Summary for humans: append Markdown to `$GITHUB_STEP_SUMMARY`.
|
|
68
|
+
|
|
69
|
+
## Xcode on macOS runners
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
ios:
|
|
73
|
+
runs-on: macos-15
|
|
74
|
+
timeout-minutes: 45
|
|
75
|
+
steps:
|
|
76
|
+
- uses: actions/checkout@<sha>
|
|
77
|
+
- run: sudo xcode-select -s /Applications/Xcode_16.4.app
|
|
78
|
+
- uses: actions/cache@<sha>
|
|
79
|
+
with:
|
|
80
|
+
path: ~/Library/Developer/Xcode/DerivedData/**/SourcePackages
|
|
81
|
+
key: spm-${{ hashFiles('**/Package.resolved') }}
|
|
82
|
+
- run: |
|
|
83
|
+
set -o pipefail
|
|
84
|
+
xcodebuild test \
|
|
85
|
+
-scheme Notes -destination 'platform=iOS Simulator,name=iPhone 16' \
|
|
86
|
+
-resultBundlePath TestResults.xcresult | xcbeautify
|
|
87
|
+
- if: failure()
|
|
88
|
+
uses: actions/upload-artifact@<sha>
|
|
89
|
+
with: { name: xcresult, path: TestResults.xcresult }
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- macOS minutes cost several times Linux minutes; run lint and unit tests of
|
|
93
|
+
pure packages on Linux where possible.
|
|
94
|
+
- Check the runner image's installed Xcode list before selecting a version.
|
|
95
|
+
- Import signing certificates into a temporary keychain created in the job and
|
|
96
|
+
delete it in an `if: always()` step.
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: healthkit
|
|
3
3
|
description: "Read, write, and query Apple Health data using HealthKit. Covers HKHealthStore authorization, sample queries, statistics queries, statistics collection queries for charts, saving HKQuantitySample data, background delivery, workout sessions with HKWorkoutSession and HKLiveWorkoutBuilder, HKUnit, and HKQuantityTypeIdentifier values. Use when integrating with Apple Health, displaying health metrics, recording workouts, or enabling background health data delivery."
|
|
4
|
+
metadata:
|
|
5
|
+
source: "dpearson2699/swift-ios-skills (PolyForm Perimeter 1.0.0)"
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# HealthKit
|