feat: whyrating - initial project from turbostarter boilerplate
This commit is contained in:
208
docs/tcs/TCS-QUICKSTART.md
Normal file
208
docs/tcs/TCS-QUICKSTART.md
Normal file
@@ -0,0 +1,208 @@
|
||||
# TCS Quick Start
|
||||
|
||||
> Build a compiler in hours, not weeks.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Node.js 18+
|
||||
- pnpm
|
||||
- Anthropic API key
|
||||
|
||||
## 1. Define Your Triangle (5 min)
|
||||
|
||||
Pick 3 representations of the same semantic content:
|
||||
|
||||
```
|
||||
Example: Form Builder
|
||||
├── Visual: Form UI mockup/description
|
||||
├── Structured: JSON Schema
|
||||
└── Compact: FormDSL
|
||||
```
|
||||
|
||||
## 2. Write Initial Spec (15 min)
|
||||
|
||||
```markdown
|
||||
# FormDSL Spec v0.1
|
||||
|
||||
## Syntax
|
||||
form "name"
|
||||
? field_id "Label" type [validation]
|
||||
! message "text"
|
||||
-> next_field
|
||||
end
|
||||
|
||||
## Types
|
||||
Tx = text, Em = email, Ph = phone, Nm = number
|
||||
|
||||
## Example
|
||||
form "contact"
|
||||
? name "Your name" Tx [required]
|
||||
? email "Email" Em [required]
|
||||
! thanks "Thank you!"
|
||||
end
|
||||
```
|
||||
|
||||
## 3. Create Sample Generator (10 min)
|
||||
|
||||
```typescript
|
||||
// tcs/generate.ts
|
||||
import Anthropic from '@anthropic-ai/sdk';
|
||||
|
||||
const client = new Anthropic();
|
||||
|
||||
export async function generateTriangle(prompt: string) {
|
||||
const [visual, structured, dsl] = await Promise.all([
|
||||
client.messages.create({
|
||||
model: 'claude-sonnet-4-20250514',
|
||||
max_tokens: 2000,
|
||||
messages: [{ role: 'user', content: `Describe this form visually: ${prompt}` }]
|
||||
}),
|
||||
client.messages.create({
|
||||
model: 'claude-sonnet-4-20250514',
|
||||
max_tokens: 2000,
|
||||
messages: [{ role: 'user', content: `Generate JSON Schema for: ${prompt}` }]
|
||||
}),
|
||||
client.messages.create({
|
||||
model: 'claude-sonnet-4-20250514',
|
||||
max_tokens: 2000,
|
||||
system: `You write FormDSL. Spec: [paste spec here]`,
|
||||
messages: [{ role: 'user', content: prompt }]
|
||||
}),
|
||||
]);
|
||||
|
||||
return { visual, structured, dsl };
|
||||
}
|
||||
```
|
||||
|
||||
## 4. Create Triangulator (10 min)
|
||||
|
||||
```typescript
|
||||
// tcs/triangulate.ts
|
||||
export async function triangulate(sample: Triangle) {
|
||||
const response = await client.messages.create({
|
||||
model: 'claude-sonnet-4-20250514',
|
||||
max_tokens: 2000,
|
||||
messages: [{
|
||||
role: 'user',
|
||||
content: `Compare these 3 representations. Are they semantically equivalent?
|
||||
|
||||
VISUAL:
|
||||
${sample.visual}
|
||||
|
||||
JSON SCHEMA:
|
||||
${JSON.stringify(sample.structured, null, 2)}
|
||||
|
||||
DSL:
|
||||
${sample.dsl}
|
||||
|
||||
Return JSON: { equivalent: boolean, disagreements: string[], specGaps: string[] }`
|
||||
}]
|
||||
});
|
||||
|
||||
return JSON.parse(response.content[0].text);
|
||||
}
|
||||
```
|
||||
|
||||
## 5. Run TCS Loop (iterate)
|
||||
|
||||
```typescript
|
||||
// tcs/iterate.ts
|
||||
async function tcsIteration(spec: string, sampleCount = 10) {
|
||||
// Generate samples
|
||||
const prompts = await generatePrompts(sampleCount);
|
||||
const samples = await Promise.all(prompts.map(generateTriangle));
|
||||
|
||||
// Triangulate
|
||||
const results = await Promise.all(samples.map(triangulate));
|
||||
|
||||
// Collect findings
|
||||
const findings = results
|
||||
.filter(r => !r.equivalent)
|
||||
.flatMap(r => r.specGaps);
|
||||
|
||||
// Evolve spec if needed
|
||||
if (findings.length > 0) {
|
||||
spec = await evolveSpec(spec, findings);
|
||||
}
|
||||
|
||||
// Build/update compiler
|
||||
await buildCompiler(spec);
|
||||
|
||||
// Test
|
||||
const testResults = await runTests(samples.filter((_, i) => results[i].equivalent));
|
||||
|
||||
return { spec, passRate: testResults.passRate, findings };
|
||||
}
|
||||
|
||||
// Main loop
|
||||
let spec = readFileSync('spec.md', 'utf-8');
|
||||
while (true) {
|
||||
const result = await tcsIteration(spec);
|
||||
spec = result.spec;
|
||||
|
||||
if (result.passRate === 1 && result.findings.length === 0) {
|
||||
console.log('Converged!');
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. Output
|
||||
|
||||
After convergence:
|
||||
|
||||
```
|
||||
output/
|
||||
├── spec-final.md # Evolved specification
|
||||
├── compiler/
|
||||
│ ├── scanner.ts # Tokenizer
|
||||
│ ├── parser.ts # AST builder
|
||||
│ └── emitter.ts # Code generator
|
||||
└── tests/
|
||||
└── samples.json # Validated test cases
|
||||
```
|
||||
|
||||
## Tips
|
||||
|
||||
1. **Start small** - 5-10 samples per iteration
|
||||
2. **Parallelize** - Generate/triangulate concurrently
|
||||
3. **Trust disagreements** - They reveal real spec gaps
|
||||
4. **Checkpoint often** - Save state every iteration
|
||||
5. **Let it converge** - Don't manually fix, let TCS find issues
|
||||
|
||||
## Example Run
|
||||
|
||||
```bash
|
||||
$ pnpm tcs:run --spec form-dsl.md --target 50
|
||||
|
||||
Iteration 1: 10 samples, 3 disagreements, 2 spec changes
|
||||
Iteration 2: 10 samples, 1 disagreement, 1 spec change
|
||||
Iteration 3: 10 samples, 0 disagreements, 0 spec changes
|
||||
Iteration 4: 20 samples, 0 disagreements, 0 spec changes
|
||||
✓ Converged at 50 samples, 4 iterations
|
||||
```
|
||||
|
||||
## Quality Rules (Non-Negotiable)
|
||||
|
||||
1. **No bypassing** - Errors reveal spec gaps, don't suppress them
|
||||
2. **No patches** - Generalize fixes, don't add special cases
|
||||
3. **Production code** - Strict TypeScript, no TODOs, no debug code
|
||||
4. **Redesign when stuck** - Bad architecture can't be patched
|
||||
|
||||
```typescript
|
||||
// ❌ WRONG
|
||||
try { parse(input) } catch { return null } // Bypassing
|
||||
if (sample === 'special') { ... } // Isolated patch
|
||||
const x: any = ... // Not production
|
||||
|
||||
// ✅ RIGHT
|
||||
const result = parse(input) // Let it fail, fix root cause
|
||||
handleAllCases(sample) // Generalized solution
|
||||
const x: ParsedNode = ... // Strict types
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Read [TCS-AI-METHODOLOGY.md](./TCS-AI-METHODOLOGY.md) for full theory
|
||||
- Read [TCS-CLAUDE-CODE.md](./TCS-CLAUDE-CODE.md) for Claude Code execution
|
||||
- Check [TCS-ROADMAP.md](./TCS-ROADMAP.md) for liquid package applications
|
||||
Reference in New Issue
Block a user