From 6406208b35355789208e96f9dcd0b28b87718b84 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Mon, 10 Aug 2026 15:15:06 -0400 Subject: [PATCH] shell: fish functions -> ~/.local/bin executables + bash/zsh ports; manage ~/.agents - 16 cross-shell utilities converted to sh/bash chezmoi executables: ai c2p cp-appid extract_agents fab gdc gh-sonr-org-migrate ghg-clone ghn gho git-summary launch_omp_livediff_overlay lc-elir mdcp mdp pj (ghg-clone not named ghg: unrelated cargo binary owns that name) - cwd/history helpers stay per-shell: yy c cd clip-last + ghg/ghn/gho cd-wrappers in bash/functions/ and zsh/functions/, loaded by rc files - fish keeps only shell-state functions; converted ones now hit PATH - cp-appid ignore gating moved to .local/bin path - dot_agents/skills: 82 skills materialized from dotstate storage so dot_claude skill symlinks resolve on fresh bootstrap; dotstate profile/symlinks.json released .agents/skills .bashrc .zshrc --- .beads/interactions.jsonl | 2 + .beads/issues.jsonl | 2 + .chezmoiignore.tmpl | 2 +- README.md | 10 + dot_agents/dot_skill-lock.json | 796 +++++++ dot_agents/skills/blume-migrate/SKILL.md | 170 ++ .../blume-migrate/assets/oxfmt@0.55.0.patch | 20 + .../blume-migrate/references/docusaurus.md | 95 + .../blume-migrate/references/fumadocs.md | 95 + .../blume-migrate/references/mintlify.md | 156 ++ .../blume-migrate/references/monorepo.md | 224 ++ .../skills/blume-migrate/references/nextra.md | 76 + .../blume-migrate/references/starlight.md | 116 + .../scripts/mintlify-codemod.mjs | 478 ++++ dot_agents/skills/blume-update-docs/SKILL.md | 53 + .../references/audit-checklist.md | 46 + dot_agents/skills/blume/SKILL.md | 73 + dot_agents/skills/brandkit/SKILL.md | 798 +++++++ dot_agents/skills/bun-development/SKILL.md | 706 ++++++ dot_agents/skills/cloudflare/SKILL.md | 228 ++ .../references/agents-sdk/README.md | 89 + .../cloudflare/references/agents-sdk/api.md | 190 ++ .../references/agents-sdk/configuration.md | 182 ++ .../references/agents-sdk/gotchas.md | 158 ++ .../references/agents-sdk/patterns.md | 192 ++ .../references/ai-gateway/README.md | 175 ++ .../references/ai-gateway/configuration.md | 111 + .../references/ai-gateway/dynamic-routing.md | 82 + .../references/ai-gateway/features.md | 96 + .../references/ai-gateway/sdk-integration.md | 114 + .../references/ai-gateway/troubleshooting.md | 88 + .../cloudflare/references/ai-search/README.md | 138 ++ .../cloudflare/references/ai-search/api.md | 87 + .../references/ai-search/configuration.md | 88 + .../references/ai-search/gotchas.md | 81 + .../references/ai-search/patterns.md | 85 + .../references/analytics-engine/README.md | 94 + .../references/analytics-engine/api.md | 112 + .../analytics-engine/configuration.md | 112 + .../references/analytics-engine/gotchas.md | 85 + .../references/analytics-engine/patterns.md | 83 + .../references/api-shield/README.md | 44 + .../cloudflare/references/api-shield/api.md | 141 ++ .../references/api-shield/configuration.md | 192 ++ .../references/api-shield/gotchas.md | 125 ++ .../references/api-shield/patterns.md | 180 ++ .../cloudflare/references/api/README.md | 66 + .../skills/cloudflare/references/api/api.md | 204 ++ .../references/api/configuration.md | 160 ++ .../cloudflare/references/api/gotchas.md | 225 ++ .../cloudflare/references/api/patterns.md | 204 ++ .../references/argo-smart-routing/README.md | 90 + .../references/argo-smart-routing/api.md | 240 ++ .../argo-smart-routing/configuration.md | 197 ++ .../references/argo-smart-routing/gotchas.md | 111 + .../references/argo-smart-routing/patterns.md | 104 + .../cloudflare/references/bindings/README.md | 122 ++ .../cloudflare/references/bindings/api.md | 203 ++ .../references/bindings/configuration.md | 188 ++ .../cloudflare/references/bindings/gotchas.md | 208 ++ .../references/bindings/patterns.md | 200 ++ .../references/bot-management/README.md | 94 + .../references/bot-management/api.md | 169 ++ .../bot-management/configuration.md | 163 ++ .../references/bot-management/gotchas.md | 114 + .../references/bot-management/patterns.md | 182 ++ .../references/browser-rendering/README.md | 78 + .../references/browser-rendering/api.md | 108 + .../browser-rendering/configuration.md | 78 + .../references/browser-rendering/gotchas.md | 88 + .../references/browser-rendering/patterns.md | 91 + .../skills/cloudflare/references/c3/README.md | 111 + .../skills/cloudflare/references/c3/api.md | 71 + .../cloudflare/references/c3/configuration.md | 81 + .../cloudflare/references/c3/gotchas.md | 92 + .../cloudflare/references/c3/patterns.md | 82 + .../references/cache-reserve/README.md | 147 ++ .../references/cache-reserve/api.md | 194 ++ .../references/cache-reserve/configuration.md | 169 ++ .../references/cache-reserve/gotchas.md | 132 ++ .../references/cache-reserve/patterns.md | 197 ++ .../references/containers/README.md | 85 + .../cloudflare/references/containers/api.md | 187 ++ .../references/containers/configuration.md | 188 ++ .../references/containers/gotchas.md | 178 ++ .../references/containers/patterns.md | 202 ++ .../references/cron-triggers/README.md | 99 + .../references/cron-triggers/api.md | 196 ++ .../references/cron-triggers/configuration.md | 180 ++ .../references/cron-triggers/gotchas.md | 199 ++ .../references/cron-triggers/patterns.md | 190 ++ .../skills/cloudflare/references/d1/README.md | 133 ++ .../skills/cloudflare/references/d1/api.md | 196 ++ .../cloudflare/references/d1/configuration.md | 188 ++ .../cloudflare/references/d1/gotchas.md | 98 + .../cloudflare/references/d1/patterns.md | 189 ++ .../cloudflare/references/ddos/README.md | 41 + .../skills/cloudflare/references/ddos/api.md | 164 ++ .../references/ddos/configuration.md | 93 + .../cloudflare/references/ddos/gotchas.md | 107 + .../cloudflare/references/ddos/patterns.md | 174 ++ .../references/do-storage/README.md | 75 + .../cloudflare/references/do-storage/api.md | 102 + .../references/do-storage/configuration.md | 112 + .../references/do-storage/gotchas.md | 150 ++ .../references/do-storage/patterns.md | 194 ++ .../references/do-storage/testing.md | 183 ++ .../references/durable-objects/README.md | 185 ++ .../references/durable-objects/api.md | 187 ++ .../durable-objects/configuration.md | 160 ++ .../references/durable-objects/gotchas.md | 197 ++ .../references/durable-objects/patterns.md | 201 ++ .../references/email-routing/README.md | 89 + .../references/email-routing/api.md | 195 ++ .../references/email-routing/configuration.md | 186 ++ .../references/email-routing/gotchas.md | 196 ++ .../references/email-routing/patterns.md | 229 ++ .../references/email-workers/README.md | 151 ++ .../references/email-workers/api.md | 237 ++ .../references/email-workers/configuration.md | 112 + .../references/email-workers/gotchas.md | 125 ++ .../references/email-workers/patterns.md | 102 + .../references/graphql-api/README.md | 147 ++ .../cloudflare/references/graphql-api/api.md | 175 ++ .../references/graphql-api/configuration.md | 118 + .../references/graphql-api/gotchas.md | 110 + .../references/graphql-api/patterns.md | 225 ++ .../references/hyperdrive/README.md | 82 + .../cloudflare/references/hyperdrive/api.md | 143 ++ .../references/hyperdrive/configuration.md | 159 ++ .../references/hyperdrive/gotchas.md | 77 + .../references/hyperdrive/patterns.md | 190 ++ .../cloudflare/references/images/README.md | 61 + .../cloudflare/references/images/api.md | 96 + .../references/images/configuration.md | 211 ++ .../cloudflare/references/images/gotchas.md | 99 + .../cloudflare/references/images/patterns.md | 115 + .../skills/cloudflare/references/kv/README.md | 89 + .../skills/cloudflare/references/kv/api.md | 160 ++ .../cloudflare/references/kv/configuration.md | 144 ++ .../cloudflare/references/kv/gotchas.md | 131 ++ .../cloudflare/references/kv/patterns.md | 196 ++ .../cloudflare/references/miniflare/README.md | 105 + .../cloudflare/references/miniflare/api.md | 187 ++ .../references/miniflare/configuration.md | 173 ++ .../references/miniflare/gotchas.md | 160 ++ .../references/miniflare/patterns.md | 181 ++ .../references/network-interconnect/README.md | 99 + .../references/network-interconnect/api.md | 199 ++ .../network-interconnect/configuration.md | 114 + .../network-interconnect/gotchas.md | 165 ++ .../network-interconnect/patterns.md | 166 ++ .../references/observability/README.md | 88 + .../references/observability/api.md | 164 ++ .../references/observability/configuration.md | 169 ++ .../references/observability/gotchas.md | 115 + .../references/observability/patterns.md | 105 + .../references/pages-functions/README.md | 98 + .../references/pages-functions/api.md | 143 ++ .../pages-functions/configuration.md | 122 ++ .../references/pages-functions/gotchas.md | 94 + .../references/pages-functions/patterns.md | 137 ++ .../cloudflare/references/pages/README.md | 88 + .../skills/cloudflare/references/pages/api.md | 204 ++ .../references/pages/configuration.md | 201 ++ .../cloudflare/references/pages/gotchas.md | 203 ++ .../cloudflare/references/pages/patterns.md | 204 ++ .../cloudflare/references/pipelines/README.md | 105 + .../cloudflare/references/pipelines/api.md | 208 ++ .../references/pipelines/configuration.md | 98 + .../references/pipelines/gotchas.md | 80 + .../references/pipelines/patterns.md | 87 + .../cloudflare/references/pulumi/README.md | 100 + .../cloudflare/references/pulumi/api.md | 200 ++ .../references/pulumi/configuration.md | 198 ++ .../cloudflare/references/pulumi/gotchas.md | 181 ++ .../cloudflare/references/pulumi/patterns.md | 191 ++ .../cloudflare/references/queues/README.md | 96 + .../cloudflare/references/queues/api.md | 206 ++ .../references/queues/configuration.md | 144 ++ .../cloudflare/references/queues/gotchas.md | 206 ++ .../cloudflare/references/queues/patterns.md | 220 ++ .../references/r2-data-catalog/README.md | 149 ++ .../references/r2-data-catalog/api.md | 199 ++ .../r2-data-catalog/configuration.md | 198 ++ .../references/r2-data-catalog/gotchas.md | 170 ++ .../references/r2-data-catalog/patterns.md | 191 ++ .../cloudflare/references/r2-sql/README.md | 128 ++ .../references/r2-sql/SKILL.md.backup | 512 +++++ .../cloudflare/references/r2-sql/api.md | 158 ++ .../references/r2-sql/configuration.md | 147 ++ .../cloudflare/references/r2-sql/gotchas.md | 212 ++ .../cloudflare/references/r2-sql/patterns.md | 222 ++ .../skills/cloudflare/references/r2/README.md | 95 + .../skills/cloudflare/references/r2/api.md | 200 ++ .../cloudflare/references/r2/configuration.md | 165 ++ .../cloudflare/references/r2/gotchas.md | 190 ++ .../cloudflare/references/r2/patterns.md | 193 ++ .../references/realtime-sfu/README.md | 65 + .../cloudflare/references/realtime-sfu/api.md | 158 ++ .../references/realtime-sfu/configuration.md | 137 ++ .../references/realtime-sfu/gotchas.md | 133 ++ .../references/realtime-sfu/patterns.md | 174 ++ .../references/realtimekit/README.md | 113 + .../cloudflare/references/realtimekit/api.md | 212 ++ .../references/realtimekit/configuration.md | 203 ++ .../references/realtimekit/gotchas.md | 169 ++ .../references/realtimekit/patterns.md | 223 ++ .../cloudflare/references/sandbox/README.md | 96 + .../cloudflare/references/sandbox/api.md | 198 ++ .../references/sandbox/configuration.md | 143 ++ .../cloudflare/references/sandbox/gotchas.md | 194 ++ .../cloudflare/references/sandbox/patterns.md | 201 ++ .../references/secrets-store/README.md | 74 + .../references/secrets-store/api.md | 200 ++ .../references/secrets-store/configuration.md | 185 ++ .../references/secrets-store/gotchas.md | 97 + .../references/secrets-store/patterns.md | 207 ++ .../references/smart-placement/README.md | 138 ++ .../references/smart-placement/api.md | 183 ++ .../smart-placement/configuration.md | 196 ++ .../references/smart-placement/gotchas.md | 174 ++ .../references/smart-placement/patterns.md | 183 ++ .../cloudflare/references/snippets/README.md | 68 + .../cloudflare/references/snippets/api.md | 198 ++ .../references/snippets/configuration.md | 227 ++ .../cloudflare/references/snippets/gotchas.md | 86 + .../references/snippets/patterns.md | 135 ++ .../cloudflare/references/spectrum/README.md | 52 + .../cloudflare/references/spectrum/api.md | 181 ++ .../references/spectrum/configuration.md | 194 ++ .../cloudflare/references/spectrum/gotchas.md | 145 ++ .../references/spectrum/patterns.md | 196 ++ .../references/static-assets/README.md | 65 + .../references/static-assets/api.md | 199 ++ .../references/static-assets/configuration.md | 186 ++ .../references/static-assets/gotchas.md | 162 ++ .../references/static-assets/patterns.md | 189 ++ .../cloudflare/references/stream/README.md | 114 + .../cloudflare/references/stream/api-live.md | 195 ++ .../cloudflare/references/stream/api.md | 199 ++ .../references/stream/configuration.md | 141 ++ .../cloudflare/references/stream/gotchas.md | 130 ++ .../cloudflare/references/stream/patterns.md | 184 ++ .../references/tail-workers/README.md | 89 + .../cloudflare/references/tail-workers/api.md | 200 ++ .../references/tail-workers/configuration.md | 176 ++ .../references/tail-workers/gotchas.md | 192 ++ .../references/tail-workers/patterns.md | 180 ++ .../cloudflare/references/terraform/README.md | 102 + .../cloudflare/references/terraform/api.md | 178 ++ .../references/terraform/configuration.md | 197 ++ .../references/terraform/gotchas.md | 150 ++ .../references/terraform/patterns.md | 174 ++ .../cloudflare/references/tunnel/README.md | 129 ++ .../cloudflare/references/tunnel/api.md | 193 ++ .../references/tunnel/configuration.md | 157 ++ .../cloudflare/references/tunnel/gotchas.md | 147 ++ .../references/tunnel/networking.md | 168 ++ .../cloudflare/references/tunnel/patterns.md | 192 ++ .../cloudflare/references/turn/README.md | 82 + .../skills/cloudflare/references/turn/api.md | 239 ++ .../references/turn/configuration.md | 179 ++ .../cloudflare/references/turn/gotchas.md | 231 ++ .../cloudflare/references/turn/patterns.md | 213 ++ .../cloudflare/references/turnstile/README.md | 99 + .../cloudflare/references/turnstile/api.md | 240 ++ .../references/turnstile/configuration.md | 222 ++ .../references/turnstile/gotchas.md | 218 ++ .../references/turnstile/patterns.md | 193 ++ .../cloudflare/references/vectorize/README.md | 133 ++ .../cloudflare/references/vectorize/api.md | 88 + .../references/vectorize/configuration.md | 88 + .../references/vectorize/gotchas.md | 76 + .../references/vectorize/patterns.md | 90 + .../cloudflare/references/waf/README.md | 113 + .../skills/cloudflare/references/waf/api.md | 202 ++ .../references/waf/configuration.md | 203 ++ .../cloudflare/references/waf/gotchas.md | 204 ++ .../cloudflare/references/waf/patterns.md | 197 ++ .../references/web-analytics/README.md | 141 ++ .../references/web-analytics/configuration.md | 76 + .../references/web-analytics/gotchas.md | 82 + .../references/web-analytics/integration.md | 60 + .../references/web-analytics/patterns.md | 91 + .../cloudflare/references/workerd/README.md | 78 + .../cloudflare/references/workerd/api.md | 185 ++ .../references/workerd/configuration.md | 183 ++ .../cloudflare/references/workerd/gotchas.md | 139 ++ .../cloudflare/references/workerd/patterns.md | 192 ++ .../references/workers-ai/README.md | 197 ++ .../cloudflare/references/workers-ai/api.md | 112 + .../references/workers-ai/configuration.md | 97 + .../references/workers-ai/gotchas.md | 114 + .../references/workers-ai/patterns.md | 120 + .../workers-for-platforms/README.md | 89 + .../references/workers-for-platforms/api.md | 196 ++ .../workers-for-platforms/configuration.md | 167 ++ .../workers-for-platforms/gotchas.md | 134 ++ .../workers-for-platforms/patterns.md | 188 ++ .../references/workers-playground/README.md | 127 ++ .../references/workers-playground/api.md | 101 + .../workers-playground/configuration.md | 163 ++ .../references/workers-playground/gotchas.md | 88 + .../references/workers-playground/patterns.md | 132 ++ .../references/workers-vpc/README.md | 127 ++ .../cloudflare/references/workers-vpc/api.md | 202 ++ .../references/workers-vpc/configuration.md | 147 ++ .../references/workers-vpc/gotchas.md | 167 ++ .../references/workers-vpc/patterns.md | 209 ++ .../cloudflare/references/workers/README.md | 108 + .../cloudflare/references/workers/api.md | 195 ++ .../references/workers/configuration.md | 185 ++ .../references/workers/frameworks.md | 197 ++ .../cloudflare/references/workers/gotchas.md | 136 ++ .../cloudflare/references/workers/patterns.md | 198 ++ .../cloudflare/references/workflows/README.md | 69 + .../cloudflare/references/workflows/api.md | 185 ++ .../references/workflows/configuration.md | 151 ++ .../references/workflows/gotchas.md | 97 + .../references/workflows/patterns.md | 175 ++ .../cloudflare/references/wrangler/README.md | 135 ++ .../cloudflare/references/wrangler/api.md | 188 ++ .../references/wrangler/configuration.md | 197 ++ .../cloudflare/references/wrangler/gotchas.md | 197 ++ .../references/wrangler/patterns.md | 209 ++ .../zaraz/IMPLEMENTATION_SUMMARY.md | 121 ++ .../cloudflare/references/zaraz/README.md | 111 + .../skills/cloudflare/references/zaraz/api.md | 112 + .../references/zaraz/configuration.md | 90 + .../cloudflare/references/zaraz/gotchas.md | 81 + .../cloudflare/references/zaraz/patterns.md | 74 + .../skills/codebase-design/DEEPENING.md | 37 + .../skills/codebase-design/DESIGN-IT-TWICE.md | 44 + dot_agents/skills/codebase-design/SKILL.md | 114 + dot_agents/skills/core/SKILL.md | 265 +++ dot_agents/skills/deepinit/SKILL.md | 321 +++ .../skills/design-an-interface/SKILL.md | 94 + .../skills/design-taste-frontend/SKILL.md | 1206 +++++++++++ dot_agents/skills/diagnosing-bugs/SKILL.md | 134 ++ .../scripts/hitl-loop.template.sh | 41 + .../skills/domain-modeling/ADR-FORMAT.md | 47 + .../skills/domain-modeling/CONTEXT-FORMAT.md | 60 + dot_agents/skills/domain-modeling/SKILL.md | 74 + dot_agents/skills/find-skills/SKILL.md | 142 ++ .../skills/fumadocs-component-docs/SKILL.md | 163 ++ .../skills/fumadocs-mdx-structure/SKILL.md | 136 ++ .../fumadocs-registry-integration/SKILL.md | 178 ++ .../git-guardrails-claude-code/SKILL.md | 95 + .../scripts/executable_block-dangerous-git.sh | 25 + dot_agents/skills/golang-pro/SKILL.md | 124 ++ .../golang-pro/references/concurrency.md | 329 +++ .../skills/golang-pro/references/generics.md | 442 ++++ .../golang-pro/references/interfaces.md | 432 ++++ .../references/project-structure.md | 477 ++++ .../skills/golang-pro/references/testing.md | 451 ++++ dot_agents/skills/gpt-taste/SKILL.md | 74 + dot_agents/skills/grill-me/SKILL.md | 7 + dot_agents/skills/grill-with-docs/SKILL.md | 7 + dot_agents/skills/grilling/SKILL.md | 12 + dot_agents/skills/handoff/SKILL.md | 16 + .../skills/high-end-visual-design/SKILL.md | 98 + .../skills/imagegen-frontend-web/SKILL.md | 987 +++++++++ dot_agents/skills/implement/SKILL.md | 15 + .../HTML-REPORT.md | 123 ++ .../improve-codebase-architecture/SKILL.md | 66 + dot_agents/skills/interface-design/SKILL.md | 391 ++++ .../interface-design/references/critique.md | 67 + .../interface-design/references/example.md | 86 + .../interface-design/references/principles.md | 235 ++ .../interface-design/references/validation.md | 48 + dot_agents/skills/laws-of-ux/SKILL.md | 987 +++++++++ dot_agents/skills/linear-cli/SKILL.md | 265 +++ .../skills/linear-cli/SKILL.template.md | 153 ++ .../skills/linear-cli/references/api.md | 23 + .../skills/linear-cli/references/auth.md | 152 ++ .../skills/linear-cli/references/commands.md | 26 + .../skills/linear-cli/references/config.md | 18 + .../skills/linear-cli/references/cycle.md | 61 + .../skills/linear-cli/references/document.md | 138 ++ .../references/initiative-update.md | 65 + .../linear-cli/references/initiative.md | 222 ++ .../skills/linear-cli/references/issue.md | 627 ++++++ .../skills/linear-cli/references/label.md | 87 + .../skills/linear-cli/references/milestone.md | 124 ++ .../references/organization-features.md | 85 + .../linear-cli/references/project-update.md | 65 + .../skills/linear-cli/references/project.md | 139 ++ .../skills/linear-cli/references/schema.md | 20 + .../skills/linear-cli/references/team.md | 141 ++ .../linear-cli/scripts/generate-docs.ts | 331 +++ dot_agents/skills/linear-documents/SKILL.md | 33 + dot_agents/skills/linear/LICENSE.txt | 202 ++ dot_agents/skills/linear/SKILL.md | 87 + dot_agents/skills/linear/agents/openai.yaml | 14 + .../skills/linear/assets/linear-small.svg | 5 + dot_agents/skills/linear/assets/linear.png | Bin 0 -> 6969 bytes dot_agents/skills/loop-me/SKILL.md | 32 + dot_agents/skills/loopy/SKILL.md | 301 +++ dot_agents/skills/loopy/agents/openai.yaml | 4 + dot_agents/skills/loopy/references/audit.md | 61 + dot_agents/skills/loopy/references/debrief.md | 43 + .../skills/loopy/references/discover.md | 72 + dot_agents/skills/loopy/references/publish.md | 65 + dot_agents/skills/loopy/references/run.md | 73 + .../skills/migrate-to-shoehorn/SKILL.md | 118 + dot_agents/skills/minimalist-ui/SKILL.md | 85 + dot_agents/skills/mintlify-api/SKILL.md | 43 + dot_agents/skills/mintlify-docs/SKILL.md | 328 +++ dot_agents/skills/mintlify/SKILL.md | 328 +++ dot_agents/skills/native-sdk/SKILL.md | 33 + dot_agents/skills/obsidian-vault/SKILL.md | 59 + .../skills/openlogs-server-logs/SKILL.md | 56 + .../openlogs-server-logs/agents/openai.yaml | 4 + dot_agents/skills/prototype/LOGIC.md | 79 + dot_agents/skills/prototype/SKILL.md | 26 + dot_agents/skills/prototype/UI.md | 112 + dot_agents/skills/qa/SKILL.md | 130 ++ dot_agents/skills/react/SKILL.md | 265 +++ .../redesign-existing-projects/SKILL.md | 178 ++ dot_agents/skills/remix/SKILL.md | 439 ++++ .../remix/references/animate-elements.md | 186 ++ .../references/assets-and-browser-modules.md | 111 + .../remix/references/auth-and-sessions.md | 422 ++++ .../remix/references/component-model.md | 270 +++ .../skills/remix/references/create-mixins.md | 153 ++ .../remix/references/data-and-validation.md | 356 +++ .../references/hydration-frames-navigation.md | 264 +++ .../remix/references/middleware-and-server.md | 216 ++ .../remix/references/mixins-styling-events.md | 195 ++ .../references/routing-and-controllers.md | 362 ++++ .../remix/references/testing-patterns.md | 153 ++ .../skills/request-refactor-plan/SKILL.md | 68 + .../skills/resolving-merge-conflicts/SKILL.md | 14 + .../skills/rust-async-patterns/SKILL.md | 95 + .../rust-async-patterns/references/details.md | 423 ++++ .../skills/rust-best-practices/SKILL.md | 94 + .../references/chapter_01.md | 552 +++++ .../references/chapter_02.md | 117 + .../references/chapter_03.md | 209 ++ .../references/chapter_04.md | 180 ++ .../references/chapter_05.md | 381 ++++ .../references/chapter_06.md | 161 ++ .../references/chapter_07.md | 226 ++ .../references/chapter_08.md | 254 +++ .../references/chapter_09.md | 256 +++ dot_agents/skills/rust-testing/SKILL.md | 501 +++++ dot_agents/skills/scaffold-exercises/SKILL.md | 106 + .../skills/setup-matt-pocock-skills/SKILL.md | 116 + .../skills/setup-matt-pocock-skills/domain.md | 51 + .../issue-tracker-github.md | 45 + .../issue-tracker-gitlab.md | 46 + .../issue-tracker-local.md | 30 + .../setup-matt-pocock-skills/triage-labels.md | 15 + dot_agents/skills/setup-pre-commit/SKILL.md | 91 + dot_agents/skills/shadcn/SKILL.md | 275 +++ dot_agents/skills/shadcn/agents/openai.yml | 5 + .../skills/shadcn/assets/shadcn-small.png | Bin 0 -> 1049 bytes dot_agents/skills/shadcn/assets/shadcn.png | Bin 0 -> 3852 bytes dot_agents/skills/shadcn/cli.md | 290 +++ dot_agents/skills/shadcn/customization.md | 209 ++ dot_agents/skills/shadcn/evals/evals.json | 77 + dot_agents/skills/shadcn/mcp.md | 105 + dot_agents/skills/shadcn/registry.md | 277 +++ .../skills/shadcn/rules/base-vs-radix.md | 306 +++ dot_agents/skills/shadcn/rules/chat.md | 224 ++ dot_agents/skills/shadcn/rules/composition.md | 201 ++ dot_agents/skills/shadcn/rules/forms.md | 192 ++ dot_agents/skills/shadcn/rules/icons.md | 101 + dot_agents/skills/shadcn/rules/styling.md | 185 ++ .../solidity-foundry-development/SKILL.md | 127 ++ .../references/foundry-cheatsheet.md | 119 + dot_agents/skills/solidity-security/SKILL.md | 112 + .../solidity-security/references/details.md | 389 ++++ dot_agents/skills/stop-slop/CHANGELOG.md | 24 + dot_agents/skills/stop-slop/LICENSE | 21 + dot_agents/skills/stop-slop/README.md | 62 + dot_agents/skills/stop-slop/SKILL.md | 68 + .../skills/stop-slop/references/examples.md | 59 + .../skills/stop-slop/references/phrases.md | 128 ++ .../skills/stop-slop/references/structures.md | 134 ++ dot_agents/skills/tanstack-form/SKILL.md | 416 ++++ .../SKILL.md | 68 + .../rules/cache-single-source.md | 187 ++ .../rules/flow-loader-query-pattern.md | 178 ++ .../rules/setup-query-client-context.md | 173 ++ .../rules/ssr-dehydrate-hydrate.md | 206 ++ .../tanstack-query-best-practices/SKILL.md | 114 + .../rules/cache-gc-time.md | 93 + .../rules/cache-invalidation.md | 116 + .../rules/cache-placeholder-vs-initial.md | 156 ++ .../rules/cache-stale-time.md | 80 + .../rules/err-error-boundaries.md | 150 ++ .../rules/inf-page-params.md | 132 ++ .../rules/mut-invalidate-queries.md | 118 + .../rules/mut-mutation-state.md | 169 ++ .../rules/mut-optimistic-updates.md | 137 ++ .../rules/network-mode.md | 179 ++ .../rules/parallel-use-queries.md | 152 ++ .../rules/perf-select-transform.md | 144 ++ .../rules/persist-queries.md | 194 ++ .../rules/pf-intent-prefetch.md | 143 ++ .../rules/qk-array-structure.md | 50 + .../rules/qk-factory-pattern.md | 102 + .../rules/qk-hierarchical-organization.md | 76 + .../rules/qk-include-dependencies.md | 62 + .../rules/qk-serializable.md | 93 + .../rules/query-cancellation.md | 171 ++ .../rules/ssr-dehydration.md | 158 ++ .../tanstack-router-best-practices/SKILL.md | 113 + .../rules/ctx-root-context.md | 172 ++ .../rules/err-not-found.md | 194 ++ .../rules/load-ensure-query-data.md | 153 ++ .../rules/load-parallel.md | 190 ++ .../rules/load-use-loaders.md | 148 ++ .../rules/nav-link-component.md | 178 ++ .../rules/nav-route-masks.md | 197 ++ .../rules/org-virtual-routes.md | 133 ++ .../rules/preload-intent.md | 133 ++ .../rules/router-default-options.md | 163 ++ .../rules/search-custom-serializer.md | 198 ++ .../rules/search-validation.md | 158 ++ .../rules/split-lazy-routes.md | 148 ++ .../rules/ts-register-router.md | 113 + .../rules/ts-use-from-param.md | 130 ++ .../tanstack-start-best-practices/SKILL.md | 109 + .../rules/api-routes.md | 238 ++ .../rules/auth-route-protection.md | 192 ++ .../rules/auth-session-management.md | 191 ++ .../rules/deploy-adapters.md | 201 ++ .../rules/env-functions.md | 211 ++ .../rules/err-server-errors.md | 187 ++ .../rules/file-separation.md | 152 ++ .../rules/mw-request-middleware.md | 166 ++ .../rules/sf-create-server-fn.md | 146 ++ .../rules/sf-input-validation.md | 158 ++ .../rules/ssr-hydration-safety.md | 187 ++ .../rules/ssr-prerender.md | 199 ++ .../rules/ssr-streaming.md | 201 ++ dot_agents/skills/tanstack-table/SKILL.md | 582 +++++ dot_agents/skills/tdd/SKILL.md | 36 + dot_agents/skills/tdd/mocking.md | 59 + dot_agents/skills/tdd/tests.md | 77 + dot_agents/skills/teach/GLOSSARY-FORMAT.md | 35 + .../skills/teach/LEARNING-RECORD-FORMAT.md | 46 + dot_agents/skills/teach/MISSION-FORMAT.md | 31 + dot_agents/skills/teach/RESOURCES-FORMAT.md | 32 + dot_agents/skills/teach/SKILL.md | 140 ++ dot_agents/skills/todoist-cli/SKILL.md | 414 ++++ dot_agents/skills/triage/AGENT-BRIEF.md | 207 ++ dot_agents/skills/triage/OUT-OF-SCOPE.md | 105 + dot_agents/skills/triage/SKILL.md | 112 + dot_agents/skills/typescript-expert/SKILL.md | 138 ++ .../typescript-expert/agents/openai.yaml | 4 + .../skills/ubiquitous-language/SKILL.md | 93 + dot_agents/skills/ui-ux-pro-max/SKILL.md | 659 ++++++ .../skills/ui-ux-pro-max/data/_sync_all.py | 414 ++++ .../ui-ux-pro-max/data/app-interface.csv | 31 + .../skills/ui-ux-pro-max/data/charts.csv | 26 + .../skills/ui-ux-pro-max/data/colors.csv | 162 ++ .../skills/ui-ux-pro-max/data/design.csv | 1776 +++++++++++++++ .../skills/ui-ux-pro-max/data/draft.csv | 1779 +++++++++++++++ .../ui-ux-pro-max/data/google-fonts.csv | 1924 +++++++++++++++++ .../skills/ui-ux-pro-max/data/icons.csv | 106 + .../skills/ui-ux-pro-max/data/landing.csv | 35 + .../skills/ui-ux-pro-max/data/products.csv | 162 ++ .../ui-ux-pro-max/data/react-performance.csv | 45 + .../data/stacks/react-native.csv | 52 + .../skills/ui-ux-pro-max/data/styles.csv | 85 + .../skills/ui-ux-pro-max/data/typography.csv | 74 + .../ui-ux-pro-max/data/ui-reasoning.csv | 162 ++ .../ui-ux-pro-max/data/ux-guidelines.csv | 100 + .../skills/ui-ux-pro-max/scripts/core.py | 247 +++ .../ui-ux-pro-max/scripts/design_system.py | 1067 +++++++++ .../skills/ui-ux-pro-max/scripts/search.py | 114 + dot_agents/skills/uv-package-manager/SKILL.md | 345 +++ .../references/advanced-patterns.md | 473 ++++ .../skills/web-design-guidelines/SKILL.md | 39 + .../skills/workers-best-practices/SKILL.md | 127 ++ .../references/review.md | 174 ++ .../references/rules.md | 463 ++++ dot_agents/skills/wrangler/SKILL.md | 922 ++++++++ dot_agents/skills/write-tests/SKILL.md | 99 + .../skills/write-tests/agents/openai.yaml | 4 + dot_agents/skills/writing-beats/SKILL.md | 67 + dot_agents/skills/writing-fragments/SKILL.md | 79 + .../skills/writing-great-skills/GLOSSARY.md | 201 ++ .../skills/writing-great-skills/SKILL.md | 83 + dot_agents/skills/writing-shape/SKILL.md | 79 + dot_bashrc | 10 + dot_config/bash/functions/c.bash | 8 + dot_config/bash/functions/cd.bash | 23 + dot_config/bash/functions/clip-last.bash | 29 + dot_config/bash/functions/ghg.bash | 8 + dot_config/bash/functions/ghn.bash | 6 + dot_config/bash/functions/gho.bash | 10 + dot_config/bash/functions/yy.bash | 11 + dot_config/fish/functions/ai.fish | 13 - dot_config/fish/functions/c2p.fish | 3 - dot_config/fish/functions/cp-appid.fish | 43 - dot_config/fish/functions/extract_agents.fish | 18 - dot_config/fish/functions/fab.fish | 40 - dot_config/fish/functions/gdc.fish | 9 - .../fish/functions/gh-sonr-org-migrate.fish | 151 -- dot_config/fish/functions/ghg.fish | 17 +- dot_config/fish/functions/ghn.fish | 31 +- dot_config/fish/functions/gho.fish | 21 +- dot_config/fish/functions/git-summary.fish | 22 - .../launch_omp_livediff_overlay.fish | 16 - dot_config/fish/functions/lc-elir.fish | 16 - dot_config/fish/functions/mdcp.fish | 8 - dot_config/fish/functions/mdp.fish | 10 - dot_config/fish/functions/pj.fish | 86 - dot_config/zsh/functions/c.zsh | 8 + dot_config/zsh/functions/cd.zsh | 23 + dot_config/zsh/functions/clip-last.zsh | 29 + dot_config/zsh/functions/ghg.zsh | 8 + dot_config/zsh/functions/ghn.zsh | 6 + dot_config/zsh/functions/gho.zsh | 10 + dot_config/zsh/functions/yy.zsh | 11 + dot_local/bin/executable_ai | 11 + dot_local/bin/executable_c2p | 5 + dot_local/bin/executable_cp-appid | 43 + dot_local/bin/executable_extract_agents | 16 + dot_local/bin/executable_fab | 44 + dot_local/bin/executable_gdc | 9 + dot_local/bin/executable_gh-sonr-org-migrate | 163 ++ dot_local/bin/executable_ghg-clone | 34 + dot_local/bin/executable_ghn | 28 + dot_local/bin/executable_gho | 20 + dot_local/bin/executable_git-summary | 20 + .../executable_launch_omp_livediff_overlay | 16 + dot_local/bin/executable_lc-elir | 18 + dot_local/bin/executable_mdcp | 19 + dot_local/bin/executable_mdp | 6 + dot_local/bin/executable_pj | 90 + dot_zshrc | 10 + 637 files changed, 100297 insertions(+), 497 deletions(-) create mode 100644 dot_agents/dot_skill-lock.json create mode 100644 dot_agents/skills/blume-migrate/SKILL.md create mode 100644 dot_agents/skills/blume-migrate/assets/oxfmt@0.55.0.patch create mode 100644 dot_agents/skills/blume-migrate/references/docusaurus.md create mode 100644 dot_agents/skills/blume-migrate/references/fumadocs.md create mode 100644 dot_agents/skills/blume-migrate/references/mintlify.md create mode 100644 dot_agents/skills/blume-migrate/references/monorepo.md create mode 100644 dot_agents/skills/blume-migrate/references/nextra.md create mode 100644 dot_agents/skills/blume-migrate/references/starlight.md create mode 100644 dot_agents/skills/blume-migrate/scripts/mintlify-codemod.mjs create mode 100644 dot_agents/skills/blume-update-docs/SKILL.md create mode 100644 dot_agents/skills/blume-update-docs/references/audit-checklist.md create mode 100644 dot_agents/skills/blume/SKILL.md create mode 100644 dot_agents/skills/brandkit/SKILL.md create mode 100644 dot_agents/skills/bun-development/SKILL.md create mode 100644 dot_agents/skills/cloudflare/SKILL.md create mode 100644 dot_agents/skills/cloudflare/references/agents-sdk/README.md create mode 100644 dot_agents/skills/cloudflare/references/agents-sdk/api.md create mode 100644 dot_agents/skills/cloudflare/references/agents-sdk/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/agents-sdk/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/agents-sdk/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/ai-gateway/README.md create mode 100644 dot_agents/skills/cloudflare/references/ai-gateway/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/ai-gateway/dynamic-routing.md create mode 100644 dot_agents/skills/cloudflare/references/ai-gateway/features.md create mode 100644 dot_agents/skills/cloudflare/references/ai-gateway/sdk-integration.md create mode 100644 dot_agents/skills/cloudflare/references/ai-gateway/troubleshooting.md create mode 100644 dot_agents/skills/cloudflare/references/ai-search/README.md create mode 100644 dot_agents/skills/cloudflare/references/ai-search/api.md create mode 100644 dot_agents/skills/cloudflare/references/ai-search/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/ai-search/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/ai-search/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/analytics-engine/README.md create mode 100644 dot_agents/skills/cloudflare/references/analytics-engine/api.md create mode 100644 dot_agents/skills/cloudflare/references/analytics-engine/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/analytics-engine/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/analytics-engine/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/api-shield/README.md create mode 100644 dot_agents/skills/cloudflare/references/api-shield/api.md create mode 100644 dot_agents/skills/cloudflare/references/api-shield/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/api-shield/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/api-shield/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/api/README.md create mode 100644 dot_agents/skills/cloudflare/references/api/api.md create mode 100644 dot_agents/skills/cloudflare/references/api/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/api/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/api/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/argo-smart-routing/README.md create mode 100644 dot_agents/skills/cloudflare/references/argo-smart-routing/api.md create mode 100644 dot_agents/skills/cloudflare/references/argo-smart-routing/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/argo-smart-routing/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/argo-smart-routing/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/bindings/README.md create mode 100644 dot_agents/skills/cloudflare/references/bindings/api.md create mode 100644 dot_agents/skills/cloudflare/references/bindings/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/bindings/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/bindings/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/bot-management/README.md create mode 100644 dot_agents/skills/cloudflare/references/bot-management/api.md create mode 100644 dot_agents/skills/cloudflare/references/bot-management/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/bot-management/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/bot-management/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/browser-rendering/README.md create mode 100644 dot_agents/skills/cloudflare/references/browser-rendering/api.md create mode 100644 dot_agents/skills/cloudflare/references/browser-rendering/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/browser-rendering/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/browser-rendering/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/c3/README.md create mode 100644 dot_agents/skills/cloudflare/references/c3/api.md create mode 100644 dot_agents/skills/cloudflare/references/c3/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/c3/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/c3/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/cache-reserve/README.md create mode 100644 dot_agents/skills/cloudflare/references/cache-reserve/api.md create mode 100644 dot_agents/skills/cloudflare/references/cache-reserve/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/cache-reserve/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/cache-reserve/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/containers/README.md create mode 100644 dot_agents/skills/cloudflare/references/containers/api.md create mode 100644 dot_agents/skills/cloudflare/references/containers/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/containers/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/containers/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/cron-triggers/README.md create mode 100644 dot_agents/skills/cloudflare/references/cron-triggers/api.md create mode 100644 dot_agents/skills/cloudflare/references/cron-triggers/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/cron-triggers/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/cron-triggers/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/d1/README.md create mode 100644 dot_agents/skills/cloudflare/references/d1/api.md create mode 100644 dot_agents/skills/cloudflare/references/d1/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/d1/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/d1/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/ddos/README.md create mode 100644 dot_agents/skills/cloudflare/references/ddos/api.md create mode 100644 dot_agents/skills/cloudflare/references/ddos/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/ddos/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/ddos/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/do-storage/README.md create mode 100644 dot_agents/skills/cloudflare/references/do-storage/api.md create mode 100644 dot_agents/skills/cloudflare/references/do-storage/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/do-storage/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/do-storage/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/do-storage/testing.md create mode 100644 dot_agents/skills/cloudflare/references/durable-objects/README.md create mode 100644 dot_agents/skills/cloudflare/references/durable-objects/api.md create mode 100644 dot_agents/skills/cloudflare/references/durable-objects/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/durable-objects/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/durable-objects/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/email-routing/README.md create mode 100644 dot_agents/skills/cloudflare/references/email-routing/api.md create mode 100644 dot_agents/skills/cloudflare/references/email-routing/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/email-routing/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/email-routing/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/email-workers/README.md create mode 100644 dot_agents/skills/cloudflare/references/email-workers/api.md create mode 100644 dot_agents/skills/cloudflare/references/email-workers/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/email-workers/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/email-workers/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/graphql-api/README.md create mode 100644 dot_agents/skills/cloudflare/references/graphql-api/api.md create mode 100644 dot_agents/skills/cloudflare/references/graphql-api/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/graphql-api/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/graphql-api/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/hyperdrive/README.md create mode 100644 dot_agents/skills/cloudflare/references/hyperdrive/api.md create mode 100644 dot_agents/skills/cloudflare/references/hyperdrive/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/hyperdrive/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/hyperdrive/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/images/README.md create mode 100644 dot_agents/skills/cloudflare/references/images/api.md create mode 100644 dot_agents/skills/cloudflare/references/images/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/images/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/images/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/kv/README.md create mode 100644 dot_agents/skills/cloudflare/references/kv/api.md create mode 100644 dot_agents/skills/cloudflare/references/kv/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/kv/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/kv/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/miniflare/README.md create mode 100644 dot_agents/skills/cloudflare/references/miniflare/api.md create mode 100644 dot_agents/skills/cloudflare/references/miniflare/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/miniflare/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/miniflare/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/network-interconnect/README.md create mode 100644 dot_agents/skills/cloudflare/references/network-interconnect/api.md create mode 100644 dot_agents/skills/cloudflare/references/network-interconnect/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/network-interconnect/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/network-interconnect/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/observability/README.md create mode 100644 dot_agents/skills/cloudflare/references/observability/api.md create mode 100644 dot_agents/skills/cloudflare/references/observability/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/observability/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/observability/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/pages-functions/README.md create mode 100644 dot_agents/skills/cloudflare/references/pages-functions/api.md create mode 100644 dot_agents/skills/cloudflare/references/pages-functions/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/pages-functions/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/pages-functions/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/pages/README.md create mode 100644 dot_agents/skills/cloudflare/references/pages/api.md create mode 100644 dot_agents/skills/cloudflare/references/pages/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/pages/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/pages/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/pipelines/README.md create mode 100644 dot_agents/skills/cloudflare/references/pipelines/api.md create mode 100644 dot_agents/skills/cloudflare/references/pipelines/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/pipelines/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/pipelines/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/pulumi/README.md create mode 100644 dot_agents/skills/cloudflare/references/pulumi/api.md create mode 100644 dot_agents/skills/cloudflare/references/pulumi/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/pulumi/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/pulumi/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/queues/README.md create mode 100644 dot_agents/skills/cloudflare/references/queues/api.md create mode 100644 dot_agents/skills/cloudflare/references/queues/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/queues/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/queues/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/r2-data-catalog/README.md create mode 100644 dot_agents/skills/cloudflare/references/r2-data-catalog/api.md create mode 100644 dot_agents/skills/cloudflare/references/r2-data-catalog/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/r2-data-catalog/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/r2-data-catalog/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/r2-sql/README.md create mode 100644 dot_agents/skills/cloudflare/references/r2-sql/SKILL.md.backup create mode 100644 dot_agents/skills/cloudflare/references/r2-sql/api.md create mode 100644 dot_agents/skills/cloudflare/references/r2-sql/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/r2-sql/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/r2-sql/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/r2/README.md create mode 100644 dot_agents/skills/cloudflare/references/r2/api.md create mode 100644 dot_agents/skills/cloudflare/references/r2/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/r2/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/r2/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/realtime-sfu/README.md create mode 100644 dot_agents/skills/cloudflare/references/realtime-sfu/api.md create mode 100644 dot_agents/skills/cloudflare/references/realtime-sfu/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/realtime-sfu/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/realtime-sfu/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/realtimekit/README.md create mode 100644 dot_agents/skills/cloudflare/references/realtimekit/api.md create mode 100644 dot_agents/skills/cloudflare/references/realtimekit/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/realtimekit/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/realtimekit/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/sandbox/README.md create mode 100644 dot_agents/skills/cloudflare/references/sandbox/api.md create mode 100644 dot_agents/skills/cloudflare/references/sandbox/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/sandbox/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/sandbox/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/secrets-store/README.md create mode 100644 dot_agents/skills/cloudflare/references/secrets-store/api.md create mode 100644 dot_agents/skills/cloudflare/references/secrets-store/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/secrets-store/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/secrets-store/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/smart-placement/README.md create mode 100644 dot_agents/skills/cloudflare/references/smart-placement/api.md create mode 100644 dot_agents/skills/cloudflare/references/smart-placement/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/smart-placement/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/smart-placement/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/snippets/README.md create mode 100644 dot_agents/skills/cloudflare/references/snippets/api.md create mode 100644 dot_agents/skills/cloudflare/references/snippets/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/snippets/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/snippets/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/spectrum/README.md create mode 100644 dot_agents/skills/cloudflare/references/spectrum/api.md create mode 100644 dot_agents/skills/cloudflare/references/spectrum/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/spectrum/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/spectrum/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/static-assets/README.md create mode 100644 dot_agents/skills/cloudflare/references/static-assets/api.md create mode 100644 dot_agents/skills/cloudflare/references/static-assets/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/static-assets/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/static-assets/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/stream/README.md create mode 100644 dot_agents/skills/cloudflare/references/stream/api-live.md create mode 100644 dot_agents/skills/cloudflare/references/stream/api.md create mode 100644 dot_agents/skills/cloudflare/references/stream/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/stream/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/stream/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/tail-workers/README.md create mode 100644 dot_agents/skills/cloudflare/references/tail-workers/api.md create mode 100644 dot_agents/skills/cloudflare/references/tail-workers/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/tail-workers/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/tail-workers/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/terraform/README.md create mode 100644 dot_agents/skills/cloudflare/references/terraform/api.md create mode 100644 dot_agents/skills/cloudflare/references/terraform/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/terraform/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/terraform/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/tunnel/README.md create mode 100644 dot_agents/skills/cloudflare/references/tunnel/api.md create mode 100644 dot_agents/skills/cloudflare/references/tunnel/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/tunnel/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/tunnel/networking.md create mode 100644 dot_agents/skills/cloudflare/references/tunnel/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/turn/README.md create mode 100644 dot_agents/skills/cloudflare/references/turn/api.md create mode 100644 dot_agents/skills/cloudflare/references/turn/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/turn/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/turn/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/turnstile/README.md create mode 100644 dot_agents/skills/cloudflare/references/turnstile/api.md create mode 100644 dot_agents/skills/cloudflare/references/turnstile/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/turnstile/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/turnstile/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/vectorize/README.md create mode 100644 dot_agents/skills/cloudflare/references/vectorize/api.md create mode 100644 dot_agents/skills/cloudflare/references/vectorize/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/vectorize/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/vectorize/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/waf/README.md create mode 100644 dot_agents/skills/cloudflare/references/waf/api.md create mode 100644 dot_agents/skills/cloudflare/references/waf/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/waf/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/waf/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/web-analytics/README.md create mode 100644 dot_agents/skills/cloudflare/references/web-analytics/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/web-analytics/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/web-analytics/integration.md create mode 100644 dot_agents/skills/cloudflare/references/web-analytics/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workerd/README.md create mode 100644 dot_agents/skills/cloudflare/references/workerd/api.md create mode 100644 dot_agents/skills/cloudflare/references/workerd/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workerd/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workerd/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workers-ai/README.md create mode 100644 dot_agents/skills/cloudflare/references/workers-ai/api.md create mode 100644 dot_agents/skills/cloudflare/references/workers-ai/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workers-ai/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workers-ai/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workers-for-platforms/README.md create mode 100644 dot_agents/skills/cloudflare/references/workers-for-platforms/api.md create mode 100644 dot_agents/skills/cloudflare/references/workers-for-platforms/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workers-for-platforms/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workers-for-platforms/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workers-playground/README.md create mode 100644 dot_agents/skills/cloudflare/references/workers-playground/api.md create mode 100644 dot_agents/skills/cloudflare/references/workers-playground/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workers-playground/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workers-playground/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workers-vpc/README.md create mode 100644 dot_agents/skills/cloudflare/references/workers-vpc/api.md create mode 100644 dot_agents/skills/cloudflare/references/workers-vpc/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workers-vpc/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workers-vpc/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workers/README.md create mode 100644 dot_agents/skills/cloudflare/references/workers/api.md create mode 100644 dot_agents/skills/cloudflare/references/workers/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workers/frameworks.md create mode 100644 dot_agents/skills/cloudflare/references/workers/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workers/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/workflows/README.md create mode 100644 dot_agents/skills/cloudflare/references/workflows/api.md create mode 100644 dot_agents/skills/cloudflare/references/workflows/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/workflows/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/workflows/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/wrangler/README.md create mode 100644 dot_agents/skills/cloudflare/references/wrangler/api.md create mode 100644 dot_agents/skills/cloudflare/references/wrangler/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/wrangler/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/wrangler/patterns.md create mode 100644 dot_agents/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md create mode 100644 dot_agents/skills/cloudflare/references/zaraz/README.md create mode 100644 dot_agents/skills/cloudflare/references/zaraz/api.md create mode 100644 dot_agents/skills/cloudflare/references/zaraz/configuration.md create mode 100644 dot_agents/skills/cloudflare/references/zaraz/gotchas.md create mode 100644 dot_agents/skills/cloudflare/references/zaraz/patterns.md create mode 100644 dot_agents/skills/codebase-design/DEEPENING.md create mode 100644 dot_agents/skills/codebase-design/DESIGN-IT-TWICE.md create mode 100644 dot_agents/skills/codebase-design/SKILL.md create mode 100644 dot_agents/skills/core/SKILL.md create mode 100644 dot_agents/skills/deepinit/SKILL.md create mode 100644 dot_agents/skills/design-an-interface/SKILL.md create mode 100644 dot_agents/skills/design-taste-frontend/SKILL.md create mode 100644 dot_agents/skills/diagnosing-bugs/SKILL.md create mode 100644 dot_agents/skills/diagnosing-bugs/scripts/hitl-loop.template.sh create mode 100644 dot_agents/skills/domain-modeling/ADR-FORMAT.md create mode 100644 dot_agents/skills/domain-modeling/CONTEXT-FORMAT.md create mode 100644 dot_agents/skills/domain-modeling/SKILL.md create mode 100644 dot_agents/skills/find-skills/SKILL.md create mode 100644 dot_agents/skills/fumadocs-component-docs/SKILL.md create mode 100644 dot_agents/skills/fumadocs-mdx-structure/SKILL.md create mode 100644 dot_agents/skills/fumadocs-registry-integration/SKILL.md create mode 100644 dot_agents/skills/git-guardrails-claude-code/SKILL.md create mode 100644 dot_agents/skills/git-guardrails-claude-code/scripts/executable_block-dangerous-git.sh create mode 100644 dot_agents/skills/golang-pro/SKILL.md create mode 100644 dot_agents/skills/golang-pro/references/concurrency.md create mode 100644 dot_agents/skills/golang-pro/references/generics.md create mode 100644 dot_agents/skills/golang-pro/references/interfaces.md create mode 100644 dot_agents/skills/golang-pro/references/project-structure.md create mode 100644 dot_agents/skills/golang-pro/references/testing.md create mode 100644 dot_agents/skills/gpt-taste/SKILL.md create mode 100644 dot_agents/skills/grill-me/SKILL.md create mode 100644 dot_agents/skills/grill-with-docs/SKILL.md create mode 100644 dot_agents/skills/grilling/SKILL.md create mode 100644 dot_agents/skills/handoff/SKILL.md create mode 100644 dot_agents/skills/high-end-visual-design/SKILL.md create mode 100644 dot_agents/skills/imagegen-frontend-web/SKILL.md create mode 100644 dot_agents/skills/implement/SKILL.md create mode 100644 dot_agents/skills/improve-codebase-architecture/HTML-REPORT.md create mode 100644 dot_agents/skills/improve-codebase-architecture/SKILL.md create mode 100644 dot_agents/skills/interface-design/SKILL.md create mode 100644 dot_agents/skills/interface-design/references/critique.md create mode 100644 dot_agents/skills/interface-design/references/example.md create mode 100644 dot_agents/skills/interface-design/references/principles.md create mode 100644 dot_agents/skills/interface-design/references/validation.md create mode 100644 dot_agents/skills/laws-of-ux/SKILL.md create mode 100644 dot_agents/skills/linear-cli/SKILL.md create mode 100644 dot_agents/skills/linear-cli/SKILL.template.md create mode 100644 dot_agents/skills/linear-cli/references/api.md create mode 100644 dot_agents/skills/linear-cli/references/auth.md create mode 100644 dot_agents/skills/linear-cli/references/commands.md create mode 100644 dot_agents/skills/linear-cli/references/config.md create mode 100644 dot_agents/skills/linear-cli/references/cycle.md create mode 100644 dot_agents/skills/linear-cli/references/document.md create mode 100644 dot_agents/skills/linear-cli/references/initiative-update.md create mode 100644 dot_agents/skills/linear-cli/references/initiative.md create mode 100644 dot_agents/skills/linear-cli/references/issue.md create mode 100644 dot_agents/skills/linear-cli/references/label.md create mode 100644 dot_agents/skills/linear-cli/references/milestone.md create mode 100644 dot_agents/skills/linear-cli/references/organization-features.md create mode 100644 dot_agents/skills/linear-cli/references/project-update.md create mode 100644 dot_agents/skills/linear-cli/references/project.md create mode 100644 dot_agents/skills/linear-cli/references/schema.md create mode 100644 dot_agents/skills/linear-cli/references/team.md create mode 100644 dot_agents/skills/linear-cli/scripts/generate-docs.ts create mode 100644 dot_agents/skills/linear-documents/SKILL.md create mode 100644 dot_agents/skills/linear/LICENSE.txt create mode 100644 dot_agents/skills/linear/SKILL.md create mode 100644 dot_agents/skills/linear/agents/openai.yaml create mode 100644 dot_agents/skills/linear/assets/linear-small.svg create mode 100644 dot_agents/skills/linear/assets/linear.png create mode 100644 dot_agents/skills/loop-me/SKILL.md create mode 100644 dot_agents/skills/loopy/SKILL.md create mode 100644 dot_agents/skills/loopy/agents/openai.yaml create mode 100644 dot_agents/skills/loopy/references/audit.md create mode 100644 dot_agents/skills/loopy/references/debrief.md create mode 100644 dot_agents/skills/loopy/references/discover.md create mode 100644 dot_agents/skills/loopy/references/publish.md create mode 100644 dot_agents/skills/loopy/references/run.md create mode 100644 dot_agents/skills/migrate-to-shoehorn/SKILL.md create mode 100644 dot_agents/skills/minimalist-ui/SKILL.md create mode 100644 dot_agents/skills/mintlify-api/SKILL.md create mode 100644 dot_agents/skills/mintlify-docs/SKILL.md create mode 100644 dot_agents/skills/mintlify/SKILL.md create mode 100644 dot_agents/skills/native-sdk/SKILL.md create mode 100644 dot_agents/skills/obsidian-vault/SKILL.md create mode 100644 dot_agents/skills/openlogs-server-logs/SKILL.md create mode 100644 dot_agents/skills/openlogs-server-logs/agents/openai.yaml create mode 100644 dot_agents/skills/prototype/LOGIC.md create mode 100644 dot_agents/skills/prototype/SKILL.md create mode 100644 dot_agents/skills/prototype/UI.md create mode 100644 dot_agents/skills/qa/SKILL.md create mode 100644 dot_agents/skills/react/SKILL.md create mode 100644 dot_agents/skills/redesign-existing-projects/SKILL.md create mode 100644 dot_agents/skills/remix/SKILL.md create mode 100644 dot_agents/skills/remix/references/animate-elements.md create mode 100644 dot_agents/skills/remix/references/assets-and-browser-modules.md create mode 100644 dot_agents/skills/remix/references/auth-and-sessions.md create mode 100644 dot_agents/skills/remix/references/component-model.md create mode 100644 dot_agents/skills/remix/references/create-mixins.md create mode 100644 dot_agents/skills/remix/references/data-and-validation.md create mode 100644 dot_agents/skills/remix/references/hydration-frames-navigation.md create mode 100644 dot_agents/skills/remix/references/middleware-and-server.md create mode 100644 dot_agents/skills/remix/references/mixins-styling-events.md create mode 100644 dot_agents/skills/remix/references/routing-and-controllers.md create mode 100644 dot_agents/skills/remix/references/testing-patterns.md create mode 100644 dot_agents/skills/request-refactor-plan/SKILL.md create mode 100644 dot_agents/skills/resolving-merge-conflicts/SKILL.md create mode 100644 dot_agents/skills/rust-async-patterns/SKILL.md create mode 100644 dot_agents/skills/rust-async-patterns/references/details.md create mode 100644 dot_agents/skills/rust-best-practices/SKILL.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_01.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_02.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_03.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_04.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_05.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_06.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_07.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_08.md create mode 100644 dot_agents/skills/rust-best-practices/references/chapter_09.md create mode 100644 dot_agents/skills/rust-testing/SKILL.md create mode 100644 dot_agents/skills/scaffold-exercises/SKILL.md create mode 100644 dot_agents/skills/setup-matt-pocock-skills/SKILL.md create mode 100644 dot_agents/skills/setup-matt-pocock-skills/domain.md create mode 100644 dot_agents/skills/setup-matt-pocock-skills/issue-tracker-github.md create mode 100644 dot_agents/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md create mode 100644 dot_agents/skills/setup-matt-pocock-skills/issue-tracker-local.md create mode 100644 dot_agents/skills/setup-matt-pocock-skills/triage-labels.md create mode 100644 dot_agents/skills/setup-pre-commit/SKILL.md create mode 100644 dot_agents/skills/shadcn/SKILL.md create mode 100644 dot_agents/skills/shadcn/agents/openai.yml create mode 100644 dot_agents/skills/shadcn/assets/shadcn-small.png create mode 100644 dot_agents/skills/shadcn/assets/shadcn.png create mode 100644 dot_agents/skills/shadcn/cli.md create mode 100644 dot_agents/skills/shadcn/customization.md create mode 100644 dot_agents/skills/shadcn/evals/evals.json create mode 100644 dot_agents/skills/shadcn/mcp.md create mode 100644 dot_agents/skills/shadcn/registry.md create mode 100644 dot_agents/skills/shadcn/rules/base-vs-radix.md create mode 100644 dot_agents/skills/shadcn/rules/chat.md create mode 100644 dot_agents/skills/shadcn/rules/composition.md create mode 100644 dot_agents/skills/shadcn/rules/forms.md create mode 100644 dot_agents/skills/shadcn/rules/icons.md create mode 100644 dot_agents/skills/shadcn/rules/styling.md create mode 100644 dot_agents/skills/solidity-foundry-development/SKILL.md create mode 100644 dot_agents/skills/solidity-foundry-development/references/foundry-cheatsheet.md create mode 100644 dot_agents/skills/solidity-security/SKILL.md create mode 100644 dot_agents/skills/solidity-security/references/details.md create mode 100644 dot_agents/skills/stop-slop/CHANGELOG.md create mode 100644 dot_agents/skills/stop-slop/LICENSE create mode 100644 dot_agents/skills/stop-slop/README.md create mode 100644 dot_agents/skills/stop-slop/SKILL.md create mode 100644 dot_agents/skills/stop-slop/references/examples.md create mode 100644 dot_agents/skills/stop-slop/references/phrases.md create mode 100644 dot_agents/skills/stop-slop/references/structures.md create mode 100644 dot_agents/skills/tanstack-form/SKILL.md create mode 100644 dot_agents/skills/tanstack-integration-best-practices/SKILL.md create mode 100644 dot_agents/skills/tanstack-integration-best-practices/rules/cache-single-source.md create mode 100644 dot_agents/skills/tanstack-integration-best-practices/rules/flow-loader-query-pattern.md create mode 100644 dot_agents/skills/tanstack-integration-best-practices/rules/setup-query-client-context.md create mode 100644 dot_agents/skills/tanstack-integration-best-practices/rules/ssr-dehydrate-hydrate.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/SKILL.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/cache-gc-time.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/cache-invalidation.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/cache-placeholder-vs-initial.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/cache-stale-time.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/err-error-boundaries.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/inf-page-params.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/mut-invalidate-queries.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/mut-mutation-state.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/mut-optimistic-updates.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/network-mode.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/parallel-use-queries.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/perf-select-transform.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/persist-queries.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/pf-intent-prefetch.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/qk-array-structure.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/qk-factory-pattern.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/qk-hierarchical-organization.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/qk-include-dependencies.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/qk-serializable.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/query-cancellation.md create mode 100644 dot_agents/skills/tanstack-query-best-practices/rules/ssr-dehydration.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/SKILL.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/ctx-root-context.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/err-not-found.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/load-ensure-query-data.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/load-parallel.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/load-use-loaders.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/nav-link-component.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/nav-route-masks.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/org-virtual-routes.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/preload-intent.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/router-default-options.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/search-custom-serializer.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/search-validation.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/split-lazy-routes.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/ts-register-router.md create mode 100644 dot_agents/skills/tanstack-router-best-practices/rules/ts-use-from-param.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/SKILL.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/api-routes.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/auth-route-protection.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/auth-session-management.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/deploy-adapters.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/env-functions.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/err-server-errors.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/file-separation.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/mw-request-middleware.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/sf-create-server-fn.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/sf-input-validation.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/ssr-hydration-safety.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/ssr-prerender.md create mode 100644 dot_agents/skills/tanstack-start-best-practices/rules/ssr-streaming.md create mode 100644 dot_agents/skills/tanstack-table/SKILL.md create mode 100644 dot_agents/skills/tdd/SKILL.md create mode 100644 dot_agents/skills/tdd/mocking.md create mode 100644 dot_agents/skills/tdd/tests.md create mode 100644 dot_agents/skills/teach/GLOSSARY-FORMAT.md create mode 100644 dot_agents/skills/teach/LEARNING-RECORD-FORMAT.md create mode 100644 dot_agents/skills/teach/MISSION-FORMAT.md create mode 100644 dot_agents/skills/teach/RESOURCES-FORMAT.md create mode 100644 dot_agents/skills/teach/SKILL.md create mode 100644 dot_agents/skills/todoist-cli/SKILL.md create mode 100644 dot_agents/skills/triage/AGENT-BRIEF.md create mode 100644 dot_agents/skills/triage/OUT-OF-SCOPE.md create mode 100644 dot_agents/skills/triage/SKILL.md create mode 100644 dot_agents/skills/typescript-expert/SKILL.md create mode 100644 dot_agents/skills/typescript-expert/agents/openai.yaml create mode 100644 dot_agents/skills/ubiquitous-language/SKILL.md create mode 100644 dot_agents/skills/ui-ux-pro-max/SKILL.md create mode 100644 dot_agents/skills/ui-ux-pro-max/data/_sync_all.py create mode 100644 dot_agents/skills/ui-ux-pro-max/data/app-interface.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/charts.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/colors.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/design.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/draft.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/google-fonts.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/icons.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/landing.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/products.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/react-performance.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/stacks/react-native.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/styles.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/typography.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/ui-reasoning.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/data/ux-guidelines.csv create mode 100644 dot_agents/skills/ui-ux-pro-max/scripts/core.py create mode 100644 dot_agents/skills/ui-ux-pro-max/scripts/design_system.py create mode 100644 dot_agents/skills/ui-ux-pro-max/scripts/search.py create mode 100644 dot_agents/skills/uv-package-manager/SKILL.md create mode 100644 dot_agents/skills/uv-package-manager/references/advanced-patterns.md create mode 100644 dot_agents/skills/web-design-guidelines/SKILL.md create mode 100644 dot_agents/skills/workers-best-practices/SKILL.md create mode 100644 dot_agents/skills/workers-best-practices/references/review.md create mode 100644 dot_agents/skills/workers-best-practices/references/rules.md create mode 100644 dot_agents/skills/wrangler/SKILL.md create mode 100644 dot_agents/skills/write-tests/SKILL.md create mode 100644 dot_agents/skills/write-tests/agents/openai.yaml create mode 100644 dot_agents/skills/writing-beats/SKILL.md create mode 100644 dot_agents/skills/writing-fragments/SKILL.md create mode 100644 dot_agents/skills/writing-great-skills/GLOSSARY.md create mode 100644 dot_agents/skills/writing-great-skills/SKILL.md create mode 100644 dot_agents/skills/writing-shape/SKILL.md create mode 100644 dot_config/bash/functions/c.bash create mode 100644 dot_config/bash/functions/cd.bash create mode 100644 dot_config/bash/functions/clip-last.bash create mode 100644 dot_config/bash/functions/ghg.bash create mode 100644 dot_config/bash/functions/ghn.bash create mode 100644 dot_config/bash/functions/gho.bash create mode 100644 dot_config/bash/functions/yy.bash delete mode 100644 dot_config/fish/functions/ai.fish delete mode 100644 dot_config/fish/functions/c2p.fish delete mode 100644 dot_config/fish/functions/cp-appid.fish delete mode 100644 dot_config/fish/functions/extract_agents.fish delete mode 100644 dot_config/fish/functions/fab.fish delete mode 100644 dot_config/fish/functions/gdc.fish delete mode 100644 dot_config/fish/functions/gh-sonr-org-migrate.fish delete mode 100644 dot_config/fish/functions/git-summary.fish delete mode 100644 dot_config/fish/functions/launch_omp_livediff_overlay.fish delete mode 100644 dot_config/fish/functions/lc-elir.fish delete mode 100644 dot_config/fish/functions/mdcp.fish delete mode 100644 dot_config/fish/functions/mdp.fish delete mode 100644 dot_config/fish/functions/pj.fish create mode 100644 dot_config/zsh/functions/c.zsh create mode 100644 dot_config/zsh/functions/cd.zsh create mode 100644 dot_config/zsh/functions/clip-last.zsh create mode 100644 dot_config/zsh/functions/ghg.zsh create mode 100644 dot_config/zsh/functions/ghn.zsh create mode 100644 dot_config/zsh/functions/gho.zsh create mode 100644 dot_config/zsh/functions/yy.zsh create mode 100755 dot_local/bin/executable_ai create mode 100755 dot_local/bin/executable_c2p create mode 100755 dot_local/bin/executable_cp-appid create mode 100755 dot_local/bin/executable_extract_agents create mode 100755 dot_local/bin/executable_fab create mode 100755 dot_local/bin/executable_gdc create mode 100755 dot_local/bin/executable_gh-sonr-org-migrate create mode 100755 dot_local/bin/executable_ghg-clone create mode 100755 dot_local/bin/executable_ghn create mode 100755 dot_local/bin/executable_gho create mode 100755 dot_local/bin/executable_git-summary create mode 100755 dot_local/bin/executable_launch_omp_livediff_overlay create mode 100755 dot_local/bin/executable_lc-elir create mode 100755 dot_local/bin/executable_mdcp create mode 100755 dot_local/bin/executable_mdp create mode 100755 dot_local/bin/executable_pj diff --git a/.beads/interactions.jsonl b/.beads/interactions.jsonl index db84000..4931b5f 100644 --- a/.beads/interactions.jsonl +++ b/.beads/interactions.jsonl @@ -28,3 +28,5 @@ {"id":"int-eab7a82b","kind":"field_change","created_at":"2026-08-09T18:58:33.495195245Z","actor":"Prad Nukala","issue_id":"chezmoi-42m","extra":{"field":"status","new_value":"in_progress","old_value":"open"}} {"id":"int-45a90136","kind":"field_change","created_at":"2026-08-09T18:58:46.086021951Z","actor":"Prad Nukala","issue_id":"chezmoi-udp","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Simulated: every .tmpl rendered in darwin/mac mode without error; darwin ignore file gates entire arch layer (niri/noctalia/fontconfig/mimeapps/systemd/niri-launch/fish niri bits); packages script renders brew-only; gitconfig/yazi render portable. Full apply on real Mac deferred until hardware available."}} {"id":"int-bc698341","kind":"field_change","created_at":"2026-08-10T18:09:40.450714596Z","actor":"Prad Nukala","issue_id":"chezmoi-09g","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"bash/zsh managed with starship; aliases single-sourced in .chezmoidata/aliases.yaml, rendered to fish + shell/aliases.sh; verified in all three shells"}} +{"id":"int-6352d74c","kind":"field_change","created_at":"2026-08-10T19:14:56.357237414Z","actor":"Prad Nukala","issue_id":"chezmoi-288","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"16 cross-shell utilities -> ~/.local/bin executables (ghg renamed ghg-clone: cargo-bin collision); cwd/history helpers ported as per-shell functions in bash/zsh function dirs; fish wrappers migrated to bins"}} +{"id":"int-7ce36d07","kind":"field_change","created_at":"2026-08-10T19:14:56.649745176Z","actor":"Prad Nukala","issue_id":"chezmoi-hr0","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"dot_agents/skills materialized (82 skills, secret-scanned); live symlink cut over to real dir; dotstate profile+symlinks.json dropped .agents/.bashrc/.zshrc; storage repo committed+pushed; 0 broken ~/.claude/skills links"}} diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 704fd57..6a7b2b2 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,6 +1,8 @@ {"_type":"issue","id":"chezmoi-1a0","title":"Secrets audit: grep all candidate content for tokens before any chezmoi add","description":"Grep sk-, ghp_, glpat-, Bearer, token, key = across all files destined for repo. secrets.fish goes to age-encrypted encrypted_ path (key ~/.config/chezmoi/key.txt, manual distribution, document in README). Claude: never .credentials.json.","status":"closed","priority":1,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-09T18:41:50Z","created_by":"Prad Nukala","updated_at":"2026-08-09T18:48:14Z","started_at":"2026-08-09T18:45:28Z","closed_at":"2026-08-09T18:48:14Z","close_reason":"secrets.fish age-encrypted; plaintext purged from git history and remote force-pushed; noctalia/plugins excluded (live ghp_ token); gh hosts.yml excluded; npmrc deferred; rotation recommended","dependency_count":0,"dependent_count":3,"comment_count":0} {"_type":"issue","id":"chezmoi-byc","title":"Gating skeleton: .chezmoi.toml.tmpl + .chezmoiignore.tmpl + packages.yaml skeleton","description":"promptOnce name/email/role (desktop|laptop|mac|server); chezmoiignore gates linux-only trees on darwin and vice versa; .chezmoidata/packages.yaml skeleton {arch:{pacman,aur},darwin:{brew,cask},shared:{gh_extensions,go,cargo}}. Machinery before content.","status":"closed","priority":1,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-09T18:41:50Z","created_by":"Prad Nukala","updated_at":"2026-08-09T18:47:06Z","started_at":"2026-08-09T18:45:28Z","closed_at":"2026-08-09T18:47:06Z","close_reason":"Closed","dependency_count":0,"dependent_count":13,"comment_count":0} {"_type":"issue","id":"chezmoi-rnv","title":"Inventory: disposition table for all dotstate synced paths","description":"Parse .dotstate-profiles.toml (Noctalia/Inir/Rogz/Vertical-Rogz_AppleStudio). Every synced path gets decision: universal / arch-gated / defer / drop / secret. Output table in MIGRATION-NOTES.md. Blocks all content.","status":"closed","priority":1,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-09T18:41:50Z","created_by":"Prad Nukala","updated_at":"2026-08-09T18:45:28Z","started_at":"2026-08-09T18:44:23Z","closed_at":"2026-08-09T18:45:28Z","close_reason":"Closed","dependency_count":0,"dependent_count":13,"comment_count":0} +{"_type":"issue","id":"chezmoi-288","title":"shell: fish functions -\u003e chezmoi executables + bash/zsh ports","status":"closed","priority":2,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-10T19:04:18Z","created_by":"Prad Nukala","updated_at":"2026-08-10T19:14:56Z","closed_at":"2026-08-10T19:14:56Z","close_reason":"16 cross-shell utilities -\u003e ~/.local/bin executables (ghg renamed ghg-clone: cargo-bin collision); cwd/history helpers ported as per-shell functions in bash/zsh function dirs; fish wrappers migrated to bins","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"chezmoi-hr0","title":"agents: manage ~/.agents so dot_claude skill symlinks resolve","status":"closed","priority":2,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-10T19:04:18Z","created_by":"Prad Nukala","updated_at":"2026-08-10T19:14:57Z","closed_at":"2026-08-10T19:14:57Z","close_reason":"dot_agents/skills materialized (82 skills, secret-scanned); live symlink cut over to real dir; dotstate profile+symlinks.json dropped .agents/.bashrc/.zshrc; storage repo committed+pushed; 0 broken ~/.claude/skills links","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"chezmoi-09g","title":"shell: starship + shared aliases for bash/zsh (synced with fish)","description":"aliases.yaml chezmoidata as single source; fish 20-aliases becomes tmpl; dot_config/shell/aliases.sh.tmpl for bash/zsh; managed dot_bashrc/dot_zshrc with starship init (drop flyline/p10k)","status":"closed","priority":2,"issue_type":"task","assignee":"Prad Nukala","owner":"prad@sonr.io","created_at":"2026-08-10T18:06:52Z","created_by":"Prad Nukala","updated_at":"2026-08-10T18:09:40Z","started_at":"2026-08-10T18:07:59Z","closed_at":"2026-08-10T18:09:40Z","close_reason":"bash/zsh managed with starship; aliases single-sourced in .chezmoidata/aliases.yaml, rendered to fish + shell/aliases.sh; verified in all three shells","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"chezmoi-42m","title":"Validation: Arch fresh bring-up in container","description":"docker run archlinux: bootstrap one-liner, packages install, chezmoi doctor clean, niri validate, fish -n all files, nvim --headless +Lazy! sync, tmux -f cfg new -d; kill-server, gh extension list matches manifest. Plus live machine chezmoi diff ~ empty.","status":"in_progress","priority":2,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-09T18:42:17Z","created_by":"Prad Nukala","updated_at":"2026-08-09T18:58:33Z","started_at":"2026-08-09T18:58:33Z","dependencies":[{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-21v","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-4sj","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-9sg","type":"blocks","created_at":"2026-08-09T14:42:59Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-a2k","type":"blocks","created_at":"2026-08-09T14:42:59Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-exq","type":"blocks","created_at":"2026-08-09T14:42:59Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-fde","type":"blocks","created_at":"2026-08-09T14:42:59Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-hou","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-iu2","type":"blocks","created_at":"2026-08-09T14:42:59Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-sd9","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-utl","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-uw2","type":"blocks","created_at":"2026-08-09T14:42:57Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-x7f","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-42m","depends_on_id":"chezmoi-xi5","type":"blocks","created_at":"2026-08-09T14:42:58Z","created_by":"Prad Nukala","metadata":"{}"}],"dependency_count":13,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"chezmoi-5by","title":"Cutover: freeze dotstate for migrated paths","description":"After both validations: remove migrated paths from .dotstate-profiles.toml, tag dotstate pre-chezmoi-freeze, stop Dolt sync for those paths. Archive, never delete.","status":"open","priority":2,"issue_type":"task","owner":"prad@sonr.io","created_at":"2026-08-09T18:42:17Z","created_by":"Prad Nukala","updated_at":"2026-08-09T18:42:17Z","dependencies":[{"issue_id":"chezmoi-5by","depends_on_id":"chezmoi-42m","type":"blocks","created_at":"2026-08-09T14:42:25Z","created_by":"Prad Nukala","metadata":"{}"},{"issue_id":"chezmoi-5by","depends_on_id":"chezmoi-udp","type":"blocks","created_at":"2026-08-09T14:42:25Z","created_by":"Prad Nukala","metadata":"{}"}],"dependency_count":2,"dependent_count":0,"comment_count":0} diff --git a/.chezmoiignore.tmpl b/.chezmoiignore.tmpl index ce87f42..26b02d0 100644 --- a/.chezmoiignore.tmpl +++ b/.chezmoiignore.tmpl @@ -32,7 +32,7 @@ AGENTS.md .config/systemd/** .local/bin/niri-launch .config/fish/auto-Niri.fish -.config/fish/functions/cp-appid.fish +.local/bin/cp-appid .config/tmux/niri-title.sh {{ end }} diff --git a/README.md b/README.md index 1ddc7ff..291ee5e 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,16 @@ Aliases are defined once in `.chezmoidata/aliases.yaml` and rendered into fish (`fish/conf.d/20-aliases.fish`) and bash/zsh (`~/.config/shell/aliases.sh`, sourced by `.bashrc`/`.zshrc`). +Shell utilities live as standalone sh/bash executables in +`~/.local/bin` (ai, c2p, fab, gdc, gho, ghn, ghg-clone, git-summary, +mdp, mdcp, pj, …) so all shells share one implementation. Helpers that +must mutate shell state (`cd`-style: yy, c, cd, ghg/ghn/gho wrappers, +clip-last) are per-shell functions in `fish/functions/`, +`bash/functions/`, and `zsh/functions/`. + +`~/.agents/skills` (agent skill library) is managed directly; the +symlinks under `~/.claude/skills` resolve against it. + Linux desktop (role `desktop`/`laptop` only): niri, noctalia, fontconfig, mimeapps, systemd user units, niri-launch. diff --git a/dot_agents/dot_skill-lock.json b/dot_agents/dot_skill-lock.json new file mode 100644 index 0000000..ce24653 --- /dev/null +++ b/dot_agents/dot_skill-lock.json @@ -0,0 +1,796 @@ +{ + "version": 3, + "skills": { + "mintlify": { + "source": "mintlify.com", + "sourceType": "well-known", + "sourceUrl": "https://mintlify.com/docs/.well-known/agent-skills/mintlify/skill.md", + "skillFolderHash": "", + "installedAt": "2026-03-06T23:16:24.133Z", + "updatedAt": "2026-07-09T16:33:01.435Z" + }, + "find-skills": { + "source": "vercel-labs/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/skills.git", + "skillPath": "skills/find-skills/SKILL.md", + "skillFolderHash": "76a98a285cb0434f3d39e1a873823556330e398b", + "installedAt": "2026-03-06T23:16:26.850Z", + "updatedAt": "2026-07-11T22:58:43.931Z" + }, + "web-design-guidelines": { + "source": "vercel-labs/agent-skills", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/agent-skills.git", + "skillPath": "skills/web-design-guidelines/SKILL.md", + "skillFolderHash": "3116f3e62dbd02b44a598b1aa690d2a8938e8f89", + "installedAt": "2026-03-06T23:17:28.357Z", + "updatedAt": "2026-03-06T23:17:28.357Z" + }, + "wrangler": { + "source": "cloudflare/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/cloudflare/skills.git", + "skillPath": "skills/wrangler/SKILL.md", + "skillFolderHash": "45cc198b2aad3f06e8abf91333f55fbe7579f659", + "installedAt": "2026-03-06T23:17:51.886Z", + "updatedAt": "2026-05-14T13:17:51.800Z" + }, + "tanstack-start-best-practices": { + "source": "deckardger/tanstack-agent-skills", + "sourceType": "github", + "sourceUrl": "https://github.com/deckardger/tanstack-agent-skills.git", + "skillPath": "skills/tanstack-start/SKILL.md", + "skillFolderHash": "f51cf71300531adc6e9af58e2a3a578be8a58aea", + "installedAt": "2026-03-06T23:18:14.260Z", + "updatedAt": "2026-05-14T13:17:52.807Z" + }, + "tanstack-query-best-practices": { + "source": "deckardger/tanstack-agent-skills", + "sourceType": "github", + "sourceUrl": "https://github.com/deckardger/tanstack-agent-skills.git", + "skillPath": "skills/tanstack-query/SKILL.md", + "skillFolderHash": "b73085898a2015a0f33c98aef0f3f2ff4ee9454f", + "installedAt": "2026-03-06T23:18:29.570Z", + "updatedAt": "2026-03-06T23:18:29.570Z" + }, + "ethereum-wingman": { + "source": "austintgriffith/ethereum-wingman", + "sourceType": "github", + "sourceUrl": "https://github.com/austintgriffith/ethereum-wingman.git", + "skillPath": "skills/ethereum-wingman/SKILL.md", + "skillFolderHash": "87c6e8d93ea71cf608ef13b3c27fae6f2b5466a4", + "installedAt": "2026-03-06T23:19:25.834Z", + "updatedAt": "2026-03-06T23:19:25.834Z" + }, + "solidity-security": { + "source": "wshobson/agents", + "sourceType": "github", + "sourceUrl": "https://github.com/wshobson/agents.git", + "skillPath": "plugins/blockchain-web3/skills/solidity-security/SKILL.md", + "skillFolderHash": "04eced95a2501b780e71b1157b928de1ad34c538", + "installedAt": "2026-03-06T23:19:43.396Z", + "updatedAt": "2026-05-28T16:55:40.447Z" + }, + "solidity-foundry-development": { + "source": "whackur/solidity-agent-toolkit", + "sourceType": "github", + "sourceUrl": "https://github.com/whackur/solidity-agent-toolkit.git", + "skillPath": "skills/solidity-foundry-development/SKILL.md", + "skillFolderHash": "195d13ac69743f20cd1b845d9f6715263626116e", + "installedAt": "2026-03-06T23:20:07.263Z", + "updatedAt": "2026-06-28T19:36:33.256Z" + }, + "golang-pro": { + "source": "jeffallan/claude-skills", + "sourceType": "github", + "sourceUrl": "https://github.com/jeffallan/claude-skills.git", + "skillPath": "skills/golang-pro/SKILL.md", + "skillFolderHash": "e347d9842958ce46d5f0644ef6009304d648a964", + "installedAt": "2026-03-06T23:21:16.634Z", + "updatedAt": "2026-05-14T13:17:56.339Z" + }, + "Technical Writer": { + "source": "daffy0208/ai-dev-standards", + "sourceType": "github", + "sourceUrl": "https://github.com/daffy0208/ai-dev-standards.git", + "skillPath": "skills/technical-writer/SKILL.md", + "skillFolderHash": "0491075584fae0727df54f24e0e5cb6344b165bf", + "installedAt": "2026-03-06T23:21:33.091Z", + "updatedAt": "2026-03-06T23:21:33.091Z" + }, + "uv-package-manager": { + "source": "wshobson/agents", + "sourceType": "github", + "sourceUrl": "https://github.com/wshobson/agents.git", + "skillPath": "plugins/python-development/skills/uv-package-manager/SKILL.md", + "skillFolderHash": "f80b5182adb7bec902841316352bb9e1b8871fbf", + "installedAt": "2026-03-08T01:09:07.357Z", + "updatedAt": "2026-05-14T13:17:57.333Z" + }, + "bun-development": { + "source": "sickn33/antigravity-awesome-skills", + "sourceType": "github", + "sourceUrl": "https://github.com/sickn33/antigravity-awesome-skills.git", + "skillPath": "skills/bun-development/SKILL.md", + "skillFolderHash": "309d79a55351d0cf21b64cd908be064ab5df497d", + "installedAt": "2026-03-08T01:09:35.482Z", + "updatedAt": "2026-07-05T21:43:22.418Z" + }, + "core": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/core/SKILL.md", + "skillFolderHash": "05d62717178814848f7ea80e5d8a022132a6a85d", + "installedAt": "2026-03-13T21:55:31.291Z", + "updatedAt": "2026-06-16T19:27:58.864Z" + }, + "react": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/react/SKILL.md", + "skillFolderHash": "e464186113a0ba176c602d74164041e242113854", + "installedAt": "2026-03-13T21:55:40.915Z", + "updatedAt": "2026-06-16T19:27:59.795Z" + }, + "react-pdf": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/react-pdf/SKILL.md", + "skillFolderHash": "d1fa1d79a29cdc3692c7baacee582cbbf0fa0cc1", + "installedAt": "2026-03-13T21:55:50.545Z", + "updatedAt": "2026-03-13T21:55:50.545Z" + }, + "react-email": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/react-email/SKILL.md", + "skillFolderHash": "359d1a515186b7aed175d990e60f2d4fd3ea414d", + "installedAt": "2026-03-13T21:55:57.139Z", + "updatedAt": "2026-03-13T21:55:57.139Z" + }, + "react-native": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/react-native/SKILL.md", + "skillFolderHash": "5428d72027a35d709a68ea10400cb7923f397140", + "installedAt": "2026-03-13T21:56:04.694Z", + "updatedAt": "2026-03-13T21:56:04.694Z" + }, + "shadcn": { + "source": "shadcn/ui", + "sourceType": "github", + "sourceUrl": "https://github.com/shadcn/ui.git", + "skillPath": "skills/shadcn/SKILL.md", + "skillFolderHash": "962eb7ef77f17e0bce530153d4fec2136c5fa061", + "installedAt": "2026-03-13T21:56:09.517Z", + "updatedAt": "2026-07-05T21:43:24.792Z" + }, + "image": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/image/SKILL.md", + "skillFolderHash": "f697c8a50da72a9ca2f1cc37c74f87a7a90b6722", + "installedAt": "2026-03-13T21:56:14.738Z", + "updatedAt": "2026-03-13T21:56:14.738Z" + }, + "remotion": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/remotion/SKILL.md", + "skillFolderHash": "a1a047a21d40a39e8b13853a326fb1e53b967706", + "installedAt": "2026-03-13T21:58:08.516Z", + "updatedAt": "2026-03-13T21:58:08.516Z" + }, + "vue": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/vue/SKILL.md", + "skillFolderHash": "478436a2ed1034ddd8db79c9bd74c88e37ef0696", + "installedAt": "2026-03-13T21:58:14.274Z", + "updatedAt": "2026-03-13T21:58:14.274Z" + }, + "svelte": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/svelte/SKILL.md", + "skillFolderHash": "7cade2dfb70c837ec40acdf3cca64afcef278bed", + "installedAt": "2026-03-13T21:58:19.264Z", + "updatedAt": "2026-03-13T21:58:19.264Z" + }, + "solid": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/solid/SKILL.md", + "skillFolderHash": "61023accb0990e70f235a6a89ba28a7d373a9b45", + "installedAt": "2026-03-13T21:58:23.919Z", + "updatedAt": "2026-03-13T21:58:23.919Z" + }, + "codegen": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/codegen/SKILL.md", + "skillFolderHash": "5bd34abdd5045973433399f14e96559dce28c0b4", + "installedAt": "2026-03-13T21:58:28.992Z", + "updatedAt": "2026-03-13T21:58:28.992Z" + }, + "mcp": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/mcp/SKILL.md", + "skillFolderHash": "eb7a93c6df1ecf6997c3fe6ea2c92847cfbe3114", + "installedAt": "2026-03-13T21:58:34.168Z", + "updatedAt": "2026-03-13T21:58:34.168Z" + }, + "redux": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/redux/SKILL.md", + "skillFolderHash": "b67e39ae74ba8c338657fe420b95c60a06cf6270", + "installedAt": "2026-03-13T21:58:39.965Z", + "updatedAt": "2026-03-13T21:58:39.965Z" + }, + "zustand": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/zustand/SKILL.md", + "skillFolderHash": "4315759f61175e4b75c45bab1e72caccbd440c42", + "installedAt": "2026-03-13T21:58:45.208Z", + "updatedAt": "2026-03-13T21:58:45.208Z" + }, + "jotai": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/jotai/SKILL.md", + "skillFolderHash": "60b5a6ebcc751d25bae4faa2c9be7f36085cb65f", + "installedAt": "2026-03-13T21:58:50.970Z", + "updatedAt": "2026-03-13T21:58:50.970Z" + }, + "xstate": { + "source": "vercel-labs/json-render", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/json-render.git", + "skillPath": "skills/xstate/SKILL.md", + "skillFolderHash": "58cc03a9b085c2ec82fdffdfb388893b7d59fa19", + "installedAt": "2026-03-13T21:58:59.740Z", + "updatedAt": "2026-03-13T21:58:59.740Z" + }, + "grill-me": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/productivity/grill-me/SKILL.md", + "skillFolderHash": "8320e7b87f7b208f50ce165b1dd43d1e93c8e801", + "pluginName": "mattpocock-skills", + "installedAt": "2026-05-11T17:38:14.403Z", + "updatedAt": "2026-06-27T19:37:25.604Z" + }, + "grill-with-docs": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/grill-with-docs/SKILL.md", + "skillFolderHash": "21adba95de7d93065d9fec725ddf37f871e01d05", + "pluginName": "mattpocock-skills", + "installedAt": "2026-05-11T17:38:14.403Z", + "updatedAt": "2026-06-27T19:37:25.604Z" + }, + "handoff": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/productivity/handoff/SKILL.md", + "skillFolderHash": "3f7df8e717e41dfd6eacd03d47319a2e01248ffb", + "installedAt": "2026-05-11T17:38:14.404Z", + "updatedAt": "2026-07-09T16:32:30.968Z" + }, + "improve-codebase-architecture": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/improve-codebase-architecture/SKILL.md", + "skillFolderHash": "e5beae48471adf87c513b5cbcb0ca347467546da", + "pluginName": "mattpocock-skills", + "installedAt": "2026-05-11T17:38:14.404Z", + "updatedAt": "2026-06-27T19:37:25.606Z" + }, + "prototype": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/prototype/SKILL.md", + "skillFolderHash": "e50d76191bf197e3d947eb8c780c7009269ba589", + "installedAt": "2026-05-11T17:38:14.405Z", + "updatedAt": "2026-07-11T22:58:44.875Z" + }, + "setup-matt-pocock-skills": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/setup-matt-pocock-skills/SKILL.md", + "skillFolderHash": "ed1bbe6a06bb049aaa95bfe2c487bdb7a8300838", + "installedAt": "2026-05-11T17:38:14.405Z", + "updatedAt": "2026-07-11T22:58:45.876Z" + }, + "tdd": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/tdd/SKILL.md", + "skillFolderHash": "57e1bee887816ed2af745e5fd388f224f6e61ada", + "installedAt": "2026-05-11T17:38:14.405Z", + "updatedAt": "2026-07-05T21:43:26.608Z" + }, + "triage": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/triage/SKILL.md", + "skillFolderHash": "3e7a49151929d884365035cb322de099c15b33d3", + "pluginName": "mattpocock-skills", + "installedAt": "2026-05-11T17:38:14.406Z", + "updatedAt": "2026-06-27T19:37:25.607Z" + }, + "remix": { + "source": "remix-run/remix", + "sourceType": "github", + "sourceUrl": "https://github.com/remix-run/remix.git", + "skillPath": ".agents/skills/remix/SKILL.md", + "skillFolderHash": "3b50ba213a7ca5cb296dd34b3a4e88ede17b30e7", + "installedAt": "2026-05-23T19:11:24.642Z", + "updatedAt": "2026-06-28T19:36:34.960Z" + }, + "typescript-expert": { + "source": "remix-run/remix", + "sourceType": "github", + "sourceUrl": "https://github.com/remix-run/remix.git", + "skillPath": ".agents/skills/typescript-expert/SKILL.md", + "skillFolderHash": "e6926fb96faf26e3c46900aab1135b202436719e", + "installedAt": "2026-05-23T19:11:24.644Z", + "updatedAt": "2026-05-23T19:11:24.644Z" + }, + "write-tests": { + "source": "remix-run/remix", + "sourceType": "github", + "sourceUrl": "https://github.com/remix-run/remix.git", + "skillPath": ".agents/skills/write-tests/SKILL.md", + "skillFolderHash": "4b4e2847a6c86c53418b2f2303c4d40187a1d1a4", + "installedAt": "2026-05-23T19:11:24.644Z", + "updatedAt": "2026-05-23T19:11:24.644Z" + }, + "design-taste-frontend": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/taste-skill/SKILL.md", + "skillFolderHash": "a6d128e53b4ec0238baee751dde33bf707adb5ec", + "installedAt": "2026-05-26T16:59:11.011Z", + "updatedAt": "2026-05-28T16:55:47.754Z" + }, + "gpt-taste": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/gpt-tasteskill/SKILL.md", + "skillFolderHash": "c87d529ad945cd35985b19475bf53f41682d4f69", + "installedAt": "2026-05-26T16:59:11.012Z", + "updatedAt": "2026-05-26T16:59:11.012Z" + }, + "high-end-visual-design": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/soft-skill/SKILL.md", + "skillFolderHash": "1b5943432ddd1b980206968c529a323cc992dbec", + "installedAt": "2026-05-26T16:59:11.014Z", + "updatedAt": "2026-05-26T16:59:11.014Z" + }, + "imagegen-frontend-web": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/imagegen-frontend-web/SKILL.md", + "skillFolderHash": "3b5117d349200e33f9c3399344681620079dcc18", + "installedAt": "2026-05-26T16:59:11.014Z", + "updatedAt": "2026-05-26T16:59:11.014Z" + }, + "minimalist-ui": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/minimalist-skill/SKILL.md", + "skillFolderHash": "5509c012862cda27e2ed7efae89ed940ecc53add", + "installedAt": "2026-05-26T16:59:11.015Z", + "updatedAt": "2026-05-26T16:59:11.015Z" + }, + "redesign-existing-projects": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/redesign-skill/SKILL.md", + "skillFolderHash": "d9cffe56d26d4af7687299e391a7be1cfaf46c1b", + "installedAt": "2026-05-26T16:59:11.015Z", + "updatedAt": "2026-05-26T16:59:11.015Z" + }, + "brandkit": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "sourceUrl": "https://github.com/Leonxlnx/taste-skill.git", + "skillPath": "skills/brandkit/SKILL.md", + "skillFolderHash": "d278ff748cafab01e4ae5dd7758fc0b53258621c", + "installedAt": "2026-05-26T16:59:11.015Z", + "updatedAt": "2026-05-26T16:59:11.015Z" + }, + "stop-slop": { + "source": "hardikpandya/stop-slop", + "sourceType": "github", + "sourceUrl": "https://github.com/hardikpandya/stop-slop.git", + "skillPath": "SKILL.md", + "skillFolderHash": "8da1f030185bdfe8471220585162991eaeb970e9", + "installedAt": "2026-05-26T16:59:31.618Z", + "updatedAt": "2026-05-26T16:59:31.618Z" + }, + "openlogs-server-logs": { + "source": "charlietlamb/openlogs", + "sourceType": "github", + "sourceUrl": "https://github.com/charlietlamb/openlogs.git", + "skillPath": "skills/openlogs-server-logs/SKILL.md", + "skillFolderHash": "42fb220fe9596d6a30679940ecdf44082a166954", + "installedAt": "2026-06-10T21:12:16.667Z", + "updatedAt": "2026-06-10T21:12:16.667Z" + }, + "linear": { + "source": "openai/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/openai/skills.git", + "skillPath": "skills/.curated/linear/SKILL.md", + "skillFolderHash": "31c1648f2d1a4d05d32eab4bdfb2ed89a5541e06", + "installedAt": "2026-06-23T19:50:00.950Z", + "updatedAt": "2026-06-23T19:50:00.950Z" + }, + "linear-cli": { + "source": "schpet/linear-cli", + "sourceType": "github", + "sourceUrl": "https://github.com/schpet/linear-cli.git", + "skillPath": "skills/linear-cli/SKILL.md", + "skillFolderHash": "5db263378a03ca0d733e3b55695bffab4ccc7896", + "installedAt": "2026-06-23T19:51:54.496Z", + "updatedAt": "2026-07-11T22:58:46.750Z" + }, + "linear-documents": { + "source": "finesssee/linear-cli", + "sourceType": "github", + "sourceUrl": "https://github.com/finesssee/linear-cli.git", + "skillPath": "skills/linear-documents/SKILL.md", + "skillFolderHash": "4c306d0268f42978363078262380fd63912a7493", + "installedAt": "2026-06-23T19:53:25.148Z", + "updatedAt": "2026-06-23T19:53:25.148Z" + }, + "codebase-design": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/codebase-design/SKILL.md", + "skillFolderHash": "c5dfc023e5ae146a4ceb9c509024f6ffe13db4a3", + "pluginName": "mattpocock-skills", + "installedAt": "2026-06-27T19:37:25.602Z", + "updatedAt": "2026-06-27T19:37:25.602Z" + }, + "diagnosing-bugs": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/diagnosing-bugs/SKILL.md", + "skillFolderHash": "0ecacff09e31245c34727abe7cb7cff71f615a35", + "pluginName": "mattpocock-skills", + "installedAt": "2026-06-27T19:37:25.603Z", + "updatedAt": "2026-06-27T19:37:25.603Z" + }, + "domain-modeling": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/domain-modeling/SKILL.md", + "skillFolderHash": "028a0e44b23909cbdd715aa00546d5c1c46ae4d6", + "pluginName": "mattpocock-skills", + "installedAt": "2026-06-27T19:37:25.604Z", + "updatedAt": "2026-06-27T19:37:25.604Z" + }, + "grilling": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/productivity/grilling/SKILL.md", + "skillFolderHash": "0ace40ac10f5c0b1534324e4e109ebfa831fb361", + "installedAt": "2026-06-27T19:37:25.605Z", + "updatedAt": "2026-07-09T16:32:32.121Z" + }, + "teach": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/productivity/teach/SKILL.md", + "skillFolderHash": "3b6a4245e2aaeacb308ba6175ab3e7f2e43b0c47", + "pluginName": "mattpocock-skills", + "installedAt": "2026-06-27T19:37:25.607Z", + "updatedAt": "2026-06-27T19:37:25.607Z" + }, + "writing-great-skills": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/productivity/writing-great-skills/SKILL.md", + "skillFolderHash": "c84411b360fad91b8756e60fa17fd5b5761422dd", + "installedAt": "2026-06-27T19:37:25.608Z", + "updatedAt": "2026-07-09T16:32:32.702Z" + }, + "design-an-interface": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/deprecated/design-an-interface/SKILL.md", + "skillFolderHash": "59d5eca0fd23930d3d3821aa9da507f1bdb8a348", + "installedAt": "2026-06-27T19:37:25.608Z", + "updatedAt": "2026-06-27T19:37:25.608Z" + }, + "git-guardrails-claude-code": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/misc/git-guardrails-claude-code/SKILL.md", + "skillFolderHash": "f02ae7c2de75270e93a200e11a7e466ece897353", + "installedAt": "2026-06-27T19:37:25.609Z", + "updatedAt": "2026-06-27T19:37:25.609Z" + }, + "implement": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/implement/SKILL.md", + "skillFolderHash": "aa65990650368f020166bc28d6c05b5b34592c97", + "installedAt": "2026-06-27T19:37:25.609Z", + "updatedAt": "2026-07-09T16:32:33.264Z" + }, + "loop-me": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/in-progress/loop-me/SKILL.md", + "skillFolderHash": "1cec9deaf4f4ce1b99bd0750f1e34bc1100b1285", + "installedAt": "2026-06-27T19:37:25.609Z", + "updatedAt": "2026-06-27T19:37:25.609Z" + }, + "migrate-to-shoehorn": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/misc/migrate-to-shoehorn/SKILL.md", + "skillFolderHash": "ad722b79beb1c1fb998678d498ba11760d53714b", + "installedAt": "2026-06-27T19:37:25.609Z", + "updatedAt": "2026-06-27T19:37:25.609Z" + }, + "obsidian-vault": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/personal/obsidian-vault/SKILL.md", + "skillFolderHash": "1e814d168a215762391895aee58f4de06c8e3b7f", + "installedAt": "2026-06-27T19:37:25.609Z", + "updatedAt": "2026-06-27T19:37:25.609Z" + }, + "qa": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/deprecated/qa/SKILL.md", + "skillFolderHash": "3eed5beeb18e77776349782ed087ee4560fd69c5", + "installedAt": "2026-06-27T19:37:25.610Z", + "updatedAt": "2026-06-27T19:37:25.610Z" + }, + "request-refactor-plan": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/deprecated/request-refactor-plan/SKILL.md", + "skillFolderHash": "b0617c9cf69ac1e73a6b30f78c82ff81372079fd", + "installedAt": "2026-06-27T19:37:25.610Z", + "updatedAt": "2026-06-27T19:37:25.610Z" + }, + "resolving-merge-conflicts": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/engineering/resolving-merge-conflicts/SKILL.md", + "skillFolderHash": "b601c90446f887a94ec68e5c2301a8919f949a2c", + "installedAt": "2026-06-27T19:37:25.610Z", + "updatedAt": "2026-06-27T19:37:25.610Z" + }, + "scaffold-exercises": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/misc/scaffold-exercises/SKILL.md", + "skillFolderHash": "ef19ca90ec6645b23dc7e68601552ab795e3e6ee", + "installedAt": "2026-06-27T19:37:25.611Z", + "updatedAt": "2026-06-27T19:37:25.611Z" + }, + "setup-pre-commit": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/misc/setup-pre-commit/SKILL.md", + "skillFolderHash": "5e6e9301b4826bd820401ea4114a797adb169f47", + "installedAt": "2026-06-27T19:37:25.611Z", + "updatedAt": "2026-06-27T19:37:25.611Z" + }, + "ubiquitous-language": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/deprecated/ubiquitous-language/SKILL.md", + "skillFolderHash": "483fe10b01bed81b7eba7ee26df3f1bef9540c88", + "installedAt": "2026-06-27T19:37:25.611Z", + "updatedAt": "2026-06-27T19:37:25.611Z" + }, + "writing-beats": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/in-progress/writing-beats/SKILL.md", + "skillFolderHash": "28c4a84a44e1e44b28ce0c45e01892fa3691ace6", + "installedAt": "2026-06-27T19:37:25.612Z", + "updatedAt": "2026-06-27T19:37:25.612Z" + }, + "writing-fragments": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/in-progress/writing-fragments/SKILL.md", + "skillFolderHash": "ae1380aef2436f7a7eb1d62aedcc5f2b8e71d6c5", + "installedAt": "2026-06-27T19:37:25.612Z", + "updatedAt": "2026-06-27T19:37:25.612Z" + }, + "writing-shape": { + "source": "mattpocock/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/mattpocock/skills.git", + "skillPath": "skills/in-progress/writing-shape/SKILL.md", + "skillFolderHash": "2ca73419c5762c668a30ae0c160165b9baf5b133", + "installedAt": "2026-06-27T19:37:25.613Z", + "updatedAt": "2026-06-27T19:37:25.613Z" + }, + "loopy": { + "source": "Forward-Future/loop-library", + "sourceType": "github", + "sourceUrl": "https://github.com/Forward-Future/loop-library.git", + "skillPath": "skills/loopy/SKILL.md", + "skillFolderHash": "29f8d21b72ea1326ceac048b362ff344ecb5fcab", + "installedAt": "2026-06-29T15:24:59.672Z", + "updatedAt": "2026-07-05T21:43:28.623Z" + }, + "deepinit": { + "source": "yeachan-heo/oh-my-claudecode", + "sourceType": "github", + "sourceUrl": "https://github.com/yeachan-heo/oh-my-claudecode.git", + "skillPath": "skills/deepinit/SKILL.md", + "skillFolderHash": "5839f9be75783f998424c936ce3b62d5a443718f", + "pluginName": "oh-my-claudecode", + "installedAt": "2026-06-30T14:03:37.084Z", + "updatedAt": "2026-06-30T14:03:37.084Z" + }, + "native-sdk": { + "source": "vercel-labs/native", + "sourceType": "github", + "sourceUrl": "https://github.com/vercel-labs/native.git", + "skillPath": "skills/native-sdk/SKILL.md", + "skillFolderHash": "72221bd76c44638d2db54c7cc0656083c61c5258", + "installedAt": "2026-07-09T15:09:31.311Z", + "updatedAt": "2026-07-11T22:58:47.416Z" + }, + "mintlify-api": { + "source": "mintlify.com", + "sourceType": "well-known", + "sourceUrl": "https://mintlify.com/docs/.well-known/agent-skills/mintlify-api/skill.md", + "skillFolderHash": "", + "installedAt": "2026-07-09T16:33:01.435Z", + "updatedAt": "2026-07-09T16:33:01.435Z" + }, + "mintlify-docs": { + "source": "mintlify.com", + "sourceType": "well-known", + "sourceUrl": "https://mintlify.com/docs/.well-known/agent-skills/mintlify-docs/skill.md", + "skillFolderHash": "", + "installedAt": "2026-07-09T16:33:01.437Z", + "updatedAt": "2026-07-09T16:33:01.437Z" + }, + "blume": { + "source": "haydenbleasel/blume", + "sourceType": "github", + "sourceUrl": "https://github.com/haydenbleasel/blume.git", + "skillPath": "skills/blume/SKILL.md", + "skillFolderHash": "e1c680e3304ee45fa160c421ecb73137d6bc1843", + "installedAt": "2026-07-14T15:07:06.129Z", + "updatedAt": "2026-07-21T17:52:06.810Z" + }, + "blume-update-docs": { + "source": "haydenbleasel/blume", + "sourceType": "github", + "sourceUrl": "https://github.com/haydenbleasel/blume.git", + "skillPath": "skills/blume-update-docs/SKILL.md", + "skillFolderHash": "cd89e3a3cecd361d1cf4debab3c1cd403b0833ed", + "installedAt": "2026-07-14T15:07:06.131Z", + "updatedAt": "2026-07-21T17:52:06.814Z" + }, + "blume-migrate": { + "source": "haydenbleasel/blume", + "sourceType": "github", + "sourceUrl": "https://github.com/haydenbleasel/blume.git", + "skillPath": "skills/blume-migrate/SKILL.md", + "skillFolderHash": "b902d68a527f3650b3ccffe9477bc087107cd6e7", + "installedAt": "2026-07-21T17:52:06.811Z", + "updatedAt": "2026-07-21T17:52:06.811Z" + }, + "rust-best-practices": { + "source": "apollographql/skills", + "sourceType": "github", + "sourceUrl": "https://github.com/apollographql/skills.git", + "skillPath": "skills/rust-best-practices/SKILL.md", + "skillFolderHash": "73bee942cb621e4ee7f2c3f86de01ab09638ee5d", + "installedAt": "2026-07-21T18:52:13.087Z", + "updatedAt": "2026-07-21T18:52:13.087Z" + }, + "rust-async-patterns": { + "source": "wshobson/agents", + "sourceType": "github", + "sourceUrl": "https://github.com/wshobson/agents.git", + "skillPath": "plugins/systems-programming/skills/rust-async-patterns/SKILL.md", + "skillFolderHash": "3624037dbe3d96e2e55ecb6988afeaffbbb9ad1b", + "installedAt": "2026-07-21T18:52:26.413Z", + "updatedAt": "2026-07-21T18:52:26.413Z" + }, + "rust-testing": { + "source": "affaan-m/everything-claude-code", + "sourceType": "github", + "sourceUrl": "https://github.com/affaan-m/everything-claude-code.git", + "skillPath": "skills/rust-testing/SKILL.md", + "skillFolderHash": "38d383ad33a4ea55498b6a35ec40f33be5e094ab", + "installedAt": "2026-07-21T18:52:43.658Z", + "updatedAt": "2026-07-21T18:52:43.658Z" + } + }, + "dismissed": { + "findSkillsPrompt": true + }, + "lastSelectedAgents": [ + "amp", + "antigravity", + "antigravity-cli", + "cline", + "codex", + "cursor", + "deepagents", + "gemini-cli", + "github-copilot", + "kimi-code-cli", + "opencode", + "warp", + "zed", + "claude-code", + "pi" + ] +} \ No newline at end of file diff --git a/dot_agents/skills/blume-migrate/SKILL.md b/dot_agents/skills/blume-migrate/SKILL.md new file mode 100644 index 0000000..cbce990 --- /dev/null +++ b/dot_agents/skills/blume-migrate/SKILL.md @@ -0,0 +1,170 @@ +--- +name: blume-migrate +description: Migrate an existing documentation site (Mintlify, Docusaurus, Fumadocs, Nextra, Starlight, or any docs framework) to Blume, the markdown-first docs framework on Astro. Translate the source config to blume.config.ts, restructure content into Blume's filesystem-derived navigation, rewrite JSX callouts to directives, convert icons to Lucide, and inline snippets. Use when the user asks to migrate/convert/port a docs repo to Blume, or when the repo has a docs.json/mint.json, docusaurus.config.*, meta.json with fumadocs, _meta.* with nextra, or an astro.config.* with starlight(). +--- + +# Migrate to Blume + +Blume is a **markdown-first** documentation framework on Astro/Vite. You drop Markdown/MDX into a folder and get navigation, search, theming, Open Graph images, and a component library with no app boilerplate — **the framework is the template**. There is no starter to clone; the only thing a project owns is its content and a `blume.config.ts`. + +Your job is to convert a source docs repo into an **idiomatic** Blume project — not a 1:1 transliteration. Read this file, detect the source framework, open the matching `references/.md` for the exact mappings, and work the loop below. Report everything you drop or approximate. + +## Migration philosophy + +- **Target idiomatic Blume, not a mechanical port.** Prefer filesystem-derived navigation over an exhaustive explicit `navigation.sidebar`. Prefer `:::` directives over JSX callouts. Prefer Blume defaults over restating them in config. +- **Every field has a default; `{}` is a valid config.** Map only what the source _declares_. If the source uses a framework default, don't write it. +- **Drop chrome that has no Blume equivalent — and say so.** Navbar CTAs, footer columns, custom theming, dynamic redirects, and unmappable icons get reported to the user, not silently discarded or faked. +- **Convert, don't preserve.** Blume's page frontmatter schema is **strict** — unknown keys are build errors. A source-only frontmatter key must be mapped to a Blume key or removed (and reported), never left to "maybe validate." + +## Migration workflow + +1. **Detect the source framework** and read its reference file: + - `docs.json` / `mint.json` → **Mintlify** (`references/mintlify.md`) — the deepest, config-declared nav. + - `docusaurus.config.*` → **Docusaurus** (`references/docusaurus.md`). + - `meta.json` + `fumadocs-*` deps (content under `content/docs/`) → **Fumadocs** (`references/fumadocs.md`). + - `_meta.{js,ts,json}` + `nextra` deps → **Nextra** (`references/nextra.md`). + - `astro.config.*` calling `starlight({…})` → **Starlight** (`references/starlight.md`). + - Anything else → apply this file's mental model directly; there's no framework-specific reference, so inventory by hand. + - **Also note the host repo, independent of source framework:** a pnpm/Turbo workspace, a non-`docs/` content layout, or a Vercel deploy each need integration steps (`content.root` scoping, `minimumReleaseAge`, lockfile, `vercel.json`, an Astro/Vite patch) — all in `references/monorepo.md`. Read it whenever the target isn't a bare single-package docs folder. +2. **Inventory the repo** before changing anything: the config file(s), the content tree, the nav definition, snippets/partials/includes, static assets, OpenAPI/AsyncAPI specs, redirects, i18n locales, custom components, and icon usage. Note what's declared vs. defaulted. +3. **Write `blume.config.ts`** with `defineConfig` from `blume`. Map only declared fields (see the reference's mapping table); rely on defaults everywhere else. A minimal result is `defineConfig({ title: "…" })`. +4. **Restructure content.** Choose `content.root` (default `docs`) — **detect where `.md`/`.mdx` actually live, don't assume a `docs/` folder.** Many repos keep content directly under an app dir (`apps/docs/api/`, `.../getting-started/`) with no `docs/` subfolder; when so, set `content.root` to that dir and scope `content.include` to the real content folders rather than leaving a bare `content.root: "."` that scans everything (see `references/monorepo.md` §1). Order with numeric prefixes (`01-intro.mdx`), group without a URL segment via `(group)/` folders, and add a `meta.ts` (`defineMeta`) only where filesystem order isn't enough. **A source that already declares per-folder navigation in a sidecar file — Fumadocs `meta.json`, Nextra `_meta.*` — _is_ that case: convert each one to a `meta.ts`, carrying over its title/icon/order/collapse, rather than dropping it and hoping filenames reproduce the intent. Filesystem inference is the fallback for folders that declare no per-folder nav, never a reason to discard one that does.** Reach for an explicit `navigation.sidebar` only when the source nav genuinely can't be expressed by files. **Reshaping into folder-per-tab moves URLs** — track every old→new path as you go; you'll turn them into `redirects` in step 5. +5. **Rewrite pages.** Map frontmatter to Blume's strict schema; convert callout JSX to `:::` directives — **directives (and math/mermaid/package-install fences) are MDX-only, so rename any `.md` page that needs them to `.mdx`**; rename components; inline snippets/partials (Blume has no import-based includes); fix asset paths; **rewrite internal links** to their new routes (including OpenAPI operation links — see the OpenAPI section, their slugs differ from most sources); **add a `redirects` entry for every route you moved** in step 4; **convert every icon name to Lucide** (Blume is Lucide-only — no FontAwesome/Tabler). Remove any duplicated H1 in the body (`title` renders the H1; bodies start at `##`). **If the source has a hand-maintained changelog and the repo is open source on GitHub, offer to swap it for the `github-releases` source** (see "Changelogs" below) rather than porting the entries. For **Mintlify**, run the bundled codemod first — `node /scripts/mintlify-codemod.mjs --write ` deterministically remaps icons and drops/renames unsupported frontmatter keys, and reports the rest (unknown icons, OpenAPI-stub flags) for you to finish by hand (see `references/mintlify.md`). +6. **Adopt `package.json`.** Repoint `dev`/`build`/`start` → `blume dev`/`blume build`/`blume preview`, remove the old framework's deps, add `blume`. A config-only source (e.g. a bare Mintlify `docs.json`) has no manifest — scaffold one. **In a pnpm workspace:** if `pnpm-workspace.yaml`/`.npmrc` sets `minimumReleaseAge`, add **only** `blume` to `minimumReleaseAgeExclude` (don't disable the guard) so the just-published version installs. **Always regenerate the lockfile in the same change:** after editing deps run a plain `pnpm install` (from the workspace root) and commit `pnpm-lock.yaml` alongside `package.json` — CI/Vercel use `--frozen-lockfile`, so a stale lockfile fails the build before it starts. **If the repo uses (or the user wants) [Ultracite](https://www.ultracite.ai) for formatting:** its oxfmt formatter mangles the `:::` directives you just wrote unless you ship the bundled `assets/oxfmt@0.55.0.patch` and register it under `patchedDependencies` — see `references/monorepo.md` §6. See `references/monorepo.md` §2–3. +7. **Wire up the host repo & deploy (non-trivial repos).** For a monorepo on Vercel, emit the root-aware install/build recipe and `apps/docs/vercel.json`, and tell the user the two settings you can't commit (Vercel Root Directory, Node 22). If the workspace pins Vite and `blume build` crashes inside Astro/Vite, apply the pnpm-patch workaround. All copy-pasteable in `references/monorepo.md` §4–5. +8. **Verify.** Run `blume build --strict` (frontmatter schema, duplicate routes, config — **without `--strict` a build exits 0 despite content errors**, silently dropping invalid pages) and `blume validate --strict` (internal links, heading anchors, assets — the link checker lives in `validate`, not `build`), fix diagnostics, then `blume dev` for a visual pass. End with a written summary of what was migrated, dropped, and approximated — **and every repo-specific edit you made** (pnpm-workspace, vercel.json, config globs) with the reason, plus any manual step left to the user (the Astro patch, Vercel dashboard settings). + +## The Blume mental model + +The single biggest shift for most sources — especially Mintlify — is that **navigation is derived from the filesystem**, not declared in config. + +### Navigation is the file tree + +- **Folders become groups, files become pages.** A page's sidebar label is its frontmatter `title`; a group's label is the humanized folder name. +- **Ordering resolves highest-priority-first:** an explicit `navigation.sidebar` (replaces the whole tree) → a folder's `meta.ts` `pages` array → a page's frontmatter `sidebar.order` → the filesystem (`index` first, then numeric filename prefix like `01-`, then alphabetical). +- **`meta.ts` refines one folder** (`defineMeta({ title, icon, order, collapsed, pages })`). The `pages` array lists children by slug (numeric prefix and parentheses stripped); children you omit fall back to their own `sidebar.order`, then filesystem order (`index` still sorts first) — so a partial `pages` list is safe, but list every child when the source declared a complete order. +- **Sidebar render mode is global, not per-folder.** `navigation.sidebar.display` in `blume.config.ts` is `"flat"` (default), `"group"` (collapsible), or `"page"` (drill-in sub-panel) and applies to **every** group at once. (It used to live on each folder's `meta.ts` as `display`; that field was **removed** — writing it in a `meta.ts` is now a build error. Set it once in config instead.) An explicit `navigation.sidebar` item may still override its own group's `display`. +- **An explicit `navigation.sidebar` replaces filesystem generation entirely.** Use it only for a nav shape files can't express. Its items are a page route string, a group (`{ label, items }`), or a link (`{ label, href }`). +- **Config-declared nesting has no on-disk counterpart — materialize it or it flattens silently.** When a source (Mintlify `groups`, Nextra `_meta`, a Docusaurus sidebar…) declares a nested group, its pages usually sit **flat in one folder** and the grouping lives only in config. Filesystem-derived nav sees the flat folder and drops the inner group. To keep the nesting you must **either** move those pages into a real subfolder (`meta.ts` for label/`collapsed`) — which changes their URLs, so add `redirects` — **or** declare the group in an explicit `navigation.sidebar`, which nests the existing routes without moving a file. Walk config `pages`/nav arrays **recursively** during inventory and record where config nesting depth exceeds on-disk depth; that gap is exactly what gets lost. + +### Tabs and selectors + +- **`navigation.tabs`** (`{ label, path, icon? }`) render top-of-header sections and **scope the sidebar by route** — the folder at a tab's `path` becomes the section, so this needs no config beyond the tabs themselves; structure content as **one folder per tab**. **A source's top-level tabs (Mintlify `navigation.tabs`, a top-level product/section switcher) map to these header tabs — keep them as tabs; don't flatten them into a single global `navigation.sidebar`.** Blume picks the active tab by **URL prefix** (longest tab `path` that prefixes the route), so every page in a tab must live under that tab's single `path`; a source tab that mixes arbitrary routes isn't portable as-is — either move its pages under one prefix (route change → add `redirects`) or accept the closest shape, and say which in the report (details in `references/mintlify.md`). The filtering runs both ways: on a route **under** a tab's `path`, the sidebar shows **only** that tab's folder (a tab also highlights when the current route is under it); on a **root or untabbed** route (or a tab whose `path` is `/`), the tab folders are **hidden** and the sidebar shows only the loose pages that belong to no tab (full tree as a fallback, so it's never blank). Consequence for migrations: once you add tabs, the landing sidebar automatically drops the sectioned content — that's intended, not lost pages; don't hand-build excludes for it. +- **`navigation.selectors`** (`{ kind, label, items: [{ label, path, icon?, description?, tag? }] }`, `kind` = `dropdown`/`product`/`version`/`language`) partition a whole site (products, versions) via a header dropdown keyed on the current route. +- **`navigation.featured`** (`{ label, href, icon? }`) pins links to the **top of the sidebar, above every section** — a blog, changelog, or support page that should always be one click away. These are the **exception to tab scoping**: unlike the generated tree, featured links show on **every** route and breakpoint. `href` points anywhere — an external URL opens in a new tab, an internal route (`/contact`) is validated against your pages at build time. `icon` is a Lucide name (or image path/URL/inline SVG), as everywhere else. This is the home for a source's always-visible header/utility links (Mintlify anchors, Blog/Contact links) — see `references/mintlify.md`. + +### Routes and pathing + +- A route is the content path relative to `content.root`, with **numeric prefixes stripped** (`01-intro.mdx` → `/intro`) and **`(group)/` folders adding no segment**. An `index` file maps to its folder's route. Frontmatter `slug` overrides the generated route. + +### `blume.config.ts` shape + +`defineConfig({...})` — every field optional, all with defaults: + +- **Site:** `title`, `description`, `logo` (string SVG, or `{ image: string | { light, dark, alt }, text, href }`), `banner` (`{ content, link, dismissible, id }` — no color/type). A logo renders beside `title` in the header, so a **wordmark logo doubles the brand** ("Acme Acme") — set `text: ""` to render the mark alone. **Prefer the string form over `{ light, dark }`:** if you have the logo SVG locally and it's monochrome (solid black or white), rewrite its `fill`/`stroke` to `currentColor` and use `logo: "/logo.svg"` — it then inherits the theme's text color and adapts to light/dark automatically, so you don't need separate light/dark files. +- **`theme`:** `accent` (a color string for both modes, or `{ light, dark }` per mode), `action` (color), `mode` (`light`/`dark`/`system`), `radius`, `fonts` (`{ body, display, mono }` — curated Google-font slugs), `background` and `backgroundImage` (each a string, or `{ light, dark }` per mode). The old `accentDark`/`backgroundDark`/`backgroundImageDark` fields were **merged into these per-mode objects** — a bare string still applies to both modes, so only reach for `{ light, dark }` when the two modes differ. There is **no** `theme.strict` and **no** `theme.css` config field — custom CSS goes in a project-root **`theme.css` file** (auto-picked-up), and a source's "strict appearance" flags drop. +- **`content`:** `root` (default `"docs"`, relative to the project dir where `blume` runs), `include`/`exclude` (arrays of globs **relative to `content.root`**; defaults `["**/*.{md,mdx}"]` / `["**/_*", "**/.*"]`), `sources` (staged sources: `filesystem`, `github-releases`, `notion`, `sanity`, `mdx-remote`, `custom` — OpenAPI is **not** one of these; it's the top-level `openapi` field), `pages` (custom `.astro` dir), `defaultType`. When docs sit directly under the project dir (no `docs/` subfolder), set `root` there and **scope `include` to the real content folders** instead of scanning everything — `references/monorepo.md` §1. +- **`basePath`** (top-level): a site-wide mount point (e.g. `"/docs"`) prepended to **every** route while staying invisible to the sidebar (no wrapper group). This is the right target for a source that served all docs under a prefix (Docusaurus `routeBasePath`, a Fumadocs `baseUrl` of `/docs`) — distinct from a per-source `prefix` (which adds a nav group) and from `deployment.base` (host subdirectory). +- **`navigation`:** `tabs`, `selectors`, `featured` (links pinned above the sidebar on every route), `sidebar` (`{ display, items }` — `display` is the global render mode above; `items` is an explicit tree), `repo`. **Avoid an explicit `navigation.sidebar` unless you have to** — lean on the filesystem-derived sidebar. It only works when the file tree roughly matches the intended sidebar layout, so reshape folders to match first; reach for `sidebar.items` only for a shape files genuinely can't express (see "Config-declared nesting" above). +- **`search`** (Orama default, Pagefind opt-in), **`ai`** (llms.txt, Ask AI, the MCP server), **`openapi`**, **`redirects`**, **`seo`**, **`markdown`**, **`analytics`**, **`deployment`**, **`i18n`**, **`toc`**, **`lastModified`**, **`github`**. +- **Don't set `deployment.site`.** Blume auto-fills it: the dev server's `localhost` URL in dev, and the deployment URL (`VERCEL_PROJECT_PRODUCTION_URL`/`VERCEL_URL`) on Vercel. Hardcoding it in `blume.config.ts` overrides that auto-detection and pins the wrong absolute URL (canonical links, sitemap, OG, llms.txt) everywhere but the one host you typed — so leave it unset even when a source config had a `url`/`site` field. (Sitemap still generates in production because the deploy URL is present there.) +- **Favicon is a filename convention, not config.** Drop `icon`/`favicon.{svg,png,ico}` (and `apple-icon.png`) in the project root or `public/` — Blume auto-detects it. There is **no** `favicon` config field. A source favicon given as `{ light, dark }` **collapses to one** — pick a single file and report the loss. + +The schema is exported from `blume/schema`; the full field reference is in `node_modules/blume/docs/configuration/`. + +### Icons are Lucide, period + +Blume resolves **bare kebab-case [Lucide](https://lucide.dev) names** everywhere an icon is accepted — frontmatter `icon`, `sidebar.icon`, `meta.ts` `icon`, `navigation.tabs`/`selectors` icons, and `Card`/`Step`/`Icon`/etc. props. There is **no** FontAwesome or Tabler support and **no** `iconType` prop. Names must be **kebab-case** (`book-open`, not `BookOpen`) — a PascalCase React-component name (common in Fumadocs/lucide-react sources) does not resolve and renders nothing. When migrating a source that uses another icon set (Mintlify defaults to FontAwesome), **map each name to its closest Lucide equivalent**; where none exists, drop the icon and report it. Verify a name exists at [lucide.dev/icons](https://lucide.dev/icons) before writing it. + +### Page frontmatter (strict — unknown keys are build errors) + +```yaml +--- +title: Install # renders as the page H1 — remove any duplicate H1 in the body +description: Install Blume and scaffold your first project. +type: doc # doc (default) | blog | changelog | api +icon: download # a Lucide name +sidebar: + label: Install # overrides title in the sidebar + order: 2 + icon: download + badge: New + hidden: false +seo: + title: … + description: … + image: /og/install.png + canonical: https://… + noindex: false +search: + exclude: false + tags: [api] +slug: install # override the generated route +draft: false +lastModified: 2026-06-20 # pin the "last updated" date +--- +``` + +Also valid: `date`/`authors` (blog/changelog feeds), `changelog` (changelog metadata), `deprecated`, `hidden`, `noindex`. + +### Authoring features (no imports needed in `.mdx`) + +- **The rich features are MDX-only.** Directives, `package-install`, mermaid, and math are wired into the MDX processor; in a plain `.md` file a `:::note` stays **literal text** — and the build stays green. **Rename any `.md` file that uses (or should use) these to `.mdx` during migration.** This bites hardest on Docusaurus/Starlight sources, whose `.md` content is full of `:::` admonitions. Plain Markdown (headings, tables, fenced code with titles/highlighting) is fine in `.md`. +- **Callouts as directives:** `:::note`, `:::tip`, `:::warning`, `:::danger`, `:::info`, `:::success`, with an optional title in brackets: `:::warning[Heads up]`. Aliases `caution`→warning, `error`→danger, `important`→note, `warn`→warning. +- **No-import MDX components:** `Callout`, `Card`/`CardGroup`, `Columns`/`Column`, `Steps`/`Step`, `Tabs`/`Tab`, `Accordion`/`AccordionItem`, `Expandable`, `FileTree`, `Tree`/`Tree.Folder`/`Tree.File`, `CodeGroup`, `Frame`, `Panel`, `Tooltip`, `Tile`, `Badge`, `Icon`, `TypeTable`/`AutoTypeTable`, `Color`, `YouTube`, `Visibility`, `GithubInfo`, `Component`, `CodeBlock`, `Diff`, `Prompt`, `Math`. (**Not** shipped — convert away: `` → the `:::warning` directive, and the `ParamField`/`ResponseField`/`RequestField` field family → `TypeTable` rows or the OpenAPI reference. See the reference files for targets.) +- **Fenced-code superpowers:** ` ```package-install ` → package-manager tabs; ` ```mermaid ` → a rendered diagram; code-block titles (` ```ts server.ts `), line numbers (`lineNumbers`), and highlighting (`{1,4-5}`, `// [!code ++]`). +- **Math:** block math `$$…$$` renders in `.mdx` with **no config** (there is no `markdown.math` field). Inline `$…$` is **not** supported — a bare `$` stays literal text; convert inline math to display math or drop it (report). + +### OpenAPI + +`openapi: { enabled: true, sources: [{ spec, label?, route? }] }` generates **one real page per operation** — with routing, sidebar, search, and OG images for free. **The reference does not get a header tab automatically** — add a `navigation.tabs` entry pointing at the reference's `route` (reference routes are valid tab targets) or the API reference is unreachable from the header. **Never hand-migrate generated API-reference pages** (per-endpoint stub pages in the source): delete them and point `openapi.sources` at the spec. (`renderer: "scalar"` keeps the Scalar embed instead; AsyncAPI uses the same embed.) + +- **Vendor the spec by default.** A remote `spec:` URL makes every build depend on fetching it at build time — a single point of failure in CI, offline, or behind a proxy, and a failed fetch skips the whole reference. Prefer committing the spec into the repo (`openapi/.json`) and pointing `spec` at the local path; if you keep the URL, say so and consider a `prebuild` step that refreshes the local copy with a fallback. +- **Operation routes have their own slug scheme** — `//` (e.g. tag `Models`, id `listModels` → `/api-reference/models/listmodels`). This rarely matches the source's endpoint links (Mintlify/others kebab-case differently), so **rewrite every inbound link to an operation**. `blume validate` resolves operation pages like any other route, so it catches the ones you miss. +- **Keep hand-written conceptual pages.** Sources often pair a written "Introduction/Authentication" page with the endpoint group in the same tab. A normal content page placed under the openapi `route` merges into the reference tab's sidebar — so keep those (auth, errors, rate limits) and delete only the per-endpoint stubs. + +### Changelogs + +If the source ships a **hand-maintained changelog** (a `changelog.mdx`, a folder of dated entries, Mintlify `` blocks) **and the project is open source on GitHub**, offer to replace it with the **`github-releases`** content source — release notes become the changelog automatically, with no files to maintain. It's an offer, not an automatic rewrite: some teams keep a curated changelog that doesn't map 1:1 to GitHub releases, so confirm the release notes are the source of truth before deleting their pages. + +Add it under `content.sources` alongside the filesystem source: + +```ts +content: { + sources: [ + { include: ["docs/**/*.mdx"], root: ".", type: "filesystem" }, + { + owner: "haydenbleasel", + repo: "ultracite", + prefix: "changelog", + type: "github-releases", + }, + ], +}, +``` + +- Each release materializes as a `type: changelog` page under `//` (`prefix: "changelog"` → `/changelog/…`); omit `prefix` to mount at the root. +- Optional fields: `limit` (cap materialized releases, newest-first, default 100), `prereleases` (include prereleases), `drafts` (include drafts — needs a token with repo write access), `pollInterval` (dev polling seconds; omit to freeze for the session). +- A **private** repo reads a token from `GITHUB_TOKEN`; it is never inlined in config. A public repo needs no token. +- **Delete the old changelog pages** once the source is wired (and add `redirects` from their old routes to the new `//…` slugs). Pin a header/sidebar link with `navigation.featured` if the source had one. + +### Redirects are static + +A `redirects: [{ from, to, status? }]` array **in `blume.config.ts`** maps old URLs when you restructure routes — Blume serves these itself, so any reorganization that moves a page (folder-per-tab, materialized nested groups, renamed slugs, index promotion) is fixed by adding an entry there; no host config needed. **Restructuring is the main source of these:** every page you moved in step 4 (folder-per-tab, renamed slugs, index promotion) needs an entry, or old URLs 404. `status` defaults to **301 (permanent — browsers cache it indefinitely)**; that's correct for genuine moves, but never use 301/308 for redirects you might reverse. Dynamic/wildcard patterns (`:slug*`) can't be modeled as static path-to-path; move those to host-level config (`_redirects`, `vercel.json`) and report them. + +## Verification & reporting + +1. Run **`blume build --strict`** — it validates the frontmatter schema, duplicate routes, and config, and `--strict` makes diagnostics fail the build (without it, `blume build` **exits 0 despite content errors** and silently drops invalid pages). Then run **`blume validate --strict`** — links, heading anchors, and assets live here, not in `build` (add `--external` to also check outbound HTTP links). OpenAPI operation pages are real routes to `validate`, so dead links to them are caught too. Iterate until both are clean. +2. Run `blume dev` and review the site visually — nav structure, tabs, theme, rendered components. +3. **Write a migration summary** covering: what was migrated (config, N pages, nav, OpenAPI), what was **dropped** (navbar CTAs, footers, custom theming, dynamic redirects, unmappable icons, unsupported components), and suggested follow-ups (`blume eject` for full control, `blume add` to vendor a component for customization). + +## Full documentation + +The mapping details live in `references/`: one file per source framework (`mintlify.md`, `docusaurus.md`, `fumadocs.md`, `nextra.md`, `starlight.md`), plus **`monorepo.md`** for host-repo integration (content-layout detection, pnpm `minimumReleaseAge`, frozen-lockfile regeneration, the Vercel monorepo recipe, and the Astro/Vite patch). The Mintlify icon + frontmatter pass is automated by **`scripts/mintlify-codemod.mjs`** (zero-dependency, deterministic, idempotent; `--write` to apply). The authoritative Blume docs are bundled in the installed package at **`node_modules/blume/docs`** (or `apps/docs/content/docs` in a repo checkout). The most relevant pages: + +- `configuration/index.mdx` — every `blume.config.ts` field. +- `content/navigation.mdx` — the sidebar/tabs/selectors model. +- `content/meta.mdx` — `meta.ts` and display modes. +- `content/syntax.mdx` — directives, code features, math. +- `content/components.mdx` — the component library and APIs. +- `reference/frontmatter.mdx` — the strict page schema. diff --git a/dot_agents/skills/blume-migrate/assets/oxfmt@0.55.0.patch b/dot_agents/skills/blume-migrate/assets/oxfmt@0.55.0.patch new file mode 100644 index 0000000..4909461 --- /dev/null +++ b/dot_agents/skills/blume-migrate/assets/oxfmt@0.55.0.patch @@ -0,0 +1,20 @@ +diff --git a/dist/markdown-Bowe09rB.js b/dist/markdown-Bowe09rB.js +index 0fe63ff712e07c9c2188711fa0940f7a7d8f7d74..44435d91a2f5a6711512981c9bcaddedc1760be4 100644 +--- a/dist/markdown-Bowe09rB.js ++++ b/dist/markdown-Bowe09rB.js +@@ -1141,7 +1141,14 @@ function Yf(e, r, t) { + case "sentence": return Yi(e, t); + case "word": return Li(e); + case "whitespace": { +- let { next: i } = e, u = i && /^>|^(?:[*+-]|#{1,6}|\d+[).])$/u.test(i.value) ? "never" : r.proseWrap; ++ let { next: i, previous: oxfmtFencePrev } = e; ++ // Preserve line breaks that sit directly against a `:::` container ++ // directive fence, so `proseWrap: "never"` keeps the opening/closing ++ // fence on their own lines instead of joining them into the prose (which ++ // breaks the directive). Ordinary prose still wraps per proseWrap. ++ // See prettier/prettier#19040. ++ let oxfmtIsFence = (w) => w != null && typeof w.value === "string" && w.value.startsWith(":::"); ++ let u = oxfmtIsFence(oxfmtFencePrev) || oxfmtIsFence(i) ? "preserve" : i && /^>|^(?:[*+-]|#{1,6}|\d+[).])$/u.test(i.value) ? "never" : r.proseWrap; + return qt(e, n.value, u); + } + case "emphasis": { diff --git a/dot_agents/skills/blume-migrate/references/docusaurus.md b/dot_agents/skills/blume-migrate/references/docusaurus.md new file mode 100644 index 0000000..e144040 --- /dev/null +++ b/dot_agents/skills/blume-migrate/references/docusaurus.md @@ -0,0 +1,95 @@ +# Docusaurus → Blume + +Docusaurus is a React site; navigation comes from `sidebars.js` (explicit or autogenerated) plus per-folder `_category_.json`. Admonitions are already directive syntax, which eases the content transform — **but note the source major version**: v2 (MDX v1) and v3 (MDX v3) have different content hazards, called out below. + +## Detect + +- **`docusaurus.config.{js,ts}`** at the root; a **`sidebars.{js,ts}`** file and per-folder **`_category_.json`** files. +- Content under **`docs/`** (often plus `blog/`, `src/pages/`, `static/`, `versioned_docs/`); `@docusaurus/*` deps. +- v2 vs v3: check the `@docusaurus/core` major in `package.json`. + +## Config: `docusaurus.config` → `blume.config.ts` + +Read `themeConfig`, `presets`, and `plugins`: + +| Docusaurus | Blume | +| --- | --- | +| `title` | `title` | +| `tagline` | `description` | +| `themeConfig.navbar.title` / `.logo` | `title` / `logo` (move the image into `public/`) | +| `themeConfig.navbar.items` (doc items) | `navigation.tabs` (for section links) | +| `themeConfig.navbar.items` (external/utility links — Blog, GitHub, Discord…) | **`navigation.featured`** (`{ label, href, icon? }`, pinned above the sidebar on every route); the GitHub link → the `github` config instead | +| `themeConfig.colorMode.defaultMode` | `theme.mode` (`respectPrefersColorScheme: true` → `"system"`) | +| `themeConfig.prism.theme` / `.darkTheme` | `markdown.codeBlocks.theme: { light, dark }` (map Prism theme names to Shiki themes, e.g. `github`/`github-dark`) | +| `themeConfig.metadata` / `themeConfig.image` | per-page `seo` frontmatter / `seo.og`; report what doesn't fit | +| `url` + `baseUrl` | **`url` → drop** (`deployment.site` auto-detects); `baseUrl` (when not `/`) → `deployment.base` | +| preset `docs.routeBasePath` — **including the default!** | Docusaurus serves docs at **`/docs/…` by default**; the "map only declared fields" rule does **not** apply here because the _URLs_ are load-bearing. Either keep them with top-level **`basePath: "/docs"`** (invisible to the sidebar), or intentionally move to root and emit a `redirects` entry per page. Decide explicitly and say which. (`routeBasePath: '/'` = docs-only mode — nothing to do.) | +| preset `docs.editUrl` | `github` (owner/repo/branch; a path after the branch → `github.dir`) | +| `themeConfig.footer` | drop → Footer override (`defineComponents` layout slot) | +| `themeConfig.announcementBar` | `banner` (`{ content, dismissible, id }` — `isCloseable` → `dismissible`; colors drop) | +| `i18n.locales` / `defaultLocale` | `i18n` — translated files live at `i18n//docusaurus-plugin-content-docs/current/…`; move them to `/…` under `content.root` | +| `themeConfig.algolia` | drop — Blume ships built-in search (Orama); remove the Algolia dep | +| `@docusaurus/plugin-client-redirects` | **static `redirects: [{from, to}]` arrays convert 1:1** to Blume `redirects` (a `from` array = one entry per item); only `createRedirects` functions are truly dynamic → host rules | +| `@docusaurus/theme-mermaid` | delete the dep — ` ```mermaid ` renders natively (in `.mdx`) | +| `remark-math` + `rehype-katex` | delete — block `$$…$$` renders in `.mdx` with no config (no `markdown.math` field exists); **inline `$…$` is not supported** — convert or drop (report) | +| Multi-instance docs plugins (`plugin-content-docs` with `id`) | one folder (and usually one `navigation.tabs` entry) per instance | + +## Static assets — required move + +Every Docusaurus repo serves **`static/`** at the site root (`static/img/foo.png` → `/img/foo.png`). Blume serves **`public/`**. **Move `static/*` (and any extra `staticDirectories`) into `public/`** — all root-relative references then keep resolving unchanged. Without this, every image and download 404s. + +## Navigation: `sidebars.js` + `_category_.json` + +- **Autogenerated sidebar** (`{ type: 'autogenerated', dirName: '...' }`) → Blume's default filesystem navigation. Docusaurus strips numeric prefixes (`01-`) exactly like Blume, so the convention round-trips; no config needed. +- **Explicit sidebar** (arrays of doc IDs, categories, links) → restructure into folders where possible; use `navigation.sidebar` only for shapes files can't express. A category `{ type: 'category', label, items }` → a folder (label → `meta.ts` `title`); `collapsed` → `meta.ts` `collapsed` (**no `display` field in `meta.ts`** — if collapse matters, set the global `navigation.sidebar.display: "group"` once in config). +- **`_category_.json`** (also `.yml`) (`{ label, position, collapsed, collapsible, link, className, customProps }`) → a folder `meta.ts`: `label`→`title`, `position`→`order`, `collapsed`→`collapsed`. `link.type: 'generated-index'` → an `index` page in the folder — **and the old URL was `/docs/category/`**, so add a redirect and rewrite inbound links. `link.type: 'doc'` → make that doc the folder's `index`. `collapsible`/`className`/`customProps` → drop (report). +- **`src/pages/` — inventory, don't nuke.** Nearly every repo has a React landing page (`src/pages/index.tsx`) and often extra Markdown pages. Markdown pages → content pages; the React home page → rebuild as a docs index or a custom `.astro` page under `content.pages` — report either way. + +## Versioned docs + +Docusaurus `versioned_docs/version-X/` + `versions.json` (+ `versioned_sidebars/`) → **recommend migrating the latest released version only**. Mind the URL scheme: by default the **latest release** serves at `/docs/` and the work-in-progress `docs/` folder serves at `/docs/next` (`lastVersion: 'current'` flips this) — pick the folder that matches what users see at `/docs/`. If older versions must stay, put each under its own folder and wire a `navigation.selectors` entry of `kind: "version"`. + +## Blog + +A Docusaurus `blog/` → Blume `type: blog` pages. **Dates come from filenames/folders** (`2024-01-31-foo.md`) — extract each into `date` frontmatter and strip the date from the filename (the old dated URLs `/blog/2024/01/31/foo` need `redirects`). Strip `` / `{/* truncate */}` markers. `authors.yml` refs → inline author objects in each post's `authors` frontmatter. RSS stays at `/blog/rss.xml` on both sides. + +## Content & components + +- **`.md` vs `.mdx` — both majors need renames, for opposite reasons.** Blume parses `.md` as plain Markdown: no directives, no JSX, no `$$` math, no mermaid/package-install fences. **v3** treats `.md` as MDX (so a `.md` with imports/JSX/`{}` renders them as literal text in Blume); **v2** content is looser MDX v1. Rule: **rename any `.md` that contains admonitions, JSX, imports, or math to `.mdx`** — for typical Docusaurus repos that is most files. +- **Admonitions are directives — but check the version.** v3: `:::note`, `:::tip`, `:::info`, `:::warning`, `:::danger` pass through; `:::caution` → `:::warning` (or rely on Blume's alias); titles `:::note[Title]` work. **v2:** titles are space-separated (`:::note Your Title`) — rewrite to brackets or the title is silently lost; and v2's `:::warning` rendered **red/danger** — audit whether it should become `:::danger`. +- **Tabs:** ``/`` → ``/``. Drop `groupId`/`queryString`/`value`; strip the `@theme/Tabs` imports. +- **Theme JSX in content:** `` (standard on category index pages) → hand-write `Card`/`CardGroup` links or delete (a Blume group page lists its children); `` → drop (report); `` JSX → a fenced code block; `` → the matching directive; `
`/`` → ``/`` or leave as raw HTML. +- **`@theme/*` / `@site/*` imports** — strip `@theme/*` (Blume injects components globally); rewrite `@site/` asset/module paths to `/public` URLs or inline. **MDX partials** (`_partial.mdx` imports) → inline the partial's body (Blume's default `**/_*` exclude already hides the partial files themselves). +- **Code blocks:** `title="file.js"` → works as-is; `showLineNumbers` → `lineNumbers`; **magic comments** (`// highlight-next-line`, `highlight-start`/`end`) → `{ranges}` or `// [!code highlight]` — unconverted they ship as literal comments in every sample; ` ```bash npm2yarn ` → ` ```package-install `. +- **MDX v1 (v2 sources) pitfalls:** unescaped `<`/`{` in prose, HTML comments `` (→ `{/* */}`), string `style="…"` attributes (→ objects). Fix as build errors surface. + +## Frontmatter + +| Docusaurus | Blume | +| --- | --- | +| `title` / `description` | pass through | +| `id` | usually drop (routing is filesystem-based); use `slug` to pin a route | +| `slug` | `slug` | +| `sidebar_label` | `sidebar.label` | +| `sidebar_position` | `sidebar.order` | +| `unlisted` | `hidden: true` + `noindex: true` | +| `last_update.date` | `lastModified` | +| `draft` | `draft` | +| `tags` | `search.tags` (or drop if only used for the blog tag index) | +| `image` | `seo.image` | +| `keywords` | drop → use `seo` | +| `sidebar_class_name` / `sidebar_custom_props` / `pagination_next` / `pagination_prev` / `pagination_label` / `hide_title` / `hide_table_of_contents` / `toc_min_heading_level` / `toc_max_heading_level` / `displayed_sidebar` / `custom_edit_url` | drop (report) | + +Remove any duplicated H1 in the body — `title` renders the H1. + +## Icons + +Docusaurus has no built-in icon-name system (icons are usually inline SVG/emoji/CSS). Where you add sidebar/tab icons, use Lucide names. Convert any FontAwesome/react-icons usage in content to Lucide `` or drop it. + +## Teardown + +Remove `@docusaurus/*` and Algolia deps; delete `docusaurus.config.*`, `sidebars.*`, `babel.config.js`, and `src/` theme customizations (after the `src/pages/` inventory above; re-implement what matters via `defineComponents` layout slots or `blume eject`). Repoint `start`/`build`/`serve` scripts → `blume dev`/`blume build`/`blume preview`; add `blume`. + +## Dropped — report these + +Custom/swizzled theme components (layout slots or `blume eject`), footer columns, Algolia config, `sidebar_custom_props` and the other dropped frontmatter keys, `createRedirects` functions (→ host rules), React pages under `src/pages/`, ``, per-category `className`/`customProps`, and any `@theme/*` component with no Blume equivalent. diff --git a/dot_agents/skills/blume-migrate/references/fumadocs.md b/dot_agents/skills/blume-migrate/references/fumadocs.md new file mode 100644 index 0000000..8c4ad22 --- /dev/null +++ b/dot_agents/skills/blume-migrate/references/fumadocs.md @@ -0,0 +1,95 @@ +# Fumadocs → Blume + +Fumadocs is code-first: navigation comes from the folder tree + per-folder `meta.json`. This maps cleanly to Blume — most content passes through, and `meta.json` becomes `meta.ts`. Fumadocs v16 runs on Next.js, React Router, TanStack Start, Astro, or Waku — detect by the Fumadocs files, not by Next.js files, and adjust the teardown list to whichever host framework is present. + +## Detect + +- Content under **`content/docs/`** (the Fumadocs convention). +- Per-folder **`meta.json`** files. +- `fumadocs-ui` / `fumadocs-core` / `fumadocs-mdx` deps and a `source.config.ts`. +- A `loader({ baseUrl: "/docs" })` call in `lib/source.ts` (or `app/source.ts`, `src/lib/source.ts`, `source.ts`). + +## Config + +Fumadocs declares almost nothing Blume needs — only two things map: + +- **Title** — read `package.json` `name`, prettified (drop scope, split on `-_`, Title-Case). For a generic monorepo name (`web`, `app`, `docs`…), use the repo-root directory name instead. +- **Route prefix** — the `baseUrl` in the source loader (required in Fumadocs, so it's always declared). If it's a real prefix (e.g. `/docs`), set top-level **`basePath: "/docs"`** — it prefixes every route while staying invisible to the sidebar, which matches Fumadocs' behavior. (A `content.sources` `prefix` also works but adds a wrapping nav group — only use it when you _want_ the group.) If `baseUrl` is `"/"`, serve from the site root (nothing to set). + +Everything else is `defineConfig({ title })`. + +**Also read `source.config.ts` `mdxOptions`** — remark/rehype plugins live there: + +- `remark-math`/`rehype-katex` → nothing to configure: block math `$$…$$` renders in `.mdx` out of the box (there is **no** `markdown.math` field). Inline `$…$` is **not** supported — convert inline math to `$$…$$` or drop it (report). +- A Twoslash transformer → Blume supports the `twoslash` fence meta natively; drop the plugin. +- Custom Shiki transformers/themes or other plugins → report. + +## Navigation: `meta.json` → `meta.ts` + +**Every `meta.json` becomes a `meta.ts` — this is the primary navigation carry-over for Fumadocs, always required, never optional.** `meta.json` is Fumadocs' canonical nav source; no filesystem-only shortcut reproduces its ordering, icons, and collapse state, so don't skip it in favor of filename inference. Move content from `content/docs/` to your chosen `content.root` (e.g. `docs/`), then convert each `meta.json` to a `meta.ts` (`defineMeta`): + +| Fumadocs `meta.json` | Blume `meta.ts` | +| --- | --- | +| `title` | `title` | +| `icon` | `icon` — **convert the casing** (see Icons below) | +| `defaultOpen: false` | `collapsed: true` | +| `defaultOpen: true` | `collapsed: false` | +| `root: true` | a **`navigation.tabs` entry** (see below) — **not** a `meta.ts` field | +| `pages: [...]` slugs | `pages: [...]` (ordering) | +| `description` | **drop** (folders have no description) | +| `collapsible: false` | **drop** (report — no per-folder equivalent) | + +`meta.ts` accepts **only** `title`, `icon`, `order`, `collapsed`, `pages` — there is **no `display` field** (writing one is a build error). Collapse rendering is global: when any folder needs collapsing, set `navigation.sidebar.display: "group"` once in `blume.config.ts`. + +**`root: true` folders are Fumadocs' tab mechanism** — Fumadocs UI renders them as layout tabs and scopes the sidebar to the active one. That is exactly Blume's `navigation.tabs`: add `{ label, path, icon? }` per root folder (label/icon from its `meta.json`), pointing at the folder's route. Blume then scopes the sidebar by URL prefix the same way. Don't try to model root folders inside `meta.ts`. + +Handle the `pages` array items: + +- **`"..."`** (rest marker) / `""` → drop; Blume appends unlisted pages automatically. **`"z...a"`** (reversed rest) → no equivalent; list the pages explicitly in the intended order. +- **`"!page"`** (exclusion) → Blume _appends_ unlisted pages, so a dropped `!page` **resurfaces in the sidebar**. Set that page's frontmatter `sidebar.hidden: true` instead. +- **`"---Section---"`** (separator; also the `---[Icon]Label---` variant) → Blume has no flat separator. Turn each section into a **`(Section)/` group folder** (route-transparent — the `(…)` segment is stripped from URLs), and move the section's pages into it. If a section wraps a single existing folder, leave it in place and set that folder's `meta.ts` `title` instead. +- **`"...folder"`** (extract) → Blume can't flatten a folder inline; keep it as a normal group at that ordering position and report it. +- **`"[Text](url)"`** (link; also `[Icon][Text](url)` and `external:` variants) → a top-level/utility link belongs in **`navigation.featured`** (`{ label, href, icon? }` — pinned above the sidebar on every route). A link buried deep in one folder has no folder-meta home — drop and report (or model that one folder via an explicit `navigation.sidebar`). +- **`pagesIndex`** → make that page the folder's `index` (rename the file); report the route change and add a redirect. + +## Frontmatter + +Fumadocs' core frontmatter (`title`, `description`, `icon`) matches Blume — but **convert `icon` casing** (see Icons). Drops: **`full`** (Fumadocs' full-width/no-TOC layout — no equivalent; report) and **`_openapi`** (generated API stubs — delete the whole page, see OpenAPI). Any other non-schema key is a build error, so drop and report. + +## Icons: lucide-react names → kebab-case + +Fumadocs icons are strings resolved by the repo's own `icon` handler in `loader()` — in practice **PascalCase lucide-react export names** (`"BookOpen"`, `"HomeIcon"`). Blume resolves **kebab-case** Lucide names and silently renders nothing on a miss, so pass-through loses every icon. Read the loader's icon handler to confirm the scheme, then convert each name: strip any `Icon` suffix, kebab-case it (`BookOpen` → `book-open`, `HomeIcon` → `home`), and verify it exists at [lucide.dev/icons](https://lucide.dev/icons). + +## Components + +- **Callouts:** `` → `:::` directive. Fumadocs types are `info` (the default), `warn`, `warning`, `error`, `success`, `idea`: `warn`/`warning`→`:::warning`, `error`→`:::danger`, `success`→`:::success`, `idea`→`:::tip`, `info` and **bare ``** → `:::info`. `title` → `:::type[Title]`; drop `icon`. +- **Cards:** `` → ``. `` needs **prop surgery**, not pass-through: Fumadocs `icon` is a JSX element (`icon={}` imported from `lucide-react`) → Blume takes a string name (`icon="cpu"`); Fumadocs `description="…"` → Blume has no `description` prop — move the text into the card body. +- **Accordions (container/item inversion):** `` → `` (container); `` → `` (item). +- **File trees:** `` → **``** (the JSX container for `Tree.*` children — _not_ ``, which wraps a Markdown list); `` → `` (`defaultOpen` carries over); `` → ``. Or convert the whole block to a list-driven ``. +- **Tabs:** Fumadocs declares labels on the parent (``) and selects with ``. Blume's `` carries its own `title`. Strip `items={[…]}` from `` and give each child `` a `title` (from its `value`, or the positional `items` entry). +- **Pass through unchanged:** ``/``, `` (Blume's was modeled on Fumadocs' — identical `type` record shape), ``. +- **``** (layout-mounted, not per-page) → the `banner` config field (`{ content, link, dismissible, id }`). +- **`./partial.mdx`** — Blume has no runtime include. **Inline** the partial's body (strip its frontmatter) at migration time; resolve nested includes recursively. +- **No equivalent — report:** ``, `` (Blume zooms content images by default), ``. +- **Strip or convert every import** — not just `fumadocs-*`: `lucide-react` imports (icon JSX → string names), `next/image`/`next/link` (→ Markdown image/link), and local components. **Inventory `mdx-components.tsx` before deleting it** — components registered there are used import-free in MDX bodies; port or inline each usage first. + +## Code fences + +- ` ```npm ` fences (Fumadocs' remark-npm accepts both) → ` ```package-install `. +- Adjacent fences sharing `tab="…"` meta render as grouped tabs in Fumadocs → wrap them in a Blume `` and drop the `tab=` attrs. + +## OpenAPI + +`fumadocs-openapi` writes **generated MDX stubs into the content tree** (`generateFiles()` output: pages containing ``/`` with `_openapi` frontmatter), plus `lib/openapi.ts` (`createOpenAPI`) and a generate script. Treat these exactly like Mintlify endpoint stubs: **delete the generated pages**, point `openapi: { enabled: true, sources: [{ spec }] }` at the spec (vendor it locally), add a `navigation.tabs` entry for the reference route, and remove `fumadocs-openapi`, `lib/openapi.ts`, and the generate script. Keep hand-written conceptual pages (intro/auth) under the reference route. + +## i18n + +A `loader({ i18n })` setup (locale-suffixed files or locale dirs) → Blume `i18n: { defaultLocale, locales: [{ code, label }] }`. Locale **directories** match Blume's `dir` parser as-is; locale **file suffixes** (`page.cn.mdx`) need restructuring into locale folders. Report whichever transform you apply. + +## Package.json & teardown + +Repoint scripts (`dev`→`blume dev`, `build`→`blume build`, `start`→`blume preview`), remove the `fumadocs-*` deps and the host framework's deps (`next`, `react-router`, `@tanstack/*`…), add `blume`. Safe to delete after harvesting (see above for what to read first): `source.config.*`, `mdx-components.tsx`, the app/route dir, and host-framework config (`next.config.*`, `next-env.d.ts`, the `next` tsconfig plugin — or the React Router/TanStack equivalents). + +## Dropped — report these + +Folder `description` and `collapsible: false`; reversed rest (`z...a`) ordering; the extract (`...folder`) flatten semantics; deep-folder sidebar links; frontmatter `full`; ``/``; custom Shiki transformers; any icon with no Lucide equivalent after casing conversion. diff --git a/dot_agents/skills/blume-migrate/references/mintlify.md b/dot_agents/skills/blume-migrate/references/mintlify.md new file mode 100644 index 0000000..17e05ae --- /dev/null +++ b/dot_agents/skills/blume-migrate/references/mintlify.md @@ -0,0 +1,156 @@ +# Mintlify → Blume + +The deepest migration. Mintlify declares its **entire navigation in `docs.json`**; Blume derives navigation from the filesystem. The bulk of the work is reshaping content into folders + tabs and translating config, callouts, and icons. + +## Detect + +- `docs.json` (current) or `mint.json` (legacy) at the repo root — the config file. +- A `mintlify` dependency / `mintlify dev` script. +- Content is `.mdx` under the repo root (Mintlify has no `content.root` — pages live at the top level), with a `/snippets` folder and image dirs like `/images`. + +Read `docs.json` first; it drives everything. + +## Config: `docs.json`/`mint.json` → `blume.config.ts` + +Resolve `$ref` includes first (Mintlify splits config across files). Map only what's set: + +| Mintlify | Blume | Notes | +| --- | --- | --- | +| `name` / `title` | `title` | | +| `description` | `description` | | +| `logo` (string or `{ light, dark, href }`) | `logo` (string, or `{ image: { light, dark, alt }, text, href }`) | Mintlify's `light`/`dark` nest under Blume's `image`; ensure files land in `public/`. **If the SVG is local and monochrome** (a solid black or white mark), rewrite its `fill`/`stroke` to `currentColor` and collapse `{ light, dark }` to the string shorthand `logo: "/logo.svg"` — one file that inherits the theme text color and flips with light/dark automatically. If the logo is a **wordmark** (brand name baked in), set `text: ""` so it doesn't render twice beside `title` | +| `favicon` (string **or `{ light, dark }`**) | **drop the field** — copy **one** file into `public/` under the conventional name (`favicon.svg`/`icon.png`) | Blume auto-detects by filename; there is **no** favicon config field, and **no** light/dark favicon — a `{ light, dark }` source collapses to one; report the loss | +| `colors.primary` + `colors.light` | `theme.accent` (`{ light, dark }`) | accent is now **per-mode**: `accent: { light: , dark: }`. If Mintlify sets only `primary`, collapse to the string shorthand `accent: ""` (applies to both modes) | +| `colors.dark` | `theme.action` | | +| `appearance.default` | `theme.mode` (`light`/`dark`/`system`) | | +| `appearance.strict` | **drop** | `theme.strict` was removed — writing it is a config error | +| `background.color.{light,dark}` | `theme.background` (`{ light, dark }`) | one field now: `background: { light: …, dark: … }` (a bare string applies to both) | +| `background.image` | `theme.backgroundImage` (`{ light, dark }`) | same per-mode shape as `background` | +| `background.decoration` | **drop** | no Blume equivalent | +| `fonts.family` / `fonts.{heading,body}.family` | `theme.fonts.{display,body}` | only if the family is a curated Google-font slug (kebab-case, e.g. `space-grotesk`); otherwise drop and tell the user to add `@font-face` in `theme.css` | +| `banner` | `banner` (`{ content, dismissible, id, link }`) | **only** those keys — drop `banner.color`/`banner.type` | +| `styling.latex: true` | **drop the field** — block math `$$…$$` renders in `.mdx` with no config | there is **no** `markdown.math` field; inline `$…$` is **not** supported — convert inline math to `$$…$$` or drop it (report) | +| `styling.codeblocks.theme` | `markdown.codeBlocks.theme` (`{ light, dark }`) | | +| `search.prompt` | **drop** | no equivalent | +| `seo.metatags` | **drop** | no equivalent; use per-page `seo` frontmatter | +| `seo.indexing: "all"` | `search.indexing.includeHiddenPages: true` | | +| `variables` (`{{name}}`) | **inline into content** | Blume has no runtime `{{var}}` substitution — replace each `{{name}}` with its value in the pages | +| `integrations.posthog` (`{ apiKey, apiHost }`) | `analytics.posthog` (`{ key, host }`) | preserve the host verbatim (e.g. `us.posthog.com` — Blume's default is `us.i.posthog.com`) | +| `integrations` (GA, Plausible, Fathom, …) | `analytics.scripts` / `analytics.vercel` | one `scripts[]` entry per provider (`{ src, strategy, attributes }`); no first-class mapping beyond PostHog/Vercel | +| `contextual` (`["copy","chatgpt","claude",…]`) | **mostly free** | Copy-as-Markdown and Open-in-chat are default page actions; `mcp` needs `ai.mcp.enabled` + server output (report as a follow-up) | +| `redirects` | `redirects: [{ from, to }]` | static only — see below | +| `navigation.languages` | `i18n` | see i18n below | + +A minimal result is often just `defineConfig({ title, logo, theme: { accent } })`. + +## Icons: FontAwesome → Lucide (required) + +Mintlify defaults to **FontAwesome**; Blume is **Lucide-only**. Convert every icon reference — frontmatter `icon`, nav-group `icon`, ``, `` — to the closest Lucide name. Discard Mintlify's `iconType` (solid/regular/brands) entirely. + +**Automate the frontmatter pass — don't hand-edit it.** `scripts/mintlify-codemod.mjs` (in this skill, zero-dependency) remaps every **frontmatter** `icon:` using the table below, drops brand/no-equivalent icons, and — in the same pass — drops/renames unsupported frontmatter keys (see [Frontmatter](#frontmatter)). It's deterministic and idempotent, and reports what it changed per file plus what it couldn't (unknown icons, OpenAPI-stub flags): + +```bash +# dry run first (report only), then apply: +node /scripts/mintlify-codemod.mjs +node /scripts/mintlify-codemod.mjs --write +``` + +The codemod touches **only frontmatter**. Icons in MDX **body** (``, ``, nav-group icons in `docs.json`) it does not see — convert those by hand using the same table. Common mappings: + +| FontAwesome | Lucide | | FontAwesome | Lucide | +| --- | --- | --- | --- | --- | +| `bolt` | `zap` | | `gear`/`cog` | `settings` | +| `circle-info`/`info` | `info` | | `wand-magic-sparkles`/`magic` | `sparkles` | +| `house` | `house` | | `magnifying-glass` | `search` | +| `gauge`/`gauge-high` | `gauge` | | `puzzle-piece` | `puzzle` | +| `envelope` | `mail` | | `file-lines` | `file-text` | +| `pen-to-square` | `square-pen` | | `trash-can` | `trash-2` | +| `xmark`/`times` | `x` | | `circle-check` | `circle-check` | +| `triangle-exclamation` | `triangle-alert` | | `circle-exclamation` | `circle-alert` | +| `arrow-right-from-bracket` | `log-out` | | `right-to-bracket` | `log-in` | +| `location-dot`/`map-marker` | `map-pin` | | `comments` | `messages-square` | +| `cube` | `box` | | `cubes`/`boxes` | `boxes` | +| `layer-group` | `layers` | | `diagram-project`/`sitemap` | `workflow`/`network` | +| `chart-line` | `chart-line` | | `chart-simple`/`chart-column` | `chart-column` | +| `flask` | `flask-conical` | | `robot` | `bot` | +| `screwdriver-wrench`/`toolbox` | `wrench` | | `circle-question`/`question` | `circle-help` | +| `life-ring` | `life-buoy` | | `shield-halved` | `shield` | +| `rocket`/`book`/`book-open`/`code`/`terminal`/`key`/`lock`/`user`/`users`/`database`/`server`/`cloud`/`bell`/`calendar`/`star`/`heart`/`tag`/`folder`/`globe`/`link`/`download`/`upload`/`check`/`copy`/`play`/`filter` | _(same name — verify)_ | + +**Rules:** verify each Lucide name exists at [lucide.dev/icons](https://lucide.dev/icons) before writing it. **Brand icons** (`fa6-brands:*` — github, discord, x, slack, linkedin…) mostly have **no** Lucide equivalent: for GitHub use the `github` config (renders the header repo link); for other socials, drop the icon and report it (or add via a Footer override after `blume eject`). Where no Lucide counterpart exists, **drop the icon and report it** — an unknown icon name is a build error. + +## Navigation: `docs.json` `navigation` → filesystem + tabs + +Mintlify's `navigation` object (`tabs`/`anchors`/`dropdowns`/`products`/`versions`/`languages`/`groups`/`pages`) is fully config-declared. **Prefer restructuring content into folders**, not porting the config verbatim: + +- **`groups`** (`{ group, pages: [...] }`) → a folder per group. The `group` name → the folder's humanized name or a `meta.ts` `title`. Nested groups → nested folders. `expanded: false` → `meta.ts` `collapsed: true` (inverted). `tag` → the folder/page `sidebar.badge`. **Folder metadata is a `meta.ts` module** (`export default defineMeta({ title, icon, order, collapsed, pages })`), a TypeScript file — **not** JSON. Blume does not read a `meta.json`, so any folder-level config you carry over from the source (or hand-write to preserve a group's label/order/collapse) must be authored as `meta.ts`. (Render mode — flat/group/page — is **not** a `meta.ts` field; it's the global `navigation.sidebar.display` in `blume.config.ts`.) +- **Config-only nested groups don't exist on disk — you must materialize them, or they flatten silently.** A nested `{ group, pages }` almost never has a matching subfolder: its pages sit **flat in the parent directory** (e.g. `platform/analytics/getting-started.mdx`, `…/quick-reference.mdx`) and the grouping lives **only** in the `docs.json` `pages` array. If you leave the files where they are, filesystem-derived nav sees one flat folder and the inner group vanishes — Mintlify's `Analytics → Reference → {…}` becomes a flat `Analytics → {…}`. To preserve it you must **either** move those pages into a real subfolder (`platform/analytics/reference/`, with a `meta.ts` for the label/`collapsed`), **or** declare the shape in an explicit `navigation.sidebar`. Walk **every** `pages` array recursively and treat any nested `group` object as a folder-move to plan, not files already in place. When inventorying the nav (workflow step 2), record the config nesting depth separately from the on-disk depth — they diverge exactly here. +- **This is the canonical case for `navigation.sidebar` over folders.** Materializing a purely-presentational nested group as a subfolder changes URLs (`/platform/analytics/getting-started` → `/platform/analytics/reference/getting-started`) for no reason other than a visual grouping, forcing a `redirects` entry per page. When you want to keep the nesting **and** the URLs, an explicit `navigation.sidebar` group (`{ label, items }`) is the better trade — it nests the existing routes without moving any file. Pick per group; don't reflexively flatten. +- **`pages`** entries are page refs (paths without extension) → files at the corresponding path. An entry that's `"GET /path"` is an OpenAPI endpoint stub → **delete it** (Blume generates these; see OpenAPI). +- **`tabs`** (top-level `navigation.tabs`, e.g. `App` / `API` / `API reference`) → Blume's **header tabs** `navigation.tabs` (`{ label, path, icon? }`). **Keep them as tabs — do not flatten them into `navigation.sidebar` groups or sections.** Flattening is the easy translation error: it collapses the site's top-level structure into one global sidebar and loses the header tab bar entirely. A Mintlify top-level tab is a header tab; map it to one. Put each tab's pages in **one folder** and point the tab's `path` at it — the tab then scopes the sidebar automatically (under the tab's `path`, the sidebar shows only that folder). **Blume resolves the active tab by URL prefix** (the tab whose `path` is the longest prefix of the current route), so every page in a tab must live under that tab's single `path`. Mintlify tabs freely mix pages from any folder / arbitrary routes; Blume tabs scope by prefix, so a tab that pulls in routes from all over is **not portable as-is**. You have two choices, per tab: + - **Move the pages under one prefix** so they share the tab's `path` (a route change → add a `redirects` entry for each moved page). This preserves the exact tab grouping. + - **Accept the closest shape** — assign each shared/cross-cutting page to one tab's folder and link to it from the others — when moving routes isn't worth the churn. + + Call this trade out explicitly in the migration report; don't silently pick one. **The scoping is bidirectional:** on the root/landing route Blume _hides_ every tab folder and lists only untabbed top-level pages — so a Mintlify home whose single sidebar showed everything becomes a lean root list plus one sidebar per tab. That's automatic; don't try to exclude tab folders from the root by hand. + +- **`dropdowns`/`products`/`versions`** → `navigation.selectors` (`{ kind, label, items: [{ label, path, icon?, description?, tag? }] }`). Use `kind` `dropdown`/`product`/`version` accordingly. +- **`anchors` / `navigation.global.anchors` / `navbar.links`** (persistent header links — Blog, Changelog, Community, Contact/Support) → **`navigation.featured`** (`{ label, href, icon? }`). These pin to the **top of the sidebar, above every section, on every route** (not tab-scoped) — the right home for Mintlify's always-visible utility links. An external `href` opens in a new tab; an internal one (`/contact`) is build-time validated against your pages. Convert the FontAwesome `icon` to Lucide as usual. (This replaces the old "drop and report" for anchors.) The `navbar.primary` **CTA button** has no featured equivalent — see Dropped. +- **`languages`** → `i18n`, not a selector (see below). +- Only fall back to an explicit `navigation.sidebar` for a shape the filesystem genuinely can't express. + +This reshaping **changes URLs** — a page moved from `getting-started/quickstart` into the API tab's folder becomes `/api/…`, an `index` promotion drops a segment, etc. Record each old→new path and add a `redirects` entry for it (see below); otherwise every existing link and bookmark 404s. + +## Content & component transforms + +Rewrite each page's MDX: + +- **Callouts → directives** (directives are **MDX-only** — Mintlify content is already `.mdx`, so this just works; never rename a page to `.md`): ``→`:::note`, ``→`:::tip`, ``→`:::warning`, ``→`:::info`, ``→`:::success`, ``/``→`:::danger`. `` maps by type (`caution`→warning, `check`→success). A `title` attr → `:::type[Title]`. Drop `icon`/color props. +- **Accordions — container/item inversion!** Mintlify nests `` inside ``. Blume inverts: ``→`` (container), and each Mintlify ``→`` (item). +- **``/``** → `` (titled-fence tabs). +- **`` → ``.** Mintlify renders tabs **borderless** — a strip on a full-width rule with the content flowing beneath as prose — while Blume's `` defaults to a bordered box. Add `inline` to each `` to preserve Mintlify's appearance; every child `` is unchanged. Don't add `param` — Mintlify tabs switch in place and don't deep-link to the URL, so plain `inline` is the faithful mapping. +- **These pass through — Blume ships them natively:** ``/``, ``, ``, ``, ``, ``/``, ``, ``/``. Keep them as-is. +- **API fields → `TypeTable`.** Blume does **not** ship ``/``/``. Convert a cluster of fields into one `` (rows keyed by field name, each `{ type, required?, default?, description }`). For a fully spec'd API, prefer deleting the hand-written fields and using the [OpenAPI reference](#openapi) instead. +- **``** (a Mintlify changelog entry) has no component form → convert to a `type: changelog` page, or use the `github-releases` source. +- **Snippets are inlined, not imported.** Blume has no `/snippets` import mechanism. For each `import X from "/snippets/x.mdx"` + ``, inline the snippet's body (substituting `{prop}` placeholders), then delete the import and the `/snippets` file. Named string imports (`import { foo } from "/snippets/vars.mdx"`) → inline the value at each `{foo}`. + +## Frontmatter + +Mintlify page frontmatter → Blume's strict schema. **`scripts/mintlify-codemod.mjs --write` does the mechanical rows automatically** (rename, drop, icon-remap) and flags the judgment rows (`openapi`/`asyncapi`/`api`) for you — see [Icons](#icons-fontawesome--lucide-required) for the invocation. The table is both the mapping reference and a description of exactly what the codemod does: + +| Mintlify | Blume | Codemod | +| --- | --- | --- | +| `title` / `description` | pass through | — | +| `sidebarTitle` | `sidebar.label` | renames | +| `icon` | remapped to a Lucide name in place (top-level `icon` is valid Blume frontmatter; keep it there) | remaps | +| `tag` | `sidebar.badge` | renames | +| `canonical` | `seo.canonical` | renames | +| `og:image` | `seo.image` | renames | +| `hidden: true` | valid top-level in Blume — **kept as-is**; add `noindex: true` yourself if the page must also leave the search index | left (do by hand) | +| `openapi`/`asyncapi`/`api` | usually an endpoint stub → **delete the page** (Blume generates operation pages); else `type: api` | **flags** for review — never auto-deletes a page | +| `mode`, `public`, `rss`, `groups`, `keywords`, `hideApiMarker`, `hideFooterPagination`, `iconType` | **drop** (report) | drops | + +The codemod leaves the source key in place and reports a conflict rather than clobbering data when a rename target already exists (e.g. a page already has `sidebar.label`) or the value is too structured to move safely — resolve those by hand. Remove any duplicate H1 in the body — `title` renders the H1. (The codemod only edits frontmatter; it never touches the body.) + +## OpenAPI + +Top-level `openapi`, `api.openapi`, or a per-group/per-tab `openapi` → `openapi: { enabled: true, sources: [{ spec, label?, route? }] }`. A Mintlify `{ source, directory }` object: `directory` → the source's `route`. **Delete every per-endpoint stub page** (frontmatter `openapi: "GET /path"` or a `"GET /path"` nav entry) — Blume's native renderer generates one real page per operation. **Add a `navigation.tabs` entry pointing at the reference `route` yourself** (Mintlify's API tab maps to it); the reference does not create a header tab automatically. + +- **Vendor the spec.** Mintlify usually points at a spec **URL**. Copying that straight into `spec:` makes every build fetch it at build time — a single point of failure in CI/offline/behind a proxy, and a failed fetch silently drops the reference (leaving the tab pointing at a route that 404s). Prefer downloading it into the repo (`curl … -o openapi/.json`) and pointing `spec` at that local path. If you keep the URL, report the dependency and consider a `prebuild` refresh-with-fallback. +- **Fix endpoint links.** Blume operation routes are `//` (tag `Models` + id `listModels` → `/api-reference/models/listmodels`) — this differs from Mintlify's endpoint URLs, so **rewrite every inbound link to an operation**. `blume validate` resolves operation pages like any other route and flags the ones you miss. +- **Keep the "Introduction" page.** Mintlify commonly has a written intro/auth page in an "Introduction" group beside the "Endpoints" (openapi) group in the same tab. Keep it: a normal content page placed under the openapi `route` (e.g. `/api-reference/introduction.mdx`) merges into the reference tab's sidebar alongside the generated operations. Delete only the per-endpoint stubs, not the conceptual pages. + +## Assets + +Mintlify serves every top-level dir (e.g. `/images`) at the site root. Blume serves `public/` at the site root. **Move root asset dirs into `public/`** (`mv images public/images`) — every `/images/...` reference still resolves, unchanged. Move loose root files (`logo.png`, `favicon.png`) under `public/` too. + +## i18n + +`navigation.languages` (≥2) → `i18n: { defaultLocale, locales: [{ code, label }] }`. The `default: true` language → `defaultLocale`. Translated content already lives in ISO-code directories, which match Blume's `dir` parser — no file moves. Remove any language selector; language switching is handled by i18n. + +## Dropped — report these + +- **`navbar.primary`** (the prominent header **CTA button**, e.g. "Get Started"/"Sign Up") → no button equivalent; re-add via `navigation.tabs`, a `navigation.featured` link, or a Header override. (Plain `navbar.links` and `anchors` map to `navigation.featured` — see Navigation above, not here.) +- **`footer.socials`** → suggest the `github` config, or a Footer override. +- **Per-language banners** (`navigation.languages[].banner`) → no equivalent. +- **Dynamic redirects** (`:slug*`/`:id` params) → can't be static path-to-path; move to host rules (`_redirects`, `vercel.json`). +- **``** changelog components, `iconType`, `background.decoration`, `search.prompt`, `seo.metatags`, non-curated fonts. diff --git a/dot_agents/skills/blume-migrate/references/monorepo.md b/dot_agents/skills/blume-migrate/references/monorepo.md new file mode 100644 index 0000000..440f1e8 --- /dev/null +++ b/dot_agents/skills/blume-migrate/references/monorepo.md @@ -0,0 +1,224 @@ +# Migrating into a real repo (monorepos, pnpm, Vercel) + +The framework references (`mintlify.md`, etc.) cover translating _content and config_. This file covers the **host repo** the docs live in — the concerns that surface when the target isn't a bare docs folder but a pnpm/Turbo workspace deployed on Vercel. All six were real failures in a production migration; none are Blume bugs, they're integration steps. + +**Golden rule for this whole file: detect, then edit surgically, then say what you changed and why.** Every edit here touches a file the repo owns (`pnpm-workspace.yaml`, `vercel.json`, `package.json`, the lockfile). Never guess a path depth or a workspace name — read it out of the repo first. Where a step can't be fully automated (the Astro patch, the Vercel Root Directory setting), leave a copy-pasteable manual instruction rather than a half-applied change. + +--- + +## 1. Non-standard content layout → scope `content.root` + `include` + +`content.root` defaults to `"docs"`, and `blume` runs from the directory that holds `blume.config.ts` (in a monorepo, that's the docs _package_, e.g. `apps/docs/`). Many repos **don't** have a `docs/` subfolder — the content sits directly under the app dir in topic folders (`apps/docs/api/`, `apps/docs/getting-started/`). With the default root, Blume looks for `apps/docs/docs/` and finds nothing. + +**Detect by finding where `.md`/`.mdx` actually live** — never assume `docs/`. From the docs package dir: + +```bash +# top two path segments of every content file, deduped — your content folders +find . -path ./node_modules -prune -o \( -name '*.md' -o -name '*.mdx' \) -print \ + | sed 's|^\./||' | cut -d/ -f1 | sort -u +``` + +If that lists a real `docs` folder, keep the default. If it lists content folders directly (`api`, `getting-started`, `guides`), the content root is the package dir itself. + +**Set `content.root` to the package dir and scope with explicit `include` globs — do _not_ use `content.root: "."` alone.** A bare `.` root scans the whole package: `src/`, `public/`, `README.md`, config files, and (in a monorepo) anything a loose glob reaches. That's slow and pulls non-content Markdown into the site. Instead pin `root` and list the real content folders in `content.include`: + +```ts blume.config.ts +import { defineConfig } from "blume"; + +export default defineConfig({ + content: { + root: ".", // content sits directly under this package (apps/docs/), no docs/ subfolder + // include/exclude globs are relative to `content.root`. List the actual + // content folders so the scan never wanders into src/, public/, etc. + include: [ + "api/**/*.{md,mdx}", + "getting-started/**/*.{md,mdx}", + "guides/**/*.{md,mdx}", + ], + exclude: ["**/node_modules/**", "**/_*", "**/.*"], + }, +}); +``` + +Schema field names, exactly: **`content.root`** (string, relative to the project/cwd), **`content.include`** (array of globs, relative to `content.root`, default `["**/*.{md,mdx}"]`), **`content.exclude`** (array of globs, relative to `content.root`, default `["**/_*", "**/.*"]`). Singular `include`/`exclude`, both arrays. + +Report to the user: the detected content root, the folders you scoped `include` to, and anything Markdown you deliberately left out (a top-level `README.md`, a `CHANGELOG.md`) so they can confirm it isn't content. + +--- + +## 2. pnpm `minimumReleaseAge` blocks installing fresh Blume + +pnpm's supply-chain guard (`minimumReleaseAge`, often set to `1440` = 24h) refuses to install any package version published more recently than the window. Right after Blume publishes, that's **every** Blume release — so `pnpm add blume` / the workspace install fails or silently pins an older version. + +**Do not disable the policy globally** — that removes the guard for the whole dependency tree. Add **only `blume`** to the exclude list. + +**Detect** in `pnpm-workspace.yaml` (pnpm 10+, the primary location) and, for older setups, `.npmrc`: + +```bash +grep -rn "minimumReleaseAge\|minimum-release-age" pnpm-workspace.yaml .npmrc 2>/dev/null +``` + +**Fix — `pnpm-workspace.yaml`** (surgical add; create the key if the policy is set but no exclude exists): + +```yaml +minimumReleaseAge: 1440 +minimumReleaseAgeExclude: + - blume +``` + +**Fix — `.npmrc`** form (if the policy lives there instead): + +```ini +minimum-release-age=1440 +minimum-release-age-exclude[]=blume +``` + +Report: "Added `blume` to `minimumReleaseAgeExclude` so the just-published version installs; the release-age guard still applies to everything else." + +--- + +## 3. Frozen lockfile — regenerate and commit `pnpm-lock.yaml` in the same change + +CI and Vercel install with `--frozen-lockfile` (pnpm's default in CI): if `package.json` and `pnpm-lock.yaml` disagree by even one dependency, the install **fails immediately** — before any build step runs. A migration always edits dependencies (add `blume`, drop the old framework), so the lockfile is guaranteed stale. + +**After every dependency edit, regenerate the lockfile and stage it with the manifest:** + +```bash +pnpm install # NOT --frozen-lockfile — this rewrites pnpm-lock.yaml +git add package.json apps/docs/package.json pnpm-lock.yaml +``` + +Rules: + +- Run `pnpm install` (plain) from the **workspace root**, not the docs package, so the single root lockfile updates. +- The lockfile change belongs in the **same commit** as the `package.json` change. A commit that edits deps without the matching lockfile is a broken build for anyone who pulls it. +- Verify locally the way CI will: `pnpm install --frozen-lockfile` should succeed with no diff. If it errors "lockfile not up to date," you forgot the plain install. + +--- + +## 4. Vercel monorepo recipe (root-aware install + build) + +A plain `blume build` works locally, but Vercel in a workspace needs three things aligned: the install must run at the **workspace root** (so pnpm resolves the whole graph under a frozen lockfile), the build must run in the **docs package**, and Vercel must be pointed at the built `dist/`. `blume build` emits a static site to `dist/` **relative to where it runs** — so building in `apps/docs/` produces `apps/docs/dist/`. + +This is a **copyable template**, not prose. Three pieces: + +**a) Docs package `apps/docs/package.json`** — the standard Blume scripts: + +```json +{ + "scripts": { + "dev": "blume dev", + "build": "blume build", + "preview": "blume preview" + }, + "dependencies": { + "blume": "^1" + } +} +``` + +**b) `apps/docs/vercel.json`** — root-aware install, local build, `dist` output: + +```json +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "framework": null, + "installCommand": "cd ../.. && pnpm install --frozen-lockfile", + "buildCommand": "pnpm run build", + "outputDirectory": "dist" +} +``` + +**c) The one setting `vercel.json` can't hold — set it in the Vercel project (dashboard → Settings → General, or `vercel` CLI):** + +- **Root Directory** = `apps/docs`. This makes install/build/output paths resolve from the docs package, which is what the `vercel.json` above assumes. +- **Node version** = 22 or newer (Blume requires it). Or pin it in the docs package: `"engines": { "node": ">=22" }`. + +How the pieces fit, with Root Directory = `apps/docs`: + +- `installCommand` does `cd ../..` to reach the **workspace root** and runs a frozen install of the whole graph. **Adjust `../..` to the app's actual depth** — an app at `packages/web/docs/` needs `cd ../../..`. Read the path; don't assume two levels. +- `buildCommand` runs in `apps/docs/` and invokes `blume build` (via the package's `build` script) → emits `apps/docs/dist/`. +- `outputDirectory: "dist"` is relative to the Root Directory (`apps/docs`), so it points at `apps/docs/dist/`. +- `framework: null` stops Vercel from auto-detecting Astro and overriding your build/output with its Astro preset (which expects a different output path). Blume's static output is plain files — Vercel just serves the folder. + +If the repo uses **Turborepo**, you can instead build through the root pipeline — `"buildCommand": "cd ../.. && pnpm turbo build --filter=docs"` — for remote-cache reuse. Keep `outputDirectory: "dist"` and Root Directory `apps/docs`. + +Report every piece you wrote and the two dashboard settings the user must set by hand (Root Directory, Node version) — those can't be committed. + +**Redirect caveat on this deploy path:** a static build emits `vercel.json` redirect rules into `dist/`, but Vercel's **git-integration** builds read `vercel.json` only from the project's Root Directory — the copy inside `dist/` is honored only when the dist folder is deployed directly via the Vercel CLI. On the §4 setup, `blume.config.ts` redirects still work (Blume also emits per-route meta-refresh pages), but they're soft redirects, not real 3xx. If real 3xx responses matter (SEO for a large moved site), copy the generated redirect rules from `dist/vercel.json` after a build into the committed `apps/docs/vercel.json`'s `redirects` array, and note they must be re-synced when `redirects` change. (Most migrations are fine with the soft fallback — say which you chose.) + +--- + +## 5. Astro/Vite version mismatch → pnpm patch (manual) + +Blume pins **`astro ^7`**. If the workspace forces a specific **Vite** version — a root `pnpm.overrides` / `resolutions` entry, or a `vite` in the workspace catalog — that pinned Vite can diverge from the version Astro 7 expects, and Astro's internal build behavior mismatches. The symptom is a **build-time crash inside Astro/Vite** (a Rollup/Vite internal error, a missing-export or hook-signature error deep in `astro`/`vite` during `blume build`) that doesn't reproduce in a clean, override-free project. + +**Detect the risk factor** before it bites: + +```bash +grep -rn "\"vite\"\|vite@\| vite:" pnpm-workspace.yaml package.json 2>/dev/null | grep -i "override\|resolution\|catalog\|vite" +``` + +Blume is adding early version validation separately, so a future release will flag this at startup. Until then, **recognize the symptom and apply a pinned patch** — pnpm's `patch` workflow writes a committed diff that pnpm reapplies on every install (survives CI and frozen installs): + +```bash +# 1. Open the offending version in an editable temp dir (use the exact version +# pnpm resolved — check `pnpm why astro`): +pnpm patch astro@7.0.6 + +# 2. Edit files in the printed temp path to reconcile the Astro/Vite interface +# (the exact edit depends on the mismatch; the crash's stack trace names the +# file and call site). Then commit the patch: +pnpm patch-commit '' +``` + +`patch-commit` writes `patches/astro@7.0.6.patch` and registers it under `patchedDependencies` in `pnpm-workspace.yaml` (pnpm 10+) or root `package.json` (`pnpm.patchedDependencies` on pnpm 9): + +```yaml +# pnpm-workspace.yaml +patchedDependencies: + astro@7.0.6: patches/astro@7.0.6.patch +``` + +Commit **both** `patches/astro@7.0.6.patch` and the `patchedDependencies` entry, then re-run `pnpm install` and `blume build`. + +This is a **manual step — do not fabricate the patch contents.** Leave the user this exact recipe plus the crash's stack trace, and tell them: the cleaner long-term fix is to relax the workspace's Vite pin so Astro 7 resolves its own compatible Vite, and drop the patch once Blume ships version validation. Don't fail silently — if a build crashes inside Astro/Vite and a Vite override exists, name this as the likely cause. + +--- + +## 6. Ultracite / oxfmt formatting → oxfmt patch (ship the bundled patch) + +If the repo uses (or the user wants to adopt) **[Ultracite](https://www.ultracite.ai)** for formatting — an `ultracite check` / `ultracite fix` script, an `ultracite` dev dep, or oxlint/oxfmt in the toolchain — it will format the migrated `.md`/`.mdx` **and break Blume's `:::` directives.** Ultracite's formatter is **oxfmt**, and under `proseWrap` oxfmt joins the opening/closing `:::` fence line into the surrounding prose, which invalidates the directive (`:::note` … `:::` callouts, tabs, steps — the exact syntax you convert callouts _into_ in step 5). Blume's own repo hits this and pins a patched oxfmt; a migrated repo needs the same patch or every directive silently degrades to literal text on the next `ultracite fix`. + +The fix is a committed **pnpm patch** (`patches/oxfmt@0.55.0.patch`), shipped with this skill at `assets/oxfmt@0.55.0.patch`. Unlike the Astro/Vite patch, this one is a **known, deterministic diff** — copy it in, don't regenerate it: + +```bash +# 1. Copy the shipped patch into the target repo's patches/ dir (keep the exact filename): +mkdir -p patches +cp "/assets/oxfmt@0.55.0.patch" patches/oxfmt@0.55.0.patch +``` + +Then register it under `patchedDependencies` — `pnpm-workspace.yaml` on pnpm 10+, or root `package.json` (`pnpm.patchedDependencies`) on pnpm 9: + +```yaml +# pnpm-workspace.yaml +patchedDependencies: + oxfmt@0.55.0: patches/oxfmt@0.55.0.patch +``` + +Commit **both** the patch file and the `patchedDependencies` entry, then re-run `pnpm install`. + +- **The patch is pinned to `oxfmt@0.55.0`** (the version Ultracite 7.8.x resolves). pnpm requires an exact version match — if `pnpm why oxfmt` reports a different version, the patch won't apply. Bump the key to the resolved version (the hunk is a one-line prose-wrap guard and usually still applies cleanly); if it doesn't, tell the user and fall back to keeping directive-heavy files out of the formatter's globs. +- **Not on pnpm?** The patch mechanism is pnpm-specific. For npm/yarn, either pin oxfmt and apply the diff with `patch-package`, or exclude `.md`/`.mdx` from Ultracite formatting so it never touches the directives — report whichever you chose. + +--- + +## Checklist for a workspace migration + +- [ ] Located real content folders (not assumed `docs/`); set `content.root` + scoped `content.include`. +- [ ] `minimumReleaseAge` present? Added `blume` to `minimumReleaseAgeExclude` only. +- [ ] Ran plain `pnpm install`; committed `pnpm-lock.yaml` with the `package.json` change; verified `pnpm install --frozen-lockfile` is clean. +- [ ] Wrote `apps/docs/vercel.json` + package scripts; told the user to set Root Directory + Node 22 in the Vercel project. +- [ ] Checked for a workspace Vite override; if the build crashes inside Astro/Vite, gave the pnpm-patch recipe. +- [ ] Uses Ultracite/oxfmt? Shipped `patches/oxfmt@0.55.0.patch` + registered it under `patchedDependencies` so formatting doesn't mangle `:::` directives. +- [ ] Reported every repo-specific edit and every manual step left to the user. diff --git a/dot_agents/skills/blume-migrate/references/nextra.md b/dot_agents/skills/blume-migrate/references/nextra.md new file mode 100644 index 0000000..089a95c --- /dev/null +++ b/dot_agents/skills/blume-migrate/references/nextra.md @@ -0,0 +1,76 @@ +# Nextra → Blume + +Nextra (on Next.js) declares navigation and per-page labels in `_meta` files — and crucially, **a folder's title and its pages' sidebar labels live in the _parent_ `_meta`**. Reconciling that cross-file inheritance is the main task. Nextra 4 was a near-rewrite, so **fingerprint the generation first** — it decides where config lives, where content lives, and what the components are called. + +## Detect & fingerprint the generation + +- **`_meta.{js,mjs,cjs,ts,jsx,tsx,json}`** files — the strongest fingerprint (v4 also has a single-file `_meta.global.*` variant). +- **v2/v3 (Pages Router):** content in `pages/`, `_meta.json` (v2) or `_meta.{js,ts}` (v3), a `theme.config.{js,jsx,ts,tsx}`, components from `nextra-theme-docs` (v2) or `nextra/components` (v3). +- **v4 (App Router):** **no `theme.config`** — config lives as component props in `app/layout.{jsx,tsx}` (``, ``, ``, `