4.2 KiB
4.2 KiB
Prism — TypeScript Specialist LoRA
Adapter codename: prism
Agent: build-ts
Base model: Qwen/Qwen3.5-27B
Objective
Teach the model TypeScript-idiomatic code generation aligned with the build-ts agent's system prompt. The adapter should internalize:
- Strict TypeScript — no
anywithout justification constoverlet, nevervar- Named exports,
typeoverinterface(unless extending) - Package manager detection (bun/pnpm/npm)
- Framework-aware patterns (Next.js, Vite, Astro, SvelteKit, Remix, Bun)
- tsc → lint → test verification cycle
Data Sources
Session extraction (~200–350 examples)
Classify from opencode build sessions by:
- File paths:
.ts,.tsx,.js,.jsx,package.json,tsconfig.json - Bash commands:
npm,pnpm,bun,npx,tsc,vitest,jest,biome - Error patterns:
TS2,TS7,error TS, type errors - Framework config files in context:
next.config.*,vite.config.*
Git repo mining (~150–250 examples)
Target repos:
~/.config/opencode/plugins/— opencode plugins (TypeScript)madcat-os/sere-kit— UI component librarymadcat-os/visor— HUD/display system- Any
package.json-rooted repos in madcat-os org
Extract patterns:
- React component implementations (hooks, state management)
- Plugin/tool development (opencode tools, MCP servers)
- Type-safe API integrations
- Build configuration (tsconfig, vite, next)
Synthetic (~50–100 examples)
- Generic type patterns and constraints
- Discriminated unions and type narrowing
- Zod schema → TypeScript type inference
- React Server Components vs Client Components
- Edge runtime constraints (Cloudflare Workers, Vercel Edge)
Example Format
{
"messages": [
{
"role": "system",
"content": "<build-ts agent system prompt>"
},
{
"role": "user",
"content": "Add a new visor widget component for displaying memory graph connections"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "glob",
"arguments": {"pattern": "src/components/**/*.tsx"}
}
}
]
},
{
"role": "tool",
"content": "<file list>"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "read",
"arguments": {"filePath": "src/components/widgets/LogWidget.tsx"}
}
}
]
},
{
"role": "tool",
"content": "<existing widget pattern>"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "write",
"arguments": {
"filePath": "src/components/widgets/GraphWidget.tsx",
"content": "<new component following existing patterns>"
}
}
}
]
},
{
"role": "tool",
"content": "File written successfully"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"type": "function",
"function": {
"name": "bash",
"arguments": {"command": "npx tsc --noEmit"}
}
}
]
},
{
"role": "tool",
"content": "<type check passes>"
},
{
"role": "assistant",
"content": "GraphWidget created. Follows LogWidget's pattern — named export, typed props, const component. Type check clean."
}
]
}
Evaluation Criteria
- Generated TypeScript passes
tsc --noEmitwith strict mode - No
anytypes without explicit justification - Correct import/export patterns (named exports)
- Framework-appropriate patterns (detects Next.js vs Vite etc.)
- Package manager awareness (correct lockfile, correct run command)
- Tool call sequence: explore → read → implement → type-check
- React patterns: proper hook usage, no stale closures
Training Config Overrides
MAX_SEQ = 8192
LR = 5e-5
Estimated Size
- 400–600 examples total (largest dataset — most session history)
- ~3M tokens
- Training time: ~3 hrs on H100
- Adapter size: ~305 MB