codexkit 1.0.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/.codex/.env.example +27 -0
- package/.codex/.template-manifest.json +631 -0
- package/.codex/.version +1 -0
- package/.codex/agents/builder.toml +104 -0
- package/.codex/agents/debugger.toml +67 -0
- package/.codex/agents/general.toml +41 -0
- package/.codex/agents/painter.toml +40 -0
- package/.codex/agents/planner.toml +60 -0
- package/.codex/agents/refactorer.toml +76 -0
- package/.codex/agents/reviewer.toml +60 -0
- package/.codex/agents/runner.toml +40 -0
- package/.codex/agents/scout.toml +133 -0
- package/.codex/agents/shipper.toml +69 -0
- package/.codex/agents/vision.toml +69 -0
- package/.codex/config.toml +146 -0
- package/.codex/context/architecture.md +66 -0
- package/.codex/context/conventions.md +98 -0
- package/.codex/context/current-priorities.md +33 -0
- package/.codex/context/decision-log.md +93 -0
- package/.codex/context/gotchas.md +42 -0
- package/.codex/context/index.md +21 -0
- package/.codex/context/session-context.md +11 -0
- package/.codex/context/worklog.md +9 -0
- package/.codex/hooks/README.md +17 -0
- package/.codex/hooks/after_agent.sh +11 -0
- package/.codex/hooks/after_tool_use.sh +10 -0
- package/.codex/hooks/post_commit.sh +10 -0
- package/.codex/hooks/pre_commit.sh +6 -0
- package/.codex/hooks/session_start.sh +18 -0
- package/.codex/hooks/stop.sh +10 -0
- package/.codex/mcp/README.md +143 -0
- package/.codex/mcp/basic-memory.toml.example +10 -0
- package/.codex/mcp/context7.toml.example +13 -0
- package/.codex/mcp/exa.toml.example +12 -0
- package/.codex/mcp/memory-bridge.toml.example +15 -0
- package/.codex/mcp/memory.toml.example +6 -0
- package/.codex/mcp/ref.toml.example +13 -0
- package/.codex/mcp/tilth.toml.example +10 -0
- package/.codex/memory/README.md +29 -0
- package/.codex/memory/_templates/README.md +26 -0
- package/.codex/memory/_templates/design.md +15 -0
- package/.codex/memory/_templates/gotcha.md +9 -0
- package/.codex/memory/_templates/handoff.md +9 -0
- package/.codex/memory/_templates/prd.md +13 -0
- package/.codex/memory/_templates/project.md +9 -0
- package/.codex/memory/_templates/proposal.md +13 -0
- package/.codex/memory/_templates/research.md +9 -0
- package/.codex/memory/_templates/roadmap.md +11 -0
- package/.codex/memory/_templates/session-context.md +7 -0
- package/.codex/memory/_templates/state.md +11 -0
- package/.codex/memory/_templates/tasks.md +9 -0
- package/.codex/memory/_templates/tech-stack.md +9 -0
- package/.codex/memory/_templates/user.md +7 -0
- package/.codex/memory/project/gotchas.md +5 -0
- package/.codex/memory/project/project.md +12 -0
- package/.codex/memory/project/roadmap.md +15 -0
- package/.codex/memory/project/state.md +22 -0
- package/.codex/memory/project/tech-stack.md +19 -0
- package/.codex/memory/project/user.md +10 -0
- package/.codex/memory/research/.gitkeep +1 -0
- package/.codex/memory/session-context.md +18 -0
- package/.codex/plans/README.md +7 -0
- package/.codex/prompts/compound.md +154 -0
- package/.codex/prompts/create.md +238 -0
- package/.codex/prompts/design.md +90 -0
- package/.codex/prompts/handoff.md +184 -0
- package/.codex/prompts/init-context.md +185 -0
- package/.codex/prompts/init-user.md +93 -0
- package/.codex/prompts/init.md +103 -0
- package/.codex/prompts/lfg.md +140 -0
- package/.codex/prompts/plan.md +140 -0
- package/.codex/prompts/pr.md +150 -0
- package/.codex/prompts/research.md +137 -0
- package/.codex/prompts/resume.md +105 -0
- package/.codex/prompts/review-codebase.md +147 -0
- package/.codex/prompts/ship.md +334 -0
- package/.codex/prompts/start.md +141 -0
- package/.codex/prompts/status.md +102 -0
- package/.codex/prompts/ui-inspire.md +151 -0
- package/.codex/prompts/ui-review.md +86 -0
- package/.codex/prompts/verify.md +181 -0
- package/.codex/scripts/append_worklog.sh +20 -0
- package/.codex/scripts/apply_worklog_archive.sh +48 -0
- package/.codex/scripts/audit_memory_hygiene.sh +102 -0
- package/.codex/scripts/build_memory_index.sh +167 -0
- package/.codex/scripts/build_prior_related_work.sh +127 -0
- package/.codex/scripts/build_startup_brief.sh +52 -0
- package/.codex/scripts/close_bead.sh +103 -0
- package/.codex/scripts/detect_changed_files.sh +38 -0
- package/.codex/scripts/ensure_beads.sh +14 -0
- package/.codex/scripts/memory_search.sh +292 -0
- package/.codex/scripts/prepare_worklog_archive.sh +115 -0
- package/.codex/scripts/search_bead_context.sh +214 -0
- package/.codex/scripts/start_bead.sh +129 -0
- package/.codex/scripts/sync_bead_context.sh +288 -0
- package/.codex/scripts/validate_memory_docs.sh +44 -0
- package/.codex/scripts/verify_bead.sh +154 -0
- package/.codex/skills/accessibility-audit/SKILL.md +191 -0
- package/.codex/skills/agent-browser/SKILL.md +413 -0
- package/.codex/skills/agent-teams/SKILL.md +268 -0
- package/.codex/skills/augment-context-engine/SKILL.md +115 -0
- package/.codex/skills/augment-context-engine/mcp.json +6 -0
- package/.codex/skills/beads/SKILL.md +181 -0
- package/.codex/skills/beads/references/BEST_PRACTICES.md +27 -0
- package/.codex/skills/beads/references/BOUNDARIES.md +219 -0
- package/.codex/skills/beads/references/DEPENDENCIES.md +124 -0
- package/.codex/skills/beads/references/EXAMPLES.md +45 -0
- package/.codex/skills/beads/references/FILE_CLAIMING.md +101 -0
- package/.codex/skills/beads/references/GIT_SYNC.md +25 -0
- package/.codex/skills/beads/references/HIERARCHY.md +71 -0
- package/.codex/skills/beads/references/MULTI_AGENT.md +40 -0
- package/.codex/skills/beads/references/RESUMABILITY.md +177 -0
- package/.codex/skills/beads/references/SESSION_PROTOCOL.md +61 -0
- package/.codex/skills/beads/references/TASK_CREATION.md +38 -0
- package/.codex/skills/beads/references/TROUBLESHOOTING.md +38 -0
- package/.codex/skills/beads/references/WORKFLOWS.md +226 -0
- package/.codex/skills/beads-bridge/SKILL.md +321 -0
- package/.codex/skills/brainstorming/SKILL.md +114 -0
- package/.codex/skills/bug-triage/SKILL.md +191 -0
- package/.codex/skills/chrome-devtools/SKILL.md +76 -0
- package/.codex/skills/chrome-devtools/mcp.json +19 -0
- package/.codex/skills/cloudflare/SKILL.md +253 -0
- package/.codex/skills/cloudflare/references/agents-sdk/README.md +35 -0
- package/.codex/skills/cloudflare/references/agents-sdk/api.md +100 -0
- package/.codex/skills/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/.codex/skills/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/.codex/skills/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/.codex/skills/cloudflare/references/ai-gateway/README.md +695 -0
- package/.codex/skills/cloudflare/references/ai-search/README.md +14 -0
- package/.codex/skills/cloudflare/references/ai-search/api.md +38 -0
- package/.codex/skills/cloudflare/references/ai-search/configuration.md +52 -0
- package/.codex/skills/cloudflare/references/ai-search/gotchas.md +41 -0
- package/.codex/skills/cloudflare/references/ai-search/patterns.md +45 -0
- package/.codex/skills/cloudflare/references/analytics-engine/README.md +14 -0
- package/.codex/skills/cloudflare/references/analytics-engine/api.md +27 -0
- package/.codex/skills/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/.codex/skills/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/.codex/skills/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/.codex/skills/cloudflare/references/api/README.md +21 -0
- package/.codex/skills/cloudflare/references/api/api.md +31 -0
- package/.codex/skills/cloudflare/references/api/configuration.md +20 -0
- package/.codex/skills/cloudflare/references/api/gotchas.md +28 -0
- package/.codex/skills/cloudflare/references/api/patterns.md +47 -0
- package/.codex/skills/cloudflare/references/api-shield/README.md +20 -0
- package/.codex/skills/cloudflare/references/api-shield/api.md +78 -0
- package/.codex/skills/cloudflare/references/api-shield/configuration.md +128 -0
- package/.codex/skills/cloudflare/references/api-shield/gotchas.md +51 -0
- package/.codex/skills/cloudflare/references/api-shield/patterns.md +145 -0
- package/.codex/skills/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/.codex/skills/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/.codex/skills/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/.codex/skills/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/.codex/skills/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/.codex/skills/cloudflare/references/bindings/README.md +14 -0
- package/.codex/skills/cloudflare/references/bindings/api.md +3 -0
- package/.codex/skills/cloudflare/references/bindings/configuration.md +58 -0
- package/.codex/skills/cloudflare/references/bindings/gotchas.md +35 -0
- package/.codex/skills/cloudflare/references/bindings/patterns.md +37 -0
- package/.codex/skills/cloudflare/references/bot-management/README.md +71 -0
- package/.codex/skills/cloudflare/references/bot-management/api.md +168 -0
- package/.codex/skills/cloudflare/references/bot-management/configuration.md +114 -0
- package/.codex/skills/cloudflare/references/bot-management/gotchas.md +99 -0
- package/.codex/skills/cloudflare/references/bot-management/patterns.md +125 -0
- package/.codex/skills/cloudflare/references/browser-rendering/README.md +16 -0
- package/.codex/skills/cloudflare/references/browser-rendering/api.md +54 -0
- package/.codex/skills/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/.codex/skills/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/.codex/skills/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/.codex/skills/cloudflare/references/c3/README.md +264 -0
- package/.codex/skills/cloudflare/references/cache-reserve/README.md +93 -0
- package/.codex/skills/cloudflare/references/cache-reserve/api.md +176 -0
- package/.codex/skills/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/.codex/skills/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/.codex/skills/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/.codex/skills/cloudflare/references/containers/README.md +16 -0
- package/.codex/skills/cloudflare/references/containers/api.md +43 -0
- package/.codex/skills/cloudflare/references/containers/configuration.md +56 -0
- package/.codex/skills/cloudflare/references/containers/gotchas.md +21 -0
- package/.codex/skills/cloudflare/references/containers/patterns.md +40 -0
- package/.codex/skills/cloudflare/references/cron-triggers/README.md +85 -0
- package/.codex/skills/cloudflare/references/cron-triggers/api.md +198 -0
- package/.codex/skills/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/.codex/skills/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/.codex/skills/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/.codex/skills/cloudflare/references/d1/README.md +92 -0
- package/.codex/skills/cloudflare/references/d1/api.md +141 -0
- package/.codex/skills/cloudflare/references/d1/configuration.md +127 -0
- package/.codex/skills/cloudflare/references/d1/gotchas.md +70 -0
- package/.codex/skills/cloudflare/references/d1/patterns.md +144 -0
- package/.codex/skills/cloudflare/references/ddos/README.md +34 -0
- package/.codex/skills/cloudflare/references/ddos/api.md +136 -0
- package/.codex/skills/cloudflare/references/ddos/configuration.md +67 -0
- package/.codex/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/.codex/skills/cloudflare/references/ddos/patterns.md +158 -0
- package/.codex/skills/cloudflare/references/do-storage/README.md +62 -0
- package/.codex/skills/cloudflare/references/do-storage/api.md +89 -0
- package/.codex/skills/cloudflare/references/do-storage/configuration.md +116 -0
- package/.codex/skills/cloudflare/references/do-storage/gotchas.md +93 -0
- package/.codex/skills/cloudflare/references/do-storage/patterns.md +112 -0
- package/.codex/skills/cloudflare/references/durable-objects/README.md +125 -0
- package/.codex/skills/cloudflare/references/durable-objects/api.md +152 -0
- package/.codex/skills/cloudflare/references/durable-objects/configuration.md +148 -0
- package/.codex/skills/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/.codex/skills/cloudflare/references/durable-objects/patterns.md +255 -0
- package/.codex/skills/cloudflare/references/email-routing/README.md +18 -0
- package/.codex/skills/cloudflare/references/email-routing/api.md +46 -0
- package/.codex/skills/cloudflare/references/email-routing/configuration.md +63 -0
- package/.codex/skills/cloudflare/references/email-routing/gotchas.md +16 -0
- package/.codex/skills/cloudflare/references/email-routing/patterns.md +46 -0
- package/.codex/skills/cloudflare/references/email-workers/README.md +598 -0
- package/.codex/skills/cloudflare/references/hyperdrive/README.md +62 -0
- package/.codex/skills/cloudflare/references/hyperdrive/api.md +137 -0
- package/.codex/skills/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/.codex/skills/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/.codex/skills/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/.codex/skills/cloudflare/references/images/README.md +14 -0
- package/.codex/skills/cloudflare/references/images/api.md +3 -0
- package/.codex/skills/cloudflare/references/images/configuration.md +45 -0
- package/.codex/skills/cloudflare/references/images/gotchas.md +23 -0
- package/.codex/skills/cloudflare/references/images/patterns.md +31 -0
- package/.codex/skills/cloudflare/references/kv/README.md +60 -0
- package/.codex/skills/cloudflare/references/kv/api.md +114 -0
- package/.codex/skills/cloudflare/references/kv/configuration.md +92 -0
- package/.codex/skills/cloudflare/references/kv/gotchas.md +117 -0
- package/.codex/skills/cloudflare/references/kv/patterns.md +139 -0
- package/.codex/skills/cloudflare/references/miniflare/README.md +64 -0
- package/.codex/skills/cloudflare/references/miniflare/api.md +144 -0
- package/.codex/skills/cloudflare/references/miniflare/configuration.md +203 -0
- package/.codex/skills/cloudflare/references/miniflare/gotchas.md +187 -0
- package/.codex/skills/cloudflare/references/miniflare/patterns.md +211 -0
- package/.codex/skills/cloudflare/references/network-interconnect/README.md +60 -0
- package/.codex/skills/cloudflare/references/network-interconnect/api.md +240 -0
- package/.codex/skills/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/.codex/skills/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/.codex/skills/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/.codex/skills/cloudflare/references/observability/README.md +18 -0
- package/.codex/skills/cloudflare/references/observability/api.md +51 -0
- package/.codex/skills/cloudflare/references/observability/configuration.md +60 -0
- package/.codex/skills/cloudflare/references/observability/gotchas.md +36 -0
- package/.codex/skills/cloudflare/references/observability/patterns.md +42 -0
- package/.codex/skills/cloudflare/references/pages/README.md +76 -0
- package/.codex/skills/cloudflare/references/pages/api.md +200 -0
- package/.codex/skills/cloudflare/references/pages/configuration.md +228 -0
- package/.codex/skills/cloudflare/references/pages/gotchas.md +161 -0
- package/.codex/skills/cloudflare/references/pages/patterns.md +145 -0
- package/.codex/skills/cloudflare/references/pages-functions/README.md +57 -0
- package/.codex/skills/cloudflare/references/pages-functions/api.md +201 -0
- package/.codex/skills/cloudflare/references/pages-functions/configuration.md +159 -0
- package/.codex/skills/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/.codex/skills/cloudflare/references/pages-functions/patterns.md +190 -0
- package/.codex/skills/cloudflare/references/pipelines/README.md +664 -0
- package/.codex/skills/cloudflare/references/pulumi/README.md +107 -0
- package/.codex/skills/cloudflare/references/pulumi/api.md +194 -0
- package/.codex/skills/cloudflare/references/pulumi/configuration.md +216 -0
- package/.codex/skills/cloudflare/references/pulumi/gotchas.md +223 -0
- package/.codex/skills/cloudflare/references/pulumi/patterns.md +139 -0
- package/.codex/skills/cloudflare/references/queues/README.md +69 -0
- package/.codex/skills/cloudflare/references/queues/api.md +138 -0
- package/.codex/skills/cloudflare/references/queues/configuration.md +125 -0
- package/.codex/skills/cloudflare/references/queues/gotchas.md +112 -0
- package/.codex/skills/cloudflare/references/queues/patterns.md +155 -0
- package/.codex/skills/cloudflare/references/r2/README.md +61 -0
- package/.codex/skills/cloudflare/references/r2/api.md +127 -0
- package/.codex/skills/cloudflare/references/r2/configuration.md +76 -0
- package/.codex/skills/cloudflare/references/r2/gotchas.md +94 -0
- package/.codex/skills/cloudflare/references/r2/patterns.md +127 -0
- package/.codex/skills/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/.codex/skills/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/.codex/skills/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/.codex/skills/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/.codex/skills/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/.codex/skills/cloudflare/references/r2-sql/README.md +512 -0
- package/.codex/skills/cloudflare/references/realtime-sfu/README.md +21 -0
- package/.codex/skills/cloudflare/references/realtime-sfu/api.md +135 -0
- package/.codex/skills/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/.codex/skills/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/.codex/skills/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/.codex/skills/cloudflare/references/realtimekit/README.md +81 -0
- package/.codex/skills/cloudflare/references/realtimekit/api.md +164 -0
- package/.codex/skills/cloudflare/references/realtimekit/configuration.md +147 -0
- package/.codex/skills/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/.codex/skills/cloudflare/references/realtimekit/patterns.md +155 -0
- package/.codex/skills/cloudflare/references/sandbox/README.md +90 -0
- package/.codex/skills/cloudflare/references/sandbox/api.md +178 -0
- package/.codex/skills/cloudflare/references/sandbox/configuration.md +131 -0
- package/.codex/skills/cloudflare/references/sandbox/gotchas.md +156 -0
- package/.codex/skills/cloudflare/references/sandbox/patterns.md +203 -0
- package/.codex/skills/cloudflare/references/secrets-store/README.md +58 -0
- package/.codex/skills/cloudflare/references/secrets-store/api.md +182 -0
- package/.codex/skills/cloudflare/references/secrets-store/configuration.md +140 -0
- package/.codex/skills/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/.codex/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/.codex/skills/cloudflare/references/smart-placement/README.md +91 -0
- package/.codex/skills/cloudflare/references/smart-placement/api.md +139 -0
- package/.codex/skills/cloudflare/references/smart-placement/configuration.md +129 -0
- package/.codex/skills/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/.codex/skills/cloudflare/references/smart-placement/patterns.md +135 -0
- package/.codex/skills/cloudflare/references/snippets/README.md +15 -0
- package/.codex/skills/cloudflare/references/snippets/api.md +47 -0
- package/.codex/skills/cloudflare/references/snippets/configuration.md +33 -0
- package/.codex/skills/cloudflare/references/snippets/gotchas.md +21 -0
- package/.codex/skills/cloudflare/references/snippets/patterns.md +34 -0
- package/.codex/skills/cloudflare/references/spectrum/README.md +16 -0
- package/.codex/skills/cloudflare/references/spectrum/api.md +24 -0
- package/.codex/skills/cloudflare/references/spectrum/configuration.md +43 -0
- package/.codex/skills/cloudflare/references/spectrum/gotchas.md +42 -0
- package/.codex/skills/cloudflare/references/spectrum/patterns.md +40 -0
- package/.codex/skills/cloudflare/references/static-assets/README.md +14 -0
- package/.codex/skills/cloudflare/references/static-assets/api.md +3 -0
- package/.codex/skills/cloudflare/references/static-assets/configuration.md +47 -0
- package/.codex/skills/cloudflare/references/static-assets/gotchas.md +44 -0
- package/.codex/skills/cloudflare/references/static-assets/patterns.md +42 -0
- package/.codex/skills/cloudflare/references/stream/README.md +103 -0
- package/.codex/skills/cloudflare/references/stream/api.md +204 -0
- package/.codex/skills/cloudflare/references/stream/configuration.md +127 -0
- package/.codex/skills/cloudflare/references/stream/gotchas.md +131 -0
- package/.codex/skills/cloudflare/references/stream/patterns.md +152 -0
- package/.codex/skills/cloudflare/references/tail-workers/README.md +640 -0
- package/.codex/skills/cloudflare/references/terraform/README.md +76 -0
- package/.codex/skills/cloudflare/references/terraform/api.md +159 -0
- package/.codex/skills/cloudflare/references/terraform/configuration.md +156 -0
- package/.codex/skills/cloudflare/references/terraform/gotchas.md +207 -0
- package/.codex/skills/cloudflare/references/terraform/patterns.md +135 -0
- package/.codex/skills/cloudflare/references/tunnel/README.md +82 -0
- package/.codex/skills/cloudflare/references/tunnel/api.md +105 -0
- package/.codex/skills/cloudflare/references/tunnel/configuration.md +113 -0
- package/.codex/skills/cloudflare/references/tunnel/gotchas.md +115 -0
- package/.codex/skills/cloudflare/references/tunnel/patterns.md +157 -0
- package/.codex/skills/cloudflare/references/turn/README.md +699 -0
- package/.codex/skills/cloudflare/references/turnstile/README.md +14 -0
- package/.codex/skills/cloudflare/references/turnstile/api.md +3 -0
- package/.codex/skills/cloudflare/references/turnstile/configuration.md +19 -0
- package/.codex/skills/cloudflare/references/turnstile/gotchas.md +27 -0
- package/.codex/skills/cloudflare/references/turnstile/patterns.md +41 -0
- package/.codex/skills/cloudflare/references/vectorize/README.md +682 -0
- package/.codex/skills/cloudflare/references/waf/README.md +14 -0
- package/.codex/skills/cloudflare/references/waf/api.md +3 -0
- package/.codex/skills/cloudflare/references/waf/configuration.md +44 -0
- package/.codex/skills/cloudflare/references/waf/gotchas.md +24 -0
- package/.codex/skills/cloudflare/references/waf/patterns.md +29 -0
- package/.codex/skills/cloudflare/references/web-analytics/README.md +19 -0
- package/.codex/skills/cloudflare/references/web-analytics/api.md +52 -0
- package/.codex/skills/cloudflare/references/web-analytics/configuration.md +31 -0
- package/.codex/skills/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/.codex/skills/cloudflare/references/web-analytics/patterns.md +52 -0
- package/.codex/skills/cloudflare/references/workerd/README.md +47 -0
- package/.codex/skills/cloudflare/references/workerd/api.md +199 -0
- package/.codex/skills/cloudflare/references/workerd/configuration.md +185 -0
- package/.codex/skills/cloudflare/references/workerd/gotchas.md +203 -0
- package/.codex/skills/cloudflare/references/workerd/patterns.md +216 -0
- package/.codex/skills/cloudflare/references/workers/README.md +96 -0
- package/.codex/skills/cloudflare/references/workers/api.md +137 -0
- package/.codex/skills/cloudflare/references/workers/configuration.md +147 -0
- package/.codex/skills/cloudflare/references/workers/gotchas.md +99 -0
- package/.codex/skills/cloudflare/references/workers/patterns.md +149 -0
- package/.codex/skills/cloudflare/references/workers-ai/README.md +116 -0
- package/.codex/skills/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/.codex/skills/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/.codex/skills/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/.codex/skills/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/.codex/skills/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/.codex/skills/cloudflare/references/workers-playground/README.md +16 -0
- package/.codex/skills/cloudflare/references/workers-playground/api.md +20 -0
- package/.codex/skills/cloudflare/references/workers-playground/configuration.md +3 -0
- package/.codex/skills/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/.codex/skills/cloudflare/references/workers-playground/patterns.md +42 -0
- package/.codex/skills/cloudflare/references/workers-vpc/README.md +579 -0
- package/.codex/skills/cloudflare/references/workflows/README.md +62 -0
- package/.codex/skills/cloudflare/references/workflows/api.md +125 -0
- package/.codex/skills/cloudflare/references/workflows/configuration.md +177 -0
- package/.codex/skills/cloudflare/references/workflows/gotchas.md +136 -0
- package/.codex/skills/cloudflare/references/workflows/patterns.md +132 -0
- package/.codex/skills/cloudflare/references/wrangler/README.md +90 -0
- package/.codex/skills/cloudflare/references/wrangler/api.md +140 -0
- package/.codex/skills/cloudflare/references/wrangler/configuration.md +128 -0
- package/.codex/skills/cloudflare/references/wrangler/gotchas.md +93 -0
- package/.codex/skills/cloudflare/references/wrangler/patterns.md +150 -0
- package/.codex/skills/cloudflare/references/zaraz/README.md +360 -0
- package/.codex/skills/code-navigation/SKILL.md +130 -0
- package/.codex/skills/code-review/SKILL.md +208 -0
- package/.codex/skills/compaction/SKILL.md +317 -0
- package/.codex/skills/condition-based-waiting/SKILL.md +123 -0
- package/.codex/skills/condition-based-waiting/example.ts +158 -0
- package/.codex/skills/context-engineering/SKILL.md +176 -0
- package/.codex/skills/context-initialization/SKILL.md +70 -0
- package/.codex/skills/context-management/SKILL.md +163 -0
- package/.codex/skills/core-data-expert/SKILL.md +93 -0
- package/.codex/skills/core-data-expert/references/batch-operations.md +543 -0
- package/.codex/skills/core-data-expert/references/cloudkit-integration.md +259 -0
- package/.codex/skills/core-data-expert/references/concurrency.md +522 -0
- package/.codex/skills/core-data-expert/references/fetch-requests.md +643 -0
- package/.codex/skills/core-data-expert/references/glossary.md +233 -0
- package/.codex/skills/core-data-expert/references/migration.md +393 -0
- package/.codex/skills/core-data-expert/references/model-configuration.md +597 -0
- package/.codex/skills/core-data-expert/references/performance.md +300 -0
- package/.codex/skills/core-data-expert/references/persistent-history.md +553 -0
- package/.codex/skills/core-data-expert/references/project-audit.md +60 -0
- package/.codex/skills/core-data-expert/references/saving.md +574 -0
- package/.codex/skills/core-data-expert/references/stack-setup.md +625 -0
- package/.codex/skills/core-data-expert/references/testing.md +300 -0
- package/.codex/skills/core-data-expert/references/threading.md +589 -0
- package/.codex/skills/debugging/SKILL.md +203 -0
- package/.codex/skills/deep-research/SKILL.md +384 -0
- package/.codex/skills/defense-in-depth/SKILL.md +166 -0
- package/.codex/skills/dependency-upgrades/SKILL.md +198 -0
- package/.codex/skills/design-system-audit/SKILL.md +153 -0
- package/.codex/skills/development-lifecycle/SKILL.md +356 -0
- package/.codex/skills/dispatching-parallel-agents/SKILL.md +191 -0
- package/.codex/skills/docs-handoff/SKILL.md +175 -0
- package/.codex/skills/executing-plans/SKILL.md +247 -0
- package/.codex/skills/figma/SKILL.md +224 -0
- package/.codex/skills/figma/mcp.json +6 -0
- package/.codex/skills/finishing-a-development-branch/SKILL.md +357 -0
- package/.codex/skills/frontend-design/SKILL.md +176 -0
- package/.codex/skills/gemini-large-context/SKILL.md +216 -0
- package/.codex/skills/git-pr-prep/SKILL.md +179 -0
- package/.codex/skills/index-knowledge/SKILL.md +413 -0
- package/.codex/skills/jira/SKILL.md +283 -0
- package/.codex/skills/jira/mcp.json +6 -0
- package/.codex/skills/memory-system/SKILL.md +93 -0
- package/.codex/skills/mockup-to-code/SKILL.md +184 -0
- package/.codex/skills/mqdh/SKILL.md +171 -0
- package/.codex/skills/obsidian/SKILL.md +187 -0
- package/.codex/skills/obsidian/mcp.json +22 -0
- package/.codex/skills/opensrc/SKILL.md +127 -0
- package/.codex/skills/opensrc/references/architecture.md +176 -0
- package/.codex/skills/opensrc/references/cli-usage.md +176 -0
- package/.codex/skills/opensrc/references/registry-support.md +137 -0
- package/.codex/skills/pdf-extract/SKILL.md +438 -0
- package/.codex/skills/playwright/SKILL.md +320 -0
- package/.codex/skills/playwright/mcp.json +16 -0
- package/.codex/skills/playwriter/SKILL.md +158 -0
- package/.codex/skills/polar/SKILL.md +102 -0
- package/.codex/skills/prd/SKILL.md +146 -0
- package/.codex/skills/prd-task/SKILL.md +182 -0
- package/.codex/skills/prd-task/references/prd-schema.json +124 -0
- package/.codex/skills/prompt-leverage/SKILL.md +69 -0
- package/.codex/skills/prompt-leverage/agents/openai.yaml +4 -0
- package/.codex/skills/prompt-leverage/references/framework.md +91 -0
- package/.codex/skills/prompt-leverage/scripts/augment_prompt.py +114 -0
- package/.codex/skills/ralph/SKILL.md +296 -0
- package/.codex/skills/react-best-practices/AGENTS.md +2410 -0
- package/.codex/skills/react-best-practices/README.md +123 -0
- package/.codex/skills/react-best-practices/SKILL.md +133 -0
- package/.codex/skills/react-best-practices/metadata.json +15 -0
- package/.codex/skills/react-best-practices/rules/_sections.md +46 -0
- package/.codex/skills/react-best-practices/rules/_template.md +28 -0
- package/.codex/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/.codex/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/.codex/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/.codex/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/.codex/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/.codex/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/.codex/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/.codex/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/.codex/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/.codex/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/.codex/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/.codex/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/.codex/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/.codex/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/.codex/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/.codex/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/.codex/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/.codex/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/.codex/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/.codex/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/.codex/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/.codex/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/.codex/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/.codex/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/.codex/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/.codex/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/.codex/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/.codex/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/.codex/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/.codex/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/.codex/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/.codex/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/.codex/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/.codex/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/.codex/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/.codex/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/.codex/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/.codex/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/.codex/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/.codex/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/.codex/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/.codex/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/.codex/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/.codex/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/.codex/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/.codex/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/.codex/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/.codex/skills/receiving-code-review/SKILL.md +252 -0
- package/.codex/skills/refactoring/SKILL.md +217 -0
- package/.codex/skills/repo-orientation/SKILL.md +156 -0
- package/.codex/skills/requesting-code-review/SKILL.md +397 -0
- package/.codex/skills/resend/SKILL.md +177 -0
- package/.codex/skills/resend/references/react-email.md +287 -0
- package/.codex/skills/resend/references/receive-email.md +248 -0
- package/.codex/skills/resend/references/send-email.md +318 -0
- package/.codex/skills/root-cause-tracing/SKILL.md +192 -0
- package/.codex/skills/root-cause-tracing/find-polluter.sh +63 -0
- package/.codex/skills/safe-implementation/SKILL.md +205 -0
- package/.codex/skills/session-management/SKILL.md +10 -0
- package/.codex/skills/sharing-skills/SKILL.md +214 -0
- package/.codex/skills/skill-creator/SKILL.md +156 -0
- package/.codex/skills/source-code-research/SKILL.md +293 -0
- package/.codex/skills/source-code-research/references/analysis-tips.md +43 -0
- package/.codex/skills/source-code-research/references/anti-patterns.md +36 -0
- package/.codex/skills/source-code-research/references/common-patterns.md +57 -0
- package/.codex/skills/source-code-research/references/example-workflow.md +60 -0
- package/.codex/skills/source-code-research/references/further-reading.md +5 -0
- package/.codex/skills/source-code-research/references/source-structure.md +45 -0
- package/.codex/skills/stitch/SKILL.md +147 -0
- package/.codex/skills/stitch/mcp.json +9 -0
- package/.codex/skills/structured-edit/SKILL.md +181 -0
- package/.codex/skills/subagent-driven-development/SKILL.md +237 -0
- package/.codex/skills/supabase/SKILL.md +130 -0
- package/.codex/skills/supabase/mcp.json +27 -0
- package/.codex/skills/supabase-postgres-best-practices/AGENTS.md +1490 -0
- package/.codex/skills/supabase-postgres-best-practices/SKILL.md +65 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/advanced-full-text-search.md +55 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/advanced-jsonb-indexing.md +49 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/conn-idle-timeout.md +46 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/conn-limits.md +44 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/conn-pooling.md +41 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/conn-prepared-statements.md +46 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/data-batch-inserts.md +54 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/data-n-plus-one.md +53 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/data-pagination.md +50 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/data-upsert.md +50 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/lock-advisory.md +56 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/lock-deadlock-prevention.md +68 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/lock-short-transactions.md +50 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/lock-skip-locked.md +54 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/monitor-explain-analyze.md +45 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/monitor-pg-stat-statements.md +55 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/monitor-vacuum-analyze.md +55 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/query-composite-indexes.md +44 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/query-covering-indexes.md +40 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/query-index-types.md +45 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/query-missing-indexes.md +43 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/query-partial-indexes.md +45 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/schema-data-types.md +46 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/schema-foreign-key-indexes.md +59 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/schema-lowercase-identifiers.md +55 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/schema-partitioning.md +55 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/schema-primary-keys.md +61 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/security-privileges.md +54 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/security-rls-basics.md +50 -0
- package/.codex/skills/supabase-postgres-best-practices/rules/security-rls-performance.md +57 -0
- package/.codex/skills/swarm-coordination/SKILL.md +179 -0
- package/.codex/skills/swarm-coordination/references/architecture.md +39 -0
- package/.codex/skills/swarm-coordination/references/delegation-worker-protocol.md +145 -0
- package/.codex/skills/swarm-coordination/references/dependency-graph.md +50 -0
- package/.codex/skills/swarm-coordination/references/drift-check.md +90 -0
- package/.codex/skills/swarm-coordination/references/integration-beads.md +20 -0
- package/.codex/skills/swarm-coordination/references/launch-flow.md +186 -0
- package/.codex/skills/swarm-coordination/references/reconciler.md +172 -0
- package/.codex/skills/swarm-coordination/references/tier-enforcement.md +78 -0
- package/.codex/skills/swarm-coordination/references/tmux-integration.md +134 -0
- package/.codex/skills/swift-concurrency/SKILL.md +266 -0
- package/.codex/skills/swift-concurrency/references/actors.md +640 -0
- package/.codex/skills/swift-concurrency/references/async-algorithms.md +822 -0
- package/.codex/skills/swift-concurrency/references/async-await-basics.md +249 -0
- package/.codex/skills/swift-concurrency/references/async-sequences.md +670 -0
- package/.codex/skills/swift-concurrency/references/core-data.md +533 -0
- package/.codex/skills/swift-concurrency/references/glossary.md +128 -0
- package/.codex/skills/swift-concurrency/references/linting.md +142 -0
- package/.codex/skills/swift-concurrency/references/memory-management.md +542 -0
- package/.codex/skills/swift-concurrency/references/migration.md +1076 -0
- package/.codex/skills/swift-concurrency/references/performance.md +574 -0
- package/.codex/skills/swift-concurrency/references/sendable.md +578 -0
- package/.codex/skills/swift-concurrency/references/tasks.md +604 -0
- package/.codex/skills/swift-concurrency/references/testing.md +565 -0
- package/.codex/skills/swift-concurrency/references/threading.md +452 -0
- package/.codex/skills/swiftui-expert-skill/SKILL.md +329 -0
- package/.codex/skills/swiftui-expert-skill/references/animation-advanced.md +351 -0
- package/.codex/skills/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/.codex/skills/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/.codex/skills/swiftui-expert-skill/references/image-optimization.md +286 -0
- package/.codex/skills/swiftui-expert-skill/references/layout-best-practices.md +312 -0
- package/.codex/skills/swiftui-expert-skill/references/liquid-glass.md +377 -0
- package/.codex/skills/swiftui-expert-skill/references/list-patterns.md +153 -0
- package/.codex/skills/swiftui-expert-skill/references/modern-apis.md +400 -0
- package/.codex/skills/swiftui-expert-skill/references/performance-patterns.md +377 -0
- package/.codex/skills/swiftui-expert-skill/references/scroll-patterns.md +305 -0
- package/.codex/skills/swiftui-expert-skill/references/sheet-navigation-patterns.md +292 -0
- package/.codex/skills/swiftui-expert-skill/references/state-management.md +447 -0
- package/.codex/skills/swiftui-expert-skill/references/text-formatting.md +285 -0
- package/.codex/skills/swiftui-expert-skill/references/view-structure.md +276 -0
- package/.codex/skills/systematic-debugging/SKILL.md +402 -0
- package/.codex/skills/task-planning/SKILL.md +205 -0
- package/.codex/skills/test-driven-development/SKILL.md +388 -0
- package/.codex/skills/test-strategy/SKILL.md +186 -0
- package/.codex/skills/testing-anti-patterns/SKILL.md +320 -0
- package/.codex/skills/testing-skills-with-subagents/SKILL.md +405 -0
- package/.codex/skills/tilth-cli/SKILL.md +180 -0
- package/.codex/skills/tool-priority/SKILL.md +299 -0
- package/.codex/skills/ui-inspiration-scout/SKILL.md +203 -0
- package/.codex/skills/ui-ux-research/SKILL.md +35 -0
- package/.codex/skills/using-git-worktrees/SKILL.md +259 -0
- package/.codex/skills/using-skills/SKILL.md +117 -0
- package/.codex/skills/v0/SKILL.md +158 -0
- package/.codex/skills/v0/mcp.json +6 -0
- package/.codex/skills/v1-run/SKILL.md +175 -0
- package/.codex/skills/v1-run/mcp.json +6 -0
- package/.codex/skills/vercel-deploy-claimable/SKILL.md +124 -0
- package/.codex/skills/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/.codex/skills/verification/SKILL.md +191 -0
- package/.codex/skills/verification-before-completion/SKILL.md +236 -0
- package/.codex/skills/visual-analysis/SKILL.md +154 -0
- package/.codex/skills/web-design-guidelines/SKILL.md +46 -0
- package/.codex/skills/writing-plans/SKILL.md +320 -0
- package/.codex/skills/writing-skills/SKILL.md +287 -0
- package/.codex/skills/writing-skills/anthropic-best-practices.md +1173 -0
- package/.codex/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/.codex/skills/writing-skills/persuasion-principles.md +220 -0
- package/.codex/skills/writing-skills/references/anti-patterns.md +25 -0
- package/.codex/skills/writing-skills/references/claude-search-optimization.md +140 -0
- package/.codex/skills/writing-skills/references/discovery-workflow.md +11 -0
- package/.codex/skills/writing-skills/references/file-organization.md +32 -0
- package/.codex/skills/writing-skills/references/flowcharts-and-examples.md +57 -0
- package/.codex/skills/writing-skills/references/rationalization-hardening.md +75 -0
- package/.codex/skills/writing-skills/references/testing-skill-types.md +52 -0
- package/.template-manifest.json +631 -0
- package/AGENTS.md +719 -0
- package/AGENTS.override.md.example +7 -0
- package/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +641 -0
- package/bin/codexkit +148 -0
- package/install/bead-close.sh +20 -0
- package/install/bead-search.sh +18 -0
- package/install/bead-start.sh +20 -0
- package/install/bead-sync.sh +19 -0
- package/install/bead-verify.sh +20 -0
- package/install/generate-manifest.sh +55 -0
- package/install/install-global.sh +150 -0
- package/install/install-project.sh +704 -0
- package/install/install-remote.sh +152 -0
- package/install/patch.sh +478 -0
- package/install/plugin.sh +565 -0
- package/install/run-codex.sh +68 -0
- package/install/template.sh +620 -0
- package/install/validate.sh +653 -0
- package/package.json +39 -0
- package/templates/global/.codex-config-template.toml +87 -0
- package/templates/global/AGENTS.override.md +18 -0
- package/templates/global/README.md +29 -0
- package/templates/project/.codex-config-template.toml +26 -0
- package/templates/project/AGENTS.md.template +27 -0
- package/templates/project/README.md +24 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
# Core Data and Swift Concurrency
|
|
2
|
+
|
|
3
|
+
Thread-safe patterns for using Core Data with Swift Concurrency.
|
|
4
|
+
|
|
5
|
+
## Core Principles
|
|
6
|
+
|
|
7
|
+
### Thread safety still matters
|
|
8
|
+
|
|
9
|
+
Core Data's thread safety rules don't change with Swift Concurrency:
|
|
10
|
+
- Can't pass `NSManagedObject` between threads
|
|
11
|
+
- Must access objects on their context's thread
|
|
12
|
+
- `NSManagedObjectID` is thread-safe (can pass around)
|
|
13
|
+
|
|
14
|
+
### NSManagedObject cannot be Sendable
|
|
15
|
+
|
|
16
|
+
```swift
|
|
17
|
+
@objc(Article)
|
|
18
|
+
public class Article: NSManagedObject {
|
|
19
|
+
@NSManaged public var title: String // ❌ Mutable, can't be Sendable
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Don't use `@unchecked Sendable`** - hides warnings without fixing safety.
|
|
24
|
+
|
|
25
|
+
## Available Async APIs
|
|
26
|
+
|
|
27
|
+
### Context perform
|
|
28
|
+
|
|
29
|
+
```swift
|
|
30
|
+
extension NSManagedObjectContext {
|
|
31
|
+
func perform<T>(_ block: @escaping () throws -> T) async rethrows -> T
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### What's missing
|
|
36
|
+
|
|
37
|
+
No async alternative for:
|
|
38
|
+
```swift
|
|
39
|
+
func loadPersistentStores(
|
|
40
|
+
completionHandler: @escaping (NSPersistentStoreDescription, Error?) -> Void
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Must bridge manually (see below).
|
|
45
|
+
|
|
46
|
+
## Data Access Objects (DAO)
|
|
47
|
+
|
|
48
|
+
Thread-safe value types representing managed objects.
|
|
49
|
+
|
|
50
|
+
### Pattern
|
|
51
|
+
|
|
52
|
+
```swift
|
|
53
|
+
// Managed object (not Sendable)
|
|
54
|
+
@objc(Article)
|
|
55
|
+
public class Article: NSManagedObject {
|
|
56
|
+
@NSManaged public var title: String?
|
|
57
|
+
@NSManaged public var timestamp: Date?
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// DAO (Sendable)
|
|
61
|
+
struct ArticleDAO: Sendable, Identifiable {
|
|
62
|
+
let id: NSManagedObjectID
|
|
63
|
+
let title: String
|
|
64
|
+
let timestamp: Date
|
|
65
|
+
|
|
66
|
+
init?(managedObject: Article) {
|
|
67
|
+
guard let title = managedObject.title,
|
|
68
|
+
let timestamp = managedObject.timestamp else {
|
|
69
|
+
return nil
|
|
70
|
+
}
|
|
71
|
+
self.id = managedObject.objectID
|
|
72
|
+
self.title = title
|
|
73
|
+
self.timestamp = timestamp
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Benefits
|
|
79
|
+
|
|
80
|
+
- **Sendable**: Safe to pass across isolation domains
|
|
81
|
+
- **Immutable**: No accidental mutations
|
|
82
|
+
- **Clear API**: Explicit data transfer
|
|
83
|
+
|
|
84
|
+
### Drawbacks
|
|
85
|
+
|
|
86
|
+
- **Requires rewrite**: All fetch/mutation logic
|
|
87
|
+
- **Boilerplate**: DAO for each entity
|
|
88
|
+
- **Complexity**: Additional layer of abstraction
|
|
89
|
+
|
|
90
|
+
## Working Without DAOs
|
|
91
|
+
|
|
92
|
+
Pass only `NSManagedObjectID` between contexts.
|
|
93
|
+
|
|
94
|
+
### Basic pattern
|
|
95
|
+
|
|
96
|
+
```swift
|
|
97
|
+
@MainActor
|
|
98
|
+
func fetchArticle(id: NSManagedObjectID) -> Article? {
|
|
99
|
+
viewContext.object(with: id) as? Article
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func processInBackground(articleID: NSManagedObjectID) async throws {
|
|
103
|
+
let backgroundContext = container.newBackgroundContext()
|
|
104
|
+
try await backgroundContext.perform {
|
|
105
|
+
guard let article = backgroundContext.object(with: articleID) as? Article else {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
// Process article
|
|
109
|
+
try backgroundContext.save()
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### NSManagedObjectID is Sendable
|
|
115
|
+
|
|
116
|
+
```swift
|
|
117
|
+
// Safe to pass between tasks
|
|
118
|
+
let articleID = article.objectID
|
|
119
|
+
|
|
120
|
+
Task {
|
|
121
|
+
try? await processInBackground(articleID: articleID)
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Bridging Closures to Async
|
|
126
|
+
|
|
127
|
+
### Load persistent stores
|
|
128
|
+
|
|
129
|
+
```swift
|
|
130
|
+
extension NSPersistentContainer {
|
|
131
|
+
func loadPersistentStores() async throws {
|
|
132
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
133
|
+
self.loadPersistentStores { description, error in
|
|
134
|
+
if let error {
|
|
135
|
+
continuation.resume(throwing: error)
|
|
136
|
+
} else {
|
|
137
|
+
continuation.resume(returning: ())
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Usage
|
|
145
|
+
try await container.loadPersistentStores()
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Simple CoreDataStore Pattern
|
|
149
|
+
|
|
150
|
+
Enforce isolation at API level:
|
|
151
|
+
|
|
152
|
+
```swift
|
|
153
|
+
final class CoreDataStore {
|
|
154
|
+
let persistentContainer: NSPersistentContainer
|
|
155
|
+
|
|
156
|
+
var viewContext: NSManagedObjectContext {
|
|
157
|
+
persistentContainer.viewContext
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
init(persistentContainer: NSPersistentContainer) {
|
|
161
|
+
self.persistentContainer = persistentContainer
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// View context operations (main thread)
|
|
165
|
+
@MainActor
|
|
166
|
+
func read<T>(_ block: (NSManagedObjectContext) throws -> T) rethrows -> T {
|
|
167
|
+
try block(viewContext)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Background operations
|
|
171
|
+
func performInBackground<T>(
|
|
172
|
+
_ block: @Sendable @escaping (NSManagedObjectContext) throws -> T
|
|
173
|
+
) async rethrows -> T {
|
|
174
|
+
let context = persistentContainer.newBackgroundContext()
|
|
175
|
+
return try await context.perform {
|
|
176
|
+
try block(context)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Usage
|
|
183
|
+
|
|
184
|
+
```swift
|
|
185
|
+
let store = CoreDataStore(persistentContainer: container)
|
|
186
|
+
|
|
187
|
+
// Main thread operations
|
|
188
|
+
@MainActor
|
|
189
|
+
func loadArticles() throws -> [Article] {
|
|
190
|
+
try store.read { context in
|
|
191
|
+
let request = Article.fetchRequest()
|
|
192
|
+
return try context.fetch(request)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Background operations
|
|
197
|
+
func deleteAll() async throws {
|
|
198
|
+
try await store.performInBackground { context in
|
|
199
|
+
let request = Article.fetchRequest()
|
|
200
|
+
let articles = try context.fetch(request)
|
|
201
|
+
articles.forEach { context.delete($0) }
|
|
202
|
+
try context.save()
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Why this pattern works
|
|
208
|
+
|
|
209
|
+
- **@MainActor**: Enforces view context on main thread
|
|
210
|
+
- **Dedicated entry points**: Read/write APIs prevent accidental cross-context use
|
|
211
|
+
- **Simple**: No custom executors needed
|
|
212
|
+
|
|
213
|
+
## Custom Actor Executor (Advanced)
|
|
214
|
+
|
|
215
|
+
**Note**: Usually not needed. Consider simple pattern first.
|
|
216
|
+
|
|
217
|
+
### Implementation
|
|
218
|
+
|
|
219
|
+
```swift
|
|
220
|
+
final class NSManagedObjectContextExecutor: @unchecked Sendable, SerialExecutor {
|
|
221
|
+
private let context: NSManagedObjectContext
|
|
222
|
+
|
|
223
|
+
init(context: NSManagedObjectContext) {
|
|
224
|
+
self.context = context
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
func enqueue(_ job: consuming ExecutorJob) {
|
|
228
|
+
let unownedJob = UnownedJob(job)
|
|
229
|
+
let executor = asUnownedSerialExecutor()
|
|
230
|
+
|
|
231
|
+
context.perform {
|
|
232
|
+
unownedJob.runSynchronously(on: executor)
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
func asUnownedSerialExecutor() -> UnownedSerialExecutor {
|
|
237
|
+
UnownedSerialExecutor(ordinary: self)
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Actor usage
|
|
243
|
+
|
|
244
|
+
```swift
|
|
245
|
+
actor CoreDataStore {
|
|
246
|
+
let persistentContainer: NSPersistentContainer
|
|
247
|
+
private let context: NSManagedObjectContext
|
|
248
|
+
nonisolated let modelExecutor: NSManagedObjectContextExecutor
|
|
249
|
+
|
|
250
|
+
nonisolated var unownedExecutor: UnownedSerialExecutor {
|
|
251
|
+
modelExecutor.asUnownedSerialExecutor()
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
private init() {
|
|
255
|
+
persistentContainer = NSPersistentContainer(name: "MyApp")
|
|
256
|
+
context = persistentContainer.newBackgroundContext()
|
|
257
|
+
modelExecutor = NSManagedObjectContextExecutor(context: context)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
func deleteAll<T: NSManagedObject>(
|
|
261
|
+
using request: NSFetchRequest<T>
|
|
262
|
+
) throws {
|
|
263
|
+
let objects = try context.fetch(request)
|
|
264
|
+
objects.forEach { context.delete($0) }
|
|
265
|
+
try context.save()
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Drawbacks
|
|
271
|
+
|
|
272
|
+
- **Hidden complexity**: Executor details obscure Core Data
|
|
273
|
+
- **Forces concurrency**: Even for main thread operations
|
|
274
|
+
- **Not simpler**: More code than `perform { }`
|
|
275
|
+
- **Error prone**: Easy to use wrong context
|
|
276
|
+
|
|
277
|
+
**Recommendation**: Use simple pattern instead.
|
|
278
|
+
|
|
279
|
+
## Default MainActor Isolation
|
|
280
|
+
|
|
281
|
+
### Problem with auto-generated code
|
|
282
|
+
|
|
283
|
+
When default isolation set to `@MainActor`, auto-generated managed objects conflict:
|
|
284
|
+
|
|
285
|
+
```swift
|
|
286
|
+
// Auto-generated (can't modify)
|
|
287
|
+
class Article: NSManagedObject {
|
|
288
|
+
// Inherits @MainActor, conflicts with NSManagedObject
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Error**: `Main actor-isolated initializer has different actor isolation from nonisolated overridden declaration`
|
|
293
|
+
|
|
294
|
+
### Solution: Manual code generation
|
|
295
|
+
|
|
296
|
+
1. Set entity to "Manual/None" code generation
|
|
297
|
+
2. Generate class definitions
|
|
298
|
+
3. Mark as `nonisolated`:
|
|
299
|
+
|
|
300
|
+
```swift
|
|
301
|
+
nonisolated class Article: NSManagedObject {
|
|
302
|
+
@NSManaged public var title: String?
|
|
303
|
+
@NSManaged public var timestamp: Date?
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**Benefit**: Full control over isolation.
|
|
308
|
+
|
|
309
|
+
## Common Patterns
|
|
310
|
+
|
|
311
|
+
### Fetch on main thread
|
|
312
|
+
|
|
313
|
+
```swift
|
|
314
|
+
@MainActor
|
|
315
|
+
func fetchArticles() throws -> [Article] {
|
|
316
|
+
let request = Article.fetchRequest()
|
|
317
|
+
return try viewContext.fetch(request)
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Background save
|
|
322
|
+
|
|
323
|
+
```swift
|
|
324
|
+
func saveInBackground() async throws {
|
|
325
|
+
let context = container.newBackgroundContext()
|
|
326
|
+
try await context.perform {
|
|
327
|
+
let article = Article(context: context)
|
|
328
|
+
article.title = "New Article"
|
|
329
|
+
try context.save()
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Pass ID, fetch in context
|
|
335
|
+
|
|
336
|
+
```swift
|
|
337
|
+
@MainActor
|
|
338
|
+
func displayArticle(id: NSManagedObjectID) {
|
|
339
|
+
guard let article = viewContext.object(with: id) as? Article else {
|
|
340
|
+
return
|
|
341
|
+
}
|
|
342
|
+
// Use article
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
func processArticle(id: NSManagedObjectID) async throws {
|
|
346
|
+
let context = container.newBackgroundContext()
|
|
347
|
+
try await context.perform {
|
|
348
|
+
guard let article = context.object(with: id) as? Article else { return }
|
|
349
|
+
// Process article
|
|
350
|
+
try context.save()
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Batch operations
|
|
356
|
+
|
|
357
|
+
```swift
|
|
358
|
+
func deleteAllArticles() async throws {
|
|
359
|
+
let context = container.newBackgroundContext()
|
|
360
|
+
try await context.perform {
|
|
361
|
+
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Article")
|
|
362
|
+
let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)
|
|
363
|
+
try context.execute(deleteRequest)
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## SwiftUI Integration
|
|
369
|
+
|
|
370
|
+
### Environment injection
|
|
371
|
+
|
|
372
|
+
```swift
|
|
373
|
+
@main
|
|
374
|
+
struct MyApp: App {
|
|
375
|
+
let persistentContainer = NSPersistentContainer(name: "MyApp")
|
|
376
|
+
|
|
377
|
+
var body: some Scene {
|
|
378
|
+
WindowGroup {
|
|
379
|
+
ContentView()
|
|
380
|
+
.environment(\.managedObjectContext, persistentContainer.viewContext)
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### View usage
|
|
387
|
+
|
|
388
|
+
```swift
|
|
389
|
+
struct ContentView: View {
|
|
390
|
+
@Environment(\.managedObjectContext) private var viewContext
|
|
391
|
+
@FetchRequest(
|
|
392
|
+
sortDescriptors: [NSSortDescriptor(keyPath: \Article.timestamp, ascending: true)]
|
|
393
|
+
) private var articles: FetchedResults<Article>
|
|
394
|
+
|
|
395
|
+
var body: some View {
|
|
396
|
+
List(articles) { article in
|
|
397
|
+
Text(article.title ?? "")
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## Best Practices
|
|
404
|
+
|
|
405
|
+
1. **Pass NSManagedObjectID only** - never managed objects
|
|
406
|
+
2. **Use perform { }** - don't access context directly
|
|
407
|
+
3. **@MainActor for view context** - enforce main thread
|
|
408
|
+
4. **Use background contexts** - run heavy work off the main thread
|
|
409
|
+
5. **Manual code generation** - control isolation
|
|
410
|
+
6. **Keep it simple** - avoid custom executors unless needed
|
|
411
|
+
7. **Enable Core Data debugging** - catch thread violations
|
|
412
|
+
8. **Merge changes automatically** - `automaticallyMergesChangesFromParent = true`
|
|
413
|
+
9. **Use background contexts** - for heavy operations
|
|
414
|
+
10. **Test with Thread Sanitizer** - catch violations early
|
|
415
|
+
|
|
416
|
+
## Debugging
|
|
417
|
+
|
|
418
|
+
### Enable Core Data concurrency debugging
|
|
419
|
+
|
|
420
|
+
```swift
|
|
421
|
+
// Launch argument
|
|
422
|
+
-com.apple.CoreData.ConcurrencyDebug 1
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
Crashes immediately on thread violations.
|
|
426
|
+
|
|
427
|
+
### Thread Sanitizer
|
|
428
|
+
|
|
429
|
+
Enable in scheme settings to catch data races.
|
|
430
|
+
|
|
431
|
+
### Assertions
|
|
432
|
+
|
|
433
|
+
```swift
|
|
434
|
+
@MainActor
|
|
435
|
+
func fetchArticles() -> [Article] {
|
|
436
|
+
assert(Thread.isMainThread)
|
|
437
|
+
// Fetch from viewContext
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## Decision Tree
|
|
442
|
+
|
|
443
|
+
```
|
|
444
|
+
Need to access Core Data?
|
|
445
|
+
├─ UI/View context?
|
|
446
|
+
│ └─ Use @MainActor + viewContext
|
|
447
|
+
│
|
|
448
|
+
├─ Background operation?
|
|
449
|
+
│ ├─ Quick operation? → perform { } on background context
|
|
450
|
+
│ └─ Batch operation? → NSBatchDeleteRequest/NSBatchUpdateRequest
|
|
451
|
+
│
|
|
452
|
+
├─ Pass between contexts?
|
|
453
|
+
│ └─ Use NSManagedObjectID only
|
|
454
|
+
│
|
|
455
|
+
└─ Need Sendable type?
|
|
456
|
+
├─ Can refactor? → Use DAO pattern
|
|
457
|
+
└─ Can't refactor? → Pass NSManagedObjectID
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
## Migration Strategy
|
|
461
|
+
|
|
462
|
+
### For existing projects
|
|
463
|
+
|
|
464
|
+
1. **Enable manual code generation** for all entities
|
|
465
|
+
2. **Mark entities as nonisolated** if using default @MainActor
|
|
466
|
+
3. **Wrap Core Data access** in CoreDataStore
|
|
467
|
+
4. **Use @MainActor** for view context operations
|
|
468
|
+
5. **Use background contexts** for write-heavy work
|
|
469
|
+
6. **Pass NSManagedObjectID** between contexts
|
|
470
|
+
7. **Test with debugging enabled**
|
|
471
|
+
|
|
472
|
+
### For new projects
|
|
473
|
+
|
|
474
|
+
1. **Start with simple pattern** (CoreDataStore)
|
|
475
|
+
2. **Manual code generation** from the start
|
|
476
|
+
3. **Consider DAOs** if heavy cross-context usage
|
|
477
|
+
4. **Enable strict concurrency** early
|
|
478
|
+
|
|
479
|
+
## Common Mistakes
|
|
480
|
+
|
|
481
|
+
### ❌ Passing managed objects
|
|
482
|
+
|
|
483
|
+
```swift
|
|
484
|
+
func process(article: Article) async {
|
|
485
|
+
// ❌ Article not Sendable
|
|
486
|
+
}
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### ❌ Accessing context from wrong thread
|
|
490
|
+
|
|
491
|
+
```swift
|
|
492
|
+
func background() async {
|
|
493
|
+
let articles = viewContext.fetch(request) // ❌ Not on main thread
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### ❌ Using @unchecked Sendable
|
|
498
|
+
|
|
499
|
+
```swift
|
|
500
|
+
extension Article: @unchecked Sendable {} // ❌ Doesn't make it safe
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### ❌ Not using perform
|
|
504
|
+
|
|
505
|
+
```swift
|
|
506
|
+
func save() async {
|
|
507
|
+
backgroundContext.save() // ❌ Not on context's thread
|
|
508
|
+
}
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
## Related References
|
|
512
|
+
|
|
513
|
+
- See `threading.md` for general Core Data threading patterns
|
|
514
|
+
- See `batch-operations.md` for async batch operation patterns
|
|
515
|
+
- See `stack-setup.md` for container setup with async/await
|
|
516
|
+
- See `testing.md` for testing async Core Data code
|
|
517
|
+
|
|
518
|
+
## Further Learning
|
|
519
|
+
|
|
520
|
+
For Core Data best practices, migration strategies, and advanced patterns:
|
|
521
|
+
- [Core Data Best Practices Repository](https://github.com/avanderlee/CoreDataBestPractices)
|
|
522
|
+
- [Swift Concurrency Course](https://www.swiftconcurrencycourse.com)
|