Files
secondsky c1afc6db8b refactor: Flatten plugin structure to fix skill discovery (v3.2.0)
BREAKING CHANGE: All plugin paths changed from nested to flat structure

Problem:
- Only 11 out of 169 skills appeared in Claude Code's system prompt
- v3.1.0 updated marketplace.json but didn't migrate directory structure
- Mismatch: marketplace expected `./plugins/skill-name` but files were at
  `./plugins/category/skills/skill-name`

Solution:
- Moved all 169 skills from `plugins/*/skills/*` to `plugins/*` (flat)
- Removed 66 empty category directories (api, cloudflare, testing, etc.)
- Updated marketplace.json with correct flat paths (all 169 entries)
- Updated scripts to work with flat structure:
  - generate-marketplace.sh: removed nested loop logic
  - sync-plugins.sh: simplified to single loop
  - Added flatten-plugin-structure.sh migration tool

Migration Details:
- Used git mv to preserve history for all 169 skills
- Handled name collisions via temporary directories
- Validated: 0 errors, 169 skills successfully migrated

Results:
- ✅ All 169 skills at `plugins/*/` level
- ✅ marketplace.json: 169 valid entries
- ✅ No nested skills/ directories remain
- ✅ Scripts updated and tested

This completes the migration started in v3.1.0 (commit 677abf8) and
resolves skill discovery issues.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-24 02:03:18 +01:00

4.1 KiB

TanStack Start (React) Skill — RC Ready

Full-stack React framework built on TanStack Router with server functions, selective SSR, prerendering, and first-class Cloudflare Workers support. Use this skill for migrations from Next.js, greenfield Start apps, or when you need type-safe server functions plus flexible rendering modes.

Auto-Trigger Keywords

  • "TanStack Start", "Start RC", "React full-stack", "file-based routing"
  • "selective SSR", "SPA mode", "static prerender", "server functions"
  • "Cloudflare Workers", "Start on Workers", "edge SSR", "router + server"

Current Status (2025-12-09)

  • Latest RC: v1.139.12 (2025-11-29)
  • GA: not announced yet; safe for pilots/POCs with monitoring.
  • Track: TanStack Router releases + Start guides for breaking changes.

What You Get

  • References:
    • references/quickstart-and-layout.md — CLI, project map, entrypoints
    • references/rendering-modes.md — SSR/data-only/CSR, SPA mode, prerender, hydration playbook
    • references/server-functions-and-middleware.md — server functions, routes, middleware, static functions
    • references/cloudflare-hosting-and-env.md — Workers setup, bindings, env vars, Tailwind v4
    • references/execution-and-auth.md — execution model, environment functions, auth/data/observability
    • references/routing-and-data-loading.md — file/code routes, params/search typing, loaders/actions, not-found
    • references/navigation-and-preloading.md — link options, preloading, route masking, blockers, scroll restoration
    • references/devtools-and-llm-support.md — router devtools, ESLint rules, LLM-oriented metadata
  • Script: scripts/bootstrap-cloudflare-start.sh <app-name> scaffolds a Start + Workers project and generates binding types.

Quick Start (Cloudflare)

./scripts/bootstrap-cloudflare-start.sh my-start-app
cd my-start-app
npm run dev

Core Patterns (updated)

// app/routes/index.tsx
import { createFileRoute, redirect } from '@tanstack/react-router'
import { getGreeting } from '@/server/greeting'

export const Route = createFileRoute('/')({
  ssr: 'data-only', // stream data, render on client
  loader: async () => {
    const greeting = await getGreeting()
    if (!greeting) throw redirect({ to: '/login' })
    return { greeting }
  },
  component: () => {
    const { greeting } = Route.useLoaderData()
    return <h1 className="text-2xl font-semibold">{greeting}</h1>
  },
})
// app/server/greeting.ts
import { createServerFn } from '@tanstack/react-start'

export const getGreeting = createServerFn({ method: 'GET' }).handler(async () => {
  return `Welcome back at ${new Date().toISOString()}`
})
  • Add validateSearch on routes to keep search params typed.
  • Use <Link preload="intent"> for hover/focus preloading; call router.preloadRoute for critical nav.
  • Enable <RouterDevtools /> during dev and @tanstack/eslint-plugin-router for property-order safety.

Migrate from Next.js (fast path)

  • Keep file-based routes; move pages into app/routes/ and convert hooks to Route.useLoaderData().
  • Replace getServerSideProps with route loaders; replace API routes with server routes or server functions.
  • Toggle SSR per route (ssr: true | false | 'data-only') to match previous rendering behavior.
  • Use @cloudflare/vite-plugin + Wrangler instead of next.config.js when targeting Workers.

Troubleshooting Cheats

  • Hydration mismatch: move non-deterministic values to loaders or use ssr: 'data-only'.
  • 404 on API routes: ensure server.handlers are defined and file path matches route path.
  • Cloudflare env undefined: confirm cloudflare({ viteEnvironment: { name: 'ssr' } }) is first plugin and bindings are declared in wrangler.jsonc.
  • Streaming stalls: avoid mixing Response.json and streaming in the same handler; prefer return toStreamResponse(...) from adapters.

Verify Before Shipping

  • Run npm run build && npm run preview locally; then npm run deploy against a staging Worker.
  • Check ONE_PAGE_CHECKLIST.md and keep wrangler types regenerated after binding changes.