opencastle 0.7.0 → 0.8.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.
Files changed (93) hide show
  1. package/README.md +30 -3
  2. package/bin/cli.mjs +2 -0
  3. package/dist/cli/adapters/claude-code.d.ts +2 -5
  4. package/dist/cli/adapters/claude-code.d.ts.map +1 -1
  5. package/dist/cli/adapters/claude-code.js +12 -251
  6. package/dist/cli/adapters/claude-code.js.map +1 -1
  7. package/dist/cli/adapters/cursor.d.ts.map +1 -1
  8. package/dist/cli/adapters/cursor.js +3 -17
  9. package/dist/cli/adapters/cursor.js.map +1 -1
  10. package/dist/cli/adapters/frontmatter.d.ts +26 -0
  11. package/dist/cli/adapters/frontmatter.d.ts.map +1 -0
  12. package/dist/cli/adapters/frontmatter.js +40 -0
  13. package/dist/cli/adapters/frontmatter.js.map +1 -0
  14. package/dist/cli/adapters/index.d.ts +5 -0
  15. package/dist/cli/adapters/index.d.ts.map +1 -0
  16. package/dist/cli/adapters/index.js +9 -0
  17. package/dist/cli/adapters/index.js.map +1 -0
  18. package/dist/cli/adapters/opencode.d.ts +2 -5
  19. package/dist/cli/adapters/opencode.d.ts.map +1 -1
  20. package/dist/cli/adapters/opencode.js +12 -250
  21. package/dist/cli/adapters/opencode.js.map +1 -1
  22. package/dist/cli/adapters/single-file-base.d.ts +40 -0
  23. package/dist/cli/adapters/single-file-base.d.ts.map +1 -0
  24. package/dist/cli/adapters/single-file-base.js +246 -0
  25. package/dist/cli/adapters/single-file-base.js.map +1 -0
  26. package/dist/cli/dashboard.d.ts.map +1 -1
  27. package/dist/cli/dashboard.js +3 -2
  28. package/dist/cli/dashboard.js.map +1 -1
  29. package/dist/cli/detect.d.ts.map +1 -1
  30. package/dist/cli/detect.js +13 -11
  31. package/dist/cli/detect.js.map +1 -1
  32. package/dist/cli/doctor.d.ts +3 -0
  33. package/dist/cli/doctor.d.ts.map +1 -0
  34. package/dist/cli/doctor.js +205 -0
  35. package/dist/cli/doctor.js.map +1 -0
  36. package/dist/cli/init.d.ts.map +1 -1
  37. package/dist/cli/init.js +31 -19
  38. package/dist/cli/init.js.map +1 -1
  39. package/dist/cli/run/schema.d.ts +1 -5
  40. package/dist/cli/run/schema.d.ts.map +1 -1
  41. package/dist/cli/run/schema.js +6 -330
  42. package/dist/cli/run/schema.js.map +1 -1
  43. package/dist/cli/run.d.ts.map +1 -1
  44. package/dist/cli/run.js +14 -1
  45. package/dist/cli/run.js.map +1 -1
  46. package/dist/cli/types.d.ts +0 -5
  47. package/dist/cli/types.d.ts.map +1 -1
  48. package/dist/cli/update.d.ts.map +1 -1
  49. package/dist/cli/update.js +4 -17
  50. package/dist/cli/update.js.map +1 -1
  51. package/package.json +7 -2
  52. package/src/cli/adapters/claude-code.ts +13 -304
  53. package/src/cli/adapters/cursor.ts +3 -23
  54. package/src/cli/adapters/frontmatter.ts +47 -0
  55. package/src/cli/adapters/index.ts +13 -0
  56. package/src/cli/adapters/opencode.ts +12 -301
  57. package/src/cli/adapters/single-file-base.ts +320 -0
  58. package/src/cli/dashboard.ts +3 -2
  59. package/src/cli/detect.ts +19 -15
  60. package/src/cli/doctor.ts +235 -0
  61. package/src/cli/init.ts +31 -24
  62. package/src/cli/run/schema.ts +7 -365
  63. package/src/cli/run.ts +17 -1
  64. package/src/cli/types.ts +0 -6
  65. package/src/cli/update.ts +5 -23
  66. package/src/dashboard/dist/_astro/{index.CWVzbF4T.css → index.Bnq19_1M.css} +1 -1
  67. package/src/dashboard/dist/index.html +170 -11
  68. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  69. package/src/dashboard/seed-data/reviews.ndjson +6 -0
  70. package/src/dashboard/src/pages/index.astro +213 -10
  71. package/src/dashboard/src/styles/dashboard.css +196 -0
  72. package/src/orchestrator/agent-workflows/bug-fix.md +2 -2
  73. package/src/orchestrator/agent-workflows/data-pipeline.md +8 -8
  74. package/src/orchestrator/agent-workflows/database-migration.md +2 -2
  75. package/src/orchestrator/agent-workflows/feature-implementation.md +12 -5
  76. package/src/orchestrator/agent-workflows/performance-optimization.md +2 -2
  77. package/src/orchestrator/agent-workflows/refactoring.md +2 -2
  78. package/src/orchestrator/agent-workflows/schema-changes.md +2 -2
  79. package/src/orchestrator/agent-workflows/security-audit.md +2 -2
  80. package/src/orchestrator/agents/data-expert.agent.md +2 -2
  81. package/src/orchestrator/agents/researcher.agent.md +0 -16
  82. package/src/orchestrator/agents/team-lead.agent.md +17 -6
  83. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +1 -3
  84. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +1 -1
  85. package/src/orchestrator/prompts/bug-fix.prompt.md +11 -6
  86. package/src/orchestrator/prompts/implement-feature.prompt.md +9 -4
  87. package/src/orchestrator/prompts/quick-refinement.prompt.md +9 -5
  88. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +18 -4
  89. package/src/orchestrator/skills/agent-hooks/SKILL.md +4 -2
  90. package/src/orchestrator/skills/fast-review/SKILL.md +15 -4
  91. package/src/orchestrator/skills/self-improvement/SKILL.md +1 -1
  92. package/src/orchestrator/skills/validation-gates/SKILL.md +152 -15
  93. package/src/orchestrator/prompts/metrics-report.prompt.md +0 -144
@@ -1,9 +1,4 @@
1
- import { resolve, basename } from 'node:path';
2
- import { mkdir, writeFile, readdir, readFile, unlink, rm } from 'node:fs/promises';
3
- import { existsSync } from 'node:fs';
4
- import { copyDir, getOrchestratorRoot, getPluginsRoot, getPluginSkillEntries } from '../copy.js';
5
- import { scaffoldMcpConfig } from '../mcp.js';
6
- import { getExcludedSkills, getExcludedAgents, getCustomizationsTransform, getIncludedPluginIds } from '../stack-config.js';
1
+ import { createSingleFileAdapter } from './single-file-base.js';
7
2
  /**
8
3
  * OpenCode adapter.
9
4
  *
@@ -18,248 +13,15 @@ import { getExcludedSkills, getExcludedAgents, getCustomizationsTransform, getIn
18
13
  * mcp.json → opencode.json (OpenCode format: type local/remote)
19
14
  */
20
15
  export const IDE_ID = 'opencode';
21
- export const IDE_LABEL = 'OpenCode';
22
- // ─── Helpers ──────────────────────────────────────────────────────
23
- function stripFrontmatter(content) {
24
- const m = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
25
- return m ? m[2].trim() : content.trim();
26
- }
27
- function parseFrontmatterMeta(content) {
28
- const m = content.match(/^---\n([\s\S]*?)\n---/);
29
- if (!m)
30
- return {};
31
- const meta = {};
32
- for (const line of m[1].split('\n')) {
33
- const kv = line.match(/^(\w[\w-]*):\s*['"]?(.+?)['"]?\s*$/);
34
- if (kv)
35
- meta[kv[1]] = kv[2];
36
- }
37
- return meta;
38
- }
39
- // ─── Install ──────────────────────────────────────────────────────
40
- export async function install(pkgRoot, projectRoot, stack, repoInfo) {
41
- const srcRoot = getOrchestratorRoot(pkgRoot);
42
- const results = { copied: [], skipped: [], created: [] };
43
- const excludedSkills = stack ? getExcludedSkills(stack) : new Set();
44
- const excludedAgents = stack ? getExcludedAgents(stack) : new Set();
45
- // 1. Build AGENTS.md ← instructions/* + agent index + skill index
46
- const agentsMd = resolve(projectRoot, 'AGENTS.md');
47
- if (!existsSync(agentsMd)) {
48
- const sections = [];
49
- sections.push('# Project Instructions\n\n' +
50
- 'All conventions, architecture, and project context are embedded below. ' +
51
- 'Skills are in `.opencode/skills/` — read them when a task matches. ' +
52
- 'Agent definitions are in `.opencode/agents/` — read the relevant file when adopting a persona.');
53
- // Always-loaded instruction files
54
- const instDir = resolve(srcRoot, 'instructions');
55
- if (existsSync(instDir)) {
56
- for (const file of (await readdir(instDir)).sort()) {
57
- if (!file.endsWith('.md'))
58
- continue;
59
- const content = await readFile(resolve(instDir, file), 'utf8');
60
- sections.push(`\n---\n\n<!-- Source: instructions/${file} -->\n\n${stripFrontmatter(content)}`);
61
- }
62
- }
63
- // Agent reference
64
- const agentsDir = resolve(srcRoot, 'agents');
65
- if (existsSync(agentsDir)) {
66
- const agentLines = ['\n---\n\n## Agent Definitions\n'];
67
- agentLines.push('The following agent personas are available. Adopt the appropriate persona when asked.\n');
68
- for (const file of (await readdir(agentsDir)).sort()) {
69
- if (!file.endsWith('.md'))
70
- continue;
71
- if (excludedAgents.has(file))
72
- continue;
73
- const meta = parseFrontmatterMeta(await readFile(resolve(agentsDir, file), 'utf8'));
74
- const name = meta['name'] ?? basename(file, '.agent.md');
75
- const desc = meta['description'] ?? '';
76
- agentLines.push(`- **${name}**: ${desc}`);
77
- }
78
- agentLines.push('\nFull agent definitions are in `.opencode/agents/`. Read the relevant file when adopting a persona.');
79
- sections.push(agentLines.join('\n'));
80
- }
81
- // Skill index
82
- const skillsDir = resolve(srcRoot, 'skills');
83
- if (existsSync(skillsDir)) {
84
- const skillLines = ['\n---\n\n## Available Skills\n'];
85
- skillLines.push('Skills are on-demand knowledge files. Read the file when the task matches.\n');
86
- const subdirs = (await readdir(skillsDir, { withFileTypes: true })).filter((e) => e.isDirectory());
87
- for (const entry of subdirs.sort((a, b) => a.name.localeCompare(b.name))) {
88
- if (excludedSkills.has(entry.name))
89
- continue;
90
- const skillFile = resolve(skillsDir, entry.name, 'SKILL.md');
91
- if (!existsSync(skillFile))
92
- continue;
93
- const meta = parseFrontmatterMeta(await readFile(skillFile, 'utf8'));
94
- const desc = meta['description'] ?? '';
95
- skillLines.push(`- **${entry.name}** (\`.opencode/skills/${entry.name}.md\`): ${desc}`);
96
- }
97
- // Plugin skills
98
- const pluginsRoot = getPluginsRoot(pkgRoot);
99
- const includedPlugins = stack ? getIncludedPluginIds(stack) : undefined;
100
- const pluginEntries = await getPluginSkillEntries(pluginsRoot, includedPlugins);
101
- for (const { id, skillPath } of pluginEntries.sort((a, b) => a.id.localeCompare(b.id))) {
102
- const pluginMeta = parseFrontmatterMeta(await readFile(skillPath, 'utf8'));
103
- const pluginDesc = pluginMeta['description'] ?? '';
104
- skillLines.push(`- **${id}** (\`.opencode/skills/${id}.md\`): ${pluginDesc}`);
105
- }
106
- sections.push(skillLines.join('\n'));
107
- }
108
- await writeFile(agentsMd, sections.join('\n') + '\n');
109
- results.created.push(agentsMd);
110
- }
111
- else {
112
- results.skipped.push(agentsMd);
113
- }
114
- const openDir = resolve(projectRoot, '.opencode');
115
- // 2. Agent definitions → .opencode/agents/
116
- const agentsDir = resolve(srcRoot, 'agents');
117
- if (existsSync(agentsDir)) {
118
- const destAgents = resolve(openDir, 'agents');
119
- await mkdir(destAgents, { recursive: true });
120
- for (const file of await readdir(agentsDir)) {
121
- if (!file.endsWith('.md'))
122
- continue;
123
- if (excludedAgents.has(file))
124
- continue;
125
- const destPath = resolve(destAgents, file);
126
- if (existsSync(destPath)) {
127
- results.skipped.push(destPath);
128
- continue;
129
- }
130
- const content = await readFile(resolve(agentsDir, file), 'utf8');
131
- await writeFile(destPath, stripFrontmatter(content) + '\n');
132
- results.created.push(destPath);
133
- }
134
- }
135
- // 3. Skills → .opencode/skills/<name>.md
136
- const skillsDir = resolve(srcRoot, 'skills');
137
- if (existsSync(skillsDir)) {
138
- const destSkills = resolve(openDir, 'skills');
139
- await mkdir(destSkills, { recursive: true });
140
- const subdirs = (await readdir(skillsDir, { withFileTypes: true })).filter((e) => e.isDirectory());
141
- for (const entry of subdirs) {
142
- if (excludedSkills.has(entry.name))
143
- continue;
144
- const skillFile = resolve(skillsDir, entry.name, 'SKILL.md');
145
- if (!existsSync(skillFile))
146
- continue;
147
- const destPath = resolve(destSkills, `${entry.name}.md`);
148
- if (existsSync(destPath)) {
149
- results.skipped.push(destPath);
150
- continue;
151
- }
152
- const content = await readFile(skillFile, 'utf8');
153
- await writeFile(destPath, stripFrontmatter(content) + '\n');
154
- results.created.push(destPath);
155
- }
156
- }
157
- // 3b. Plugin skills → .opencode/skills/<plugin-id>.md
158
- {
159
- const pluginsRoot = getPluginsRoot(pkgRoot);
160
- const includedPlugins = stack ? getIncludedPluginIds(stack) : undefined;
161
- const pluginEntries = await getPluginSkillEntries(pluginsRoot, includedPlugins);
162
- const destSkills = resolve(openDir, 'skills');
163
- await mkdir(destSkills, { recursive: true });
164
- for (const { id, skillPath } of pluginEntries) {
165
- const destPath = resolve(destSkills, `${id}.md`);
166
- if (existsSync(destPath)) {
167
- results.skipped.push(destPath);
168
- continue;
169
- }
170
- const content = await readFile(skillPath, 'utf8');
171
- await writeFile(destPath, stripFrontmatter(content) + '\n');
172
- results.created.push(destPath);
173
- }
174
- }
175
- // 4. Prompts → .opencode/prompts/<name>.md
176
- const promptDir = resolve(srcRoot, 'prompts');
177
- if (existsSync(promptDir)) {
178
- const destPrompts = resolve(openDir, 'prompts');
179
- await mkdir(destPrompts, { recursive: true });
180
- for (const file of await readdir(promptDir)) {
181
- if (!file.endsWith('.md'))
182
- continue;
183
- const name = basename(file, '.prompt.md') || basename(file, '.md');
184
- const destPath = resolve(destPrompts, `${name}.md`);
185
- if (existsSync(destPath)) {
186
- results.skipped.push(destPath);
187
- continue;
188
- }
189
- const content = await readFile(resolve(promptDir, file), 'utf8');
190
- await writeFile(destPath, stripFrontmatter(content) + '\n');
191
- results.created.push(destPath);
192
- }
193
- }
194
- // 5. Agent Workflows → .opencode/workflows/<name>.md
195
- const wfDir = resolve(srcRoot, 'agent-workflows');
196
- if (existsSync(wfDir)) {
197
- const destWf = resolve(openDir, 'workflows');
198
- await mkdir(destWf, { recursive: true });
199
- for (const file of await readdir(wfDir)) {
200
- if (!file.endsWith('.md'))
201
- continue;
202
- if (file === 'README.md')
203
- continue;
204
- const name = basename(file, '.md');
205
- const destPath = resolve(destWf, `${name}.md`);
206
- if (existsSync(destPath)) {
207
- results.skipped.push(destPath);
208
- continue;
209
- }
210
- const content = await readFile(resolve(wfDir, file), 'utf8');
211
- await writeFile(destPath, stripFrontmatter(content) + '\n');
212
- results.created.push(destPath);
213
- }
214
- }
215
- // 6. Customizations (scaffold once, pre-populated with stack choices)
216
- const custDir = resolve(srcRoot, 'customizations');
217
- if (existsSync(custDir)) {
218
- const destCust = resolve(openDir, 'customizations');
219
- const custTransform = stack ? getCustomizationsTransform(stack) : undefined;
220
- const sub = await copyDir(custDir, destCust, { transform: custTransform });
221
- results.created.push(...sub.created);
222
- results.skipped.push(...sub.skipped);
223
- }
224
- // 7. MCP server config → opencode.json (OpenCode format)
225
- const mcpResult = await scaffoldMcpConfig(projectRoot, 'opencode.json', stack, repoInfo, 'opencode');
226
- results[mcpResult.action].push(mcpResult.path);
227
- return results;
228
- }
229
- // ─── Update ───────────────────────────────────────────────────────
230
- export async function update(pkgRoot, projectRoot, stack) {
231
- const results = { copied: [], skipped: [], created: [] };
232
- const openDir = resolve(projectRoot, '.opencode');
233
- // 1. Regenerate AGENTS.md (overwrite)
234
- const agentsMd = resolve(projectRoot, 'AGENTS.md');
235
- if (existsSync(agentsMd)) {
236
- await unlink(agentsMd);
237
- }
238
- // 2. Remove existing framework files so install() recreates them
239
- const frameworkDirs = ['agents', 'skills', 'prompts', 'workflows'];
240
- for (const dir of frameworkDirs) {
241
- const dirPath = resolve(openDir, dir);
242
- if (existsSync(dirPath)) {
243
- await rm(dirPath, { recursive: true });
244
- }
245
- }
246
- // 3. Re-run full install
247
- const installResult = await install(pkgRoot, projectRoot, stack);
248
- results.copied.push(...installResult.created);
249
- results.skipped.push(...installResult.skipped);
250
- return results;
251
- }
252
- // ─── Managed paths ────────────────────────────────────────────────
253
- export function getManagedPaths() {
254
- return {
255
- framework: [
256
- 'AGENTS.md',
257
- '.opencode/agents/',
258
- '.opencode/skills/',
259
- '.opencode/prompts/',
260
- '.opencode/workflows/',
261
- ],
262
- customizable: ['.opencode/customizations/', 'opencode.json'],
263
- };
264
- }
16
+ const { install, update, getManagedPaths } = createSingleFileAdapter({
17
+ rootFile: 'AGENTS.md',
18
+ dotDir: '.opencode',
19
+ mcpConfigPath: 'opencode.json',
20
+ mcpFormat: 'opencode',
21
+ promptsDir: 'prompts',
22
+ workflowsDir: 'workflows',
23
+ workflowPrefix: '',
24
+ frameworkDirs: ['agents', 'skills', 'prompts', 'workflows'],
25
+ });
26
+ export { install, update, getManagedPaths };
265
27
  //# sourceMappingURL=opencode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/cli/adapters/opencode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/cli/adapters/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAE/D;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAA;AAEhC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC;IACnE,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,WAAW;IACzB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC;CAC5D,CAAC,CAAA;AAEF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { IdeAdapter, IdeChoice } from '../types.js';
2
+ /**
3
+ * Configuration for adapters that produce a single root instructions file
4
+ * and a dot-directory structure (e.g. Claude Code → CLAUDE.md + .claude/,
5
+ * OpenCode → AGENTS.md + .opencode/).
6
+ */
7
+ export interface SingleFileAdapterConfig {
8
+ /** Root instructions file name, e.g. 'CLAUDE.md' */
9
+ rootFile: string;
10
+ /** Dot directory for framework files, e.g. '.claude' */
11
+ dotDir: string;
12
+ /** Path for MCP config relative to project root, e.g. '.claude/mcp.json' */
13
+ mcpConfigPath: string;
14
+ /** MCP format identifier passed to scaffoldMcpConfig */
15
+ mcpFormat: IdeChoice;
16
+ /** Subdirectory name under dotDir for prompt output, e.g. 'commands' or 'prompts' */
17
+ promptsDir: string;
18
+ /** Subdirectory name under dotDir for workflow output, e.g. 'commands' or 'workflows' */
19
+ workflowsDir: string;
20
+ /** Prefix prepended to workflow filenames, e.g. 'workflow-' or '' */
21
+ workflowPrefix: string;
22
+ /** Framework subdirectories (under dotDir) to remove during update */
23
+ frameworkDirs: string[];
24
+ }
25
+ /**
26
+ * Creates install/update/getManagedPaths functions from a config object.
27
+ *
28
+ * Both Claude Code and OpenCode share the same structure:
29
+ * 1. A single root .md file with embedded instructions, agent index, and skill index
30
+ * 2. Agent definitions stripped of frontmatter
31
+ * 3. Skills stripped of frontmatter
32
+ * 4. Prompts stripped of frontmatter
33
+ * 5. Workflows stripped of frontmatter
34
+ * 6. Customizations scaffolded once
35
+ * 7. MCP config scaffolded once
36
+ *
37
+ * The only differences are directory names and file naming conventions.
38
+ */
39
+ export declare function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAdapter;
40
+ //# sourceMappingURL=single-file-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-file-base.d.ts","sourceRoot":"","sources":["../../../src/cli/adapters/single-file-base.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAe,UAAU,EAAE,SAAS,EAAuC,MAAM,aAAa,CAAA;AAG1G;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAA;IACrB,wDAAwD;IACxD,SAAS,EAAE,SAAS,CAAA;IACpB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,YAAY,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,UAAU,CAgRnF"}
@@ -0,0 +1,246 @@
1
+ import { resolve, basename } from 'node:path';
2
+ import { mkdir, writeFile, readdir, readFile, unlink, rm } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { copyDir, getOrchestratorRoot, getPluginsRoot, getPluginSkillEntries } from '../copy.js';
5
+ import { scaffoldMcpConfig } from '../mcp.js';
6
+ import { getExcludedSkills, getExcludedAgents, getCustomizationsTransform, getIncludedPluginIds } from '../stack-config.js';
7
+ import { stripFrontmatter, parseFrontmatterMeta } from './frontmatter.js';
8
+ /**
9
+ * Creates install/update/getManagedPaths functions from a config object.
10
+ *
11
+ * Both Claude Code and OpenCode share the same structure:
12
+ * 1. A single root .md file with embedded instructions, agent index, and skill index
13
+ * 2. Agent definitions stripped of frontmatter
14
+ * 3. Skills stripped of frontmatter
15
+ * 4. Prompts stripped of frontmatter
16
+ * 5. Workflows stripped of frontmatter
17
+ * 6. Customizations scaffolded once
18
+ * 7. MCP config scaffolded once
19
+ *
20
+ * The only differences are directory names and file naming conventions.
21
+ */
22
+ export function createSingleFileAdapter(config) {
23
+ async function install(pkgRoot, projectRoot, stack, repoInfo) {
24
+ const srcRoot = getOrchestratorRoot(pkgRoot);
25
+ const results = { copied: [], skipped: [], created: [] };
26
+ const excludedSkills = stack ? getExcludedSkills(stack) : new Set();
27
+ const excludedAgents = stack ? getExcludedAgents(stack) : new Set();
28
+ // 1. Build root instructions file
29
+ const rootPath = resolve(projectRoot, config.rootFile);
30
+ if (!existsSync(rootPath)) {
31
+ const sections = [];
32
+ sections.push('# Project Instructions\n\n' +
33
+ 'All conventions, architecture, and project context are embedded below. ' +
34
+ `Skills are in \`${config.dotDir}/skills/\` — read them when a task matches. ` +
35
+ `Agent definitions are in \`${config.dotDir}/agents/\` — read the relevant file when adopting a persona.`);
36
+ // Always-loaded instruction files
37
+ const instDir = resolve(srcRoot, 'instructions');
38
+ if (existsSync(instDir)) {
39
+ for (const file of (await readdir(instDir)).sort()) {
40
+ if (!file.endsWith('.md'))
41
+ continue;
42
+ const content = await readFile(resolve(instDir, file), 'utf8');
43
+ sections.push(`\n---\n\n<!-- Source: instructions/${file} -->\n\n${stripFrontmatter(content)}`);
44
+ }
45
+ }
46
+ // Agent reference
47
+ const agentsDir = resolve(srcRoot, 'agents');
48
+ if (existsSync(agentsDir)) {
49
+ const agentLines = ['\n---\n\n## Agent Definitions\n'];
50
+ agentLines.push('The following agent personas are available. Adopt the appropriate persona when asked.\n');
51
+ for (const file of (await readdir(agentsDir)).sort()) {
52
+ if (!file.endsWith('.md'))
53
+ continue;
54
+ if (excludedAgents.has(file))
55
+ continue;
56
+ const meta = parseFrontmatterMeta(await readFile(resolve(agentsDir, file), 'utf8'));
57
+ const name = meta['name'] ?? basename(file, '.agent.md');
58
+ const desc = meta['description'] ?? '';
59
+ agentLines.push(`- **${name}**: ${desc}`);
60
+ }
61
+ agentLines.push(`\nFull agent definitions are in \`${config.dotDir}/agents/\`. Read the relevant file when adopting a persona.`);
62
+ sections.push(agentLines.join('\n'));
63
+ }
64
+ // Skill index
65
+ const skillsDir = resolve(srcRoot, 'skills');
66
+ if (existsSync(skillsDir)) {
67
+ const skillLines = ['\n---\n\n## Available Skills\n'];
68
+ skillLines.push('Skills are on-demand knowledge files. Read the file when the task matches.\n');
69
+ const subdirs = (await readdir(skillsDir, { withFileTypes: true })).filter((e) => e.isDirectory());
70
+ for (const entry of subdirs.sort((a, b) => a.name.localeCompare(b.name))) {
71
+ if (excludedSkills.has(entry.name))
72
+ continue;
73
+ const skillFile = resolve(skillsDir, entry.name, 'SKILL.md');
74
+ if (!existsSync(skillFile))
75
+ continue;
76
+ const meta = parseFrontmatterMeta(await readFile(skillFile, 'utf8'));
77
+ const desc = meta['description'] ?? '';
78
+ skillLines.push(`- **${entry.name}** (\`${config.dotDir}/skills/${entry.name}.md\`): ${desc}`);
79
+ }
80
+ // Plugin skills
81
+ const pluginsRoot = getPluginsRoot(pkgRoot);
82
+ const includedPlugins = stack ? getIncludedPluginIds(stack) : undefined;
83
+ const pluginEntries = await getPluginSkillEntries(pluginsRoot, includedPlugins);
84
+ for (const { id, skillPath } of pluginEntries.sort((a, b) => a.id.localeCompare(b.id))) {
85
+ const pluginMeta = parseFrontmatterMeta(await readFile(skillPath, 'utf8'));
86
+ const pluginDesc = pluginMeta['description'] ?? '';
87
+ skillLines.push(`- **${id}** (\`${config.dotDir}/skills/${id}.md\`): ${pluginDesc}`);
88
+ }
89
+ sections.push(skillLines.join('\n'));
90
+ }
91
+ await writeFile(rootPath, sections.join('\n') + '\n');
92
+ results.created.push(rootPath);
93
+ }
94
+ else {
95
+ results.skipped.push(rootPath);
96
+ }
97
+ const dotDirPath = resolve(projectRoot, config.dotDir);
98
+ // 2. Agent definitions → dotDir/agents/
99
+ const agentsDir = resolve(srcRoot, 'agents');
100
+ if (existsSync(agentsDir)) {
101
+ const destAgents = resolve(dotDirPath, 'agents');
102
+ await mkdir(destAgents, { recursive: true });
103
+ for (const file of await readdir(agentsDir)) {
104
+ if (!file.endsWith('.md'))
105
+ continue;
106
+ if (excludedAgents.has(file))
107
+ continue;
108
+ const destPath = resolve(destAgents, file);
109
+ if (existsSync(destPath)) {
110
+ results.skipped.push(destPath);
111
+ continue;
112
+ }
113
+ const content = await readFile(resolve(agentsDir, file), 'utf8');
114
+ await writeFile(destPath, stripFrontmatter(content) + '\n');
115
+ results.created.push(destPath);
116
+ }
117
+ }
118
+ // 3. Skills → dotDir/skills/<name>.md
119
+ const skillsDir = resolve(srcRoot, 'skills');
120
+ if (existsSync(skillsDir)) {
121
+ const destSkills = resolve(dotDirPath, 'skills');
122
+ await mkdir(destSkills, { recursive: true });
123
+ const subdirs = (await readdir(skillsDir, { withFileTypes: true })).filter((e) => e.isDirectory());
124
+ for (const entry of subdirs) {
125
+ if (excludedSkills.has(entry.name))
126
+ continue;
127
+ const skillFile = resolve(skillsDir, entry.name, 'SKILL.md');
128
+ if (!existsSync(skillFile))
129
+ continue;
130
+ const destPath = resolve(destSkills, `${entry.name}.md`);
131
+ if (existsSync(destPath)) {
132
+ results.skipped.push(destPath);
133
+ continue;
134
+ }
135
+ const content = await readFile(skillFile, 'utf8');
136
+ await writeFile(destPath, stripFrontmatter(content) + '\n');
137
+ results.created.push(destPath);
138
+ }
139
+ }
140
+ // 3b. Plugin skills → dotDir/skills/<plugin-id>.md
141
+ {
142
+ const pluginsRoot = getPluginsRoot(pkgRoot);
143
+ const includedPlugins = stack ? getIncludedPluginIds(stack) : undefined;
144
+ const pluginEntries = await getPluginSkillEntries(pluginsRoot, includedPlugins);
145
+ const destSkills = resolve(dotDirPath, 'skills');
146
+ await mkdir(destSkills, { recursive: true });
147
+ for (const { id, skillPath } of pluginEntries) {
148
+ const destPath = resolve(destSkills, `${id}.md`);
149
+ if (existsSync(destPath)) {
150
+ results.skipped.push(destPath);
151
+ continue;
152
+ }
153
+ const content = await readFile(skillPath, 'utf8');
154
+ await writeFile(destPath, stripFrontmatter(content) + '\n');
155
+ results.created.push(destPath);
156
+ }
157
+ }
158
+ // 4. Prompts → dotDir/<promptsDir>/<name>.md
159
+ const promptDir = resolve(srcRoot, 'prompts');
160
+ if (existsSync(promptDir)) {
161
+ const destPrompts = resolve(dotDirPath, config.promptsDir);
162
+ await mkdir(destPrompts, { recursive: true });
163
+ for (const file of await readdir(promptDir)) {
164
+ if (!file.endsWith('.md'))
165
+ continue;
166
+ const name = basename(file, '.prompt.md') || basename(file, '.md');
167
+ const destPath = resolve(destPrompts, `${name}.md`);
168
+ if (existsSync(destPath)) {
169
+ results.skipped.push(destPath);
170
+ continue;
171
+ }
172
+ const content = await readFile(resolve(promptDir, file), 'utf8');
173
+ await writeFile(destPath, stripFrontmatter(content) + '\n');
174
+ results.created.push(destPath);
175
+ }
176
+ }
177
+ // 5. Agent Workflows → dotDir/<workflowsDir>/<prefix><name>.md
178
+ const wfDir = resolve(srcRoot, 'agent-workflows');
179
+ if (existsSync(wfDir)) {
180
+ const destWf = resolve(dotDirPath, config.workflowsDir);
181
+ await mkdir(destWf, { recursive: true });
182
+ for (const file of await readdir(wfDir)) {
183
+ if (!file.endsWith('.md'))
184
+ continue;
185
+ if (file === 'README.md')
186
+ continue;
187
+ const name = basename(file, '.md');
188
+ const destPath = resolve(destWf, `${config.workflowPrefix}${name}.md`);
189
+ if (existsSync(destPath)) {
190
+ results.skipped.push(destPath);
191
+ continue;
192
+ }
193
+ const content = await readFile(resolve(wfDir, file), 'utf8');
194
+ await writeFile(destPath, stripFrontmatter(content) + '\n');
195
+ results.created.push(destPath);
196
+ }
197
+ }
198
+ // 6. Customizations (scaffold once)
199
+ const custDir = resolve(srcRoot, 'customizations');
200
+ if (existsSync(custDir)) {
201
+ const destCust = resolve(dotDirPath, 'customizations');
202
+ const custTransform = stack ? getCustomizationsTransform(stack) : undefined;
203
+ const sub = await copyDir(custDir, destCust, { transform: custTransform });
204
+ results.created.push(...sub.created);
205
+ results.skipped.push(...sub.skipped);
206
+ }
207
+ // 7. MCP server config (scaffold once)
208
+ const mcpResult = await scaffoldMcpConfig(projectRoot, config.mcpConfigPath, stack, repoInfo, config.mcpFormat);
209
+ results[mcpResult.action].push(mcpResult.path);
210
+ return results;
211
+ }
212
+ async function update(pkgRoot, projectRoot, stack) {
213
+ const results = { copied: [], skipped: [], created: [] };
214
+ const dotDirPath = resolve(projectRoot, config.dotDir);
215
+ // 1. Remove root instructions file so install() recreates it
216
+ const rootPath = resolve(projectRoot, config.rootFile);
217
+ if (existsSync(rootPath)) {
218
+ await unlink(rootPath);
219
+ }
220
+ // 2. Remove existing framework directories
221
+ for (const dir of config.frameworkDirs) {
222
+ const dirPath = resolve(dotDirPath, dir);
223
+ if (existsSync(dirPath)) {
224
+ await rm(dirPath, { recursive: true });
225
+ }
226
+ }
227
+ // 3. Re-run full install
228
+ const installResult = await install(pkgRoot, projectRoot, stack);
229
+ results.copied.push(...installResult.created);
230
+ results.skipped.push(...installResult.skipped);
231
+ return results;
232
+ }
233
+ function getManagedPaths() {
234
+ // Deduplicate dirs (e.g. promptsDir === workflowsDir for claude-code's 'commands')
235
+ const dirs = new Set(['agents', 'skills', ...config.frameworkDirs]);
236
+ return {
237
+ framework: [
238
+ config.rootFile,
239
+ ...Array.from(dirs).map((d) => `${config.dotDir}/${d}/`),
240
+ ],
241
+ customizable: [`${config.dotDir}/customizations/`, config.mcpConfigPath],
242
+ };
243
+ }
244
+ return { install, update, getManagedPaths };
245
+ }
246
+ //# sourceMappingURL=single-file-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-file-base.js","sourceRoot":"","sources":["../../../src/cli/adapters/single-file-base.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAiG5C,wBAA8B,SAAS,CAAC,EACtC,OAAO,EACP,IAAI,GACL,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H5B"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAkG5C,wBAA8B,SAAS,CAAC,EACtC,OAAO,EACP,IAAI,GACL,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H5B"}
@@ -1,7 +1,7 @@
1
1
  import { createServer } from 'node:http';
2
2
  import { readFile, access } from 'node:fs/promises';
3
3
  import { resolve, join, extname } from 'node:path';
4
- import { exec } from 'node:child_process';
4
+ import { execFile } from 'node:child_process';
5
5
  const MIME_TYPES = {
6
6
  '.html': 'text/html',
7
7
  '.css': 'text/css',
@@ -18,6 +18,7 @@ const DATA_FILES = [
18
18
  'sessions.ndjson',
19
19
  'delegations.ndjson',
20
20
  'panels.ndjson',
21
+ 'reviews.ndjson',
21
22
  ];
22
23
  function parseArgs(args) {
23
24
  let port = 4300;
@@ -44,7 +45,7 @@ function openUrl(url) {
44
45
  : plat === 'win32'
45
46
  ? 'start'
46
47
  : 'xdg-open';
47
- exec(`${cmd} ${url}`);
48
+ execFile(cmd, [url]);
48
49
  }
49
50
  async function fileExists(filePath) {
50
51
  try {