From jaan-to
Wires backend and frontend scaffold outputs into a runnable project with directory tree, configs, and entry points. Use after generating scaffolds via upstream tools.
npx claudepluginhub parhumm/jaan-to --plugin jaan-toThis skill uses the workspace's default tool permissions.
> Wire backend + frontend scaffold outputs into a runnable project with proper directory tree, configs, and entry points.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Wire backend + frontend scaffold outputs into a runnable project with proper directory tree, configs, and entry points.
$JAAN_CONTEXT_DIR/tech.md - Tech stack context (CRITICAL -- determines framework, monorepo tool, package manager)
#current-stack, #frameworks, #constraints, #patterns$JAAN_CONTEXT_DIR/config.md - Project configuration$JAAN_TEMPLATES_DIR/jaan-to-dev-project-assemble.template.md - Output template (assembly log)$JAAN_LEARN_DIR/jaan-to-dev-project-assemble.learn.md - Past lessons (loaded in Pre-Execution)${CLAUDE_PLUGIN_ROOT}/docs/extending/language-protocol.md - Language resolution protocol${CLAUDE_PLUGIN_ROOT}/docs/research/69-dev-scaffold-project-assembly-automation.md - Research: monorepo patterns, entry points, provider wiring, config inheritance, .env validationUpstream Artifacts: $ARGUMENTS
Accepts 2-3 file paths or descriptions plus optional target directory:
/jaan-to:backend-scaffold output: $JAAN_OUTPUTS_DIR/backend/scaffold/{id}-{slug}/)/jaan-to:frontend-scaffold output: $JAAN_OUTPUTS_DIR/frontend/scaffold/{id}-{slug}/)/jaan-to:frontend-design output, optional)MANDATORY — Read and execute ALL steps in: ${CLAUDE_PLUGIN_ROOT}/docs/extending/pre-execution-protocol.md
Skill name: dev-project-assemble
Execute: Step 0 (Init Guard) → A (Load Lessons) → B (Resolve Template) → C (Offer Template Seeding)
Also read context files if available:
$JAAN_CONTEXT_DIR/tech.md -- Know the tech stack for framework-specific assembly$JAAN_CONTEXT_DIR/config.md -- Project configuration${CLAUDE_PLUGIN_ROOT}/docs/research/69-dev-scaffold-project-assembly-automation.md -- Research reference for assembly patternsRead and apply language protocol: ${CLAUDE_PLUGIN_ROOT}/docs/extending/language-protocol.md
Override field for this skill: language_dev-project-assemble
Language exception: Generated code output (variable names, code blocks, schemas, SQL, API specs) is NOT affected by this setting and remains in the project's programming language.
ultrathink
Use extended reasoning for:
For each provided path:
backend-scaffold: Read all files in the scaffold folder:
{id}-{slug}.md -- Main doc (setup guide, architecture){id}-{slug}-routes.ts -- Route handlers{id}-{slug}-services.ts -- Service layer{id}-{slug}-schemas.ts -- Validation schemas{id}-{slug}-middleware.ts -- Auth + error handling{id}-{slug}-prisma.prisma -- ORM data model{id}-{slug}-config.ts -- Package.json + tsconfig content{id}-{slug}-readme.md -- Setup instructionsfrontend-scaffold: Read all files in the scaffold folder:
{id}-{slug}.md -- Main doc (architecture, component map){id}-{slug}-components.tsx -- React components{id}-{slug}-hooks.ts -- Typed API client hooks{id}-{slug}-types.ts -- TypeScript interfaces{id}-{slug}-pages.tsx -- Page layouts / routes{id}-{slug}-config.ts -- Package.json + tsconfig + tailwind config{id}-{slug}-readme.md -- Setup instructionsfrontend-design (optional): Read HTML preview files for visual reference.
Report which inputs found vs missing:
INPUT SUMMARY
-------------
Sources Found: {list}
Sources Missing: {list with fallback suggestions}
Backend Files: {count}
Frontend Files: {count}
Design Files: {count or "none"}
Entities: {extracted entity names from backend}
Components: {extracted component names from frontend}
Read $JAAN_CONTEXT_DIR/tech.md:
#current-stack (default: Fastify v5 + Node.js)#current-stack (default: React v19 + Next.js v15)#current-stack (default: PostgreSQL + Prisma)#current-stack (default: TailwindCSS v4)#patterns (auth, error handling, state management)Determine primary stack from tech.md:
| tech.md value | Backend | Frontend | Package Manager |
|---|---|---|---|
| Node.js / TypeScript | Fastify v5+ | Next.js v15+ | pnpm |
| PHP | Laravel 12 / Symfony 7 | Next.js v15+ (or Blade/Inertia) | composer + pnpm |
| Go | Chi / stdlib | Next.js v15+ | go mod + pnpm |
AskUserQuestion:
Based on selection, determine directory layout:
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "Directory Layout Templates" for monorepo and separate project directory trees.
Map bundled scaffold files to individual project files:
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "File Splitting Maps" for scaffold-to-project file mapping tables.
Present file tree:
FILE SPLIT PLAN
===============
BACKEND ({count} files)
-----------------------
{numbered list with source -> target mapping}
FRONTEND ({count} files)
------------------------
{numbered list with source -> target mapping}
GENERATED ENTRY POINTS ({count} files)
---------------------------------------
{numbered list}
CONFIG FILES ({count} files)
----------------------------
{numbered list}
TOTAL: {count} files to write
Detect required providers from scaffold dependencies:
Frontend providers (ordered by dependency):
next-auth or auth hooks detectednext-themes detectedQueryClientProvider + optional tRPCBackend plugins (ordered by registration):
Present wiring plan:
PROVIDER WIRING
===============
Frontend (providers.tsx):
1. {Provider} -- {reason}
2. {Provider} -- {reason}
...
Backend (app.ts plugin registration):
1. {Plugin} -- {reason}
2. {Plugin} -- {reason}
...
Use AskUserQuestion:
Present full summary:
ASSEMBLY PLAN SUMMARY
=====================
Project Structure: {monorepo / separate / single}
Target Directory: {path}
Package Manager: {pnpm / npm / yarn}
Backend Stack: {framework + DB + ORM}
Frontend Stack: {framework + styling + state}
FILES TO WRITE
--------------
Backend: {count} files
Frontend: {count} files
Entry Points: {count} files (generated)
Configs: {count} files (generated)
Total: {count} files
PROVIDERS
---------
Frontend: {list}
Backend: {list}
ENVIRONMENT VARIABLES
---------------------
{list of all .env variables with descriptions}
Do NOT proceed to Phase 2 without explicit approval.
Read each bundled backend scaffold file and split into individual project files:
Parse {id}-{slug}-routes.ts and split per resource:
{target}/src/routes/{resource}/index.ts -- Route handlerParse {id}-{slug}-schemas.ts and split per resource:
{target}/src/routes/{resource}/{resource}.schema.ts -- Zod schemas + inferred typesParse {id}-{slug}-services.ts and split per resource:
{target}/src/routes/{resource}/{resource}.service.ts -- Business logic with PrismaParse {id}-{slug}-middleware.ts and create:
{target}/src/plugins/auth.ts -- Auth plugin (fastify-plugin wrapped){target}/src/plugins/error-handler.ts -- Error handler (RFC 9457){target}/src/plugins/cors.ts -- CORS configuration (if not inline)Copy {id}-{slug}-prisma.prisma to:
{target}/prisma/schema.prisma{target}/prisma/seed.ts with placeholder seed dataCreate entry points that wire everything together:
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "Backend Entry Point Templates" for app.ts, server.ts, and env.ts code templates.
Read each bundled frontend scaffold file and split into individual project files:
Parse {id}-{slug}-components.tsx and split per component:
{target}/src/components/{level}/{ComponentName}.tsx'use client' directive only where neededParse {id}-{slug}-hooks.ts and create:
{target}/src/lib/api/hooks.ts -- TanStack Query hooks{target}/src/lib/api/query-client.ts -- Query client configurationParse {id}-{slug}-types.ts and create:
{target}/src/types/api.ts -- API response/request typespackages/types/src/index.tsParse {id}-{slug}-pages.tsx and split per route:
{target}/src/app/{route}/page.tsx{target}/src/app/{route}/layout.tsx (where needed){target}/src/app/{route}/loading.tsx (skeleton states)Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "Frontend Entry Point Templates" for layout, providers, page, global.css, and env.ts code templates.
package.jsontsconfig.jsontooling/typescript/, extended per appnext.config.tsbabel-plugin-react-compiler is in devDependencies when reactCompiler: true#current-stack — PHP/Go projects may have equivalent config-implied dependencies (see reference)Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "Build Plugin Detection" for multi-stack config-implied dependency detection.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "Config File Content Patterns" for .env.example, .gitignore, and monorepo-specific config content.
Condition: Only when backend-api-contract is in inputs AND $JAAN_CONTEXT_DIR/tech.md indicates Node.js/TypeScript stack.
src/app/reference/route.ts — Scalar API reference route:
import { ApiReference } from '@scalar/nextjs-api-reference';
const config = { url: '/api/openapi.json', theme: 'moon' };
export const GET = ApiReference(config);
src/app/api/openapi/route.ts — spec serving route:
import { NextResponse } from 'next/server';
import yaml from 'js-yaml';
import fs from 'fs';
import path from 'path';
export async function GET() {
const filePath = path.join(process.cwd(), 'specs/openapi.yaml');
const fileContent = fs.readFileSync(filePath, 'utf8');
const spec = yaml.load(fileContent);
return NextResponse.json(spec);
}
@scalar/nextjs-api-reference and js-yaml to package.json dependenciesReference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/openapi-integration-reference.mdsection "Scalar API Documentation".
Before preview, verify:
If any check fails, fix before preview.
Present complete file list with sizes and key content:
ASSEMBLY PREVIEW
================
{target}/
{full directory tree with file sizes}
Key Generated Files:
- src/app.ts: {brief description}
- src/app/layout.tsx: {brief description}
- src/app/providers.tsx: {providers listed}
- package.json: {dependency count}
- .env.example: {variable count}
Use AskUserQuestion:
If approved:
Confirm each batch:
Backend files written: {count} files Frontend files written: {count} files Config files written: {count} files
Write assembly log to $JAAN_OUTPUTS_DIR/dev/project-assemble/:
source "${CLAUDE_PLUGIN_ROOT}/scripts/lib/id-generator.sh"
SUBDOMAIN_DIR="$JAAN_OUTPUTS_DIR/dev/project-assemble"
mkdir -p "$SUBDOMAIN_DIR"
NEXT_ID=$(generate_next_id "$SUBDOMAIN_DIR")
slug="{project-name-slug}"
OUTPUT_FOLDER="${SUBDOMAIN_DIR}/${NEXT_ID}-${slug}"
Write {NEXT_ID}-{slug}.md with:
source "${CLAUDE_PLUGIN_ROOT}/scripts/lib/index-updater.sh"
add_to_index \
"$SUBDOMAIN_DIR/README.md" \
"$NEXT_ID" \
"${NEXT_ID}-${slug}" \
"{Project Title}" \
"{Executive summary -- 1-2 sentences}"
Confirm:
Assembly log written to:
$JAAN_OUTPUTS_DIR/dev/project-assemble/{NEXT_ID}-{slug}/{NEXT_ID}-{slug}.mdIndex updated:$JAAN_OUTPUTS_DIR/dev/project-assemble/README.md
Project assembled successfully!
Immediate Steps:
- Run
pnpm install(ornpm install) to install dependencies- Copy
.env.exampleto.env.localand fill in values- Run
pnpm db:generate && pnpm db:pushto set up database- Run
pnpm devto start developmentNext Skills in Pipeline:
- Run
/jaan-to:backend-service-implementto fill in service layer business logic- Run
/jaan-to:qa-test-generateto generate test suites- Run
/jaan-to:devops-infra-scaffoldto generate deployment configs
Use AskUserQuestion:
If "Learn from this": Run /jaan-to:learn-add dev-project-assemble "{feedback}"
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/dev-project-assemble-reference.mdsection "Multi-Stack Assembly Rules" for Node.js/TypeScript, PHP/Laravel, and Go stack-specific assembly patterns.
.js extensions in ESMany types, loose module resolutiontech.md detection$JAAN_OUTPUTS_DIR path