opencode-starterkit 1.0.1
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/README.md +47 -0
- package/baseline/.env.example +196 -0
- package/baseline/.template-manifest.json +646 -0
- package/baseline/.version +1 -0
- package/baseline/AGENTS.md +410 -0
- package/baseline/AGENT_ALIGNMENT.md +564 -0
- package/baseline/README.md +79 -0
- package/baseline/agent/build.md +373 -0
- package/baseline/agent/explore.md +96 -0
- package/baseline/agent/general.md +186 -0
- package/baseline/agent/painter.md +74 -0
- package/baseline/agent/plan.md +435 -0
- package/baseline/agent/review.md +243 -0
- package/baseline/agent/runner.md +79 -0
- package/baseline/agent/scout.md +100 -0
- package/baseline/agent/vision.md +91 -0
- package/baseline/command/compound.md +143 -0
- package/baseline/command/create.md +213 -0
- package/baseline/command/design.md +112 -0
- package/baseline/command/handoff.md +147 -0
- package/baseline/command/init-context.md +273 -0
- package/baseline/command/init-user.md +105 -0
- package/baseline/command/init.md +117 -0
- package/baseline/command/lfg.md +170 -0
- package/baseline/command/plan.md +355 -0
- package/baseline/command/pr.md +161 -0
- package/baseline/command/research.md +125 -0
- package/baseline/command/resume.md +87 -0
- package/baseline/command/review-codebase.md +131 -0
- package/baseline/command/ship.md +342 -0
- package/baseline/command/start.md +158 -0
- package/baseline/command/status.md +117 -0
- package/baseline/command/ui-review.md +92 -0
- package/baseline/command/ui-slop-check.md +146 -0
- package/baseline/command/verify.md +160 -0
- package/baseline/context/README.md +29 -0
- package/baseline/dcp.jsonc +72 -0
- package/baseline/memory/README.md +89 -0
- package/baseline/memory/_templates/design.md +59 -0
- package/baseline/memory/_templates/prd.md +192 -0
- package/baseline/memory/_templates/project.md +58 -0
- package/baseline/memory/_templates/proposal.md +38 -0
- package/baseline/memory/_templates/roadmap.md +93 -0
- package/baseline/memory/_templates/state.md +89 -0
- package/baseline/memory/_templates/tasks.md +198 -0
- package/baseline/memory/_templates/tech-stack.md +85 -0
- package/baseline/memory/_templates/user.md +26 -0
- package/baseline/memory/project/gotchas.md +67 -0
- package/baseline/memory/project/project.md +92 -0
- package/baseline/memory/project/roadmap.md +142 -0
- package/baseline/memory/project/state.md +84 -0
- package/baseline/memory/project/tech-stack.md +53 -0
- package/baseline/memory/project/user.md +38 -0
- package/baseline/memory/research/benchmark-framework.md +162 -0
- package/baseline/memory/research/ccpm-analysis.md +334 -0
- package/baseline/memory/research/context-management-analysis.md +685 -0
- package/baseline/memory/research/effectiveness-audit.md +213 -0
- package/baseline/memory/research/opencode-mcp-bug-report.md +129 -0
- package/baseline/memory/research/openspec-analysis.md +226 -0
- package/baseline/memory/session-context.md +40 -0
- package/baseline/opencode.json +1431 -0
- package/baseline/opencode.json.tui-migration.bak +1380 -0
- package/baseline/package-lock.json +87 -0
- package/baseline/package.json +21 -0
- package/baseline/plans/1768385996691-silent-wizard.md +247 -0
- package/baseline/plans/1770006237537-mighty-otter.md +418 -0
- package/baseline/plans/1770006913647-glowing-forest.md +170 -0
- package/baseline/plans/1770013678126-witty-planet.md +278 -0
- package/baseline/plans/1770112267595-shiny-rocket.md +258 -0
- package/baseline/plans/swarm-protocol.md +123 -0
- package/baseline/plugin/README.md +70 -0
- package/baseline/plugin/copilot-auth.ts +607 -0
- package/baseline/plugin/lib/capture.ts +177 -0
- package/baseline/plugin/lib/context.ts +198 -0
- package/baseline/plugin/lib/curator.ts +234 -0
- package/baseline/plugin/lib/db/maintenance.ts +312 -0
- package/baseline/plugin/lib/db/observations.ts +299 -0
- package/baseline/plugin/lib/db/pipeline.ts +520 -0
- package/baseline/plugin/lib/db/schema.ts +356 -0
- package/baseline/plugin/lib/db/types.ts +211 -0
- package/baseline/plugin/lib/distill.ts +376 -0
- package/baseline/plugin/lib/inject.ts +126 -0
- package/baseline/plugin/lib/memory-admin-tools.ts +188 -0
- package/baseline/plugin/lib/memory-db.ts +58 -0
- package/baseline/plugin/lib/memory-helpers.ts +111 -0
- package/baseline/plugin/lib/memory-hooks.ts +195 -0
- package/baseline/plugin/lib/memory-tools.ts +341 -0
- package/baseline/plugin/lib/notify.ts +81 -0
- package/baseline/plugin/memory.ts +89 -0
- package/baseline/plugin/notification.ts.bak +64 -0
- package/baseline/plugin/package.json +7 -0
- package/baseline/plugin/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +178 -0
- package/baseline/plugin/sdk/copilot/chat/get-response-metadata.ts +15 -0
- package/baseline/plugin/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-api-types.ts +72 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-chat-language-model.ts +833 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-chat-options.ts +30 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +48 -0
- package/baseline/plugin/sdk/copilot/chat/openai-compatible-prepare-tools.ts +92 -0
- package/baseline/plugin/sdk/copilot/copilot-provider.ts +94 -0
- package/baseline/plugin/sdk/copilot/index.ts +5 -0
- package/baseline/plugin/sdk/copilot/openai-compatible-error.ts +30 -0
- package/baseline/plugin/sessions.ts +428 -0
- package/baseline/plugin/skill-mcp.ts +618 -0
- package/baseline/plugin/tsconfig.json +16 -0
- package/baseline/skill/accessibility-audit/SKILL.md +191 -0
- package/baseline/skill/agent-browser/SKILL.md +413 -0
- package/baseline/skill/agent-teams/SKILL.md +268 -0
- package/baseline/skill/augment-context-engine/SKILL.md +122 -0
- package/baseline/skill/augment-context-engine/mcp.json +6 -0
- package/baseline/skill/beads/SKILL.md +181 -0
- package/baseline/skill/beads/references/BEST_PRACTICES.md +27 -0
- package/baseline/skill/beads/references/BOUNDARIES.md +219 -0
- package/baseline/skill/beads/references/DEPENDENCIES.md +124 -0
- package/baseline/skill/beads/references/EXAMPLES.md +45 -0
- package/baseline/skill/beads/references/FILE_CLAIMING.md +101 -0
- package/baseline/skill/beads/references/GIT_SYNC.md +25 -0
- package/baseline/skill/beads/references/HIERARCHY.md +71 -0
- package/baseline/skill/beads/references/MULTI_AGENT.md +40 -0
- package/baseline/skill/beads/references/RESUMABILITY.md +177 -0
- package/baseline/skill/beads/references/SESSION_PROTOCOL.md +61 -0
- package/baseline/skill/beads/references/TASK_CREATION.md +38 -0
- package/baseline/skill/beads/references/TROUBLESHOOTING.md +38 -0
- package/baseline/skill/beads/references/WORKFLOWS.md +226 -0
- package/baseline/skill/beads-bridge/SKILL.md +321 -0
- package/baseline/skill/brainstorming/SKILL.md +114 -0
- package/baseline/skill/chrome-devtools/SKILL.md +76 -0
- package/baseline/skill/chrome-devtools/mcp.json +19 -0
- package/baseline/skill/cloudflare/SKILL.md +253 -0
- package/baseline/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/baseline/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/baseline/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/baseline/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/baseline/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/baseline/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/baseline/skill/cloudflare/references/ai-search/README.md +14 -0
- package/baseline/skill/cloudflare/references/ai-search/api.md +38 -0
- package/baseline/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/baseline/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/baseline/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/baseline/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/baseline/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/baseline/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/baseline/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/baseline/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/baseline/skill/cloudflare/references/api/README.md +21 -0
- package/baseline/skill/cloudflare/references/api/api.md +31 -0
- package/baseline/skill/cloudflare/references/api/configuration.md +20 -0
- package/baseline/skill/cloudflare/references/api/gotchas.md +28 -0
- package/baseline/skill/cloudflare/references/api/patterns.md +47 -0
- package/baseline/skill/cloudflare/references/api-shield/README.md +20 -0
- package/baseline/skill/cloudflare/references/api-shield/api.md +78 -0
- package/baseline/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/baseline/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/baseline/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/baseline/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/baseline/skill/cloudflare/references/bindings/README.md +14 -0
- package/baseline/skill/cloudflare/references/bindings/api.md +3 -0
- package/baseline/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/baseline/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/baseline/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/baseline/skill/cloudflare/references/bot-management/README.md +71 -0
- package/baseline/skill/cloudflare/references/bot-management/api.md +168 -0
- package/baseline/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/baseline/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/baseline/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/baseline/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/baseline/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/baseline/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/baseline/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/baseline/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/baseline/skill/cloudflare/references/c3/README.md +264 -0
- package/baseline/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/baseline/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/baseline/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/baseline/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/baseline/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/baseline/skill/cloudflare/references/containers/README.md +16 -0
- package/baseline/skill/cloudflare/references/containers/api.md +43 -0
- package/baseline/skill/cloudflare/references/containers/configuration.md +56 -0
- package/baseline/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/baseline/skill/cloudflare/references/containers/patterns.md +40 -0
- package/baseline/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/baseline/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/baseline/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/baseline/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/baseline/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/baseline/skill/cloudflare/references/d1/README.md +92 -0
- package/baseline/skill/cloudflare/references/d1/api.md +141 -0
- package/baseline/skill/cloudflare/references/d1/configuration.md +127 -0
- package/baseline/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/baseline/skill/cloudflare/references/d1/patterns.md +144 -0
- package/baseline/skill/cloudflare/references/ddos/README.md +34 -0
- package/baseline/skill/cloudflare/references/ddos/api.md +136 -0
- package/baseline/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/baseline/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/baseline/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/baseline/skill/cloudflare/references/do-storage/README.md +62 -0
- package/baseline/skill/cloudflare/references/do-storage/api.md +89 -0
- package/baseline/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/baseline/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/baseline/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/baseline/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/baseline/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/baseline/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/baseline/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/baseline/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/baseline/skill/cloudflare/references/email-routing/README.md +18 -0
- package/baseline/skill/cloudflare/references/email-routing/api.md +46 -0
- package/baseline/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/baseline/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/baseline/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/baseline/skill/cloudflare/references/email-workers/README.md +598 -0
- package/baseline/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/baseline/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/baseline/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/baseline/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/baseline/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/baseline/skill/cloudflare/references/images/README.md +14 -0
- package/baseline/skill/cloudflare/references/images/api.md +3 -0
- package/baseline/skill/cloudflare/references/images/configuration.md +45 -0
- package/baseline/skill/cloudflare/references/images/gotchas.md +23 -0
- package/baseline/skill/cloudflare/references/images/patterns.md +31 -0
- package/baseline/skill/cloudflare/references/kv/README.md +60 -0
- package/baseline/skill/cloudflare/references/kv/api.md +114 -0
- package/baseline/skill/cloudflare/references/kv/configuration.md +92 -0
- package/baseline/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/baseline/skill/cloudflare/references/kv/patterns.md +139 -0
- package/baseline/skill/cloudflare/references/miniflare/README.md +64 -0
- package/baseline/skill/cloudflare/references/miniflare/api.md +144 -0
- package/baseline/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/baseline/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/baseline/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/baseline/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/baseline/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/baseline/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/baseline/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/baseline/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/baseline/skill/cloudflare/references/observability/README.md +18 -0
- package/baseline/skill/cloudflare/references/observability/api.md +51 -0
- package/baseline/skill/cloudflare/references/observability/configuration.md +60 -0
- package/baseline/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/baseline/skill/cloudflare/references/observability/patterns.md +42 -0
- package/baseline/skill/cloudflare/references/pages/README.md +76 -0
- package/baseline/skill/cloudflare/references/pages/api.md +200 -0
- package/baseline/skill/cloudflare/references/pages/configuration.md +228 -0
- package/baseline/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/baseline/skill/cloudflare/references/pages/patterns.md +145 -0
- package/baseline/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/baseline/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/baseline/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/baseline/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/baseline/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/baseline/skill/cloudflare/references/pipelines/README.md +664 -0
- package/baseline/skill/cloudflare/references/pulumi/README.md +107 -0
- package/baseline/skill/cloudflare/references/pulumi/api.md +194 -0
- package/baseline/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/baseline/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/baseline/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/baseline/skill/cloudflare/references/queues/README.md +69 -0
- package/baseline/skill/cloudflare/references/queues/api.md +138 -0
- package/baseline/skill/cloudflare/references/queues/configuration.md +125 -0
- package/baseline/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/baseline/skill/cloudflare/references/queues/patterns.md +155 -0
- package/baseline/skill/cloudflare/references/r2/README.md +61 -0
- package/baseline/skill/cloudflare/references/r2/api.md +127 -0
- package/baseline/skill/cloudflare/references/r2/configuration.md +76 -0
- package/baseline/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/baseline/skill/cloudflare/references/r2/patterns.md +127 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/baseline/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/baseline/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/baseline/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/baseline/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/baseline/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/baseline/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/baseline/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/baseline/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/baseline/skill/cloudflare/references/sandbox/README.md +90 -0
- package/baseline/skill/cloudflare/references/sandbox/api.md +178 -0
- package/baseline/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/baseline/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/baseline/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/baseline/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/baseline/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/baseline/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/baseline/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/baseline/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/baseline/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/baseline/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/baseline/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/baseline/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/baseline/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/baseline/skill/cloudflare/references/snippets/README.md +15 -0
- package/baseline/skill/cloudflare/references/snippets/api.md +47 -0
- package/baseline/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/baseline/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/baseline/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/baseline/skill/cloudflare/references/spectrum/README.md +16 -0
- package/baseline/skill/cloudflare/references/spectrum/api.md +24 -0
- package/baseline/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/baseline/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/baseline/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/baseline/skill/cloudflare/references/static-assets/README.md +14 -0
- package/baseline/skill/cloudflare/references/static-assets/api.md +3 -0
- package/baseline/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/baseline/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/baseline/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/baseline/skill/cloudflare/references/stream/README.md +103 -0
- package/baseline/skill/cloudflare/references/stream/api.md +204 -0
- package/baseline/skill/cloudflare/references/stream/configuration.md +127 -0
- package/baseline/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/baseline/skill/cloudflare/references/stream/patterns.md +152 -0
- package/baseline/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/baseline/skill/cloudflare/references/terraform/README.md +76 -0
- package/baseline/skill/cloudflare/references/terraform/api.md +159 -0
- package/baseline/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/baseline/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/baseline/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/baseline/skill/cloudflare/references/tunnel/README.md +82 -0
- package/baseline/skill/cloudflare/references/tunnel/api.md +105 -0
- package/baseline/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/baseline/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/baseline/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/baseline/skill/cloudflare/references/turn/README.md +699 -0
- package/baseline/skill/cloudflare/references/turnstile/README.md +14 -0
- package/baseline/skill/cloudflare/references/turnstile/api.md +3 -0
- package/baseline/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/baseline/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/baseline/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/baseline/skill/cloudflare/references/vectorize/README.md +682 -0
- package/baseline/skill/cloudflare/references/waf/README.md +14 -0
- package/baseline/skill/cloudflare/references/waf/api.md +3 -0
- package/baseline/skill/cloudflare/references/waf/configuration.md +44 -0
- package/baseline/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/baseline/skill/cloudflare/references/waf/patterns.md +29 -0
- package/baseline/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/baseline/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/baseline/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/baseline/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/baseline/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/baseline/skill/cloudflare/references/workerd/README.md +47 -0
- package/baseline/skill/cloudflare/references/workerd/api.md +199 -0
- package/baseline/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/baseline/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/baseline/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/baseline/skill/cloudflare/references/workers/README.md +96 -0
- package/baseline/skill/cloudflare/references/workers/api.md +137 -0
- package/baseline/skill/cloudflare/references/workers/configuration.md +147 -0
- package/baseline/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/baseline/skill/cloudflare/references/workers/patterns.md +149 -0
- package/baseline/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/baseline/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/baseline/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/baseline/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/baseline/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/baseline/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/baseline/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/baseline/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/baseline/skill/cloudflare/references/workflows/README.md +62 -0
- package/baseline/skill/cloudflare/references/workflows/api.md +125 -0
- package/baseline/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/baseline/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/baseline/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/baseline/skill/cloudflare/references/wrangler/README.md +90 -0
- package/baseline/skill/cloudflare/references/wrangler/api.md +140 -0
- package/baseline/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/baseline/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/baseline/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/baseline/skill/cloudflare/references/zaraz/README.md +360 -0
- package/baseline/skill/code-navigation/SKILL.md +130 -0
- package/baseline/skill/compaction/SKILL.md +317 -0
- package/baseline/skill/condition-based-waiting/SKILL.md +123 -0
- package/baseline/skill/condition-based-waiting/example.ts +158 -0
- package/baseline/skill/context-engineering/SKILL.md +176 -0
- package/baseline/skill/context-initialization/SKILL.md +70 -0
- package/baseline/skill/context-management/SKILL.md +163 -0
- package/baseline/skill/core-data-expert/SKILL.md +93 -0
- package/baseline/skill/core-data-expert/references/batch-operations.md +543 -0
- package/baseline/skill/core-data-expert/references/cloudkit-integration.md +259 -0
- package/baseline/skill/core-data-expert/references/concurrency.md +522 -0
- package/baseline/skill/core-data-expert/references/fetch-requests.md +643 -0
- package/baseline/skill/core-data-expert/references/glossary.md +233 -0
- package/baseline/skill/core-data-expert/references/migration.md +393 -0
- package/baseline/skill/core-data-expert/references/model-configuration.md +597 -0
- package/baseline/skill/core-data-expert/references/performance.md +300 -0
- package/baseline/skill/core-data-expert/references/persistent-history.md +553 -0
- package/baseline/skill/core-data-expert/references/project-audit.md +60 -0
- package/baseline/skill/core-data-expert/references/saving.md +574 -0
- package/baseline/skill/core-data-expert/references/stack-setup.md +625 -0
- package/baseline/skill/core-data-expert/references/testing.md +300 -0
- package/baseline/skill/core-data-expert/references/threading.md +589 -0
- package/baseline/skill/deep-research/SKILL.md +384 -0
- package/baseline/skill/defense-in-depth/SKILL.md +166 -0
- package/baseline/skill/design-system-audit/SKILL.md +153 -0
- package/baseline/skill/development-lifecycle/SKILL.md +356 -0
- package/baseline/skill/dispatching-parallel-agents/SKILL.md +191 -0
- package/baseline/skill/executing-plans/SKILL.md +247 -0
- package/baseline/skill/figma/SKILL.md +224 -0
- package/baseline/skill/finishing-a-development-branch/SKILL.md +357 -0
- package/baseline/skill/frontend-design/SKILL.md +235 -0
- package/baseline/skill/frontend-design/references/animation/motion-advanced.md +224 -0
- package/baseline/skill/frontend-design/references/animation/motion-core.md +181 -0
- package/baseline/skill/frontend-design/references/canvas/execution.md +90 -0
- package/baseline/skill/frontend-design/references/canvas/philosophy.md +94 -0
- package/baseline/skill/frontend-design/references/design/color-system.md +111 -0
- package/baseline/skill/frontend-design/references/design/interaction.md +149 -0
- package/baseline/skill/frontend-design/references/design/typography-rules.md +106 -0
- package/baseline/skill/frontend-design/references/design/ux-writing.md +99 -0
- package/baseline/skill/frontend-design/references/shadcn/accessibility.md +132 -0
- package/baseline/skill/frontend-design/references/shadcn/core-components.md +153 -0
- package/baseline/skill/frontend-design/references/shadcn/form-components.md +158 -0
- package/baseline/skill/frontend-design/references/shadcn/setup.md +69 -0
- package/baseline/skill/frontend-design/references/shadcn/theming.md +152 -0
- package/baseline/skill/frontend-design/references/tailwind/responsive.md +112 -0
- package/baseline/skill/frontend-design/references/tailwind/utilities-layout.md +134 -0
- package/baseline/skill/frontend-design/references/tailwind/utilities-styling.md +165 -0
- package/baseline/skill/frontend-design/references/tailwind/v4-config.md +147 -0
- package/baseline/skill/frontend-design/references/tailwind/v4-features.md +128 -0
- package/baseline/skill/gemini-large-context/SKILL.md +216 -0
- package/baseline/skill/index-knowledge/SKILL.md +413 -0
- package/baseline/skill/jira/SKILL.md +283 -0
- package/baseline/skill/jira/mcp.json +6 -0
- package/baseline/skill/memory-system/SKILL.md +84 -0
- package/baseline/skill/mockup-to-code/SKILL.md +184 -0
- package/baseline/skill/mqdh/SKILL.md +171 -0
- package/baseline/skill/obsidian/SKILL.md +192 -0
- package/baseline/skill/obsidian/mcp.json +22 -0
- package/baseline/skill/opensrc/SKILL.md +127 -0
- package/baseline/skill/opensrc/references/architecture.md +176 -0
- package/baseline/skill/opensrc/references/cli-usage.md +176 -0
- package/baseline/skill/opensrc/references/registry-support.md +137 -0
- package/baseline/skill/pdf-extract/SKILL.md +438 -0
- package/baseline/skill/playwright/SKILL.md +320 -0
- package/baseline/skill/playwright/mcp.json +16 -0
- package/baseline/skill/playwriter/SKILL.md +158 -0
- package/baseline/skill/polar/SKILL.md +102 -0
- package/baseline/skill/prd/SKILL.md +146 -0
- package/baseline/skill/prd-task/SKILL.md +182 -0
- package/baseline/skill/prd-task/references/prd-schema.json +124 -0
- package/baseline/skill/ralph/SKILL.md +296 -0
- package/baseline/skill/react-best-practices/AGENTS.md +2410 -0
- package/baseline/skill/react-best-practices/README.md +123 -0
- package/baseline/skill/react-best-practices/SKILL.md +133 -0
- package/baseline/skill/react-best-practices/metadata.json +15 -0
- package/baseline/skill/react-best-practices/rules/_sections.md +46 -0
- package/baseline/skill/react-best-practices/rules/_template.md +28 -0
- package/baseline/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/baseline/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/baseline/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/baseline/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/baseline/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/baseline/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/baseline/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/baseline/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/baseline/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/baseline/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/baseline/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/baseline/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/baseline/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/baseline/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/baseline/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/baseline/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/baseline/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/baseline/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/baseline/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/baseline/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/baseline/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/baseline/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/baseline/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/baseline/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/baseline/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/baseline/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/baseline/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/baseline/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/baseline/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/baseline/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/baseline/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/baseline/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/baseline/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/baseline/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/baseline/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/baseline/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/baseline/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/baseline/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/baseline/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/baseline/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/baseline/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/baseline/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/baseline/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/baseline/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/baseline/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/baseline/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/baseline/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/baseline/skill/receiving-code-review/SKILL.md +252 -0
- package/baseline/skill/requesting-code-review/SKILL.md +397 -0
- package/baseline/skill/requesting-code-review/review.md +160 -0
- package/baseline/skill/resend/SKILL.md +177 -0
- package/baseline/skill/resend/references/react-email.md +287 -0
- package/baseline/skill/resend/references/receive-email.md +248 -0
- package/baseline/skill/resend/references/send-email.md +318 -0
- package/baseline/skill/root-cause-tracing/SKILL.md +192 -0
- package/baseline/skill/root-cause-tracing/find-polluter.sh +63 -0
- package/baseline/skill/session-management/SKILL.md +9 -0
- package/baseline/skill/sharing-skills/SKILL.md +214 -0
- package/baseline/skill/skill-creator/SKILL.md +156 -0
- package/baseline/skill/source-code-research/SKILL.md +293 -0
- package/baseline/skill/source-code-research/references/analysis-tips.md +43 -0
- package/baseline/skill/source-code-research/references/anti-patterns.md +36 -0
- package/baseline/skill/source-code-research/references/common-patterns.md +57 -0
- package/baseline/skill/source-code-research/references/example-workflow.md +60 -0
- package/baseline/skill/source-code-research/references/further-reading.md +5 -0
- package/baseline/skill/source-code-research/references/source-structure.md +45 -0
- package/baseline/skill/stitch/SKILL.md +147 -0
- package/baseline/skill/stitch/mcp.json +9 -0
- package/baseline/skill/structured-edit/SKILL.md +181 -0
- package/baseline/skill/subagent-driven-development/SKILL.md +237 -0
- package/baseline/skill/supabase/SKILL.md +130 -0
- package/baseline/skill/supabase/mcp.json +27 -0
- package/baseline/skill/supabase-postgres-best-practices/AGENTS.md +1490 -0
- package/baseline/skill/supabase-postgres-best-practices/SKILL.md +65 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/advanced-full-text-search.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/advanced-jsonb-indexing.md +49 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-idle-timeout.md +46 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-limits.md +44 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-pooling.md +41 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/conn-prepared-statements.md +46 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-batch-inserts.md +54 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-n-plus-one.md +53 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-pagination.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/data-upsert.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-advisory.md +56 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-deadlock-prevention.md +68 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-short-transactions.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/lock-skip-locked.md +54 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/monitor-explain-analyze.md +45 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/monitor-pg-stat-statements.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/monitor-vacuum-analyze.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-composite-indexes.md +44 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-covering-indexes.md +40 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-index-types.md +45 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-missing-indexes.md +43 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/query-partial-indexes.md +45 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-data-types.md +46 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-foreign-key-indexes.md +59 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-lowercase-identifiers.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-partitioning.md +55 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/schema-primary-keys.md +61 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/security-privileges.md +54 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/security-rls-basics.md +50 -0
- package/baseline/skill/supabase-postgres-best-practices/rules/security-rls-performance.md +57 -0
- package/baseline/skill/swarm-coordination/SKILL.md +179 -0
- package/baseline/skill/swarm-coordination/references/architecture.md +39 -0
- package/baseline/skill/swarm-coordination/references/delegation-worker-protocol.md +145 -0
- package/baseline/skill/swarm-coordination/references/dependency-graph.md +50 -0
- package/baseline/skill/swarm-coordination/references/drift-check.md +90 -0
- package/baseline/skill/swarm-coordination/references/integration-beads.md +20 -0
- package/baseline/skill/swarm-coordination/references/launch-flow.md +186 -0
- package/baseline/skill/swarm-coordination/references/reconciler.md +172 -0
- package/baseline/skill/swarm-coordination/references/tier-enforcement.md +78 -0
- package/baseline/skill/swarm-coordination/references/tmux-integration.md +134 -0
- package/baseline/skill/swift-concurrency/SKILL.md +266 -0
- package/baseline/skill/swift-concurrency/references/actors.md +640 -0
- package/baseline/skill/swift-concurrency/references/async-algorithms.md +822 -0
- package/baseline/skill/swift-concurrency/references/async-await-basics.md +249 -0
- package/baseline/skill/swift-concurrency/references/async-sequences.md +670 -0
- package/baseline/skill/swift-concurrency/references/core-data.md +533 -0
- package/baseline/skill/swift-concurrency/references/glossary.md +128 -0
- package/baseline/skill/swift-concurrency/references/linting.md +142 -0
- package/baseline/skill/swift-concurrency/references/memory-management.md +542 -0
- package/baseline/skill/swift-concurrency/references/migration.md +1076 -0
- package/baseline/skill/swift-concurrency/references/performance.md +574 -0
- package/baseline/skill/swift-concurrency/references/sendable.md +578 -0
- package/baseline/skill/swift-concurrency/references/tasks.md +604 -0
- package/baseline/skill/swift-concurrency/references/testing.md +565 -0
- package/baseline/skill/swift-concurrency/references/threading.md +452 -0
- package/baseline/skill/swiftui-expert-skill/SKILL.md +329 -0
- package/baseline/skill/swiftui-expert-skill/references/animation-advanced.md +351 -0
- package/baseline/skill/swiftui-expert-skill/references/animation-basics.md +284 -0
- package/baseline/skill/swiftui-expert-skill/references/animation-transitions.md +326 -0
- package/baseline/skill/swiftui-expert-skill/references/image-optimization.md +286 -0
- package/baseline/skill/swiftui-expert-skill/references/layout-best-practices.md +312 -0
- package/baseline/skill/swiftui-expert-skill/references/liquid-glass.md +377 -0
- package/baseline/skill/swiftui-expert-skill/references/list-patterns.md +153 -0
- package/baseline/skill/swiftui-expert-skill/references/modern-apis.md +400 -0
- package/baseline/skill/swiftui-expert-skill/references/performance-patterns.md +377 -0
- package/baseline/skill/swiftui-expert-skill/references/scroll-patterns.md +305 -0
- package/baseline/skill/swiftui-expert-skill/references/sheet-navigation-patterns.md +292 -0
- package/baseline/skill/swiftui-expert-skill/references/state-management.md +447 -0
- package/baseline/skill/swiftui-expert-skill/references/text-formatting.md +285 -0
- package/baseline/skill/swiftui-expert-skill/references/view-structure.md +276 -0
- package/baseline/skill/systematic-debugging/SKILL.md +402 -0
- package/baseline/skill/test-driven-development/SKILL.md +388 -0
- package/baseline/skill/testing-anti-patterns/SKILL.md +333 -0
- package/baseline/skill/testing-skills-with-subagents/SKILL.md +405 -0
- package/baseline/skill/tilth-cli/SKILL.md +180 -0
- package/baseline/skill/tool-priority/SKILL.md +299 -0
- package/baseline/skill/ui-ux-research/SKILL.md +9 -0
- package/baseline/skill/using-git-worktrees/SKILL.md +259 -0
- package/baseline/skill/using-skills/SKILL.md +117 -0
- package/baseline/skill/v0/SKILL.md +158 -0
- package/baseline/skill/v1-run/SKILL.md +175 -0
- package/baseline/skill/v1-run/mcp.json +6 -0
- package/baseline/skill/vercel-deploy-claimable/SKILL.md +124 -0
- package/baseline/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/baseline/skill/verification-before-completion/SKILL.md +236 -0
- package/baseline/skill/verification-before-completion/references/VERIFICATION_PROTOCOL.md +171 -0
- package/baseline/skill/visual-analysis/SKILL.md +154 -0
- package/baseline/skill/web-design-guidelines/SKILL.md +46 -0
- package/baseline/skill/writing-plans/SKILL.md +320 -0
- package/baseline/skill/writing-skills/SKILL.md +287 -0
- package/baseline/skill/writing-skills/anthropic-best-practices.md +1173 -0
- package/baseline/skill/writing-skills/graphviz-conventions.dot +172 -0
- package/baseline/skill/writing-skills/persuasion-principles.md +220 -0
- package/baseline/skill/writing-skills/references/anti-patterns.md +25 -0
- package/baseline/skill/writing-skills/references/claude-search-optimization.md +140 -0
- package/baseline/skill/writing-skills/references/discovery-workflow.md +11 -0
- package/baseline/skill/writing-skills/references/file-organization.md +32 -0
- package/baseline/skill/writing-skills/references/flowcharts-and-examples.md +57 -0
- package/baseline/skill/writing-skills/references/rationalization-hardening.md +75 -0
- package/baseline/skill/writing-skills/references/testing-skill-types.md +52 -0
- package/baseline/tool/context7.ts +191 -0
- package/baseline/tool/grepsearch.ts +143 -0
- package/baseline/tsconfig.json +21 -0
- package/baseline/tui.json +15 -0
- package/bin/mrc-opc.mjs +25 -0
- package/bin/ocp.mjs +25 -0
- package/bin/opc.mjs +25 -0
- package/bin/opencode-starterkit.mjs +25 -0
- package/docs/reports/2026-03-18-memory-db-architecture-note.md +47 -0
- package/docs/reports/2026-03-18-vat-opencode-classification-matrix.md +180 -0
- package/package.json +25 -0
- package/src/cli.mjs +41 -0
- package/src/config-merge.mjs +61 -0
- package/src/constants.mjs +58 -0
- package/src/fs-utils.mjs +46 -0
- package/src/install-global.mjs +102 -0
- package/src/install-project.mjs +81 -0
- package/src/memory-bootstrap.mjs +29 -0
- package/src/prompt.mjs +31 -0
- package/src/templates.mjs +31 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Core Data Glossary
|
|
2
|
+
|
|
3
|
+
Quick reference for Core Data terminology.
|
|
4
|
+
|
|
5
|
+
## Core Concepts
|
|
6
|
+
|
|
7
|
+
**Core Data**
|
|
8
|
+
Apple's framework for object graph management and persistence.
|
|
9
|
+
|
|
10
|
+
**Persistent Store**
|
|
11
|
+
The underlying storage (typically SQLite database) where data is saved.
|
|
12
|
+
|
|
13
|
+
**Managed Object Model**
|
|
14
|
+
Describes your data schema (entities, attributes, relationships).
|
|
15
|
+
|
|
16
|
+
**Entity**
|
|
17
|
+
A class definition in your data model (like a database table).
|
|
18
|
+
|
|
19
|
+
**Attribute**
|
|
20
|
+
A property of an entity (like a database column).
|
|
21
|
+
|
|
22
|
+
**Relationship**
|
|
23
|
+
A connection between entities (one-to-one, one-to-many, many-to-many).
|
|
24
|
+
|
|
25
|
+
## Stack Components
|
|
26
|
+
|
|
27
|
+
**NSPersistentContainer**
|
|
28
|
+
Encapsulates the Core Data stack (model, coordinator, contexts).
|
|
29
|
+
|
|
30
|
+
**NSPersistentCloudKitContainer**
|
|
31
|
+
Extends NSPersistentContainer with CloudKit sync capabilities.
|
|
32
|
+
|
|
33
|
+
**NSPersistentStoreCoordinator**
|
|
34
|
+
Manages one or more persistent stores and coordinates access.
|
|
35
|
+
|
|
36
|
+
**NSManagedObjectContext**
|
|
37
|
+
Scratch pad for working with managed objects. Changes aren't persisted until saved.
|
|
38
|
+
|
|
39
|
+
**NSManagedObject**
|
|
40
|
+
Base class for Core Data objects. Represents a row in a database table.
|
|
41
|
+
|
|
42
|
+
**NSManagedObjectID**
|
|
43
|
+
Unique, immutable identifier for a managed object. Thread-safe.
|
|
44
|
+
|
|
45
|
+
## Context Types
|
|
46
|
+
|
|
47
|
+
**View Context**
|
|
48
|
+
Main queue context for UI operations. Runs on main thread.
|
|
49
|
+
|
|
50
|
+
**Background Context**
|
|
51
|
+
Private queue context for heavy work. Runs on background thread.
|
|
52
|
+
|
|
53
|
+
**Child Context**
|
|
54
|
+
Context with a parent context. Saves push changes to parent, not to disk.
|
|
55
|
+
|
|
56
|
+
## Fetching
|
|
57
|
+
|
|
58
|
+
**NSFetchRequest**
|
|
59
|
+
Describes a search for objects in the persistent store.
|
|
60
|
+
|
|
61
|
+
**NSFetchedResultsController**
|
|
62
|
+
Manages fetch results for table/collection views with automatic updates.
|
|
63
|
+
|
|
64
|
+
**Predicate**
|
|
65
|
+
Filter condition for fetch requests (like SQL WHERE clause).
|
|
66
|
+
|
|
67
|
+
**Sort Descriptor**
|
|
68
|
+
Defines ordering for fetch results (like SQL ORDER BY).
|
|
69
|
+
|
|
70
|
+
**Faulting**
|
|
71
|
+
Lazy loading mechanism. Object data loaded only when accessed.
|
|
72
|
+
|
|
73
|
+
**Prefetching**
|
|
74
|
+
Loading related objects eagerly to avoid faulting.
|
|
75
|
+
|
|
76
|
+
## Operations
|
|
77
|
+
|
|
78
|
+
**Save**
|
|
79
|
+
Persists changes from context to persistent store.
|
|
80
|
+
|
|
81
|
+
**Fetch**
|
|
82
|
+
Retrieves objects from persistent store.
|
|
83
|
+
|
|
84
|
+
**Insert**
|
|
85
|
+
Creates new object in context.
|
|
86
|
+
|
|
87
|
+
**Delete**
|
|
88
|
+
Marks object for deletion. Removed on save.
|
|
89
|
+
|
|
90
|
+
**Refresh**
|
|
91
|
+
Reloads object from persistent store, discarding in-memory changes.
|
|
92
|
+
|
|
93
|
+
**Reset**
|
|
94
|
+
Clears all objects from context, freeing memory.
|
|
95
|
+
|
|
96
|
+
**Rollback**
|
|
97
|
+
Discards all unsaved changes in context.
|
|
98
|
+
|
|
99
|
+
## Batch Operations
|
|
100
|
+
|
|
101
|
+
**NSBatchInsertRequest**
|
|
102
|
+
Inserts multiple objects at SQL level (iOS 14+).
|
|
103
|
+
|
|
104
|
+
**NSBatchDeleteRequest**
|
|
105
|
+
Deletes multiple objects at SQL level.
|
|
106
|
+
|
|
107
|
+
**NSBatchUpdateRequest**
|
|
108
|
+
Updates multiple objects at SQL level.
|
|
109
|
+
|
|
110
|
+
## Advanced Features
|
|
111
|
+
|
|
112
|
+
**Persistent History Tracking**
|
|
113
|
+
Records all changes in a transaction log for cross-context synchronization.
|
|
114
|
+
|
|
115
|
+
**Derived Attribute**
|
|
116
|
+
Computed attribute stored in database (e.g., `articles.@count`).
|
|
117
|
+
|
|
118
|
+
**Transformable**
|
|
119
|
+
Custom type stored using value transformer.
|
|
120
|
+
|
|
121
|
+
**Constraint**
|
|
122
|
+
Ensures attribute uniqueness (requires merge policy).
|
|
123
|
+
|
|
124
|
+
**Merge Policy**
|
|
125
|
+
Determines how conflicts are resolved when saving.
|
|
126
|
+
|
|
127
|
+
## Migration
|
|
128
|
+
|
|
129
|
+
**Lightweight Migration**
|
|
130
|
+
Automatic migration for simple model changes.
|
|
131
|
+
|
|
132
|
+
**Staged Migration**
|
|
133
|
+
Complex migration decomposed into steps (iOS 17+).
|
|
134
|
+
|
|
135
|
+
**Deferred Migration**
|
|
136
|
+
Delays cleanup work for better performance (iOS 14+).
|
|
137
|
+
|
|
138
|
+
**Composite Attribute**
|
|
139
|
+
Structured data within single attribute (iOS 17+).
|
|
140
|
+
|
|
141
|
+
**Mapping Model**
|
|
142
|
+
Describes how to migrate from one model version to another.
|
|
143
|
+
|
|
144
|
+
**Version Hash**
|
|
145
|
+
Checksum identifying a specific model version.
|
|
146
|
+
|
|
147
|
+
## Threading
|
|
148
|
+
|
|
149
|
+
**perform**
|
|
150
|
+
Executes block asynchronously on context's queue.
|
|
151
|
+
|
|
152
|
+
**performAndWait**
|
|
153
|
+
Executes block synchronously on context's queue (blocks calling thread).
|
|
154
|
+
|
|
155
|
+
**Thread Confinement**
|
|
156
|
+
Each context must be accessed only from its queue.
|
|
157
|
+
|
|
158
|
+
**automaticallyMergesChangesFromParent**
|
|
159
|
+
Context automatically receives changes from parent context.
|
|
160
|
+
|
|
161
|
+
## Validation
|
|
162
|
+
|
|
163
|
+
**validateForInsert**
|
|
164
|
+
Called before inserting object.
|
|
165
|
+
|
|
166
|
+
**validateForUpdate**
|
|
167
|
+
Called before updating object.
|
|
168
|
+
|
|
169
|
+
**validateForDelete**
|
|
170
|
+
Called before deleting object.
|
|
171
|
+
|
|
172
|
+
## Lifecycle
|
|
173
|
+
|
|
174
|
+
**awakeFromInsert**
|
|
175
|
+
Called once when object first inserted.
|
|
176
|
+
|
|
177
|
+
**awakeFromFetch**
|
|
178
|
+
Called when object loaded from store.
|
|
179
|
+
|
|
180
|
+
**willSave**
|
|
181
|
+
Called before each save.
|
|
182
|
+
|
|
183
|
+
**didSave**
|
|
184
|
+
Called after save completes.
|
|
185
|
+
|
|
186
|
+
**prepareForDeletion**
|
|
187
|
+
Called when object marked for deletion.
|
|
188
|
+
|
|
189
|
+
## CloudKit
|
|
190
|
+
|
|
191
|
+
**Container Identifier**
|
|
192
|
+
Unique ID for CloudKit container (e.g., `iCloud.com.example.app`).
|
|
193
|
+
|
|
194
|
+
**Development Environment**
|
|
195
|
+
CloudKit environment for testing (schema mutable).
|
|
196
|
+
|
|
197
|
+
**Production Environment**
|
|
198
|
+
CloudKit environment for released apps (schema immutable).
|
|
199
|
+
|
|
200
|
+
**Schema Initialization**
|
|
201
|
+
First run creates CloudKit schema from Core Data model.
|
|
202
|
+
|
|
203
|
+
**Event Notification**
|
|
204
|
+
Notification sent when CloudKit sync events occur.
|
|
205
|
+
|
|
206
|
+
## Debugging
|
|
207
|
+
|
|
208
|
+
**SQL Debug**
|
|
209
|
+
Launch argument to log SQL queries: `-com.apple.CoreData.SQLDebug 1`
|
|
210
|
+
|
|
211
|
+
**Concurrency Debug**
|
|
212
|
+
Launch argument to catch threading violations: `-com.apple.CoreData.ConcurrencyDebug 1`
|
|
213
|
+
|
|
214
|
+
**Migration Debug**
|
|
215
|
+
Launch argument to log migration steps: `-com.apple.CoreData.MigrationDebug 1`
|
|
216
|
+
|
|
217
|
+
## Common Acronyms
|
|
218
|
+
|
|
219
|
+
**CD** - Core Data
|
|
220
|
+
**MOC** - Managed Object Context (NSManagedObjectContext)
|
|
221
|
+
**MO** - Managed Object (NSManagedObject)
|
|
222
|
+
**FRC** - Fetched Results Controller (NSFetchedResultsController)
|
|
223
|
+
**PSC** - Persistent Store Coordinator (NSPersistentStoreCoordinator)
|
|
224
|
+
**MOD** - Managed Object Model (NSManagedObjectModel)
|
|
225
|
+
|
|
226
|
+
## Quick Reference
|
|
227
|
+
|
|
228
|
+
**Thread-safe:** NSManagedObjectID, NSPersistentStoreCoordinator
|
|
229
|
+
**Not thread-safe:** NSManagedObject, NSManagedObjectContext
|
|
230
|
+
**Main thread only:** View context operations
|
|
231
|
+
**Background thread:** Background context operations
|
|
232
|
+
**Automatic:** Lightweight migration (with NSPersistentContainer)
|
|
233
|
+
**Manual:** Staged migration, custom mapping models
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
# Schema Migration
|
|
2
|
+
|
|
3
|
+
Schema migration is the process of updating your Core Data model as your app evolves. Core Data provides three migration strategies: lightweight, staged (iOS 17+), and deferred (iOS 14+).
|
|
4
|
+
|
|
5
|
+
## When Migration is Required
|
|
6
|
+
|
|
7
|
+
Core Data refuses to open a store when the model doesn't match:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Error: NSPersistentStoreIncompatibleVersionHashError
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**This means:** Your data model changed, and you need to migrate.
|
|
14
|
+
|
|
15
|
+
## Lightweight Migration (Recommended)
|
|
16
|
+
|
|
17
|
+
Lightweight migration is automatic and handles most common changes.
|
|
18
|
+
|
|
19
|
+
### Enabling Lightweight Migration
|
|
20
|
+
|
|
21
|
+
With `NSPersistentContainer` (automatic):
|
|
22
|
+
```swift
|
|
23
|
+
let container = NSPersistentContainer(name: "Model")
|
|
24
|
+
// Lightweight migration enabled by default
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
With `NSPersistentStoreDescription` (automatic):
|
|
28
|
+
```swift
|
|
29
|
+
let description = NSPersistentStoreDescription(url: storeURL)
|
|
30
|
+
// Lightweight migration enabled by default
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Manual setup (if needed):
|
|
34
|
+
```swift
|
|
35
|
+
let options = [
|
|
36
|
+
NSMigratePersistentStoresAutomaticallyOption: true,
|
|
37
|
+
NSInferMappingModelAutomaticallyOption: true
|
|
38
|
+
]
|
|
39
|
+
try coordinator.addPersistentStore(
|
|
40
|
+
ofType: NSSQLiteStoreType,
|
|
41
|
+
configurationName: nil,
|
|
42
|
+
at: storeURL,
|
|
43
|
+
options: options
|
|
44
|
+
)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Supported Operations
|
|
48
|
+
|
|
49
|
+
**Attributes:**
|
|
50
|
+
- Add attribute
|
|
51
|
+
- Remove attribute
|
|
52
|
+
- Make optional attribute non-optional (with default value)
|
|
53
|
+
- Make non-optional attribute optional
|
|
54
|
+
- Rename attribute (using renaming identifier)
|
|
55
|
+
|
|
56
|
+
**Relationships:**
|
|
57
|
+
- Add relationship
|
|
58
|
+
- Remove relationship
|
|
59
|
+
- Rename relationship (using renaming identifier)
|
|
60
|
+
- Change cardinality (to-one ↔ to-many)
|
|
61
|
+
- Change ordering (ordered ↔ non-ordered)
|
|
62
|
+
|
|
63
|
+
**Entities:**
|
|
64
|
+
- Add entity
|
|
65
|
+
- Remove entity
|
|
66
|
+
- Rename entity (using renaming identifier)
|
|
67
|
+
- Create parent/child entity
|
|
68
|
+
- Move attributes up/down hierarchy
|
|
69
|
+
- Move entities in/out of hierarchy
|
|
70
|
+
|
|
71
|
+
**Cannot do:**
|
|
72
|
+
- Merge entity hierarchies (entities without common parent can't share parent)
|
|
73
|
+
|
|
74
|
+
### Renaming Attributes/Entities
|
|
75
|
+
|
|
76
|
+
Set the renaming identifier to the **old name**:
|
|
77
|
+
|
|
78
|
+
```swift
|
|
79
|
+
// In Data Model Editor:
|
|
80
|
+
// 1. Rename attribute from "color" to "paintColor"
|
|
81
|
+
// 2. Set Renaming Identifier to "color"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This allows chaining renames across versions:
|
|
85
|
+
- V1: `color`
|
|
86
|
+
- V2: `paintColor` (renaming ID: `color`)
|
|
87
|
+
- V3: `primaryColor` (renaming ID: `paintColor`)
|
|
88
|
+
|
|
89
|
+
Migration works: V1→V2, V2→V3, and V1→V3.
|
|
90
|
+
|
|
91
|
+
### Testing Lightweight Migration
|
|
92
|
+
|
|
93
|
+
```swift
|
|
94
|
+
// Check if migration is possible
|
|
95
|
+
let sourceModel = // ... load V1 model
|
|
96
|
+
let destinationModel = // ... load V2 model
|
|
97
|
+
|
|
98
|
+
if let mappingModel = try? NSMappingModel.inferredMappingModel(
|
|
99
|
+
forSourceModel: sourceModel,
|
|
100
|
+
destinationModel: destinationModel
|
|
101
|
+
) {
|
|
102
|
+
print("Lightweight migration possible")
|
|
103
|
+
} else {
|
|
104
|
+
print("Lightweight migration not possible")
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Composite Attributes (iOS 17+)
|
|
109
|
+
|
|
110
|
+
New in iOS 17: Structured data within a single attribute.
|
|
111
|
+
|
|
112
|
+
### Creating Composite Attributes
|
|
113
|
+
|
|
114
|
+
In Data Model Editor:
|
|
115
|
+
1. Add Composite Attribute
|
|
116
|
+
2. Add elements (String, Int, Date, etc.)
|
|
117
|
+
3. Can nest composite attributes
|
|
118
|
+
|
|
119
|
+
```swift
|
|
120
|
+
// Example: ColorScheme composite
|
|
121
|
+
// - primary: String
|
|
122
|
+
// - secondary: String
|
|
123
|
+
// - tertiary: String
|
|
124
|
+
|
|
125
|
+
class Aircraft: NSManagedObject {
|
|
126
|
+
@NSManaged var colorScheme: [String: Any]
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Usage
|
|
130
|
+
aircraft.colorScheme = [
|
|
131
|
+
"primary": "Red",
|
|
132
|
+
"secondary": "White",
|
|
133
|
+
"tertiary": "Blue"
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
// Querying
|
|
137
|
+
fetchRequest.predicate = NSPredicate(format: "colorScheme.primary == %@", "Red")
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Benefits
|
|
141
|
+
|
|
142
|
+
- No transformable code needed
|
|
143
|
+
- Supports predicates with keypaths
|
|
144
|
+
- Better than flattened attributes
|
|
145
|
+
- Can prevent faulting across relationships
|
|
146
|
+
|
|
147
|
+
## Staged Migration (iOS 17+)
|
|
148
|
+
|
|
149
|
+
For complex migrations that exceed lightweight capabilities.
|
|
150
|
+
|
|
151
|
+
### When to Use
|
|
152
|
+
|
|
153
|
+
- Changes don't fit lightweight patterns
|
|
154
|
+
- Need to run custom code during migration
|
|
155
|
+
- Need to decompose complex changes into steps
|
|
156
|
+
|
|
157
|
+
### Key Classes
|
|
158
|
+
|
|
159
|
+
- `NSStagedMigrationManager` - Manages migration event loop
|
|
160
|
+
- `NSCustomMigrationStage` - Custom code execution
|
|
161
|
+
- `NSLightweightMigrationStage` - Lightweight-eligible changes
|
|
162
|
+
- `NSManagedObjectModelReference` - Model references with checksums
|
|
163
|
+
|
|
164
|
+
### Example: Denormalizing Data
|
|
165
|
+
|
|
166
|
+
**Problem:** Move `flightData` attribute to separate entity.
|
|
167
|
+
|
|
168
|
+
**Solution:** Decompose into stages:
|
|
169
|
+
|
|
170
|
+
**Stage 1 (Lightweight):** Add new entity and relationship
|
|
171
|
+
```swift
|
|
172
|
+
// ModelV1 → ModelV2
|
|
173
|
+
// Add FlightData entity
|
|
174
|
+
// Add flightParameters relationship to Aircraft
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Stage 2 (Custom):** Copy data
|
|
178
|
+
- Fetch rows using generic `NSManagedObject` / `NSFetchRequestResult` types.
|
|
179
|
+
- Create new entities and copy data inside the migration stage handler.
|
|
180
|
+
- Ensure the custom logic is restartable if the process is interrupted.
|
|
181
|
+
|
|
182
|
+
**Stage 3 (Lightweight):** Remove old attribute
|
|
183
|
+
```swift
|
|
184
|
+
// ModelV3 → ModelV4
|
|
185
|
+
// Remove flightData attribute from Aircraft
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Getting Version Checksum
|
|
189
|
+
|
|
190
|
+
From Xcode build log:
|
|
191
|
+
```
|
|
192
|
+
Compile data model Model.xcdatamodeld
|
|
193
|
+
version checksum: ABC123...
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Deferred Migration (iOS 14+)
|
|
197
|
+
|
|
198
|
+
Defer cleanup work to keep app responsive.
|
|
199
|
+
|
|
200
|
+
### When to Use
|
|
201
|
+
|
|
202
|
+
- Removing attributes/relationships
|
|
203
|
+
- Changing relationship hierarchy
|
|
204
|
+
- Changing relationship ordering
|
|
205
|
+
- Any migration with expensive cleanup
|
|
206
|
+
|
|
207
|
+
### How It Works
|
|
208
|
+
|
|
209
|
+
1. Migration runs synchronously (fast)
|
|
210
|
+
2. Cleanup (indices, column drops) is deferred
|
|
211
|
+
3. App uses latest schema immediately
|
|
212
|
+
4. Finish cleanup when resources available
|
|
213
|
+
|
|
214
|
+
### Enabling Deferred Migration
|
|
215
|
+
|
|
216
|
+
```swift
|
|
217
|
+
let description = NSPersistentStoreDescription(url: storeURL)
|
|
218
|
+
description.setOption(
|
|
219
|
+
true as NSNumber,
|
|
220
|
+
forKey: NSPersistentStoreDeferredLightweightMigrationOptionKey
|
|
221
|
+
)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Checking for Pending Work
|
|
225
|
+
|
|
226
|
+
```swift
|
|
227
|
+
let metadata = try NSPersistentStoreCoordinator.metadataForPersistentStore(
|
|
228
|
+
ofType: NSSQLiteStoreType,
|
|
229
|
+
at: storeURL
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
if let hasDeferredWork = metadata[NSPersistentStoreDeferredLightweightMigrationOptionKey] as? Bool,
|
|
233
|
+
hasDeferredWork {
|
|
234
|
+
print("Deferred migration work pending")
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Finishing Deferred Migration
|
|
239
|
+
|
|
240
|
+
```swift
|
|
241
|
+
func finishDeferredMigration() {
|
|
242
|
+
let coordinator = container.persistentStoreCoordinator
|
|
243
|
+
|
|
244
|
+
do {
|
|
245
|
+
try coordinator.finishDeferredLightweightMigration()
|
|
246
|
+
print("Deferred migration completed")
|
|
247
|
+
} catch {
|
|
248
|
+
print("Failed to finish deferred migration: \(error)")
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Scheduling with Background Tasks
|
|
254
|
+
|
|
255
|
+
```swift
|
|
256
|
+
import BackgroundTasks
|
|
257
|
+
|
|
258
|
+
// Register task
|
|
259
|
+
BGTaskScheduler.shared.register(
|
|
260
|
+
forTaskWithIdentifier: "com.example.app.migration",
|
|
261
|
+
using: nil
|
|
262
|
+
) { task in
|
|
263
|
+
self.handleMigrationTask(task as! BGProcessingTask)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Schedule task
|
|
267
|
+
func scheduleMigration() {
|
|
268
|
+
let request = BGProcessingTaskRequest(identifier: "com.example.app.migration")
|
|
269
|
+
request.requiresNetworkConnectivity = false
|
|
270
|
+
request.requiresExternalPower = false
|
|
271
|
+
|
|
272
|
+
try? BGTaskScheduler.shared.submit(request)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Handle task
|
|
276
|
+
func handleMigrationTask(_ task: BGProcessingTask) {
|
|
277
|
+
task.expirationHandler = {
|
|
278
|
+
task.setTaskCompleted(success: false)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
finishDeferredMigration()
|
|
282
|
+
task.setTaskCompleted(success: true)
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Migration Debugging
|
|
287
|
+
|
|
288
|
+
### Enable Migration Debug
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
-com.apple.CoreData.MigrationDebug 1
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Output:**
|
|
295
|
+
```
|
|
296
|
+
CoreData: annotation: Migration: Migrating from version 1 to version 2
|
|
297
|
+
CoreData: annotation: Migration: Inferred mapping model
|
|
298
|
+
CoreData: annotation: Migration: Completed successfully
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Common Errors
|
|
302
|
+
|
|
303
|
+
**NSPersistentStoreIncompatibleVersionHashError**
|
|
304
|
+
- Model changed, migration required
|
|
305
|
+
- Enable lightweight migration or create mapping model
|
|
306
|
+
|
|
307
|
+
**NSMigrationMissingSourceModelError**
|
|
308
|
+
- Can't find source model
|
|
309
|
+
- Ensure all model versions are in bundle
|
|
310
|
+
|
|
311
|
+
**NSMigrationError**
|
|
312
|
+
- Migration failed
|
|
313
|
+
- Check if changes are lightweight-compatible
|
|
314
|
+
- Use staged migration for complex changes
|
|
315
|
+
|
|
316
|
+
## Best Practices
|
|
317
|
+
|
|
318
|
+
1. **Test migrations thoroughly** - Test upgrade paths from all previous versions
|
|
319
|
+
2. **Keep model versions** - Don't delete old .xcdatamodel files
|
|
320
|
+
3. **Use lightweight when possible** - Simplest and most reliable
|
|
321
|
+
4. **Decompose complex changes** - Use staged migration for non-lightweight changes
|
|
322
|
+
5. **Defer expensive cleanup** - Use deferred migration for large datasets
|
|
323
|
+
6. **Version your models** - Create new model version for each release
|
|
324
|
+
7. **Test on real data** - Migration behavior differs with large datasets
|
|
325
|
+
8. **Document changes** - Keep migration notes for future reference
|
|
326
|
+
|
|
327
|
+
## Testing Migrations
|
|
328
|
+
|
|
329
|
+
```swift
|
|
330
|
+
func testMigration() throws {
|
|
331
|
+
// 1. Create store with old model
|
|
332
|
+
let oldModelURL = Bundle.main.url(forResource: "ModelV1", withExtension: "momd")!
|
|
333
|
+
let oldModel = NSManagedObjectModel(contentsOf: oldModelURL)!
|
|
334
|
+
|
|
335
|
+
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: oldModel)
|
|
336
|
+
try coordinator.addPersistentStore(
|
|
337
|
+
ofType: NSSQLiteStoreType,
|
|
338
|
+
configurationName: nil,
|
|
339
|
+
at: storeURL,
|
|
340
|
+
options: nil
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
// 2. Add test data
|
|
344
|
+
let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
|
|
345
|
+
context.persistentStoreCoordinator = coordinator
|
|
346
|
+
|
|
347
|
+
let entity = NSEntityDescription.insertNewObject(forEntityName: "Article", into: context)
|
|
348
|
+
entity.setValue("Test", forKey: "name")
|
|
349
|
+
try context.save()
|
|
350
|
+
|
|
351
|
+
// 3. Close store
|
|
352
|
+
try coordinator.remove(coordinator.persistentStores.first!)
|
|
353
|
+
|
|
354
|
+
// 4. Migrate with new model
|
|
355
|
+
let newModelURL = Bundle.main.url(forResource: "ModelV2", withExtension: "momd")!
|
|
356
|
+
let newModel = NSManagedObjectModel(contentsOf: newModelURL)!
|
|
357
|
+
|
|
358
|
+
let newCoordinator = NSPersistentStoreCoordinator(managedObjectModel: newModel)
|
|
359
|
+
let options = [
|
|
360
|
+
NSMigratePersistentStoresAutomaticallyOption: true,
|
|
361
|
+
NSInferMappingModelAutomaticallyOption: true
|
|
362
|
+
]
|
|
363
|
+
try newCoordinator.addPersistentStore(
|
|
364
|
+
ofType: NSSQLiteStoreType,
|
|
365
|
+
configurationName: nil,
|
|
366
|
+
at: storeURL,
|
|
367
|
+
options: options
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
// 5. Verify data
|
|
371
|
+
let newContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
|
|
372
|
+
newContext.persistentStoreCoordinator = newCoordinator
|
|
373
|
+
|
|
374
|
+
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Article")
|
|
375
|
+
let results = try newContext.fetch(fetchRequest)
|
|
376
|
+
|
|
377
|
+
XCTAssertEqual(results.count, 1)
|
|
378
|
+
XCTAssertEqual(results.first?.value(forKey: "name") as? String, "Test")
|
|
379
|
+
}
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
## Summary
|
|
383
|
+
|
|
384
|
+
1. **Use lightweight migration** - Handles most common changes automatically
|
|
385
|
+
2. **Enable by default** - NSPersistentContainer enables it automatically
|
|
386
|
+
3. **Use renaming identifiers** - For renaming attributes/entities/relationships
|
|
387
|
+
4. **Use composite attributes (iOS 17+)** - For structured data
|
|
388
|
+
5. **Use staged migration (iOS 17+)** - For complex, non-lightweight changes
|
|
389
|
+
6. **Use deferred migration (iOS 14+)** - For expensive cleanup operations
|
|
390
|
+
7. **Test thoroughly** - Verify all upgrade paths
|
|
391
|
+
8. **Keep all model versions** - Required for migration
|
|
392
|
+
9. **Enable migration debug** - Helps diagnose issues
|
|
393
|
+
10. **Document changes** - Track what changed in each version
|