@hexidecibel/companion 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/task-parser.test.js +29 -29
- package/dist/__tests__/task-parser.test.js.map +1 -1
- package/dist/anthropic-usage.d.ts.map +1 -1
- package/dist/anthropic-usage.js +1 -1
- package/dist/anthropic-usage.js.map +1 -1
- package/dist/cert-generator.d.ts.map +1 -1
- package/dist/cert-generator.js +4 -21
- package/dist/cert-generator.js.map +1 -1
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +413 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -7
- package/dist/config.js.map +1 -1
- package/dist/escalation.d.ts +51 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +198 -0
- package/dist/escalation.js.map +1 -0
- package/dist/index.js +67 -30
- package/dist/index.js.map +1 -1
- package/dist/input-injector.d.ts.map +1 -1
- package/dist/input-injector.js +9 -5
- package/dist/input-injector.js.map +1 -1
- package/dist/notification-store.d.ts +35 -0
- package/dist/notification-store.d.ts.map +1 -0
- package/dist/notification-store.js +272 -0
- package/dist/notification-store.js.map +1 -0
- package/dist/parser.d.ts +15 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +106 -61
- package/dist/parser.js.map +1 -1
- package/dist/push.d.ts +18 -26
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +90 -184
- package/dist/push.js.map +1 -1
- package/dist/qr-server.d.ts.map +1 -1
- package/dist/qr-server.js +159 -139
- package/dist/qr-server.js.map +1 -1
- package/dist/rules-engine.d.ts +20 -0
- package/dist/rules-engine.d.ts.map +1 -0
- package/dist/rules-engine.js +71 -0
- package/dist/rules-engine.js.map +1 -0
- package/dist/scaffold/claude-commands.d.ts +18 -0
- package/dist/scaffold/claude-commands.d.ts.map +1 -0
- package/dist/scaffold/claude-commands.js +352 -0
- package/dist/scaffold/claude-commands.js.map +1 -0
- package/dist/scaffold/generator.d.ts.map +1 -1
- package/dist/scaffold/generator.js +26 -1
- package/dist/scaffold/generator.js.map +1 -1
- package/dist/scaffold/scorer.d.ts +19 -0
- package/dist/scaffold/scorer.d.ts.map +1 -0
- package/dist/scaffold/scorer.js +92 -0
- package/dist/scaffold/scorer.js.map +1 -0
- package/dist/scaffold/templates/go-cli.d.ts +3 -0
- package/dist/scaffold/templates/go-cli.d.ts.map +1 -0
- package/dist/scaffold/templates/go-cli.js +249 -0
- package/dist/scaffold/templates/go-cli.js.map +1 -0
- package/dist/scaffold/templates/index.d.ts.map +1 -1
- package/dist/scaffold/templates/index.js +8 -2
- package/dist/scaffold/templates/index.js.map +1 -1
- package/dist/scaffold/templates/nextjs.d.ts +3 -0
- package/dist/scaffold/templates/nextjs.d.ts.map +1 -0
- package/dist/scaffold/templates/nextjs.js +336 -0
- package/dist/scaffold/templates/nextjs.js.map +1 -0
- package/dist/scaffold/templates/node-express.d.ts.map +1 -1
- package/dist/scaffold/templates/node-express.js +170 -157
- package/dist/scaffold/templates/node-express.js.map +1 -1
- package/dist/scaffold/templates/python-fastapi.d.ts.map +1 -1
- package/dist/scaffold/templates/python-fastapi.js +234 -221
- package/dist/scaffold/templates/python-fastapi.js.map +1 -1
- package/dist/scaffold/templates/react-mui-website.d.ts.map +1 -1
- package/dist/scaffold/templates/react-mui-website.js +337 -324
- package/dist/scaffold/templates/react-mui-website.js.map +1 -1
- package/dist/scaffold/templates/react-typescript.d.ts.map +1 -1
- package/dist/scaffold/templates/react-typescript.js +219 -206
- package/dist/scaffold/templates/react-typescript.js.map +1 -1
- package/dist/scaffold/templates/typescript-library.d.ts +3 -0
- package/dist/scaffold/templates/typescript-library.d.ts.map +1 -0
- package/dist/scaffold/templates/typescript-library.js +241 -0
- package/dist/scaffold/templates/typescript-library.js.map +1 -0
- package/dist/scaffold/types.d.ts +7 -0
- package/dist/scaffold/types.d.ts.map +1 -1
- package/dist/subagent-watcher.d.ts.map +1 -1
- package/dist/subagent-watcher.js +3 -3
- package/dist/subagent-watcher.js.map +1 -1
- package/dist/tmux-manager.d.ts +37 -0
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +165 -5
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-config.d.ts.map +1 -1
- package/dist/tool-config.js +2 -2
- package/dist/tool-config.js.map +1 -1
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -1
- package/dist/watcher.d.ts +7 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +118 -9
- package/dist/watcher.js.map +1 -1
- package/dist/websocket.d.ts +16 -2
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +758 -117
- package/dist/websocket.js.map +1 -1
- package/dist/work-group-manager.d.ts +69 -0
- package/dist/work-group-manager.d.ts.map +1 -0
- package/dist/work-group-manager.js +610 -0
- package/dist/work-group-manager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generates CLAUDE.md content and .claude/commands/*.md files
|
|
4
|
+
* tailored to each project template.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateClaudeMd = generateClaudeMd;
|
|
8
|
+
exports.generateCommandFiles = generateCommandFiles;
|
|
9
|
+
const STACK_CONFIGS = {
|
|
10
|
+
'react-typescript': {
|
|
11
|
+
upCmd: 'npm run dev',
|
|
12
|
+
downCmd: 'Stop the Vite dev server (Ctrl+C in terminal)',
|
|
13
|
+
testCmd: 'npm test',
|
|
14
|
+
buildCmd: 'npm run build',
|
|
15
|
+
installCmd: 'npm install',
|
|
16
|
+
devServer: 'Vite dev server',
|
|
17
|
+
language: 'TypeScript',
|
|
18
|
+
},
|
|
19
|
+
'react-mui-website': {
|
|
20
|
+
upCmd: 'npm run dev',
|
|
21
|
+
downCmd: 'Stop the Vite dev server (Ctrl+C in terminal)',
|
|
22
|
+
testCmd: 'npm test',
|
|
23
|
+
buildCmd: 'npm run build',
|
|
24
|
+
installCmd: 'npm install',
|
|
25
|
+
devServer: 'Vite dev server',
|
|
26
|
+
language: 'TypeScript',
|
|
27
|
+
},
|
|
28
|
+
'node-express': {
|
|
29
|
+
upCmd: 'npm run dev',
|
|
30
|
+
downCmd: 'Stop the Express server (Ctrl+C in terminal)',
|
|
31
|
+
testCmd: 'npm test',
|
|
32
|
+
buildCmd: 'npm run build',
|
|
33
|
+
installCmd: 'npm install',
|
|
34
|
+
devServer: 'Express dev server with ts-node',
|
|
35
|
+
language: 'TypeScript',
|
|
36
|
+
},
|
|
37
|
+
'python-fastapi': {
|
|
38
|
+
upCmd: 'uvicorn main:app --reload',
|
|
39
|
+
downCmd: 'Stop the uvicorn server (Ctrl+C in terminal)',
|
|
40
|
+
testCmd: 'pytest',
|
|
41
|
+
installCmd: 'pip install -r requirements.txt',
|
|
42
|
+
devServer: 'uvicorn with hot reload',
|
|
43
|
+
language: 'Python',
|
|
44
|
+
},
|
|
45
|
+
nextjs: {
|
|
46
|
+
upCmd: 'npm run dev',
|
|
47
|
+
downCmd: 'Stop the Next.js dev server (Ctrl+C in terminal)',
|
|
48
|
+
testCmd: 'npm test',
|
|
49
|
+
buildCmd: 'npm run build',
|
|
50
|
+
installCmd: 'npm install',
|
|
51
|
+
devServer: 'Next.js dev server',
|
|
52
|
+
language: 'TypeScript',
|
|
53
|
+
},
|
|
54
|
+
'go-cli': {
|
|
55
|
+
upCmd: 'go run .',
|
|
56
|
+
downCmd: 'N/A (CLI exits after execution)',
|
|
57
|
+
testCmd: 'go test ./...',
|
|
58
|
+
buildCmd: 'go build -o bin/',
|
|
59
|
+
language: 'Go',
|
|
60
|
+
},
|
|
61
|
+
'typescript-library': {
|
|
62
|
+
upCmd: 'npm run build -- --watch',
|
|
63
|
+
downCmd: 'Stop the TypeScript watcher (Ctrl+C in terminal)',
|
|
64
|
+
testCmd: 'npm test',
|
|
65
|
+
buildCmd: 'npm run build',
|
|
66
|
+
installCmd: 'npm install',
|
|
67
|
+
language: 'TypeScript',
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const DEFAULT_CONFIG = {
|
|
71
|
+
upCmd: 'npm run dev',
|
|
72
|
+
downCmd: 'Stop the dev server',
|
|
73
|
+
testCmd: 'npm test',
|
|
74
|
+
buildCmd: 'npm run build',
|
|
75
|
+
installCmd: 'npm install',
|
|
76
|
+
language: 'TypeScript',
|
|
77
|
+
};
|
|
78
|
+
function getStackConfig(templateId) {
|
|
79
|
+
return STACK_CONFIGS[templateId] || DEFAULT_CONFIG;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate CLAUDE.md content for a project.
|
|
83
|
+
*/
|
|
84
|
+
function generateClaudeMd(projectName, description, templateId) {
|
|
85
|
+
const config = getStackConfig(templateId);
|
|
86
|
+
const sections = [];
|
|
87
|
+
sections.push(`# ${projectName}`);
|
|
88
|
+
sections.push('');
|
|
89
|
+
sections.push(description);
|
|
90
|
+
sections.push('');
|
|
91
|
+
// Commands section
|
|
92
|
+
sections.push('## Commands');
|
|
93
|
+
sections.push('');
|
|
94
|
+
if (config.installCmd) {
|
|
95
|
+
sections.push(`- Install: \`${config.installCmd}\``);
|
|
96
|
+
}
|
|
97
|
+
if (config.buildCmd) {
|
|
98
|
+
sections.push(`- Build: \`${config.buildCmd}\``);
|
|
99
|
+
}
|
|
100
|
+
sections.push(`- Dev: \`${config.upCmd}\``);
|
|
101
|
+
sections.push(`- Test: \`${config.testCmd}\``);
|
|
102
|
+
sections.push('');
|
|
103
|
+
// Code style
|
|
104
|
+
sections.push('## Code Style');
|
|
105
|
+
sections.push('');
|
|
106
|
+
sections.push(`- Language: ${config.language}`);
|
|
107
|
+
sections.push('- Use functional patterns where possible');
|
|
108
|
+
sections.push('- Keep functions small and focused');
|
|
109
|
+
sections.push('- Prefer explicit types over `any`');
|
|
110
|
+
sections.push('');
|
|
111
|
+
// Workflow
|
|
112
|
+
sections.push('## Workflow');
|
|
113
|
+
sections.push('');
|
|
114
|
+
sections.push('Use the slash commands for common tasks:');
|
|
115
|
+
sections.push('- `/up` — Start dev server');
|
|
116
|
+
sections.push('- `/down` — Stop services');
|
|
117
|
+
sections.push('- `/test` — Run test suite');
|
|
118
|
+
sections.push('- `/todo` — Capture a task');
|
|
119
|
+
sections.push('- `/plan` — Plan implementation from todo');
|
|
120
|
+
sections.push('- `/work` — Implement planned items');
|
|
121
|
+
sections.push('');
|
|
122
|
+
return sections.join('\n');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generate .claude/commands/*.md files for a project.
|
|
126
|
+
*/
|
|
127
|
+
function generateCommandFiles(projectName, templateId) {
|
|
128
|
+
const config = getStackConfig(templateId);
|
|
129
|
+
const commands = [
|
|
130
|
+
{
|
|
131
|
+
name: 'up',
|
|
132
|
+
path: '.claude/commands/up.md',
|
|
133
|
+
content: generateUpCommand(projectName, config),
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'down',
|
|
137
|
+
path: '.claude/commands/down.md',
|
|
138
|
+
content: generateDownCommand(projectName, config),
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'todo',
|
|
142
|
+
path: '.claude/commands/todo.md',
|
|
143
|
+
content: generateTodoCommand(projectName),
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: 'plan',
|
|
147
|
+
path: '.claude/commands/plan.md',
|
|
148
|
+
content: generatePlanCommand(projectName),
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: 'work',
|
|
152
|
+
path: '.claude/commands/work.md',
|
|
153
|
+
content: generateWorkCommand(projectName, config),
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'test',
|
|
157
|
+
path: '.claude/commands/test.md',
|
|
158
|
+
content: generateTestCommand(projectName, config),
|
|
159
|
+
},
|
|
160
|
+
];
|
|
161
|
+
return commands;
|
|
162
|
+
}
|
|
163
|
+
function generateUpCommand(projectName, config) {
|
|
164
|
+
const lines = [];
|
|
165
|
+
lines.push(`# Start ${projectName}`);
|
|
166
|
+
lines.push('');
|
|
167
|
+
lines.push(`Start the development server/services for ${projectName}.`);
|
|
168
|
+
lines.push('');
|
|
169
|
+
lines.push('## Steps');
|
|
170
|
+
lines.push('');
|
|
171
|
+
if (config.installCmd) {
|
|
172
|
+
lines.push(`1. Install dependencies if needed: \`${config.installCmd}\``);
|
|
173
|
+
lines.push(`2. Start: \`${config.upCmd}\``);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
lines.push(`1. Start: \`${config.upCmd}\``);
|
|
177
|
+
}
|
|
178
|
+
lines.push('');
|
|
179
|
+
return lines.join('\n');
|
|
180
|
+
}
|
|
181
|
+
function generateDownCommand(projectName, config) {
|
|
182
|
+
const lines = [];
|
|
183
|
+
lines.push(`# Stop ${projectName}`);
|
|
184
|
+
lines.push('');
|
|
185
|
+
lines.push(`Stop running services for ${projectName}.`);
|
|
186
|
+
lines.push('');
|
|
187
|
+
lines.push('## Steps');
|
|
188
|
+
lines.push('');
|
|
189
|
+
lines.push(`1. ${config.downCmd}`);
|
|
190
|
+
lines.push('');
|
|
191
|
+
return lines.join('\n');
|
|
192
|
+
}
|
|
193
|
+
function generateTodoCommand(_projectName) {
|
|
194
|
+
return `# Add Todo Item
|
|
195
|
+
|
|
196
|
+
Quickly capture ideas and tasks to todo.md.
|
|
197
|
+
|
|
198
|
+
## Usage
|
|
199
|
+
|
|
200
|
+
\`\`\`
|
|
201
|
+
/todo <description>
|
|
202
|
+
\`\`\`
|
|
203
|
+
|
|
204
|
+
## Instructions
|
|
205
|
+
|
|
206
|
+
1. The item to add: \`$ARGUMENTS\`
|
|
207
|
+
|
|
208
|
+
2. Read or create todo.md
|
|
209
|
+
|
|
210
|
+
3. Add the item as a bullet point:
|
|
211
|
+
- Format: \`- <the text>\`
|
|
212
|
+
- Add under the appropriate section
|
|
213
|
+
|
|
214
|
+
4. Confirm what was added
|
|
215
|
+
|
|
216
|
+
## Notes
|
|
217
|
+
|
|
218
|
+
- This is for quick capture - don't overthink it
|
|
219
|
+
- Use \`/plan\` later to process these into detailed plans
|
|
220
|
+
- Use \`/work\` to implement from the plan
|
|
221
|
+
`;
|
|
222
|
+
}
|
|
223
|
+
function generatePlanCommand(_projectName) {
|
|
224
|
+
return `# Plan from Todo
|
|
225
|
+
|
|
226
|
+
Process todo.md items into detailed implementation plans.
|
|
227
|
+
|
|
228
|
+
## Instructions
|
|
229
|
+
|
|
230
|
+
1. Read todo.md
|
|
231
|
+
|
|
232
|
+
2. Read plan.md (if exists)
|
|
233
|
+
|
|
234
|
+
3. For each unplanned item in todo.md:
|
|
235
|
+
- Ask clarifying questions if needed
|
|
236
|
+
- Understand the scope and requirements
|
|
237
|
+
- Identify which files need changes
|
|
238
|
+
|
|
239
|
+
4. Write detailed plan to plan.md:
|
|
240
|
+
\`\`\`markdown
|
|
241
|
+
# Implementation Plan
|
|
242
|
+
|
|
243
|
+
## Item: <title>
|
|
244
|
+
**Status:** planned | in-progress | done
|
|
245
|
+
|
|
246
|
+
### Requirements
|
|
247
|
+
- <bullet points>
|
|
248
|
+
|
|
249
|
+
### Files to Modify
|
|
250
|
+
- \`path/to/file\` - <what changes>
|
|
251
|
+
|
|
252
|
+
### Implementation Steps
|
|
253
|
+
1. <step>
|
|
254
|
+
2. <step>
|
|
255
|
+
|
|
256
|
+
### Tests Needed
|
|
257
|
+
- <test case>
|
|
258
|
+
\`\`\`
|
|
259
|
+
|
|
260
|
+
5. Mark items as planned in todo.md
|
|
261
|
+
|
|
262
|
+
## Rules
|
|
263
|
+
|
|
264
|
+
- NO CODING in this phase
|
|
265
|
+
- Ask questions if anything is unclear
|
|
266
|
+
- Keep plans focused and actionable
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
function generateWorkCommand(_projectName, config) {
|
|
270
|
+
const typeCheck = config.language === 'Python'
|
|
271
|
+
? 'mypy .'
|
|
272
|
+
: config.language === 'Go'
|
|
273
|
+
? 'go vet ./...'
|
|
274
|
+
: 'npx tsc --noEmit';
|
|
275
|
+
return `# Work on Planned Items
|
|
276
|
+
|
|
277
|
+
Implement items from plan.md using TDD. If multiple items can be parallelized, spawn worker sessions.
|
|
278
|
+
|
|
279
|
+
## Instructions
|
|
280
|
+
|
|
281
|
+
1. Read plan.md
|
|
282
|
+
|
|
283
|
+
2. Find ALL items with **Status: planned** or **Status: in-progress**
|
|
284
|
+
|
|
285
|
+
3. **If 2+ planned items exist, analyze parallelism:**
|
|
286
|
+
|
|
287
|
+
a. For each item, look at the "Files to Modify" section
|
|
288
|
+
b. Compare file lists between items \u2014 items with NO shared files can run in parallel
|
|
289
|
+
c. Group items into:
|
|
290
|
+
- **Parallel group**: Items with non-overlapping files
|
|
291
|
+
- **Sequential group**: Items that share files with another item
|
|
292
|
+
|
|
293
|
+
d. Present the analysis via AskUserQuestion:
|
|
294
|
+
- Show which items can be parallelized and why
|
|
295
|
+
- Show which items must be sequential and why (list shared files)
|
|
296
|
+
- Options: [Parallelize] [Work sequentially] [Let me choose]
|
|
297
|
+
|
|
298
|
+
e. If user approves parallelization, spawn worker sessions by calling the
|
|
299
|
+
companion daemon API with a \\\`spawn_work_group\\\` message via curl to
|
|
300
|
+
\\\`http://localhost:9877\\\`. Include the token from config, a group name,
|
|
301
|
+
the current session ID, the parent directory, and a workers array with
|
|
302
|
+
each worker's taskSlug, taskDescription, planSection, and files list.
|
|
303
|
+
|
|
304
|
+
f. After spawning, continue working on sequential items (if any) using TDD
|
|
305
|
+
g. When done with sequential items, check worker status and report
|
|
306
|
+
|
|
307
|
+
4. **If only 1 item, or user chose sequential:** Follow TDD for each item:
|
|
308
|
+
|
|
309
|
+
a. **Write tests first**
|
|
310
|
+
- Create/update test files based on "Tests Needed" section
|
|
311
|
+
- Run tests - they should fail (red)
|
|
312
|
+
|
|
313
|
+
b. **Implement the feature**
|
|
314
|
+
- Follow the "Implementation Steps" from plan
|
|
315
|
+
- Make tests pass (green)
|
|
316
|
+
- Run type check: \`${typeCheck}\`
|
|
317
|
+
|
|
318
|
+
c. **Refactor if needed**
|
|
319
|
+
- Clean up code while keeping tests green
|
|
320
|
+
|
|
321
|
+
d. **Commit**
|
|
322
|
+
- Commit with descriptive message
|
|
323
|
+
- Update plan.md status to "done"
|
|
324
|
+
|
|
325
|
+
5. When ALL items are done (including parallel workers), merge if needed by
|
|
326
|
+
calling the daemon API with a \\\`merge_work_group\\\` message.
|
|
327
|
+
|
|
328
|
+
## Rules
|
|
329
|
+
|
|
330
|
+
- Tests first, always
|
|
331
|
+
- Commit after each completed item
|
|
332
|
+
- NO push without explicit approval
|
|
333
|
+
- Ask if stuck or unclear
|
|
334
|
+
- When spawning workers, each worker handles ONE plan item only
|
|
335
|
+
- Workers should not modify files outside their scope
|
|
336
|
+
`;
|
|
337
|
+
}
|
|
338
|
+
function generateTestCommand(_projectName, config) {
|
|
339
|
+
const lines = [];
|
|
340
|
+
lines.push(`# Run Tests`);
|
|
341
|
+
lines.push('');
|
|
342
|
+
lines.push('Run the project test suite.');
|
|
343
|
+
lines.push('');
|
|
344
|
+
lines.push('## Steps');
|
|
345
|
+
lines.push('');
|
|
346
|
+
lines.push(`1. Run: \`${config.testCmd}\``);
|
|
347
|
+
lines.push('2. Report results: pass/fail count, any failures');
|
|
348
|
+
lines.push('3. If tests fail, show the failure details');
|
|
349
|
+
lines.push('');
|
|
350
|
+
return lines.join('\n');
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=claude-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-commands.js","sourceRoot":"","sources":["../../src/scaffold/claude-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/scaffold/generator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/scaffold/generator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiB1E,KAAK,gBAAgB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAoB7D,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAuKzB;AAGD,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBvE"}
|
|
@@ -41,6 +41,7 @@ const os = __importStar(require("os"));
|
|
|
41
41
|
const child_process_1 = require("child_process");
|
|
42
42
|
const util_1 = require("util");
|
|
43
43
|
const templates_1 = require("./templates");
|
|
44
|
+
const claude_commands_1 = require("./claude-commands");
|
|
44
45
|
// Expand ~ to home directory
|
|
45
46
|
function expandPath(p) {
|
|
46
47
|
if (p.startsWith('~/')) {
|
|
@@ -109,6 +110,24 @@ async function scaffoldProject(config, onProgress) {
|
|
|
109
110
|
await fs.writeFile(filePath, fileContent, 'utf-8');
|
|
110
111
|
filesCreated.push(file.path);
|
|
111
112
|
}
|
|
113
|
+
// Step 2b: Generate CLAUDE.md and .claude/commands/
|
|
114
|
+
onProgress?.({
|
|
115
|
+
step: 'Generating CLAUDE.md and commands',
|
|
116
|
+
progress: 58,
|
|
117
|
+
complete: false,
|
|
118
|
+
});
|
|
119
|
+
const claudeMdContent = (0, claude_commands_1.generateClaudeMd)(variables.projectName, config.description || `A ${template.name} project`, config.stackId);
|
|
120
|
+
const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
|
|
121
|
+
await fs.writeFile(claudeMdPath, claudeMdContent, 'utf-8');
|
|
122
|
+
filesCreated.push('CLAUDE.md');
|
|
123
|
+
const commandFiles = (0, claude_commands_1.generateCommandFiles)(variables.projectName, config.stackId);
|
|
124
|
+
const commandsDir = path.join(projectPath, '.claude', 'commands');
|
|
125
|
+
await fs.mkdir(commandsDir, { recursive: true });
|
|
126
|
+
for (const cmd of commandFiles) {
|
|
127
|
+
const cmdPath = path.join(projectPath, cmd.path);
|
|
128
|
+
await fs.writeFile(cmdPath, cmd.content, 'utf-8');
|
|
129
|
+
filesCreated.push(cmd.path);
|
|
130
|
+
}
|
|
112
131
|
// Step 3: Initialize git if requested
|
|
113
132
|
if (config.options.initGit) {
|
|
114
133
|
onProgress?.({
|
|
@@ -200,7 +219,13 @@ async function previewScaffold(config) {
|
|
|
200
219
|
return { error: `Unknown template: ${config.stackId}` };
|
|
201
220
|
}
|
|
202
221
|
const projectPath = path.join(expandPath(config.location), toValidName(config.name));
|
|
203
|
-
const files = template.files.map(f => f.path);
|
|
222
|
+
const files = template.files.map((f) => f.path);
|
|
223
|
+
// Include CLAUDE.md and commands in preview
|
|
224
|
+
files.push('CLAUDE.md');
|
|
225
|
+
const commandFiles = (0, claude_commands_1.generateCommandFiles)(toValidName(config.name), config.stackId);
|
|
226
|
+
for (const cmd of commandFiles) {
|
|
227
|
+
files.push(cmd.path);
|
|
228
|
+
}
|
|
204
229
|
return { files, projectPath };
|
|
205
230
|
}
|
|
206
231
|
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/scaffold/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/scaffold/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { StackTemplate } from './types';
|
|
2
|
+
export interface ScoredTemplate {
|
|
3
|
+
templateId: string;
|
|
4
|
+
score: number;
|
|
5
|
+
matchedKeywords: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Score templates against a user description.
|
|
9
|
+
* Pure function, no I/O.
|
|
10
|
+
*
|
|
11
|
+
* Weights:
|
|
12
|
+
* - useCases substring match: 5
|
|
13
|
+
* - primaryKeywords token match: 3
|
|
14
|
+
* - typeSignals synonym match: 2
|
|
15
|
+
* - secondaryKeywords token match: 1
|
|
16
|
+
* - tags token match: 0.5
|
|
17
|
+
*/
|
|
18
|
+
export declare function scoreTemplates(templates: StackTemplate[], description: string): ScoredTemplate[];
|
|
19
|
+
//# sourceMappingURL=scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../src/scaffold/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAwEhG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scoreTemplates = scoreTemplates;
|
|
4
|
+
/**
|
|
5
|
+
* Tokenize a description into lowercase words and bigrams.
|
|
6
|
+
*/
|
|
7
|
+
function tokenize(text) {
|
|
8
|
+
const lower = text.toLowerCase();
|
|
9
|
+
const words = lower.match(/[a-z0-9]+/g) || [];
|
|
10
|
+
const tokens = new Set(words);
|
|
11
|
+
// Add bigrams (consecutive word pairs)
|
|
12
|
+
for (let i = 0; i < words.length - 1; i++) {
|
|
13
|
+
tokens.add(`${words[i]} ${words[i + 1]}`);
|
|
14
|
+
}
|
|
15
|
+
return tokens;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Score templates against a user description.
|
|
19
|
+
* Pure function, no I/O.
|
|
20
|
+
*
|
|
21
|
+
* Weights:
|
|
22
|
+
* - useCases substring match: 5
|
|
23
|
+
* - primaryKeywords token match: 3
|
|
24
|
+
* - typeSignals synonym match: 2
|
|
25
|
+
* - secondaryKeywords token match: 1
|
|
26
|
+
* - tags token match: 0.5
|
|
27
|
+
*/
|
|
28
|
+
function scoreTemplates(templates, description) {
|
|
29
|
+
if (!description || !description.trim()) {
|
|
30
|
+
return templates.map((t) => ({ templateId: t.id, score: 0, matchedKeywords: [] }));
|
|
31
|
+
}
|
|
32
|
+
const descLower = description.toLowerCase();
|
|
33
|
+
const tokens = tokenize(description);
|
|
34
|
+
const rawScores = [];
|
|
35
|
+
let maxRaw = 0;
|
|
36
|
+
for (const template of templates) {
|
|
37
|
+
let raw = 0;
|
|
38
|
+
const matched = [];
|
|
39
|
+
const scoring = template.scoring;
|
|
40
|
+
if (scoring) {
|
|
41
|
+
// useCases: substring match against full description (weight 5)
|
|
42
|
+
for (const useCase of scoring.useCases) {
|
|
43
|
+
if (descLower.includes(useCase.toLowerCase())) {
|
|
44
|
+
raw += 5;
|
|
45
|
+
matched.push(useCase);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// primaryKeywords: token match (weight 3)
|
|
49
|
+
for (const kw of scoring.primaryKeywords) {
|
|
50
|
+
if (tokens.has(kw.toLowerCase())) {
|
|
51
|
+
raw += 3;
|
|
52
|
+
matched.push(kw);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// typeSignals: synonym match (weight 2 * signal value)
|
|
56
|
+
for (const [signal, value] of Object.entries(scoring.typeSignals)) {
|
|
57
|
+
if (tokens.has(signal.toLowerCase())) {
|
|
58
|
+
raw += 2 * value;
|
|
59
|
+
matched.push(signal);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// secondaryKeywords: token match (weight 1)
|
|
63
|
+
for (const kw of scoring.secondaryKeywords) {
|
|
64
|
+
if (tokens.has(kw.toLowerCase())) {
|
|
65
|
+
raw += 1;
|
|
66
|
+
matched.push(kw);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// tags: token match (weight 0.5)
|
|
71
|
+
for (const tag of template.tags) {
|
|
72
|
+
if (tokens.has(tag.toLowerCase())) {
|
|
73
|
+
raw += 0.5;
|
|
74
|
+
if (!matched.includes(tag)) {
|
|
75
|
+
matched.push(tag);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (raw > maxRaw)
|
|
80
|
+
maxRaw = raw;
|
|
81
|
+
rawScores.push({ templateId: template.id, raw, matchedKeywords: matched });
|
|
82
|
+
}
|
|
83
|
+
// Normalize to 0.0–1.0
|
|
84
|
+
return rawScores
|
|
85
|
+
.map((s) => ({
|
|
86
|
+
templateId: s.templateId,
|
|
87
|
+
score: maxRaw > 0 ? Math.round((s.raw / maxRaw) * 100) / 100 : 0,
|
|
88
|
+
matchedKeywords: s.matchedKeywords,
|
|
89
|
+
}))
|
|
90
|
+
.sort((a, b) => b.score - a.score || a.templateId.localeCompare(b.templateId));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../src/scaffold/scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-cli.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/go-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,aAAa,EAAE,aAoP3B,CAAC"}
|