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,670 @@
|
|
|
1
|
+
# Async Sequences and Streams
|
|
2
|
+
|
|
3
|
+
Patterns for iterating over values that arrive over time.
|
|
4
|
+
|
|
5
|
+
## AsyncSequence
|
|
6
|
+
|
|
7
|
+
Protocol for asynchronous iteration over values that become available over time.
|
|
8
|
+
|
|
9
|
+
### Basic usage
|
|
10
|
+
|
|
11
|
+
```swift
|
|
12
|
+
for await value in someAsyncSequence {
|
|
13
|
+
print(value)
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Key difference from Sequence**: Values may not all be available immediately.
|
|
18
|
+
|
|
19
|
+
### Custom implementation
|
|
20
|
+
|
|
21
|
+
```swift
|
|
22
|
+
struct Counter: AsyncSequence, AsyncIteratorProtocol {
|
|
23
|
+
typealias Element = Int
|
|
24
|
+
|
|
25
|
+
let limit: Int
|
|
26
|
+
var current = 1
|
|
27
|
+
|
|
28
|
+
mutating func next() async -> Int? {
|
|
29
|
+
guard !Task.isCancelled else { return nil }
|
|
30
|
+
guard current <= limit else { return nil }
|
|
31
|
+
|
|
32
|
+
let result = current
|
|
33
|
+
current += 1
|
|
34
|
+
return result
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
func makeAsyncIterator() -> Counter {
|
|
38
|
+
self
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Usage
|
|
43
|
+
for await count in Counter(limit: 5) {
|
|
44
|
+
print(count) // 1, 2, 3, 4, 5
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Standard operators
|
|
49
|
+
|
|
50
|
+
Same functional operators as regular sequences:
|
|
51
|
+
|
|
52
|
+
```swift
|
|
53
|
+
// Filter
|
|
54
|
+
for await even in Counter(limit: 5).filter({ $0 % 2 == 0 }) {
|
|
55
|
+
print(even) // 2, 4
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Map
|
|
59
|
+
let mapped = Counter(limit: 5).map { $0 % 2 == 0 ? "Even" : "Odd" }
|
|
60
|
+
for await label in mapped {
|
|
61
|
+
print(label)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Contains (awaits until found or sequence ends)
|
|
65
|
+
let contains = await Counter(limit: 5).contains(3) // true
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Termination
|
|
69
|
+
|
|
70
|
+
Return `nil` from `next()` to end iteration:
|
|
71
|
+
|
|
72
|
+
```swift
|
|
73
|
+
mutating func next() async -> Int? {
|
|
74
|
+
guard !Task.isCancelled else {
|
|
75
|
+
return nil // Stop on cancellation
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
guard current <= limit else {
|
|
79
|
+
return nil // Stop at limit
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return current
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> **Course Deep Dive**: This topic is covered in detail in [Lesson 6.1: Working with asynchronous sequences](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
|
|
87
|
+
|
|
88
|
+
## AsyncStream
|
|
89
|
+
|
|
90
|
+
Convenient way to create async sequences without implementing protocols.
|
|
91
|
+
|
|
92
|
+
### Basic creation
|
|
93
|
+
|
|
94
|
+
```swift
|
|
95
|
+
let stream = AsyncStream<Int> { continuation in
|
|
96
|
+
for i in 1...5 {
|
|
97
|
+
continuation.yield(i)
|
|
98
|
+
}
|
|
99
|
+
continuation.finish()
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for await value in stream {
|
|
103
|
+
print(value)
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### AsyncThrowingStream
|
|
108
|
+
|
|
109
|
+
For streams that can fail:
|
|
110
|
+
|
|
111
|
+
```swift
|
|
112
|
+
let throwingStream = AsyncThrowingStream<Int, Error> { continuation in
|
|
113
|
+
continuation.yield(1)
|
|
114
|
+
continuation.yield(2)
|
|
115
|
+
continuation.finish(throwing: SomeError())
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
do {
|
|
119
|
+
for try await value in throwingStream {
|
|
120
|
+
print(value)
|
|
121
|
+
}
|
|
122
|
+
} catch {
|
|
123
|
+
print("Error: \(error)")
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> **Course Deep Dive**: This topic is covered in detail in [Lesson 6.2: Using AsyncStream and AsyncThrowingStream in your code](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
|
|
128
|
+
|
|
129
|
+
## Bridging Closures to Streams
|
|
130
|
+
|
|
131
|
+
### Progress + completion handlers
|
|
132
|
+
|
|
133
|
+
```swift
|
|
134
|
+
// Old closure-based API
|
|
135
|
+
struct FileDownloader {
|
|
136
|
+
enum Status {
|
|
137
|
+
case downloading(Float)
|
|
138
|
+
case finished(Data)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
func download(
|
|
142
|
+
_ url: URL,
|
|
143
|
+
progressHandler: @escaping (Float) -> Void,
|
|
144
|
+
completion: @escaping (Result<Data, Error>) -> Void
|
|
145
|
+
) throws {
|
|
146
|
+
// Implementation
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Modern stream-based API
|
|
151
|
+
extension FileDownloader {
|
|
152
|
+
func download(_ url: URL) -> AsyncThrowingStream<Status, Error> {
|
|
153
|
+
AsyncThrowingStream { continuation in
|
|
154
|
+
do {
|
|
155
|
+
try self.download(url, progressHandler: { progress in
|
|
156
|
+
continuation.yield(.downloading(progress))
|
|
157
|
+
}, completion: { result in
|
|
158
|
+
switch result {
|
|
159
|
+
case .success(let data):
|
|
160
|
+
continuation.yield(.finished(data))
|
|
161
|
+
continuation.finish()
|
|
162
|
+
case .failure(let error):
|
|
163
|
+
continuation.finish(throwing: error)
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
} catch {
|
|
167
|
+
continuation.finish(throwing: error)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Usage
|
|
174
|
+
for try await status in downloader.download(url) {
|
|
175
|
+
switch status {
|
|
176
|
+
case .downloading(let progress):
|
|
177
|
+
print("Progress: \(progress)")
|
|
178
|
+
case .finished(let data):
|
|
179
|
+
print("Done: \(data.count) bytes")
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Simplified with Result
|
|
185
|
+
|
|
186
|
+
```swift
|
|
187
|
+
AsyncThrowingStream { continuation in
|
|
188
|
+
try self.download(url, progressHandler: { progress in
|
|
189
|
+
continuation.yield(.downloading(progress))
|
|
190
|
+
}, completion: { result in
|
|
191
|
+
continuation.yield(with: result.map { .finished($0) })
|
|
192
|
+
continuation.finish()
|
|
193
|
+
})
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Bridging Delegates
|
|
198
|
+
|
|
199
|
+
### Location updates example
|
|
200
|
+
|
|
201
|
+
```swift
|
|
202
|
+
final class LocationMonitor: NSObject {
|
|
203
|
+
private var continuation: AsyncThrowingStream<CLLocation, Error>.Continuation?
|
|
204
|
+
let stream: AsyncThrowingStream<CLLocation, Error>
|
|
205
|
+
|
|
206
|
+
override init() {
|
|
207
|
+
var capturedContinuation: AsyncThrowingStream<CLLocation, Error>.Continuation?
|
|
208
|
+
stream = AsyncThrowingStream { continuation in
|
|
209
|
+
capturedContinuation = continuation
|
|
210
|
+
}
|
|
211
|
+
super.init()
|
|
212
|
+
self.continuation = capturedContinuation
|
|
213
|
+
|
|
214
|
+
locationManager.delegate = self
|
|
215
|
+
locationManager.startUpdatingLocation()
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
extension LocationMonitor: CLLocationManagerDelegate {
|
|
220
|
+
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
|
|
221
|
+
for location in locations {
|
|
222
|
+
continuation?.yield(location)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
|
|
227
|
+
continuation?.finish(throwing: error)
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Usage
|
|
232
|
+
let monitor = LocationMonitor()
|
|
233
|
+
for try await location in monitor.stream {
|
|
234
|
+
print("Location: \(location.coordinate)")
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Stream Lifecycle
|
|
239
|
+
|
|
240
|
+
### Termination callback
|
|
241
|
+
|
|
242
|
+
```swift
|
|
243
|
+
AsyncThrowingStream<Int, Error> { continuation in
|
|
244
|
+
continuation.onTermination = { @Sendable reason in
|
|
245
|
+
print("Terminated: \(reason)")
|
|
246
|
+
// Cleanup: remove observers, cancel work, etc.
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
continuation.yield(1)
|
|
250
|
+
continuation.finish()
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Termination reasons**:
|
|
255
|
+
- `.finished` - Normal completion
|
|
256
|
+
- `.finished(Error?)` - Completed with error (throwing stream)
|
|
257
|
+
- `.cancelled` - Task canceled
|
|
258
|
+
|
|
259
|
+
### Cancellation
|
|
260
|
+
|
|
261
|
+
Streams cancel when:
|
|
262
|
+
- Enclosing task cancels
|
|
263
|
+
- Stream goes out of scope
|
|
264
|
+
|
|
265
|
+
```swift
|
|
266
|
+
let task = Task {
|
|
267
|
+
for try await status in download(url) {
|
|
268
|
+
print(status)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
task.cancel() // Triggers onTermination with .cancelled
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**No explicit cancel method** - rely on task cancellation.
|
|
276
|
+
|
|
277
|
+
## Buffer Policies
|
|
278
|
+
|
|
279
|
+
Control what happens to values when no one is awaiting:
|
|
280
|
+
|
|
281
|
+
### .unbounded (default)
|
|
282
|
+
|
|
283
|
+
Buffers all values until consumed:
|
|
284
|
+
|
|
285
|
+
```swift
|
|
286
|
+
let stream = AsyncStream<Int> { continuation in
|
|
287
|
+
(0...5).forEach { continuation.yield($0) }
|
|
288
|
+
continuation.finish()
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
try await Task.sleep(for: .seconds(1))
|
|
292
|
+
|
|
293
|
+
for await value in stream {
|
|
294
|
+
print(value) // Prints all: 0, 1, 2, 3, 4, 5
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### .bufferingNewest(n)
|
|
299
|
+
|
|
300
|
+
Keeps only the newest N values:
|
|
301
|
+
|
|
302
|
+
```swift
|
|
303
|
+
let stream = AsyncStream(bufferingPolicy: .bufferingNewest(1)) { continuation in
|
|
304
|
+
(0...5).forEach { continuation.yield($0) }
|
|
305
|
+
continuation.finish()
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
try await Task.sleep(for: .seconds(1))
|
|
309
|
+
|
|
310
|
+
for await value in stream {
|
|
311
|
+
print(value) // Prints only: 5
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### .bufferingOldest(n)
|
|
316
|
+
|
|
317
|
+
Keeps only the oldest N values:
|
|
318
|
+
|
|
319
|
+
```swift
|
|
320
|
+
let stream = AsyncStream(bufferingPolicy: .bufferingOldest(1)) { continuation in
|
|
321
|
+
(0...5).forEach { continuation.yield($0) }
|
|
322
|
+
continuation.finish()
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
try await Task.sleep(for: .seconds(1))
|
|
326
|
+
|
|
327
|
+
for await value in stream {
|
|
328
|
+
print(value) // Prints only: 0
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### .bufferingNewest(0)
|
|
333
|
+
|
|
334
|
+
Only receives values emitted after iteration starts:
|
|
335
|
+
|
|
336
|
+
```swift
|
|
337
|
+
let stream = AsyncStream(bufferingPolicy: .bufferingNewest(0)) { continuation in
|
|
338
|
+
continuation.yield(1) // Discarded
|
|
339
|
+
|
|
340
|
+
Task {
|
|
341
|
+
try await Task.sleep(for: .seconds(2))
|
|
342
|
+
continuation.yield(2) // Received
|
|
343
|
+
continuation.finish()
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
try await Task.sleep(for: .seconds(1))
|
|
348
|
+
|
|
349
|
+
for await value in stream {
|
|
350
|
+
print(value) // Prints only: 2
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Use case**: Location updates, file system changes - only care about latest.
|
|
355
|
+
|
|
356
|
+
## Repeated Async Calls
|
|
357
|
+
|
|
358
|
+
Use `init(unfolding:onCancel:)` for polling:
|
|
359
|
+
|
|
360
|
+
```swift
|
|
361
|
+
struct PingService {
|
|
362
|
+
func startPinging() -> AsyncStream<Bool> {
|
|
363
|
+
AsyncStream {
|
|
364
|
+
try? await Task.sleep(for: .seconds(5))
|
|
365
|
+
return await ping()
|
|
366
|
+
} onCancel: {
|
|
367
|
+
print("Pinging cancelled")
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
func ping() async -> Bool {
|
|
372
|
+
// Network request
|
|
373
|
+
return true
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Usage
|
|
378
|
+
for await result in pingService.startPinging() {
|
|
379
|
+
print("Ping: \(result)")
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Standard Library Integration
|
|
384
|
+
|
|
385
|
+
### NotificationCenter
|
|
386
|
+
|
|
387
|
+
```swift
|
|
388
|
+
let stream = NotificationCenter.default.notifications(
|
|
389
|
+
named: .NSSystemTimeZoneDidChange
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
for await notification in stream {
|
|
393
|
+
print("Time zone changed")
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Combine publishers
|
|
398
|
+
|
|
399
|
+
```swift
|
|
400
|
+
let numbers = [1, 2, 3, 4, 5]
|
|
401
|
+
let filtered = numbers.publisher.filter { $0 % 2 == 0 }
|
|
402
|
+
|
|
403
|
+
for await number in filtered.values {
|
|
404
|
+
print(number) // 2, 4
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Task groups
|
|
409
|
+
|
|
410
|
+
```swift
|
|
411
|
+
await withTaskGroup(of: Image.self) { group in
|
|
412
|
+
for url in urls {
|
|
413
|
+
group.addTask { await download(url) }
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
for await image in group {
|
|
417
|
+
display(image)
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
## Limitations
|
|
423
|
+
|
|
424
|
+
### Single consumer only
|
|
425
|
+
|
|
426
|
+
Unlike Combine, streams support one consumer at a time:
|
|
427
|
+
|
|
428
|
+
```swift
|
|
429
|
+
let stream = AsyncStream { continuation in
|
|
430
|
+
(0...5).forEach { continuation.yield($0) }
|
|
431
|
+
continuation.finish()
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
Task {
|
|
435
|
+
for await value in stream {
|
|
436
|
+
print("Consumer 1: \(value)")
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
Task {
|
|
441
|
+
for await value in stream {
|
|
442
|
+
print("Consumer 2: \(value)")
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Unpredictable output - values split between consumers
|
|
447
|
+
// Consumer 1: 0
|
|
448
|
+
// Consumer 2: 1
|
|
449
|
+
// Consumer 1: 2
|
|
450
|
+
// Consumer 2: 3
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**Solution**: Create separate streams or use third-party libraries (AsyncExtensions).
|
|
454
|
+
|
|
455
|
+
### No values after termination
|
|
456
|
+
|
|
457
|
+
Once finished, stream won't emit new values:
|
|
458
|
+
|
|
459
|
+
```swift
|
|
460
|
+
let stream = AsyncStream<Int> { continuation in
|
|
461
|
+
continuation.finish() // Terminate immediately
|
|
462
|
+
continuation.yield(1) // Never received
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
for await value in stream {
|
|
466
|
+
print(value) // Loop exits immediately
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Decision Guide
|
|
471
|
+
|
|
472
|
+
### Use AsyncSequence when:
|
|
473
|
+
|
|
474
|
+
- Implementing standard library-style protocols
|
|
475
|
+
- Need fine-grained control over iteration
|
|
476
|
+
- Building reusable sequence types
|
|
477
|
+
- Working with existing sequence protocols
|
|
478
|
+
|
|
479
|
+
**Reality**: Rarely needed in application code.
|
|
480
|
+
|
|
481
|
+
### Use AsyncStream when:
|
|
482
|
+
|
|
483
|
+
- Bridging delegates to async/await
|
|
484
|
+
- Converting closure-based APIs
|
|
485
|
+
- Emitting events manually
|
|
486
|
+
- Polling or repeated async operations
|
|
487
|
+
- Most common use case
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## When to Use AsyncAlgorithms vs Standard Library
|
|
492
|
+
|
|
493
|
+
### Use AsyncAlgorithms when:
|
|
494
|
+
|
|
495
|
+
- **Time-based operations** need debounce/throttle/timer
|
|
496
|
+
- **Combining multiple async sequences** (merge, combineLatest, zip)
|
|
497
|
+
- **Multi-consumer scenarios** require backpressure (AsyncChannel)
|
|
498
|
+
- **Complex operator chains** that Combine would handle naturally
|
|
499
|
+
- **Need specific operators** not in standard library
|
|
500
|
+
|
|
501
|
+
### Use Standard Library when:
|
|
502
|
+
|
|
503
|
+
- **Bridging callback APIs** → AsyncStream
|
|
504
|
+
- **Simple iteration** → for await in sequence
|
|
505
|
+
- **Single-value operations** → async/await
|
|
506
|
+
- **Basic transformations** → map/filter/contains
|
|
507
|
+
|
|
508
|
+
### Quick Decision Table
|
|
509
|
+
|
|
510
|
+
| Need | Solution |
|
|
511
|
+
|------|----------|
|
|
512
|
+
| Debounce search input | ✅ AsyncAlgorithms.debounce() |
|
|
513
|
+
| Throttle button clicks | ✅ AsyncAlgorithms.throttle() |
|
|
514
|
+
| Merge independent streams | ✅ AsyncAlgorithms.merge() |
|
|
515
|
+
| Combine dependent values | ✅ AsyncAlgorithms.combineLatest() or async let |
|
|
516
|
+
| Pair values from two sources | ✅ AsyncAlgorithms.zip() |
|
|
517
|
+
| Bridge callback API | AsyncStream |
|
|
518
|
+
| Multi-consumer with backpressure | ✅ AsyncChannel |
|
|
519
|
+
| Periodic timer | ✅ AsyncTimerSequence |
|
|
520
|
+
| Simple async iteration | for await in... |
|
|
521
|
+
|
|
522
|
+
> **See**: [async-algorithms.md](async-algorithms.md) for detailed usage examples with real-world patterns.
|
|
523
|
+
|
|
524
|
+
### Use regular async methods when:
|
|
525
|
+
|
|
526
|
+
- Single value returned
|
|
527
|
+
- No progress updates needed
|
|
528
|
+
- Simple request/response pattern
|
|
529
|
+
|
|
530
|
+
```swift
|
|
531
|
+
// Use this
|
|
532
|
+
func fetchData() async throws -> Data
|
|
533
|
+
|
|
534
|
+
// Not this
|
|
535
|
+
func fetchData() -> AsyncThrowingStream<Data, Error>
|
|
536
|
+
|
|
537
|
+
> **Course Deep Dive**: This topic is covered in detail in [Lesson 6.3: Deciding between AsyncSequence, AsyncStream, or regular asynchronous methods](https://www.swiftconcurrencycourse.com?utm_source=github&utm_medium=agent-skill&utm_campaign=lesson-reference)
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
## Common Patterns
|
|
541
|
+
|
|
542
|
+
### Progress reporting
|
|
543
|
+
|
|
544
|
+
```swift
|
|
545
|
+
func download(_ url: URL) -> AsyncThrowingStream<DownloadEvent, Error> {
|
|
546
|
+
AsyncThrowingStream { continuation in
|
|
547
|
+
Task {
|
|
548
|
+
do {
|
|
549
|
+
var progress: Double = 0
|
|
550
|
+
while progress < 1.0 {
|
|
551
|
+
progress += 0.1
|
|
552
|
+
continuation.yield(.progress(progress))
|
|
553
|
+
try await Task.sleep(for: .milliseconds(100))
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
let data = try await URLSession.shared.data(from: url).0
|
|
557
|
+
continuation.yield(.completed(data))
|
|
558
|
+
continuation.finish()
|
|
559
|
+
} catch {
|
|
560
|
+
continuation.finish(throwing: error)
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
### Monitoring file system
|
|
568
|
+
|
|
569
|
+
```swift
|
|
570
|
+
func watchDirectory(_ path: String) -> AsyncStream<FileEvent> {
|
|
571
|
+
AsyncStream(bufferingPolicy: .bufferingNewest(1)) { continuation in
|
|
572
|
+
let source = DispatchSource.makeFileSystemObjectSource(
|
|
573
|
+
fileDescriptor: fd,
|
|
574
|
+
eventMask: .write,
|
|
575
|
+
queue: .main
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
source.setEventHandler {
|
|
579
|
+
continuation.yield(.fileChanged(path))
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
continuation.onTermination = { _ in
|
|
583
|
+
source.cancel()
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
source.resume()
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### Timer/polling
|
|
592
|
+
|
|
593
|
+
```swift
|
|
594
|
+
func timer(interval: Duration) -> AsyncStream<Date> {
|
|
595
|
+
AsyncStream { continuation in
|
|
596
|
+
Task {
|
|
597
|
+
while !Task.isCancelled {
|
|
598
|
+
continuation.yield(Date())
|
|
599
|
+
try? await Task.sleep(for: interval)
|
|
600
|
+
}
|
|
601
|
+
continuation.finish()
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// Usage
|
|
607
|
+
for await date in timer(interval: .seconds(1)) {
|
|
608
|
+
print("Tick: \(date)")
|
|
609
|
+
}
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
## Best Practices
|
|
613
|
+
|
|
614
|
+
1. **Always call finish()** - Streams stay alive until terminated
|
|
615
|
+
2. **Use buffer policies wisely** - Match your use case (latest value vs all values)
|
|
616
|
+
3. **Handle cancellation** - Set `onTermination` for cleanup
|
|
617
|
+
4. **Single consumer** - Don't share streams across multiple consumers
|
|
618
|
+
5. **Prefer streams over closures** - More composable and cancellable
|
|
619
|
+
6. **Check Task.isCancelled** - Respect cancellation in custom sequences
|
|
620
|
+
7. **Use throwing variant** - When operations can fail
|
|
621
|
+
8. **Consider regular async** - If only returning single value
|
|
622
|
+
|
|
623
|
+
## Debugging
|
|
624
|
+
|
|
625
|
+
### Add termination logging
|
|
626
|
+
|
|
627
|
+
```swift
|
|
628
|
+
continuation.onTermination = { reason in
|
|
629
|
+
print("Stream ended: \(reason)")
|
|
630
|
+
}
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
### Validate finish() calls
|
|
634
|
+
|
|
635
|
+
```swift
|
|
636
|
+
// ❌ Forgot to finish
|
|
637
|
+
AsyncStream { continuation in
|
|
638
|
+
continuation.yield(1)
|
|
639
|
+
// Stream never ends!
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// ✅ Always finish
|
|
643
|
+
AsyncStream { continuation in
|
|
644
|
+
continuation.yield(1)
|
|
645
|
+
continuation.finish()
|
|
646
|
+
}
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
### Check for dropped values
|
|
650
|
+
|
|
651
|
+
```swift
|
|
652
|
+
let stream = AsyncStream(bufferingPolicy: .bufferingNewest(1)) { continuation in
|
|
653
|
+
for i in 1...100 {
|
|
654
|
+
continuation.yield(i)
|
|
655
|
+
print("Yielded: \(i)")
|
|
656
|
+
}
|
|
657
|
+
continuation.finish()
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// If consumer is slow, many values dropped
|
|
661
|
+
for await value in stream {
|
|
662
|
+
print("Received: \(value)")
|
|
663
|
+
try? await Task.sleep(for: .seconds(1))
|
|
664
|
+
}
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
## Further Learning
|
|
668
|
+
|
|
669
|
+
For real-world migration examples, performance patterns, and advanced stream techniques, see [Swift Concurrency Course](https://www.swiftconcurrencycourse.com).
|
|
670
|
+
|