opencastle 0.1.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.
Files changed (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/bin/cli.mjs +69 -0
  4. package/dist/cli/adapters/claude-code.d.ts +22 -0
  5. package/dist/cli/adapters/claude-code.d.ts.map +1 -0
  6. package/dist/cli/adapters/claude-code.js +237 -0
  7. package/dist/cli/adapters/claude-code.js.map +1 -0
  8. package/dist/cli/adapters/cursor.d.ts +20 -0
  9. package/dist/cli/adapters/cursor.d.ts.map +1 -0
  10. package/dist/cli/adapters/cursor.js +231 -0
  11. package/dist/cli/adapters/cursor.js.map +1 -0
  12. package/dist/cli/adapters/vscode.d.ts +20 -0
  13. package/dist/cli/adapters/vscode.d.ts.map +1 -0
  14. package/dist/cli/adapters/vscode.js +132 -0
  15. package/dist/cli/adapters/vscode.js.map +1 -0
  16. package/dist/cli/copy.d.ts +14 -0
  17. package/dist/cli/copy.d.ts.map +1 -0
  18. package/dist/cli/copy.js +62 -0
  19. package/dist/cli/copy.js.map +1 -0
  20. package/dist/cli/dashboard.d.ts +3 -0
  21. package/dist/cli/dashboard.d.ts.map +1 -0
  22. package/dist/cli/dashboard.js +183 -0
  23. package/dist/cli/dashboard.js.map +1 -0
  24. package/dist/cli/diff.d.ts +3 -0
  25. package/dist/cli/diff.d.ts.map +1 -0
  26. package/dist/cli/diff.js +27 -0
  27. package/dist/cli/diff.js.map +1 -0
  28. package/dist/cli/eject.d.ts +3 -0
  29. package/dist/cli/eject.d.ts.map +1 -0
  30. package/dist/cli/eject.js +27 -0
  31. package/dist/cli/eject.js.map +1 -0
  32. package/dist/cli/init.d.ts +3 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +92 -0
  35. package/dist/cli/init.js.map +1 -0
  36. package/dist/cli/manifest.d.ts +14 -0
  37. package/dist/cli/manifest.d.ts.map +1 -0
  38. package/dist/cli/manifest.js +34 -0
  39. package/dist/cli/manifest.js.map +1 -0
  40. package/dist/cli/mcp.d.ts +14 -0
  41. package/dist/cli/mcp.d.ts.map +1 -0
  42. package/dist/cli/mcp.js +35 -0
  43. package/dist/cli/mcp.js.map +1 -0
  44. package/dist/cli/prompt.d.ts +12 -0
  45. package/dist/cli/prompt.d.ts.map +1 -0
  46. package/dist/cli/prompt.js +104 -0
  47. package/dist/cli/prompt.js.map +1 -0
  48. package/dist/cli/run/adapters/claude-code.d.ts +16 -0
  49. package/dist/cli/run/adapters/claude-code.d.ts.map +1 -0
  50. package/dist/cli/run/adapters/claude-code.js +82 -0
  51. package/dist/cli/run/adapters/claude-code.js.map +1 -0
  52. package/dist/cli/run/adapters/copilot.d.ts +16 -0
  53. package/dist/cli/run/adapters/copilot.d.ts.map +1 -0
  54. package/dist/cli/run/adapters/copilot.js +84 -0
  55. package/dist/cli/run/adapters/copilot.js.map +1 -0
  56. package/dist/cli/run/adapters/cursor.d.ts +16 -0
  57. package/dist/cli/run/adapters/cursor.d.ts.map +1 -0
  58. package/dist/cli/run/adapters/cursor.js +81 -0
  59. package/dist/cli/run/adapters/cursor.js.map +1 -0
  60. package/dist/cli/run/adapters/index.d.ts +14 -0
  61. package/dist/cli/run/adapters/index.d.ts.map +1 -0
  62. package/dist/cli/run/adapters/index.js +35 -0
  63. package/dist/cli/run/adapters/index.js.map +1 -0
  64. package/dist/cli/run/executor.d.ts +15 -0
  65. package/dist/cli/run/executor.d.ts.map +1 -0
  66. package/dist/cli/run/executor.js +249 -0
  67. package/dist/cli/run/executor.js.map +1 -0
  68. package/dist/cli/run/reporter.d.ts +10 -0
  69. package/dist/cli/run/reporter.d.ts.map +1 -0
  70. package/dist/cli/run/reporter.js +112 -0
  71. package/dist/cli/run/reporter.js.map +1 -0
  72. package/dist/cli/run/schema.d.ts +28 -0
  73. package/dist/cli/run/schema.d.ts.map +1 -0
  74. package/dist/cli/run/schema.js +511 -0
  75. package/dist/cli/run/schema.js.map +1 -0
  76. package/dist/cli/run.d.ts +6 -0
  77. package/dist/cli/run.d.ts.map +1 -0
  78. package/dist/cli/run.js +123 -0
  79. package/dist/cli/run.js.map +1 -0
  80. package/dist/cli/stack-config.d.ts +12 -0
  81. package/dist/cli/stack-config.d.ts.map +1 -0
  82. package/dist/cli/stack-config.js +146 -0
  83. package/dist/cli/stack-config.js.map +1 -0
  84. package/dist/cli/types.d.ts +169 -0
  85. package/dist/cli/types.d.ts.map +1 -0
  86. package/dist/cli/types.js +2 -0
  87. package/dist/cli/types.js.map +1 -0
  88. package/dist/cli/update.d.ts +3 -0
  89. package/dist/cli/update.d.ts.map +1 -0
  90. package/dist/cli/update.js +50 -0
  91. package/dist/cli/update.js.map +1 -0
  92. package/package.json +48 -0
  93. package/src/cli/adapters/claude-code.ts +287 -0
  94. package/src/cli/adapters/cursor.ts +377 -0
  95. package/src/cli/adapters/vscode.ts +168 -0
  96. package/src/cli/copy.ts +79 -0
  97. package/src/cli/dashboard.ts +225 -0
  98. package/src/cli/diff.ts +44 -0
  99. package/src/cli/eject.ts +39 -0
  100. package/src/cli/init.ts +120 -0
  101. package/src/cli/manifest.ts +45 -0
  102. package/src/cli/mcp.ts +49 -0
  103. package/src/cli/prompt.ts +115 -0
  104. package/src/cli/run/adapters/claude-code.ts +95 -0
  105. package/src/cli/run/adapters/copilot.ts +97 -0
  106. package/src/cli/run/adapters/cursor.ts +94 -0
  107. package/src/cli/run/adapters/index.ts +40 -0
  108. package/src/cli/run/executor.ts +292 -0
  109. package/src/cli/run/reporter.ts +129 -0
  110. package/src/cli/run/schema.ts +595 -0
  111. package/src/cli/run.ts +137 -0
  112. package/src/cli/stack-config.ts +180 -0
  113. package/src/cli/types.ts +207 -0
  114. package/src/cli/update.ts +75 -0
  115. package/src/dashboard/astro.config.mjs +6 -0
  116. package/src/dashboard/package-lock.json +5455 -0
  117. package/src/dashboard/package.json +14 -0
  118. package/src/dashboard/public/data/delegations.ndjson +35 -0
  119. package/src/dashboard/public/data/panels.ndjson +13 -0
  120. package/src/dashboard/public/data/sessions.ndjson +50 -0
  121. package/src/dashboard/public/icon-192.png +0 -0
  122. package/src/dashboard/scripts/generate-seed-data.ts +355 -0
  123. package/src/dashboard/src/layouts/Layout.astro +25 -0
  124. package/src/dashboard/src/pages/index.astro +1070 -0
  125. package/src/dashboard/src/styles/dashboard.css +1078 -0
  126. package/src/dashboard/tsconfig.json +6 -0
  127. package/src/orchestrator/agent-workflows/README.md +22 -0
  128. package/src/orchestrator/agent-workflows/bug-fix.md +128 -0
  129. package/src/orchestrator/agent-workflows/data-pipeline.md +145 -0
  130. package/src/orchestrator/agent-workflows/database-migration.md +159 -0
  131. package/src/orchestrator/agent-workflows/feature-implementation.md +223 -0
  132. package/src/orchestrator/agent-workflows/performance-optimization.md +125 -0
  133. package/src/orchestrator/agent-workflows/refactoring.md +142 -0
  134. package/src/orchestrator/agent-workflows/schema-changes.md +164 -0
  135. package/src/orchestrator/agent-workflows/security-audit.md +148 -0
  136. package/src/orchestrator/agent-workflows/shared-delivery-phase.md +33 -0
  137. package/src/orchestrator/agents/api-designer.agent.md +68 -0
  138. package/src/orchestrator/agents/architect.agent.md +129 -0
  139. package/src/orchestrator/agents/content-engineer.agent.md +57 -0
  140. package/src/orchestrator/agents/copywriter.agent.md +95 -0
  141. package/src/orchestrator/agents/data-expert.agent.md +63 -0
  142. package/src/orchestrator/agents/database-engineer.agent.md +62 -0
  143. package/src/orchestrator/agents/developer.agent.md +66 -0
  144. package/src/orchestrator/agents/devops-expert.agent.md +57 -0
  145. package/src/orchestrator/agents/documentation-writer.agent.md +60 -0
  146. package/src/orchestrator/agents/performance-expert.agent.md +58 -0
  147. package/src/orchestrator/agents/release-manager.agent.md +72 -0
  148. package/src/orchestrator/agents/researcher.agent.md +145 -0
  149. package/src/orchestrator/agents/reviewer.agent.md +62 -0
  150. package/src/orchestrator/agents/security-expert.agent.md +64 -0
  151. package/src/orchestrator/agents/seo-specialist.agent.md +67 -0
  152. package/src/orchestrator/agents/team-lead.agent.md +644 -0
  153. package/src/orchestrator/agents/testing-expert.agent.md +85 -0
  154. package/src/orchestrator/agents/ui-ux-expert.agent.md +63 -0
  155. package/src/orchestrator/copilot-instructions.md +3 -0
  156. package/src/orchestrator/customizations/AGENT-EXPERTISE.md +325 -0
  157. package/src/orchestrator/customizations/AGENT-FAILURES.md +69 -0
  158. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +58 -0
  159. package/src/orchestrator/customizations/DISPUTES.md +162 -0
  160. package/src/orchestrator/customizations/KNOWLEDGE-GRAPH.md +10 -0
  161. package/src/orchestrator/customizations/LESSONS-LEARNED.md +70 -0
  162. package/src/orchestrator/customizations/README.md +59 -0
  163. package/src/orchestrator/customizations/agents/agent-registry.md +46 -0
  164. package/src/orchestrator/customizations/agents/skill-matrix.md +142 -0
  165. package/src/orchestrator/customizations/logs/README.md +181 -0
  166. package/src/orchestrator/customizations/logs/delegations.ndjson +1 -0
  167. package/src/orchestrator/customizations/logs/panels.ndjson +1 -0
  168. package/src/orchestrator/customizations/logs/sessions.ndjson +1 -0
  169. package/src/orchestrator/customizations/project/docs-structure.md +23 -0
  170. package/src/orchestrator/customizations/project/tracker-config.md +45 -0
  171. package/src/orchestrator/customizations/project.instructions.md +64 -0
  172. package/src/orchestrator/customizations/stack/api-config.md +37 -0
  173. package/src/orchestrator/customizations/stack/cms-config.md +26 -0
  174. package/src/orchestrator/customizations/stack/data-pipeline-config.md +41 -0
  175. package/src/orchestrator/customizations/stack/database-config.md +44 -0
  176. package/src/orchestrator/customizations/stack/deployment-config.md +45 -0
  177. package/src/orchestrator/customizations/stack/testing-config.md +56 -0
  178. package/src/orchestrator/instructions/ai-optimization.instructions.md +143 -0
  179. package/src/orchestrator/instructions/general.instructions.md +194 -0
  180. package/src/orchestrator/mcp.json +55 -0
  181. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +235 -0
  182. package/src/orchestrator/prompts/brainstorm.prompt.md +115 -0
  183. package/src/orchestrator/prompts/bug-fix.prompt.md +141 -0
  184. package/src/orchestrator/prompts/create-skill.prompt.md +103 -0
  185. package/src/orchestrator/prompts/generate-task-spec.prompt.md +154 -0
  186. package/src/orchestrator/prompts/implement-feature.prompt.md +124 -0
  187. package/src/orchestrator/prompts/metrics-report.prompt.md +142 -0
  188. package/src/orchestrator/prompts/quick-refinement.prompt.md +137 -0
  189. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +100 -0
  190. package/src/orchestrator/skills/accessibility-standards/SKILL.md +164 -0
  191. package/src/orchestrator/skills/agent-hooks/SKILL.md +147 -0
  192. package/src/orchestrator/skills/agent-memory/SKILL.md +144 -0
  193. package/src/orchestrator/skills/api-patterns/SKILL.md +106 -0
  194. package/src/orchestrator/skills/browser-testing/SKILL.md +203 -0
  195. package/src/orchestrator/skills/code-commenting/SKILL.md +133 -0
  196. package/src/orchestrator/skills/contentful-cms/SKILL.md +43 -0
  197. package/src/orchestrator/skills/context-map/SKILL.md +135 -0
  198. package/src/orchestrator/skills/convex-database/SKILL.md +80 -0
  199. package/src/orchestrator/skills/data-engineering/SKILL.md +99 -0
  200. package/src/orchestrator/skills/deployment-infrastructure/SKILL.md +49 -0
  201. package/src/orchestrator/skills/documentation-standards/SKILL.md +85 -0
  202. package/src/orchestrator/skills/fast-review/SKILL.md +327 -0
  203. package/src/orchestrator/skills/frontend-design/SKILL.md +42 -0
  204. package/src/orchestrator/skills/jira-management/SKILL.md +168 -0
  205. package/src/orchestrator/skills/memory-merger/SKILL.md +123 -0
  206. package/src/orchestrator/skills/nextjs-patterns/SKILL.md +75 -0
  207. package/src/orchestrator/skills/nx-workspace/SKILL.md +192 -0
  208. package/src/orchestrator/skills/panel-majority-vote/SKILL.md +184 -0
  209. package/src/orchestrator/skills/panel-majority-vote/panel-report.template.md +38 -0
  210. package/src/orchestrator/skills/performance-optimization/SKILL.md +101 -0
  211. package/src/orchestrator/skills/react-development/SKILL.md +117 -0
  212. package/src/orchestrator/skills/sanity-cms/SKILL.md +18 -0
  213. package/src/orchestrator/skills/security-hardening/SKILL.md +118 -0
  214. package/src/orchestrator/skills/self-improvement/SKILL.md +137 -0
  215. package/src/orchestrator/skills/seo-patterns/SKILL.md +40 -0
  216. package/src/orchestrator/skills/session-checkpoints/SKILL.md +205 -0
  217. package/src/orchestrator/skills/slack-notifications/SKILL.md +211 -0
  218. package/src/orchestrator/skills/strapi-cms/SKILL.md +43 -0
  219. package/src/orchestrator/skills/supabase-database/SKILL.md +24 -0
  220. package/src/orchestrator/skills/task-management/SKILL.md +143 -0
  221. package/src/orchestrator/skills/team-lead-reference/SKILL.md +317 -0
  222. package/src/orchestrator/skills/teams-notifications/SKILL.md +249 -0
  223. package/src/orchestrator/skills/testing-workflow/SKILL.md +134 -0
  224. package/src/orchestrator/skills/validation-gates/SKILL.md +100 -0
@@ -0,0 +1,231 @@
1
+ import { resolve, basename } from 'node:path';
2
+ import { mkdir, writeFile, readdir, readFile } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { copyDir, getOrchestratorRoot, removeDirIfExists } from '../copy.js';
5
+ import { scaffoldMcpConfig } from '../mcp.js';
6
+ import { getExcludedSkills, getExcludedAgents, getCustomizationsTransform } from '../stack-config.js';
7
+ /**
8
+ * Cursor adapter.
9
+ *
10
+ * Transforms Copilot-format orchestrator files into Cursor's .mdc rule format.
11
+ *
12
+ * copilot-instructions.md → .cursorrules
13
+ * instructions/*.md → .cursor/rules/*.mdc (alwaysApply: true)
14
+ * agents/*.agent.md → .cursor/rules/agents/*.mdc (description-triggered)
15
+ * skills/\*\/SKILL.md → .cursor/rules/skills/*.mdc (alwaysApply: false)
16
+ * agent-workflows/*.md → .cursor/rules/agent-workflows/*.mdc
17
+ * prompts/*.prompt.md → .cursor/rules/prompts/*.mdc
18
+ * customizations/ → .cursor/rules/customizations/ (scaffolded once)
19
+ */
20
+ export const IDE_ID = 'cursor';
21
+ export const IDE_LABEL = 'Cursor';
22
+ function stripFrontmatter(content) {
23
+ const m = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
24
+ return m
25
+ ? { frontmatter: m[1], body: m[2] }
26
+ : { frontmatter: '', body: content };
27
+ }
28
+ function parseFrontmatter(fm) {
29
+ const result = {};
30
+ for (const line of fm.split('\n')) {
31
+ const m = line.match(/^(\w[\w-]*):\s*['"]?(.+?)['"]?\s*$/);
32
+ if (m)
33
+ result[m[1]] = m[2];
34
+ }
35
+ return result;
36
+ }
37
+ function toMdc({ description, globs, alwaysApply, body }) {
38
+ const lines = ['---'];
39
+ if (description)
40
+ lines.push(`description: "${description}"`);
41
+ if (globs)
42
+ lines.push(`globs: ${JSON.stringify(globs)}`);
43
+ lines.push(`alwaysApply: ${alwaysApply ? 'true' : 'false'}`);
44
+ lines.push('---', '', body.trim(), '');
45
+ return lines.join('\n');
46
+ }
47
+ /** Convert a source filename to .mdc, stripping intermediate extensions. */
48
+ function mdcName(name) {
49
+ // Handle compound extensions like .agent.md, .instructions.md, .prompt.md
50
+ const compound = name.replace(/\.(agent|instructions|prompt)\.md$/, '.mdc');
51
+ if (compound !== name)
52
+ return compound;
53
+ // Handle plain .md files
54
+ return name.replace(/\.md$/, '.mdc');
55
+ }
56
+ /** Read a source .md and produce an .mdc string. */
57
+ async function convertFile(srcPath, { alwaysApply = false, descriptionFallback = '' } = {}) {
58
+ const content = await readFile(srcPath, 'utf8');
59
+ const { frontmatter, body } = stripFrontmatter(content);
60
+ const meta = parseFrontmatter(frontmatter);
61
+ // Description: frontmatter > fallback > first heading
62
+ let description = meta['description'] ?? descriptionFallback;
63
+ if (!description) {
64
+ const heading = body.match(/^#\s+(.+)/m);
65
+ if (heading)
66
+ description = heading[1];
67
+ }
68
+ // If applyTo is '**' the rule should always apply
69
+ const globs = meta['applyTo'] ? [meta['applyTo']] : undefined;
70
+ const apply = meta['applyTo'] === '**' ? true : alwaysApply;
71
+ return toMdc({ description, globs, alwaysApply: apply, body: body.trim() });
72
+ }
73
+ /** Write a converted file; skip if it already exists (unless overwrite). */
74
+ async function writeConverted(srcPath, destPath, opts, results, overwrite = false) {
75
+ if (!overwrite && existsSync(destPath)) {
76
+ results.skipped.push(destPath);
77
+ return;
78
+ }
79
+ const existed = existsSync(destPath);
80
+ const mdc = await convertFile(srcPath, opts);
81
+ await writeFile(destPath, mdc);
82
+ results[existed ? 'copied' : 'created'].push(destPath);
83
+ }
84
+ // ─── Install ──────────────────────────────────────────────────────
85
+ export async function install(pkgRoot, projectRoot, stack) {
86
+ const srcRoot = getOrchestratorRoot(pkgRoot);
87
+ const results = { copied: [], skipped: [], created: [] };
88
+ const excludedSkills = stack ? getExcludedSkills(stack) : new Set();
89
+ const excludedAgents = stack ? getExcludedAgents(stack) : new Set();
90
+ // 1. .cursorrules ← copilot-instructions.md (body only)
91
+ const cursorrules = resolve(projectRoot, '.cursorrules');
92
+ if (!existsSync(cursorrules)) {
93
+ const { body } = stripFrontmatter(await readFile(resolve(srcRoot, 'copilot-instructions.md'), 'utf8'));
94
+ await writeFile(cursorrules, body.trim() + '\n');
95
+ results.created.push(cursorrules);
96
+ }
97
+ else {
98
+ results.skipped.push(cursorrules);
99
+ }
100
+ const rulesRoot = resolve(projectRoot, '.cursor', 'rules');
101
+ await mkdir(rulesRoot, { recursive: true });
102
+ // 2. Instructions → .cursor/rules/*.mdc (alwaysApply: true)
103
+ await convertDir(srcRoot, 'instructions', rulesRoot, results, {
104
+ alwaysApply: true,
105
+ });
106
+ // 3. Agents → .cursor/rules/agents/*.mdc
107
+ await convertDir(srcRoot, 'agents', resolve(rulesRoot, 'agents'), results, {
108
+ descriptionPrefix: 'Agent: ',
109
+ removeExt: '.agent.md',
110
+ excludeFiles: excludedAgents,
111
+ });
112
+ // 4. Skills → .cursor/rules/skills/*.mdc
113
+ await convertSkills(srcRoot, resolve(rulesRoot, 'skills'), results, false, excludedSkills);
114
+ // 5. Agent Workflows → .cursor/rules/agent-workflows/*.mdc
115
+ await convertDir(srcRoot, 'agent-workflows', resolve(rulesRoot, 'agent-workflows'), results, { descriptionPrefix: 'Workflow: ' });
116
+ // 6. Prompts → .cursor/rules/prompts/*.mdc
117
+ await convertDir(srcRoot, 'prompts', resolve(rulesRoot, 'prompts'), results, {
118
+ descriptionPrefix: 'Prompt: ',
119
+ removeExt: '.prompt.md',
120
+ });
121
+ // 7. Customizations (scaffold once, pre-populated with stack choices)
122
+ const custSrc = resolve(srcRoot, 'customizations');
123
+ if (existsSync(custSrc)) {
124
+ const custDest = resolve(rulesRoot, 'customizations');
125
+ const custTransform = stack ? getCustomizationsTransform(stack) : undefined;
126
+ const sub = await copyDir(custSrc, custDest, { transform: custTransform });
127
+ results.created.push(...sub.created);
128
+ results.skipped.push(...sub.skipped);
129
+ }
130
+ // 8. MCP server config → .cursor/mcp.json (scaffold once)
131
+ const mcpResult = await scaffoldMcpConfig(pkgRoot, projectRoot, '.cursor/mcp.json', stack);
132
+ results[mcpResult.action].push(mcpResult.path);
133
+ return results;
134
+ }
135
+ // ─── Update ───────────────────────────────────────────────────────
136
+ export async function update(pkgRoot, projectRoot, stack) {
137
+ const srcRoot = getOrchestratorRoot(pkgRoot);
138
+ const results = { copied: [], skipped: [], created: [] };
139
+ const excludedSkills = stack ? getExcludedSkills(stack) : new Set();
140
+ const excludedAgents = stack ? getExcludedAgents(stack) : new Set();
141
+ // Overwrite .cursorrules
142
+ const { body } = stripFrontmatter(await readFile(resolve(srcRoot, 'copilot-instructions.md'), 'utf8'));
143
+ await writeFile(resolve(projectRoot, '.cursorrules'), body.trim() + '\n');
144
+ results.copied.push('.cursorrules');
145
+ const rulesRoot = resolve(projectRoot, '.cursor', 'rules');
146
+ // Remove existing framework rule directories to clear stale files
147
+ const FRAMEWORK_RULE_DIRS = ['agents', 'skills', 'agent-workflows', 'prompts'];
148
+ for (const dir of FRAMEWORK_RULE_DIRS) {
149
+ await removeDirIfExists(resolve(rulesRoot, dir));
150
+ }
151
+ // Overwrite framework rules
152
+ await convertDir(srcRoot, 'instructions', rulesRoot, results, {
153
+ alwaysApply: true,
154
+ overwrite: true,
155
+ });
156
+ await convertDir(srcRoot, 'agents', resolve(rulesRoot, 'agents'), results, { descriptionPrefix: 'Agent: ', removeExt: '.agent.md', overwrite: true, excludeFiles: excludedAgents });
157
+ await convertSkills(srcRoot, resolve(rulesRoot, 'skills'), results, true, excludedSkills);
158
+ await convertDir(srcRoot, 'agent-workflows', resolve(rulesRoot, 'agent-workflows'), results, { descriptionPrefix: 'Workflow: ', overwrite: true });
159
+ await convertDir(srcRoot, 'prompts', resolve(rulesRoot, 'prompts'), results, { descriptionPrefix: 'Prompt: ', removeExt: '.prompt.md', overwrite: true });
160
+ // Customizations are NEVER overwritten.
161
+ // All re-installed framework files count as "updated" (copied), not "created"
162
+ results.copied.push(...results.created);
163
+ results.created = [];
164
+ return results;
165
+ }
166
+ // ─── Managed paths ────────────────────────────────────────────────
167
+ export function getManagedPaths() {
168
+ return {
169
+ framework: [
170
+ '.cursorrules',
171
+ '.cursor/rules/agents/',
172
+ '.cursor/rules/skills/',
173
+ '.cursor/rules/agent-workflows/',
174
+ '.cursor/rules/prompts/',
175
+ '.cursor/rules/general.mdc',
176
+ '.cursor/rules/ai-optimization.mdc',
177
+ ],
178
+ customizable: [
179
+ '.cursor/rules/customizations/',
180
+ '.cursor/mcp.json',
181
+ ],
182
+ };
183
+ }
184
+ async function convertDir(srcRoot, dirName, destDir, results, { alwaysApply, descriptionPrefix, removeExt, overwrite, excludeFiles, } = {}) {
185
+ const srcDir = resolve(srcRoot, dirName);
186
+ if (!existsSync(srcDir))
187
+ return;
188
+ await mkdir(destDir, { recursive: true });
189
+ for (const file of await readdir(srcDir)) {
190
+ if (!file.endsWith('.md'))
191
+ continue;
192
+ if (excludeFiles?.has(file))
193
+ continue;
194
+ const fallback = descriptionPrefix
195
+ ? `${descriptionPrefix}${basename(file, removeExt ?? '.md')}`
196
+ : '';
197
+ const destPath = resolve(destDir, mdcName(file));
198
+ await writeConverted(resolve(srcDir, file), destPath, { alwaysApply: alwaysApply ?? false, descriptionFallback: fallback }, results, overwrite);
199
+ }
200
+ }
201
+ async function convertSkills(srcRoot, destDir, results, overwrite = false, excludedSkills) {
202
+ const skillsDir = resolve(srcRoot, 'skills');
203
+ if (!existsSync(skillsDir))
204
+ return;
205
+ await mkdir(destDir, { recursive: true });
206
+ const subdirs = await readdir(skillsDir, { withFileTypes: true });
207
+ for (const entry of subdirs) {
208
+ if (!entry.isDirectory())
209
+ continue;
210
+ if (excludedSkills?.has(entry.name))
211
+ continue;
212
+ const skillFile = resolve(skillsDir, entry.name, 'SKILL.md');
213
+ if (!existsSync(skillFile))
214
+ continue;
215
+ // Main skill → skills/<name>.mdc
216
+ const destPath = resolve(destDir, `${entry.name}.mdc`);
217
+ await writeConverted(skillFile, destPath, { descriptionFallback: `Skill: ${entry.name}` }, results, overwrite);
218
+ // Extra files in the skill directory (e.g. templates)
219
+ const files = await readdir(resolve(skillsDir, entry.name));
220
+ const extras = files.filter((f) => f !== 'SKILL.md' && f.endsWith('.md'));
221
+ if (extras.length > 0) {
222
+ const subDest = resolve(destDir, entry.name);
223
+ await mkdir(subDest, { recursive: true });
224
+ for (const file of extras) {
225
+ const extraDest = resolve(subDest, mdcName(file));
226
+ await writeConverted(resolve(skillsDir, entry.name, file), extraDest, { descriptionFallback: `${entry.name}: ${basename(file, '.md')}` }, results, overwrite);
227
+ }
228
+ }
229
+ }
230
+ }
231
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/cli/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CopyResults, ManagedPaths, StackConfig } from '../types.js';
2
+ /**
3
+ * VS Code / GitHub Copilot adapter.
4
+ *
5
+ * This is the **native format** — the orchestrator source files map 1:1.
6
+ *
7
+ * copilot-instructions.md → .github/copilot-instructions.md
8
+ * agents/ → .github/agents/
9
+ * instructions/ → .github/instructions/
10
+ * skills/ → .github/skills/
11
+ * agent-workflows/ → .github/agent-workflows/
12
+ * prompts/ → .github/prompts/
13
+ * customizations/ → .github/customizations/ (scaffolded once)
14
+ */
15
+ export declare const IDE_ID = "vscode";
16
+ export declare const IDE_LABEL = "VS Code (GitHub Copilot)";
17
+ export declare function install(pkgRoot: string, projectRoot: string, stack?: StackConfig): Promise<CopyResults>;
18
+ export declare function update(pkgRoot: string, projectRoot: string, stack?: StackConfig): Promise<CopyResults>;
19
+ export declare function getManagedPaths(): ManagedPaths;
20
+ //# sourceMappingURL=vscode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.d.ts","sourceRoot":"","sources":["../../../src/cli/adapters/vscode.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzE;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,eAAO,MAAM,SAAS,6BAA6B,CAAA;AAcnD,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA+DtB;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CA4CtB;AAED,wBAAgB,eAAe,IAAI,YAAY,CAW9C"}
@@ -0,0 +1,132 @@
1
+ import { resolve } from 'node:path';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { copyDir, getOrchestratorRoot, removeDirIfExists } from '../copy.js';
5
+ import { scaffoldMcpConfig } from '../mcp.js';
6
+ import { getExcludedSkills, getExcludedAgents, getCustomizationsTransform } from '../stack-config.js';
7
+ /**
8
+ * VS Code / GitHub Copilot adapter.
9
+ *
10
+ * This is the **native format** — the orchestrator source files map 1:1.
11
+ *
12
+ * copilot-instructions.md → .github/copilot-instructions.md
13
+ * agents/ → .github/agents/
14
+ * instructions/ → .github/instructions/
15
+ * skills/ → .github/skills/
16
+ * agent-workflows/ → .github/agent-workflows/
17
+ * prompts/ → .github/prompts/
18
+ * customizations/ → .github/customizations/ (scaffolded once)
19
+ */
20
+ export const IDE_ID = 'vscode';
21
+ export const IDE_LABEL = 'VS Code (GitHub Copilot)';
22
+ /** Directories whose contents are framework-managed (overwritten on update). */
23
+ const FRAMEWORK_DIRS = [
24
+ 'agents',
25
+ 'instructions',
26
+ 'skills',
27
+ 'agent-workflows',
28
+ 'prompts',
29
+ ];
30
+ /** Directories scaffolded once and never overwritten. */
31
+ const CUSTOMIZABLE_DIRS = ['customizations'];
32
+ export async function install(pkgRoot, projectRoot, stack) {
33
+ const srcRoot = getOrchestratorRoot(pkgRoot);
34
+ const destRoot = resolve(projectRoot, '.github');
35
+ await mkdir(destRoot, { recursive: true });
36
+ const results = { copied: [], skipped: [], created: [] };
37
+ const excludedSkills = stack ? getExcludedSkills(stack) : new Set();
38
+ const excludedAgents = stack ? getExcludedAgents(stack) : new Set();
39
+ // copilot-instructions.md
40
+ const copilotSrc = resolve(srcRoot, 'copilot-instructions.md');
41
+ const copilotDest = resolve(destRoot, 'copilot-instructions.md');
42
+ if (!existsSync(copilotDest)) {
43
+ await writeFile(copilotDest, await readFile(copilotSrc, 'utf8'));
44
+ results.created.push(copilotDest);
45
+ }
46
+ else {
47
+ results.skipped.push(copilotDest);
48
+ }
49
+ // Framework directories
50
+ for (const dir of FRAMEWORK_DIRS) {
51
+ const srcDir = resolve(srcRoot, dir);
52
+ if (!existsSync(srcDir))
53
+ continue;
54
+ const destDir = resolve(destRoot, dir);
55
+ // Build filter based on directory type
56
+ let filter;
57
+ if (dir === 'skills') {
58
+ filter = (name) => !excludedSkills.has(name);
59
+ }
60
+ else if (dir === 'agents') {
61
+ filter = (name) => !excludedAgents.has(name);
62
+ }
63
+ const sub = await copyDir(srcDir, destDir, { filter });
64
+ results.copied.push(...sub.copied);
65
+ results.skipped.push(...sub.skipped);
66
+ results.created.push(...sub.created);
67
+ }
68
+ // Customization templates (scaffold once)
69
+ const custTransform = stack ? getCustomizationsTransform(stack) : undefined;
70
+ for (const dir of CUSTOMIZABLE_DIRS) {
71
+ const srcDir = resolve(srcRoot, dir);
72
+ if (!existsSync(srcDir))
73
+ continue;
74
+ const destDir = resolve(destRoot, dir);
75
+ const sub = await copyDir(srcDir, destDir, { transform: custTransform });
76
+ results.copied.push(...sub.copied);
77
+ results.skipped.push(...sub.skipped);
78
+ results.created.push(...sub.created);
79
+ }
80
+ // MCP server config → .vscode/mcp.json (scaffold once)
81
+ const mcpResult = await scaffoldMcpConfig(pkgRoot, projectRoot, '.vscode/mcp.json', stack);
82
+ results[mcpResult.action].push(mcpResult.path);
83
+ return results;
84
+ }
85
+ export async function update(pkgRoot, projectRoot, stack) {
86
+ const srcRoot = getOrchestratorRoot(pkgRoot);
87
+ const destRoot = resolve(projectRoot, '.github');
88
+ const results = { copied: [], skipped: [], created: [] };
89
+ const excludedSkills = stack ? getExcludedSkills(stack) : new Set();
90
+ const excludedAgents = stack ? getExcludedAgents(stack) : new Set();
91
+ // Overwrite copilot-instructions.md
92
+ const copilotDest = resolve(destRoot, 'copilot-instructions.md');
93
+ await writeFile(copilotDest, await readFile(resolve(srcRoot, 'copilot-instructions.md'), 'utf8'));
94
+ results.copied.push(copilotDest);
95
+ // Remove existing framework directories to clear stale files
96
+ for (const dir of FRAMEWORK_DIRS) {
97
+ await removeDirIfExists(resolve(destRoot, dir));
98
+ }
99
+ // Re-copy framework directories
100
+ for (const dir of FRAMEWORK_DIRS) {
101
+ const srcDir = resolve(srcRoot, dir);
102
+ if (!existsSync(srcDir))
103
+ continue;
104
+ const destDir = resolve(destRoot, dir);
105
+ let filter;
106
+ if (dir === 'skills') {
107
+ filter = (name) => !excludedSkills.has(name);
108
+ }
109
+ else if (dir === 'agents') {
110
+ filter = (name) => !excludedAgents.has(name);
111
+ }
112
+ const sub = await copyDir(srcDir, destDir, { overwrite: true, filter });
113
+ // All re-installed framework files count as "updated" (copied), not "created"
114
+ results.copied.push(...sub.copied, ...sub.created);
115
+ results.skipped.push(...sub.skipped);
116
+ }
117
+ // Customizations are NEVER overwritten during update.
118
+ return results;
119
+ }
120
+ export function getManagedPaths() {
121
+ return {
122
+ framework: [
123
+ '.github/copilot-instructions.md',
124
+ ...FRAMEWORK_DIRS.map((d) => `.github/${d}/`),
125
+ ],
126
+ customizable: [
127
+ ...CUSTOMIZABLE_DIRS.map((d) => `.github/${d}/`),
128
+ '.vscode/mcp.json',
129
+ ],
130
+ };
131
+ }
132
+ //# sourceMappingURL=vscode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../../src/cli/adapters/vscode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CopyResults, CopyDirOptions } from './types.js';
2
+ /**
3
+ * Recursively copy a directory tree.
4
+ */
5
+ export declare function copyDir(src: string, dest: string, { overwrite, filter, transform }?: CopyDirOptions): Promise<CopyResults>;
6
+ /**
7
+ * Resolve the orchestrator source directory from the CLI package root.
8
+ */
9
+ export declare function getOrchestratorRoot(pkgRoot: string): string;
10
+ /**
11
+ * Remove a directory if it exists. No-op if it doesn't.
12
+ */
13
+ export declare function removeDirIfExists(dirPath: string): Promise<void>;
14
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/cli/copy.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,EAAE,SAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAE,cAAmB,GAC5D,OAAO,CAAC,WAAW,CAAC,CA2CtB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE"}
@@ -0,0 +1,62 @@
1
+ import { readdir, readFile, mkdir, writeFile, copyFile, rm, } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ /**
5
+ * Recursively copy a directory tree.
6
+ */
7
+ export async function copyDir(src, dest, { overwrite = false, filter, transform } = {}) {
8
+ const entries = await readdir(src, { withFileTypes: true });
9
+ await mkdir(dest, { recursive: true });
10
+ const results = { copied: [], skipped: [], created: [] };
11
+ for (const entry of entries) {
12
+ const srcPath = resolve(src, entry.name);
13
+ const destPath = resolve(dest, entry.name);
14
+ if (filter && !filter(entry.name, srcPath))
15
+ continue;
16
+ if (entry.isDirectory()) {
17
+ const sub = await copyDir(srcPath, destPath, {
18
+ overwrite,
19
+ filter,
20
+ transform,
21
+ });
22
+ results.copied.push(...sub.copied);
23
+ results.skipped.push(...sub.skipped);
24
+ results.created.push(...sub.created);
25
+ }
26
+ else {
27
+ const exists = existsSync(destPath);
28
+ if (exists && !overwrite) {
29
+ results.skipped.push(destPath);
30
+ continue;
31
+ }
32
+ if (transform) {
33
+ const content = await readFile(srcPath, 'utf8');
34
+ const transformed = await transform(content, srcPath);
35
+ if (transformed !== null) {
36
+ await writeFile(destPath, transformed);
37
+ results[exists ? 'copied' : 'created'].push(destPath);
38
+ }
39
+ }
40
+ else {
41
+ await copyFile(srcPath, destPath);
42
+ results[exists ? 'copied' : 'created'].push(destPath);
43
+ }
44
+ }
45
+ }
46
+ return results;
47
+ }
48
+ /**
49
+ * Resolve the orchestrator source directory from the CLI package root.
50
+ */
51
+ export function getOrchestratorRoot(pkgRoot) {
52
+ return resolve(pkgRoot, 'src', 'orchestrator');
53
+ }
54
+ /**
55
+ * Remove a directory if it exists. No-op if it doesn't.
56
+ */
57
+ export async function removeDirIfExists(dirPath) {
58
+ if (existsSync(dirPath)) {
59
+ await rm(dirPath, { recursive: true });
60
+ }
61
+ }
62
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/cli/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliContext } from './types.js';
2
+ export default function dashboard({ pkgRoot, args, }: CliContext): Promise<void>;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +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;AA4F5C,wBAA8B,SAAS,CAAC,EACtC,OAAO,EACP,IAAI,GACL,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4H5B"}