opencastle 0.24.1 → 0.26.0
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/cli/bootstrap.d.ts +8 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +358 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/bootstrap.test.d.ts +6 -0
- package/dist/cli/bootstrap.test.d.ts.map +1 -0
- package/dist/cli/bootstrap.test.js +196 -0
- package/dist/cli/bootstrap.test.js.map +1 -0
- package/dist/cli/detect.d.ts +6 -1
- package/dist/cli/detect.d.ts.map +1 -1
- package/dist/cli/detect.js +18 -0
- package/dist/cli/detect.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +21 -10
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/prompt.js +1 -1
- package/dist/cli/prompt.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/bootstrap.test.ts +286 -0
- package/src/cli/bootstrap.ts +472 -0
- package/src/cli/detect.ts +22 -1
- package/src/cli/init.ts +23 -13
- package/src/cli/prompt.ts +1 -1
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
- package/src/orchestrator/agents/team-lead.agent.md +4 -2
- package/src/orchestrator/customizations/README.md +3 -3
- package/src/orchestrator/customizations/agents/agent-registry.md +1 -1
- package/src/orchestrator/customizations/project/docs-structure.md +1 -1
- package/src/orchestrator/customizations/project/roadmap.md +1 -1
- package/src/orchestrator/customizations/project/tracker-config.md +1 -1
- package/src/orchestrator/customizations/project.instructions.md +2 -2
- package/src/orchestrator/customizations/stack/api-config.md +1 -1
- package/src/orchestrator/customizations/stack/cms-config.md +2 -2
- package/src/orchestrator/customizations/stack/data-pipeline-config.md +1 -1
- package/src/orchestrator/customizations/stack/database-config.md +2 -2
- package/src/orchestrator/customizations/stack/deployment-config.md +1 -1
- package/src/orchestrator/customizations/stack/notifications-config.md +1 -1
- package/src/orchestrator/customizations/stack/testing-config.md +1 -1
- package/src/orchestrator/instructions/general.instructions.md +2 -0
- package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +127 -132
- package/src/orchestrator/skills/agent-hooks/SKILL.md +7 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RepoInfo, StackConfig } from './types.js';
|
|
2
|
+
export interface BootstrapResult {
|
|
3
|
+
populated: string[];
|
|
4
|
+
removed: string[];
|
|
5
|
+
renamed: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function bootstrapCustomizations(projectRoot: string, repoInfo: RepoInfo, stack: StackConfig): Promise<BootstrapResult>;
|
|
8
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/cli/bootstrap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAybD,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,eAAe,CAAC,CAiB1B"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { readFile, writeFile, unlink, readdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
// ── Utilities ──────────────────────────────────────────────────
|
|
5
|
+
async function tryReadJson(p) {
|
|
6
|
+
try {
|
|
7
|
+
return JSON.parse(await readFile(p, 'utf8'));
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Replace the first empty table row within a named markdown section.
|
|
15
|
+
* Scopes the search from `sectionMarker` to the next `## ` heading.
|
|
16
|
+
*/
|
|
17
|
+
function fillTableSection(content, sectionMarker, emptyRow, rows) {
|
|
18
|
+
if (rows.length === 0)
|
|
19
|
+
return content;
|
|
20
|
+
const sIdx = content.indexOf(sectionMarker);
|
|
21
|
+
if (sIdx === -1)
|
|
22
|
+
return content;
|
|
23
|
+
const nextSectionIdx = content.indexOf('\n## ', sIdx + sectionMarker.length);
|
|
24
|
+
const end = nextSectionIdx === -1 ? content.length : nextSectionIdx;
|
|
25
|
+
const slice = content.slice(sIdx, end);
|
|
26
|
+
const needle = '\n' + emptyRow;
|
|
27
|
+
const needleIdx = slice.indexOf(needle);
|
|
28
|
+
if (needleIdx === -1)
|
|
29
|
+
return content;
|
|
30
|
+
const abs = sIdx + needleIdx + 1; // position of first char of emptyRow (skip \n)
|
|
31
|
+
return content.slice(0, abs) + rows.join('\n') + content.slice(abs + emptyRow.length);
|
|
32
|
+
}
|
|
33
|
+
function replaceMarker(content, marker, replacement) {
|
|
34
|
+
if (!content.includes(marker))
|
|
35
|
+
return content;
|
|
36
|
+
return content.replace(marker, replacement);
|
|
37
|
+
}
|
|
38
|
+
function filterConfigFiles(configFiles, patterns) {
|
|
39
|
+
if (!configFiles?.length)
|
|
40
|
+
return [];
|
|
41
|
+
return configFiles.filter(f => patterns.some(p => f === p || f.endsWith('/' + p) || f.includes(p)));
|
|
42
|
+
}
|
|
43
|
+
// ── Workspace scanning ─────────────────────────────────────────
|
|
44
|
+
async function scanWorkspace(projectRoot) {
|
|
45
|
+
const packages = [];
|
|
46
|
+
for (const dir of ['apps', 'packages', 'libs']) {
|
|
47
|
+
const dirPath = join(projectRoot, dir);
|
|
48
|
+
if (!existsSync(dirPath))
|
|
49
|
+
continue;
|
|
50
|
+
let entries = [];
|
|
51
|
+
try {
|
|
52
|
+
entries = await readdir(dirPath, { withFileTypes: true });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
for (const e of entries) {
|
|
58
|
+
if (!e.isDirectory())
|
|
59
|
+
continue;
|
|
60
|
+
const pkg = await tryReadJson(join(dirPath, e.name, 'package.json'));
|
|
61
|
+
packages.push({
|
|
62
|
+
path: `${dir}/${e.name}`,
|
|
63
|
+
name: pkg?.name ?? `${dir}/${e.name}`,
|
|
64
|
+
description: pkg?.description,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return packages;
|
|
69
|
+
}
|
|
70
|
+
// ── Builders ───────────────────────────────────────────────────
|
|
71
|
+
function buildStackRows(info) {
|
|
72
|
+
const rows = [];
|
|
73
|
+
const addList = (layer, values) => {
|
|
74
|
+
if (!values?.length)
|
|
75
|
+
return;
|
|
76
|
+
for (const v of values)
|
|
77
|
+
rows.push(`| ${layer} | ${v} | <!-- TODO: verify --> | |`);
|
|
78
|
+
};
|
|
79
|
+
if (info.language)
|
|
80
|
+
rows.push(`| Language | ${info.language} | | |`);
|
|
81
|
+
if (info.packageManager)
|
|
82
|
+
rows.push(`| Package Manager | ${info.packageManager} | | |`);
|
|
83
|
+
addList('Framework', info.frameworks);
|
|
84
|
+
addList('Database', info.databases);
|
|
85
|
+
addList('CMS', info.cms);
|
|
86
|
+
addList('Deployment', info.deployment);
|
|
87
|
+
addList('Testing', info.testing);
|
|
88
|
+
addList('CI/CD', info.cicd);
|
|
89
|
+
addList('Styling', info.styling);
|
|
90
|
+
addList('Auth', info.auth);
|
|
91
|
+
return rows;
|
|
92
|
+
}
|
|
93
|
+
function buildKeyCommandsBlock(pm, scripts) {
|
|
94
|
+
const commands = ['dev', 'build', 'test', 'lint', 'start']
|
|
95
|
+
.filter(k => scripts[k])
|
|
96
|
+
.map(k => `${pm} run ${k}`);
|
|
97
|
+
if (commands.length === 0)
|
|
98
|
+
return '';
|
|
99
|
+
return `**Package manager:** \`${pm}\`\n\n\`\`\`bash\n${commands.join('\n')}\n\`\`\``;
|
|
100
|
+
}
|
|
101
|
+
// ── Populators ─────────────────────────────────────────────────
|
|
102
|
+
async function populateProjectInstructions(opencastleDir, projectRoot, info, pkg, result) {
|
|
103
|
+
const filePath = join(opencastleDir, 'project.instructions.md');
|
|
104
|
+
if (!existsSync(filePath))
|
|
105
|
+
return;
|
|
106
|
+
let content = await readFile(filePath, 'utf8');
|
|
107
|
+
const orig = content;
|
|
108
|
+
// Overview: project name + description
|
|
109
|
+
if (pkg.name || pkg.description) {
|
|
110
|
+
const parts = [];
|
|
111
|
+
if (pkg.name)
|
|
112
|
+
parts.push(`**Project:** ${pkg.name}`);
|
|
113
|
+
if (pkg.description)
|
|
114
|
+
parts.push(`**Description:** ${pkg.description}`);
|
|
115
|
+
content = replaceMarker(content, '<!-- Project name, description, and current status -->', parts.join('\n\n'));
|
|
116
|
+
}
|
|
117
|
+
// Tech stack table
|
|
118
|
+
content = fillTableSection(content, '## Tech Stack', '| | | | |', buildStackRows(info));
|
|
119
|
+
// Key commands
|
|
120
|
+
if (pkg.scripts) {
|
|
121
|
+
const pm = info.packageManager ?? 'npm';
|
|
122
|
+
const cmdBlock = buildKeyCommandsBlock(pm, pkg.scripts);
|
|
123
|
+
if (cmdBlock) {
|
|
124
|
+
content = replaceMarker(content, '<!-- Package manager and common development commands -->', '<!-- Package manager and common development commands -->\n\n' + cmdBlock);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Monorepo workspace packages
|
|
128
|
+
if (info.monorepo) {
|
|
129
|
+
const workspaces = await scanWorkspace(projectRoot);
|
|
130
|
+
if (workspaces.length > 0) {
|
|
131
|
+
const pkgRows = workspaces.map(w => {
|
|
132
|
+
const cell = w.name !== w.path ? `\`${w.path}\` (\`${w.name}\`)` : `\`${w.path}\``;
|
|
133
|
+
return `| ${cell} | ${w.description ?? '<!-- TODO: verify -->'} |`;
|
|
134
|
+
});
|
|
135
|
+
content = fillTableSection(content, '## Project Structure', '| | |', pkgRows);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (content !== orig) {
|
|
139
|
+
await writeFile(filePath, content, 'utf8');
|
|
140
|
+
result.populated.push('project.instructions.md');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function populateTestingConfig(opencastleDir, info, result) {
|
|
144
|
+
const filePath = join(opencastleDir, 'stack', 'testing-config.md');
|
|
145
|
+
if (!existsSync(filePath))
|
|
146
|
+
return;
|
|
147
|
+
if (!info.testing?.length) {
|
|
148
|
+
await unlink(filePath);
|
|
149
|
+
result.removed.push('stack/testing-config.md');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
let content = await readFile(filePath, 'utf8');
|
|
153
|
+
const orig = content;
|
|
154
|
+
const introLine = 'Project-specific testing details referenced by the `browser-testing` skill.';
|
|
155
|
+
if (content.includes(introLine)) {
|
|
156
|
+
const cfg = filterConfigFiles(info.configFiles, [
|
|
157
|
+
'vitest.config.ts',
|
|
158
|
+
'vitest.config.js',
|
|
159
|
+
'jest.config.ts',
|
|
160
|
+
'jest.config.js',
|
|
161
|
+
'playwright.config.ts',
|
|
162
|
+
'playwright.config.js',
|
|
163
|
+
]);
|
|
164
|
+
let addition = `\n\n**Test frameworks:** ${info.testing.join(', ')}`;
|
|
165
|
+
if (cfg.length > 0) {
|
|
166
|
+
addition += `\n\n**Config files:** ${cfg.map(f => `\`${f}\``).join(', ')}`;
|
|
167
|
+
}
|
|
168
|
+
content = content.replace(introLine, introLine + addition);
|
|
169
|
+
}
|
|
170
|
+
if (content !== orig) {
|
|
171
|
+
await writeFile(filePath, content, 'utf8');
|
|
172
|
+
result.populated.push('stack/testing-config.md');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function populateDeploymentConfig(opencastleDir, info, result) {
|
|
176
|
+
const filePath = join(opencastleDir, 'stack', 'deployment-config.md');
|
|
177
|
+
if (!existsSync(filePath))
|
|
178
|
+
return;
|
|
179
|
+
if (!info.deployment?.length) {
|
|
180
|
+
await unlink(filePath);
|
|
181
|
+
result.removed.push('stack/deployment-config.md');
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
let content = await readFile(filePath, 'utf8');
|
|
185
|
+
const orig = content;
|
|
186
|
+
const archMarker = '<!-- Describe the deployment platform, CI/CD pipeline, and trigger mechanism. -->';
|
|
187
|
+
if (content.includes(archMarker)) {
|
|
188
|
+
const cfg = filterConfigFiles(info.configFiles, [
|
|
189
|
+
'vercel.json',
|
|
190
|
+
'netlify.toml',
|
|
191
|
+
'Dockerfile',
|
|
192
|
+
'docker-compose.yml',
|
|
193
|
+
'docker-compose.yaml',
|
|
194
|
+
'fly.toml',
|
|
195
|
+
'render.yaml',
|
|
196
|
+
]);
|
|
197
|
+
let addition = `**Platform:** ${info.deployment.join(', ')}`;
|
|
198
|
+
if (cfg.length > 0) {
|
|
199
|
+
addition += `\n\n**Config files:** ${cfg.map(f => `\`${f}\``).join(', ')}`;
|
|
200
|
+
}
|
|
201
|
+
content = content.replace(archMarker, addition + '\n\n' + archMarker);
|
|
202
|
+
}
|
|
203
|
+
if (content !== orig) {
|
|
204
|
+
await writeFile(filePath, content, 'utf8');
|
|
205
|
+
result.populated.push('stack/deployment-config.md');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function handleDatabaseConfig(opencastleDir, info, result) {
|
|
209
|
+
const filePath = join(opencastleDir, 'stack', 'database-config.md');
|
|
210
|
+
if (!existsSync(filePath))
|
|
211
|
+
return;
|
|
212
|
+
if (!info.databases?.length) {
|
|
213
|
+
await unlink(filePath);
|
|
214
|
+
result.removed.push('stack/database-config.md');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
let content = await readFile(filePath, 'utf8');
|
|
218
|
+
const provider = info.databases[0];
|
|
219
|
+
const integrationMarker = '<!-- Auth library path, migration directory, session pattern, role system overview. -->';
|
|
220
|
+
if (content.includes(integrationMarker)) {
|
|
221
|
+
const cfg = filterConfigFiles(info.configFiles, [
|
|
222
|
+
'supabase/config.toml',
|
|
223
|
+
'prisma/schema.prisma',
|
|
224
|
+
'drizzle.config.ts',
|
|
225
|
+
'drizzle.config.js',
|
|
226
|
+
]);
|
|
227
|
+
let addition = `**Provider:** ${provider}`;
|
|
228
|
+
if (cfg.length > 0) {
|
|
229
|
+
addition += `\n\n**Config files:** ${cfg.map(f => `\`${f}\``).join(', ')}`;
|
|
230
|
+
}
|
|
231
|
+
addition += '\n\n<!-- TODO: verify -->';
|
|
232
|
+
content = content.replace(integrationMarker, addition + '\n\n' + integrationMarker);
|
|
233
|
+
}
|
|
234
|
+
if (info.databases.length === 1) {
|
|
235
|
+
const newName = `${provider}-config.md`;
|
|
236
|
+
const newPath = join(opencastleDir, 'stack', newName);
|
|
237
|
+
await writeFile(newPath, content, 'utf8');
|
|
238
|
+
await unlink(filePath);
|
|
239
|
+
result.renamed.push(`stack/database-config.md \u2192 stack/${newName}`);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
await writeFile(filePath, content, 'utf8');
|
|
243
|
+
result.populated.push('stack/database-config.md');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function handleCmsConfig(opencastleDir, info, result) {
|
|
247
|
+
const filePath = join(opencastleDir, 'stack', 'cms-config.md');
|
|
248
|
+
if (!existsSync(filePath))
|
|
249
|
+
return;
|
|
250
|
+
if (!info.cms?.length) {
|
|
251
|
+
await unlink(filePath);
|
|
252
|
+
result.removed.push('stack/cms-config.md');
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
let content = await readFile(filePath, 'utf8');
|
|
256
|
+
const provider = info.cms[0];
|
|
257
|
+
const configMarker = '<!-- CMS project IDs, dataset, API version, studio location, etc. -->';
|
|
258
|
+
if (content.includes(configMarker)) {
|
|
259
|
+
const cfg = filterConfigFiles(info.configFiles, [
|
|
260
|
+
'sanity.config.ts',
|
|
261
|
+
'sanity.config.js',
|
|
262
|
+
'.contentful.json',
|
|
263
|
+
'payload.config.ts',
|
|
264
|
+
]);
|
|
265
|
+
let addition = `**Provider:** ${provider}`;
|
|
266
|
+
if (cfg.length > 0) {
|
|
267
|
+
addition += `\n\n**Config files:** ${cfg.map(f => `\`${f}\``).join(', ')}`;
|
|
268
|
+
}
|
|
269
|
+
addition += '\n\n<!-- TODO: verify -->';
|
|
270
|
+
content = content.replace(configMarker, addition + '\n\n' + configMarker);
|
|
271
|
+
}
|
|
272
|
+
if (info.cms.length === 1) {
|
|
273
|
+
const newName = `${provider}-config.md`;
|
|
274
|
+
const newPath = join(opencastleDir, 'stack', newName);
|
|
275
|
+
await writeFile(newPath, content, 'utf8');
|
|
276
|
+
await unlink(filePath);
|
|
277
|
+
result.renamed.push(`stack/cms-config.md \u2192 stack/${newName}`);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
await writeFile(filePath, content, 'utf8');
|
|
281
|
+
result.populated.push('stack/cms-config.md');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async function removeNotificationsIfUnused(opencastleDir, info, result) {
|
|
285
|
+
const filePath = join(opencastleDir, 'stack', 'notifications-config.md');
|
|
286
|
+
if (!existsSync(filePath) || info.notifications?.length)
|
|
287
|
+
return;
|
|
288
|
+
await unlink(filePath);
|
|
289
|
+
result.removed.push('stack/notifications-config.md');
|
|
290
|
+
}
|
|
291
|
+
async function handleApiConfig(opencastleDir, info, result) {
|
|
292
|
+
const filePath = join(opencastleDir, 'stack', 'api-config.md');
|
|
293
|
+
if (!existsSync(filePath))
|
|
294
|
+
return;
|
|
295
|
+
if (!info.frameworks?.length) {
|
|
296
|
+
await unlink(filePath);
|
|
297
|
+
result.removed.push('stack/api-config.md');
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
let content = await readFile(filePath, 'utf8');
|
|
301
|
+
const orig = content;
|
|
302
|
+
const initMarker = '<!-- Populated by `opencastle init` based on detected API routes and Server Actions. -->';
|
|
303
|
+
if (content.includes(initMarker)) {
|
|
304
|
+
const frameworkList = info.frameworks.join(', ');
|
|
305
|
+
content = content.replace(initMarker, `<!-- Populated by \`opencastle init\`. Framework: ${frameworkList} -->`);
|
|
306
|
+
}
|
|
307
|
+
if (content !== orig) {
|
|
308
|
+
await writeFile(filePath, content, 'utf8');
|
|
309
|
+
result.populated.push('stack/api-config.md');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async function removeDataPipelineConfig(opencastleDir, result) {
|
|
313
|
+
const filePath = join(opencastleDir, 'stack', 'data-pipeline-config.md');
|
|
314
|
+
if (!existsSync(filePath))
|
|
315
|
+
return;
|
|
316
|
+
await unlink(filePath);
|
|
317
|
+
result.removed.push('stack/data-pipeline-config.md');
|
|
318
|
+
}
|
|
319
|
+
const TRACKER_TOOLS = new Set(['linear', 'jira']);
|
|
320
|
+
async function handleTrackerConfig(opencastleDir, info, stack, result) {
|
|
321
|
+
const filePath = join(opencastleDir, 'project', 'tracker-config.md');
|
|
322
|
+
if (!existsSync(filePath))
|
|
323
|
+
return;
|
|
324
|
+
const tracker = stack.teamTools.find(t => TRACKER_TOOLS.has(t)) ??
|
|
325
|
+
info.pm?.find(p => TRACKER_TOOLS.has(p));
|
|
326
|
+
if (!tracker) {
|
|
327
|
+
await unlink(filePath);
|
|
328
|
+
result.removed.push('project/tracker-config.md');
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
let content = await readFile(filePath, 'utf8');
|
|
332
|
+
const displayName = tracker.charAt(0).toUpperCase() + tracker.slice(1);
|
|
333
|
+
content = content.replace('# Task Tracker Configuration', `# ${displayName} Configuration`);
|
|
334
|
+
const renameComment = '<!-- Populated by `opencastle init`.\n Rename this file to match your tracker: linear-config.md, jira-config.md, etc. -->';
|
|
335
|
+
content = content.replace(renameComment + '\n', '');
|
|
336
|
+
const newName = `${tracker}-config.md`;
|
|
337
|
+
const newPath = join(opencastleDir, 'project', newName);
|
|
338
|
+
await writeFile(newPath, content, 'utf8');
|
|
339
|
+
await unlink(filePath);
|
|
340
|
+
result.renamed.push(`project/tracker-config.md \u2192 project/${newName}`);
|
|
341
|
+
}
|
|
342
|
+
// ── Main export ────────────────────────────────────────────────
|
|
343
|
+
export async function bootstrapCustomizations(projectRoot, repoInfo, stack) {
|
|
344
|
+
const opencastleDir = join(projectRoot, '.opencastle');
|
|
345
|
+
const result = { populated: [], removed: [], renamed: [] };
|
|
346
|
+
const pkg = (await tryReadJson(join(projectRoot, 'package.json'))) ?? {};
|
|
347
|
+
await populateProjectInstructions(opencastleDir, projectRoot, repoInfo, pkg, result);
|
|
348
|
+
await populateTestingConfig(opencastleDir, repoInfo, result);
|
|
349
|
+
await populateDeploymentConfig(opencastleDir, repoInfo, result);
|
|
350
|
+
await handleDatabaseConfig(opencastleDir, repoInfo, result);
|
|
351
|
+
await handleCmsConfig(opencastleDir, repoInfo, result);
|
|
352
|
+
await removeNotificationsIfUnused(opencastleDir, repoInfo, result);
|
|
353
|
+
await handleApiConfig(opencastleDir, repoInfo, result);
|
|
354
|
+
await removeDataPipelineConfig(opencastleDir, result);
|
|
355
|
+
await handleTrackerConfig(opencastleDir, repoInfo, stack, result);
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/cli/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.test.d.ts","sourceRoot":"","sources":["../../src/cli/bootstrap.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for bootstrapCustomizations — validates programmatic population of
|
|
3
|
+
* .opencastle/ template files from RepoInfo and package.json data.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { mkdtemp, readFile, rm, writeFile, mkdir } from 'node:fs/promises';
|
|
7
|
+
import { join, resolve } from 'node:path';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
import { bootstrapCustomizations } from './bootstrap.js';
|
|
11
|
+
import { copyDir, getOrchestratorRoot } from './copy.js';
|
|
12
|
+
// ── Helpers ────────────────────────────────────────────────────
|
|
13
|
+
/** The real package root — tests run against the actual source tree. */
|
|
14
|
+
const PKG_ROOT = resolve(import.meta.dirname, '../..');
|
|
15
|
+
const STACK_EMPTY = {
|
|
16
|
+
ides: ['vscode'],
|
|
17
|
+
techTools: [],
|
|
18
|
+
teamTools: [],
|
|
19
|
+
};
|
|
20
|
+
/** Copy raw customization templates to <projectRoot>/.opencastle/ */
|
|
21
|
+
async function scaffoldTemplates(projectRoot) {
|
|
22
|
+
const custSrcDir = resolve(getOrchestratorRoot(PKG_ROOT), 'customizations');
|
|
23
|
+
const custDestDir = join(projectRoot, '.opencastle');
|
|
24
|
+
await copyDir(custSrcDir, custDestDir);
|
|
25
|
+
}
|
|
26
|
+
// ═══════════════════════════════════════════════════════════════
|
|
27
|
+
// § Test suite
|
|
28
|
+
// ═══════════════════════════════════════════════════════════════
|
|
29
|
+
describe('bootstrapCustomizations', () => {
|
|
30
|
+
let tempDir;
|
|
31
|
+
beforeEach(async () => {
|
|
32
|
+
tempDir = await mkdtemp(join(tmpdir(), 'bootstrap-test-'));
|
|
33
|
+
await scaffoldTemplates(tempDir);
|
|
34
|
+
});
|
|
35
|
+
afterEach(async () => {
|
|
36
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
37
|
+
});
|
|
38
|
+
// ── 1. Tech stack table ──────────────────────────────────────
|
|
39
|
+
it('populates project.instructions.md tech stack table from repoInfo', async () => {
|
|
40
|
+
const info = {
|
|
41
|
+
language: 'typescript',
|
|
42
|
+
frameworks: ['next'],
|
|
43
|
+
testing: ['vitest'],
|
|
44
|
+
deployment: ['vercel'],
|
|
45
|
+
};
|
|
46
|
+
await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
47
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project.instructions.md'), 'utf8');
|
|
48
|
+
expect(content).toContain('| Language | typescript |');
|
|
49
|
+
expect(content).toContain('| Framework | next |');
|
|
50
|
+
expect(content).toContain('| Testing | vitest |');
|
|
51
|
+
expect(content).toContain('| Deployment | vercel |');
|
|
52
|
+
// Empty placeholder row should be replaced
|
|
53
|
+
expect(content).not.toContain('| | | | |');
|
|
54
|
+
});
|
|
55
|
+
// ── 2. Testing config ────────────────────────────────────────
|
|
56
|
+
it('populates testing-config.md with test framework and config file', async () => {
|
|
57
|
+
const info = {
|
|
58
|
+
testing: ['vitest'],
|
|
59
|
+
configFiles: ['vitest.config.ts'],
|
|
60
|
+
};
|
|
61
|
+
await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
62
|
+
const content = await readFile(join(tempDir, '.opencastle', 'stack', 'testing-config.md'), 'utf8');
|
|
63
|
+
expect(content).toContain('vitest');
|
|
64
|
+
expect(content).toContain('`vitest.config.ts`');
|
|
65
|
+
});
|
|
66
|
+
// ── 3. Deployment config ─────────────────────────────────────
|
|
67
|
+
it('populates deployment-config.md with deployment platform and config file', async () => {
|
|
68
|
+
const info = {
|
|
69
|
+
deployment: ['vercel'],
|
|
70
|
+
configFiles: ['vercel.json'],
|
|
71
|
+
};
|
|
72
|
+
await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
73
|
+
const content = await readFile(join(tempDir, '.opencastle', 'stack', 'deployment-config.md'), 'utf8');
|
|
74
|
+
expect(content).toContain('vercel');
|
|
75
|
+
expect(content).toContain('`vercel.json`');
|
|
76
|
+
});
|
|
77
|
+
// ── 4. Remove unused stack files ─────────────────────────────
|
|
78
|
+
it('removes stack/database-config.md when no databases detected', async () => {
|
|
79
|
+
await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
80
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'database-config.md'))).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
it('removes stack/testing-config.md when no testing detected', async () => {
|
|
83
|
+
await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
84
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'testing-config.md'))).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
it('removes stack/deployment-config.md when no deployment detected', async () => {
|
|
87
|
+
await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
88
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'deployment-config.md'))).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
// ── 5. Rename database-config.md ────────────────────────────
|
|
91
|
+
it('renames database-config.md to supabase-config.md when supabase detected', async () => {
|
|
92
|
+
const info = { databases: ['supabase'] };
|
|
93
|
+
const result = await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
94
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'supabase-config.md'))).toBe(true);
|
|
95
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'database-config.md'))).toBe(false);
|
|
96
|
+
expect(result.renamed.some(r => r.includes('supabase-config.md'))).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
// ── 6. Rename cms-config.md ──────────────────────────────────
|
|
99
|
+
it('renames cms-config.md to sanity-config.md when sanity detected', async () => {
|
|
100
|
+
const info = { cms: ['sanity'] };
|
|
101
|
+
const result = await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
102
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'sanity-config.md'))).toBe(true);
|
|
103
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'cms-config.md'))).toBe(false);
|
|
104
|
+
expect(result.renamed.some(r => r.includes('sanity-config.md'))).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
// ── 7. Project name and description ──────────────────────────
|
|
107
|
+
it('fills project name and description from package.json', async () => {
|
|
108
|
+
await writeFile(join(tempDir, 'package.json'), JSON.stringify({ name: 'my-cool-project', description: 'A really cool project' }), 'utf8');
|
|
109
|
+
await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
110
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project.instructions.md'), 'utf8');
|
|
111
|
+
expect(content).toContain('**Project:** my-cool-project');
|
|
112
|
+
expect(content).toContain('**Description:** A really cool project');
|
|
113
|
+
});
|
|
114
|
+
// ── 8. Key commands from scripts ─────────────────────────────
|
|
115
|
+
it('populates key commands from package.json scripts', async () => {
|
|
116
|
+
await writeFile(join(tempDir, 'package.json'), JSON.stringify({
|
|
117
|
+
scripts: { dev: 'next dev', build: 'next build', test: 'vitest' },
|
|
118
|
+
}), 'utf8');
|
|
119
|
+
const info = { packageManager: 'pnpm' };
|
|
120
|
+
await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
121
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project.instructions.md'), 'utf8');
|
|
122
|
+
expect(content).toContain('pnpm run dev');
|
|
123
|
+
expect(content).toContain('pnpm run build');
|
|
124
|
+
expect(content).toContain('pnpm run test');
|
|
125
|
+
});
|
|
126
|
+
// ── 9. Empty repoInfo ────────────────────────────────────────
|
|
127
|
+
it('handles empty repoInfo gracefully without crashing', async () => {
|
|
128
|
+
const result = await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
129
|
+
expect(result).toBeDefined();
|
|
130
|
+
expect(result.populated).toBeInstanceOf(Array);
|
|
131
|
+
expect(result.removed).toBeInstanceOf(Array);
|
|
132
|
+
expect(result.renamed).toBeInstanceOf(Array);
|
|
133
|
+
// project.instructions.md should still exist and keep the empty row (no stack rows added)
|
|
134
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project.instructions.md'), 'utf8');
|
|
135
|
+
expect(content).toContain('| | | | |');
|
|
136
|
+
});
|
|
137
|
+
// ── 10. Monorepo workspace listing ────────────────────────────
|
|
138
|
+
it('lists monorepo workspace packages in project structure table', async () => {
|
|
139
|
+
await mkdir(join(tempDir, 'apps', 'web'), { recursive: true });
|
|
140
|
+
await writeFile(join(tempDir, 'apps', 'web', 'package.json'), JSON.stringify({ name: '@myproject/web', description: 'Main web app' }), 'utf8');
|
|
141
|
+
await mkdir(join(tempDir, 'packages', 'ui'), { recursive: true });
|
|
142
|
+
await writeFile(join(tempDir, 'packages', 'ui', 'package.json'), JSON.stringify({ name: '@myproject/ui', description: 'UI components' }), 'utf8');
|
|
143
|
+
const info = { monorepo: 'nx' };
|
|
144
|
+
await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
145
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project.instructions.md'), 'utf8');
|
|
146
|
+
expect(content).toContain('@myproject/web');
|
|
147
|
+
expect(content).toContain('Main web app');
|
|
148
|
+
expect(content).toContain('@myproject/ui');
|
|
149
|
+
expect(content).toContain('UI components');
|
|
150
|
+
});
|
|
151
|
+
// ── 11. API config ───────────────────────────────────────────
|
|
152
|
+
it('removes api-config.md when no frameworks detected', async () => {
|
|
153
|
+
const result = await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
154
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'api-config.md'))).toBe(false);
|
|
155
|
+
expect(result.removed).toContain('stack/api-config.md');
|
|
156
|
+
});
|
|
157
|
+
it('populates api-config.md with framework name when frameworks detected', async () => {
|
|
158
|
+
const info = { frameworks: ['next'] };
|
|
159
|
+
const result = await bootstrapCustomizations(tempDir, info, STACK_EMPTY);
|
|
160
|
+
const content = await readFile(join(tempDir, '.opencastle', 'stack', 'api-config.md'), 'utf8');
|
|
161
|
+
expect(content).toContain('Framework: next');
|
|
162
|
+
expect(result.populated).toContain('stack/api-config.md');
|
|
163
|
+
});
|
|
164
|
+
// ── 12. Data pipeline config ─────────────────────────────────
|
|
165
|
+
it('always removes data-pipeline-config.md', async () => {
|
|
166
|
+
const result = await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
167
|
+
expect(existsSync(join(tempDir, '.opencastle', 'stack', 'data-pipeline-config.md'))).toBe(false);
|
|
168
|
+
expect(result.removed).toContain('stack/data-pipeline-config.md');
|
|
169
|
+
});
|
|
170
|
+
// ── 13. Tracker config ───────────────────────────────────────
|
|
171
|
+
it('renames tracker-config.md to linear-config.md when linear in teamTools', async () => {
|
|
172
|
+
const stack = { ides: ['vscode'], techTools: [], teamTools: ['linear'] };
|
|
173
|
+
const result = await bootstrapCustomizations(tempDir, {}, stack);
|
|
174
|
+
expect(existsSync(join(tempDir, '.opencastle', 'project', 'linear-config.md'))).toBe(true);
|
|
175
|
+
expect(existsSync(join(tempDir, '.opencastle', 'project', 'tracker-config.md'))).toBe(false);
|
|
176
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project', 'linear-config.md'), 'utf8');
|
|
177
|
+
expect(content).toContain('# Linear Configuration');
|
|
178
|
+
expect(content).not.toContain('# Task Tracker Configuration');
|
|
179
|
+
expect(result.renamed.some(r => r.includes('linear-config.md'))).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
it('renames tracker-config.md to jira-config.md when jira in teamTools', async () => {
|
|
182
|
+
const stack = { ides: ['vscode'], techTools: [], teamTools: ['jira'] };
|
|
183
|
+
const result = await bootstrapCustomizations(tempDir, {}, stack);
|
|
184
|
+
expect(existsSync(join(tempDir, '.opencastle', 'project', 'jira-config.md'))).toBe(true);
|
|
185
|
+
expect(existsSync(join(tempDir, '.opencastle', 'project', 'tracker-config.md'))).toBe(false);
|
|
186
|
+
const content = await readFile(join(tempDir, '.opencastle', 'project', 'jira-config.md'), 'utf8');
|
|
187
|
+
expect(content).toContain('# Jira Configuration');
|
|
188
|
+
expect(result.renamed.some(r => r.includes('jira-config.md'))).toBe(true);
|
|
189
|
+
});
|
|
190
|
+
it('removes tracker-config.md when no tracker in teamTools', async () => {
|
|
191
|
+
const result = await bootstrapCustomizations(tempDir, {}, STACK_EMPTY);
|
|
192
|
+
expect(existsSync(join(tempDir, '.opencastle', 'project', 'tracker-config.md'))).toBe(false);
|
|
193
|
+
expect(result.removed).toContain('project/tracker-config.md');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=bootstrap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.test.js","sourceRoot":"","sources":["../../src/cli/bootstrap.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/detect.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type { RepoInfo, StackConfig } from './types.js';
|
|
1
|
+
import type { IdeChoice, RepoInfo, StackConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect which IDE the CLI is running from, based on environment variables.
|
|
4
|
+
* Returns the IdeChoice value or undefined if unknown.
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectCurrentIde(): IdeChoice | undefined;
|
|
2
7
|
/**
|
|
3
8
|
* Perform repo research: scan the project root for config files,
|
|
4
9
|
* package.json dependencies, and directory structures to detect
|