opencastle 0.5.1 → 0.7.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 (231) hide show
  1. package/README.md +5 -4
  2. package/dist/cli/adapters/claude-code.d.ts +2 -2
  3. package/dist/cli/adapters/claude-code.d.ts.map +1 -1
  4. package/dist/cli/adapters/claude-code.js +31 -4
  5. package/dist/cli/adapters/claude-code.js.map +1 -1
  6. package/dist/cli/adapters/cursor.d.ts +2 -2
  7. package/dist/cli/adapters/cursor.d.ts.map +1 -1
  8. package/dist/cli/adapters/cursor.js +28 -4
  9. package/dist/cli/adapters/cursor.js.map +1 -1
  10. package/dist/cli/adapters/opencode.d.ts +20 -0
  11. package/dist/cli/adapters/opencode.d.ts.map +1 -0
  12. package/dist/cli/adapters/opencode.js +265 -0
  13. package/dist/cli/adapters/opencode.js.map +1 -0
  14. package/dist/cli/adapters/vscode.d.ts +2 -2
  15. package/dist/cli/adapters/vscode.d.ts.map +1 -1
  16. package/dist/cli/adapters/vscode.js +38 -7
  17. package/dist/cli/adapters/vscode.js.map +1 -1
  18. package/dist/cli/copy.d.ts +12 -0
  19. package/dist/cli/copy.d.ts.map +1 -1
  20. package/dist/cli/copy.js +27 -0
  21. package/dist/cli/copy.js.map +1 -1
  22. package/dist/cli/detect.d.ts +18 -0
  23. package/dist/cli/detect.d.ts.map +1 -0
  24. package/dist/cli/detect.js +434 -0
  25. package/dist/cli/detect.js.map +1 -0
  26. package/dist/cli/gitignore.d.ts.map +1 -1
  27. package/dist/cli/gitignore.js +0 -2
  28. package/dist/cli/gitignore.js.map +1 -1
  29. package/dist/cli/init.d.ts.map +1 -1
  30. package/dist/cli/init.js +154 -91
  31. package/dist/cli/init.js.map +1 -1
  32. package/dist/cli/manifest.d.ts +1 -1
  33. package/dist/cli/manifest.d.ts.map +1 -1
  34. package/dist/cli/manifest.js +2 -1
  35. package/dist/cli/manifest.js.map +1 -1
  36. package/dist/cli/mcp.d.ts +6 -6
  37. package/dist/cli/mcp.d.ts.map +1 -1
  38. package/dist/cli/mcp.js +105 -34
  39. package/dist/cli/mcp.js.map +1 -1
  40. package/dist/cli/prompt.d.ts +22 -0
  41. package/dist/cli/prompt.d.ts.map +1 -1
  42. package/dist/cli/prompt.js +239 -0
  43. package/dist/cli/prompt.js.map +1 -1
  44. package/dist/cli/stack-config.d.ts +26 -3
  45. package/dist/cli/stack-config.d.ts.map +1 -1
  46. package/dist/cli/stack-config.js +140 -125
  47. package/dist/cli/stack-config.js.map +1 -1
  48. package/dist/cli/types.d.ts +46 -10
  49. package/dist/cli/types.d.ts.map +1 -1
  50. package/dist/cli/types.js +26 -1
  51. package/dist/cli/types.js.map +1 -1
  52. package/dist/cli/update.d.ts.map +1 -1
  53. package/dist/cli/update.js +66 -19
  54. package/dist/cli/update.js.map +1 -1
  55. package/dist/orchestrator/plugins/chrome-devtools/config.d.ts +3 -0
  56. package/dist/orchestrator/plugins/chrome-devtools/config.d.ts.map +1 -0
  57. package/dist/orchestrator/plugins/chrome-devtools/config.js +28 -0
  58. package/dist/orchestrator/plugins/chrome-devtools/config.js.map +1 -0
  59. package/dist/orchestrator/plugins/contentful/config.d.ts +3 -0
  60. package/dist/orchestrator/plugins/contentful/config.d.ts.map +1 -0
  61. package/dist/orchestrator/plugins/contentful/config.js +48 -0
  62. package/dist/orchestrator/plugins/contentful/config.js.map +1 -0
  63. package/dist/orchestrator/plugins/convex/config.d.ts +3 -0
  64. package/dist/orchestrator/plugins/convex/config.d.ts.map +1 -0
  65. package/dist/orchestrator/plugins/convex/config.js +32 -0
  66. package/dist/orchestrator/plugins/convex/config.js.map +1 -0
  67. package/dist/orchestrator/plugins/index.d.ts +28 -0
  68. package/dist/orchestrator/plugins/index.d.ts.map +1 -0
  69. package/dist/orchestrator/plugins/index.js +63 -0
  70. package/dist/orchestrator/plugins/index.js.map +1 -0
  71. package/dist/orchestrator/plugins/jira/config.d.ts +3 -0
  72. package/dist/orchestrator/plugins/jira/config.d.ts.map +1 -0
  73. package/dist/orchestrator/plugins/jira/config.js +29 -0
  74. package/dist/orchestrator/plugins/jira/config.js.map +1 -0
  75. package/dist/orchestrator/plugins/linear/config.d.ts +3 -0
  76. package/dist/orchestrator/plugins/linear/config.d.ts.map +1 -0
  77. package/dist/orchestrator/plugins/linear/config.js +33 -0
  78. package/dist/orchestrator/plugins/linear/config.js.map +1 -0
  79. package/dist/orchestrator/plugins/nx/config.d.ts +3 -0
  80. package/dist/orchestrator/plugins/nx/config.d.ts.map +1 -0
  81. package/dist/orchestrator/plugins/nx/config.js +28 -0
  82. package/dist/orchestrator/plugins/nx/config.js.map +1 -0
  83. package/dist/orchestrator/plugins/sanity/config.d.ts +3 -0
  84. package/dist/orchestrator/plugins/sanity/config.d.ts.map +1 -0
  85. package/dist/orchestrator/plugins/sanity/config.js +43 -0
  86. package/dist/orchestrator/plugins/sanity/config.js.map +1 -0
  87. package/dist/orchestrator/plugins/slack/config.d.ts +3 -0
  88. package/dist/orchestrator/plugins/slack/config.d.ts.map +1 -0
  89. package/dist/orchestrator/plugins/slack/config.js +34 -0
  90. package/dist/orchestrator/plugins/slack/config.js.map +1 -0
  91. package/dist/orchestrator/plugins/strapi/config.d.ts +3 -0
  92. package/dist/orchestrator/plugins/strapi/config.d.ts.map +1 -0
  93. package/dist/orchestrator/plugins/strapi/config.js +40 -0
  94. package/dist/orchestrator/plugins/strapi/config.js.map +1 -0
  95. package/dist/orchestrator/plugins/supabase/config.d.ts +3 -0
  96. package/dist/orchestrator/plugins/supabase/config.d.ts.map +1 -0
  97. package/dist/orchestrator/plugins/supabase/config.js +33 -0
  98. package/dist/orchestrator/plugins/supabase/config.js.map +1 -0
  99. package/dist/orchestrator/plugins/teams/config.d.ts +3 -0
  100. package/dist/orchestrator/plugins/teams/config.d.ts.map +1 -0
  101. package/dist/orchestrator/plugins/teams/config.js +43 -0
  102. package/dist/orchestrator/plugins/teams/config.js.map +1 -0
  103. package/dist/orchestrator/plugins/types.d.ts +61 -0
  104. package/dist/orchestrator/plugins/types.d.ts.map +1 -0
  105. package/dist/orchestrator/plugins/types.js +2 -0
  106. package/dist/orchestrator/plugins/types.js.map +1 -0
  107. package/dist/orchestrator/plugins/vercel/config.d.ts +3 -0
  108. package/dist/orchestrator/plugins/vercel/config.d.ts.map +1 -0
  109. package/dist/orchestrator/plugins/vercel/config.js +32 -0
  110. package/dist/orchestrator/plugins/vercel/config.js.map +1 -0
  111. package/package.json +1 -1
  112. package/src/cli/adapters/claude-code.ts +40 -6
  113. package/src/cli/adapters/cursor.ts +46 -6
  114. package/src/cli/adapters/opencode.ts +320 -0
  115. package/src/cli/adapters/vscode.ts +43 -9
  116. package/src/cli/copy.ts +32 -0
  117. package/src/cli/detect.ts +483 -0
  118. package/src/cli/gitignore.ts +0 -3
  119. package/src/cli/init.ts +169 -96
  120. package/src/cli/manifest.ts +2 -1
  121. package/src/cli/mcp.ts +131 -51
  122. package/src/cli/prompt.ts +299 -0
  123. package/src/cli/stack-config.ts +187 -145
  124. package/src/cli/types.ts +60 -9
  125. package/src/cli/update.ts +78 -20
  126. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  127. package/src/orchestrator/agent-workflows/README.md +1 -1
  128. package/src/orchestrator/agent-workflows/bug-fix.md +12 -12
  129. package/src/orchestrator/agent-workflows/data-pipeline.md +21 -20
  130. package/src/orchestrator/agent-workflows/database-migration.md +11 -11
  131. package/src/orchestrator/agent-workflows/feature-implementation.md +10 -10
  132. package/src/orchestrator/agent-workflows/performance-optimization.md +6 -6
  133. package/src/orchestrator/agent-workflows/refactoring.md +10 -10
  134. package/src/orchestrator/agent-workflows/schema-changes.md +8 -8
  135. package/src/orchestrator/agent-workflows/security-audit.md +12 -12
  136. package/src/orchestrator/agent-workflows/shared-delivery-phase.md +5 -5
  137. package/src/orchestrator/agents/api-designer.agent.md +2 -2
  138. package/src/orchestrator/agents/architect.agent.md +2 -2
  139. package/src/orchestrator/agents/content-engineer.agent.md +4 -4
  140. package/src/orchestrator/agents/copywriter.agent.md +2 -2
  141. package/src/orchestrator/agents/data-expert.agent.md +6 -6
  142. package/src/orchestrator/agents/database-engineer.agent.md +4 -4
  143. package/src/orchestrator/agents/developer.agent.md +5 -5
  144. package/src/orchestrator/agents/devops-expert.agent.md +5 -5
  145. package/src/orchestrator/agents/documentation-writer.agent.md +1 -1
  146. package/src/orchestrator/agents/performance-expert.agent.md +3 -3
  147. package/src/orchestrator/agents/release-manager.agent.md +4 -4
  148. package/src/orchestrator/agents/researcher.agent.md +19 -3
  149. package/src/orchestrator/agents/reviewer.agent.md +2 -4
  150. package/src/orchestrator/agents/security-expert.agent.md +4 -4
  151. package/src/orchestrator/agents/seo-specialist.agent.md +2 -2
  152. package/src/orchestrator/agents/team-lead.agent.md +97 -101
  153. package/src/orchestrator/agents/testing-expert.agent.md +5 -5
  154. package/src/orchestrator/agents/ui-ux-expert.agent.md +7 -7
  155. package/src/orchestrator/copilot-instructions.md +1 -1
  156. package/src/orchestrator/customizations/AGENT-FAILURES.md +1 -1
  157. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +12 -12
  158. package/src/orchestrator/customizations/DISPUTES.md +5 -5
  159. package/src/orchestrator/customizations/KNOWN-ISSUES.md +30 -0
  160. package/src/orchestrator/customizations/LESSONS-LEARNED.md +7 -7
  161. package/src/orchestrator/customizations/README.md +5 -2
  162. package/src/orchestrator/customizations/agents/agent-registry.md +1 -1
  163. package/src/orchestrator/customizations/agents/skill-matrix.md +12 -7
  164. package/src/orchestrator/customizations/logs/README.md +1 -1
  165. package/src/orchestrator/customizations/project/decisions.md +31 -0
  166. package/src/orchestrator/customizations/project/docs-structure.md +16 -5
  167. package/src/orchestrator/customizations/project/roadmap.md +24 -0
  168. package/src/orchestrator/customizations/project/tracker-config.md +1 -1
  169. package/src/orchestrator/customizations/stack/cms-config.md +1 -1
  170. package/src/orchestrator/customizations/stack/notifications-config.md +1 -1
  171. package/src/orchestrator/instructions/ai-optimization.instructions.md +2 -2
  172. package/src/orchestrator/instructions/general.instructions.md +102 -40
  173. package/src/orchestrator/{skills/browser-testing → plugins/chrome-devtools}/SKILL.md +1 -1
  174. package/src/orchestrator/plugins/chrome-devtools/config.ts +29 -0
  175. package/src/orchestrator/{skills/contentful-cms → plugins/contentful}/SKILL.md +1 -1
  176. package/src/orchestrator/plugins/contentful/config.ts +49 -0
  177. package/src/orchestrator/{skills/convex-database → plugins/convex}/SKILL.md +1 -1
  178. package/src/orchestrator/plugins/convex/config.ts +33 -0
  179. package/src/orchestrator/plugins/index.ts +85 -0
  180. package/src/orchestrator/{skills/jira-management → plugins/jira}/SKILL.md +3 -3
  181. package/src/orchestrator/plugins/jira/config.ts +30 -0
  182. package/src/orchestrator/{skills/task-management → plugins/linear}/SKILL.md +3 -3
  183. package/src/orchestrator/plugins/linear/config.ts +34 -0
  184. package/src/orchestrator/{skills/nx-workspace → plugins/nx}/SKILL.md +1 -1
  185. package/src/orchestrator/plugins/nx/config.ts +29 -0
  186. package/src/orchestrator/{skills/sanity-cms → plugins/sanity}/SKILL.md +1 -1
  187. package/src/orchestrator/plugins/sanity/config.ts +44 -0
  188. package/src/orchestrator/{skills/slack-notifications → plugins/slack}/SKILL.md +2 -2
  189. package/src/orchestrator/plugins/slack/config.ts +35 -0
  190. package/src/orchestrator/{skills/strapi-cms → plugins/strapi}/SKILL.md +1 -1
  191. package/src/orchestrator/plugins/strapi/config.ts +41 -0
  192. package/src/orchestrator/{skills/supabase-database → plugins/supabase}/SKILL.md +1 -1
  193. package/src/orchestrator/plugins/supabase/config.ts +34 -0
  194. package/src/orchestrator/{skills/teams-notifications → plugins/teams}/SKILL.md +2 -2
  195. package/src/orchestrator/plugins/teams/config.ts +44 -0
  196. package/src/orchestrator/plugins/types.ts +79 -0
  197. package/src/orchestrator/plugins/vercel/config.ts +33 -0
  198. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +59 -12
  199. package/src/orchestrator/prompts/brainstorm.prompt.md +3 -3
  200. package/src/orchestrator/prompts/bug-fix.prompt.md +18 -18
  201. package/src/orchestrator/prompts/create-skill.prompt.md +50 -32
  202. package/src/orchestrator/prompts/generate-task-spec.prompt.md +3 -3
  203. package/src/orchestrator/prompts/implement-feature.prompt.md +26 -26
  204. package/src/orchestrator/prompts/metrics-report.prompt.md +11 -11
  205. package/src/orchestrator/prompts/quick-refinement.prompt.md +16 -16
  206. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +2 -2
  207. package/src/orchestrator/skills/accessibility-standards/SKILL.md +1 -1
  208. package/src/orchestrator/skills/agent-hooks/SKILL.md +27 -18
  209. package/src/orchestrator/skills/agent-memory/SKILL.md +7 -7
  210. package/src/orchestrator/skills/api-patterns/SKILL.md +6 -6
  211. package/src/orchestrator/skills/code-commenting/SKILL.md +1 -1
  212. package/src/orchestrator/skills/context-map/SKILL.md +4 -4
  213. package/src/orchestrator/skills/data-engineering/SKILL.md +7 -4
  214. package/src/orchestrator/skills/deployment-infrastructure/SKILL.md +2 -2
  215. package/src/orchestrator/skills/documentation-standards/SKILL.md +1 -1
  216. package/src/orchestrator/skills/fast-review/SKILL.md +3 -3
  217. package/src/orchestrator/skills/frontend-design/SKILL.md +1 -1
  218. package/src/orchestrator/skills/memory-merger/SKILL.md +8 -8
  219. package/src/orchestrator/skills/nextjs-patterns/SKILL.md +1 -1
  220. package/src/orchestrator/skills/panel-majority-vote/SKILL.md +2 -2
  221. package/src/orchestrator/skills/panel-majority-vote/panel-report.template.md +1 -1
  222. package/src/orchestrator/skills/performance-optimization/SKILL.md +1 -1
  223. package/src/orchestrator/skills/react-development/SKILL.md +3 -3
  224. package/src/orchestrator/skills/security-hardening/SKILL.md +27 -27
  225. package/src/orchestrator/skills/self-improvement/SKILL.md +14 -13
  226. package/src/orchestrator/skills/seo-patterns/SKILL.md +1 -1
  227. package/src/orchestrator/skills/session-checkpoints/SKILL.md +19 -19
  228. package/src/orchestrator/skills/team-lead-reference/SKILL.md +9 -9
  229. package/src/orchestrator/skills/testing-workflow/SKILL.md +13 -13
  230. package/src/orchestrator/skills/validation-gates/SKILL.md +8 -15
  231. package/src/orchestrator/mcp.json +0 -61
package/dist/cli/init.js CHANGED
@@ -1,15 +1,25 @@
1
1
  import { resolve } from 'node:path';
2
2
  import { readFile, unlink } from 'node:fs/promises';
3
3
  import { existsSync } from 'node:fs';
4
- import { select, confirm, closePrompts } from './prompt.js';
4
+ import { multiselect, confirm, closePrompts, c } from './prompt.js';
5
5
  import { readManifest, writeManifest, createManifest } from './manifest.js';
6
6
  import { removeDirIfExists } from './copy.js';
7
7
  import { updateGitignore } from './gitignore.js';
8
8
  import { getRequiredMcpEnvVars } from './stack-config.js';
9
+ import { TECH_PLUGINS, TEAM_PLUGINS } from '../orchestrator/plugins/index.js';
10
+ import { detectRepoInfo, mergeStackIntoRepoInfo, formatRepoInfo } from './detect.js';
9
11
  const ADAPTERS = {
10
12
  vscode: () => import('./adapters/vscode.js'),
11
13
  cursor: () => import('./adapters/cursor.js'),
12
14
  'claude-code': () => import('./adapters/claude-code.js'),
15
+ opencode: () => import('./adapters/opencode.js'),
16
+ };
17
+ /** IDE display labels */
18
+ const IDE_DISPLAY = {
19
+ vscode: 'VS Code',
20
+ cursor: 'Cursor',
21
+ 'claude-code': 'Claude Code',
22
+ opencode: 'OpenCode',
13
23
  };
14
24
  export default async function init({ pkgRoot, args }) {
15
25
  const projectRoot = process.cwd();
@@ -18,7 +28,7 @@ export default async function init({ pkgRoot, args }) {
18
28
  const existing = await readManifest(projectRoot);
19
29
  let isReinit = false;
20
30
  if (existing) {
21
- const proceed = await confirm(`OpenCastle already installed (v${existing.version}, ${existing.ide}). Re-initialize?`, false);
31
+ const proceed = await confirm(`OpenCastle already installed (v${existing.version}). Re-initialize?`, false);
22
32
  if (!proceed) {
23
33
  console.log(' Aborted.');
24
34
  return;
@@ -26,68 +36,103 @@ export default async function init({ pkgRoot, args }) {
26
36
  isReinit = true;
27
37
  }
28
38
  const pkg = JSON.parse(await readFile(resolve(pkgRoot, 'package.json'), 'utf8'));
29
- console.log(`\n 🏰 OpenCastle v${pkg.version}`);
30
- console.log(' Multi-agent orchestration framework for AI coding assistants\n');
31
- // ── IDE selection ───────────────────────────────────────────────
32
- const ide = await select('Which IDE are you using?', [
33
- {
34
- label: 'VS Code',
35
- hint: 'GitHub Copilot — .github/ agents, instructions, skills',
36
- value: 'vscode',
37
- },
38
- {
39
- label: 'Cursor',
40
- hint: '.cursorrules & .cursor/rules/*.mdc',
41
- value: 'cursor',
42
- },
43
- {
44
- label: 'Claude Code',
45
- hint: 'CLAUDE.md & .claude/ commands, skills',
46
- value: 'claude-code',
47
- },
48
- ]);
49
- // ── CMS selection ───────────────────────────────────────────────
50
- const cms = await select('Which CMS are you using?', [
51
- { label: 'Sanity', hint: 'GROQ queries, real-time collaboration', value: 'sanity' },
52
- { label: 'Contentful', hint: 'GraphQL / REST API, structured content', value: 'contentful' },
53
- { label: 'Strapi', hint: 'Open-source headless CMS', value: 'strapi' },
54
- { label: 'None', hint: 'No CMS — skip CMS skills and agents', value: 'none' },
55
- ]);
56
- // ── Database selection ──────────────────────────────────────────
57
- const db = await select('Which database are you using?', [
58
- { label: 'Supabase', hint: 'Postgres + Auth + RLS + Edge Functions', value: 'supabase' },
59
- { label: 'Convex', hint: 'Reactive backend with real-time sync', value: 'convex' },
60
- { label: 'None', hint: 'No database — skip DB skills and agents', value: 'none' },
61
- ]);
62
- // ── Project management selection ────────────────────────────────
63
- const pm = await select('Which project management tool are you using?', [
64
- { label: 'Linear', hint: 'Issue tracking with MCP integration', value: 'linear' },
65
- { label: 'Jira', hint: 'Atlassian issue tracking via Rovo MCP', value: 'jira' },
66
- { label: 'None', hint: 'No project management — skip PM skills', value: 'none' },
67
- ]);
68
- // ── Notifications selection ────────────────────────────────────
69
- const notifications = await select('Which notifications tool are you using?', [
70
- { label: 'Slack', hint: 'Agent notifications and bi-directional communication', value: 'slack' },
71
- { label: 'Microsoft Teams', hint: 'Agent notifications via Teams channels', value: 'teams' },
72
- { label: 'None', hint: 'No notifications skip messaging skills', value: 'none' },
39
+ console.log(`\n 🏰 ${c.bold('OpenCastle')} ${c.dim(`v${pkg.version}`)}`);
40
+ console.log(` ${c.dim('Multi-agent orchestration framework for AI coding assistants')}\n`);
41
+ // ── Repo research ───────────────────────────────────────────────
42
+ console.log(` ${c.dim('Scanning repository...')}`);
43
+ const repoInfo = await detectRepoInfo(projectRoot);
44
+ const summary = formatRepoInfo(repoInfo);
45
+ if (summary) {
46
+ console.log(` ${c.green('Detected:')}\n` + summary + '\n');
47
+ }
48
+ else {
49
+ console.log(` ${c.dim('No tooling detected (empty project?)')}\n`);
50
+ }
51
+ // ── IDEs (multiselect, at least 1) ─────────────────────────────
52
+ console.log(` ${c.bold('── IDEs ──────────────────────────────────────')}`);
53
+ let ides = [];
54
+ while (ides.length === 0) {
55
+ ides = await multiselect('Which IDEs do you use?', [
56
+ {
57
+ label: 'VS Code',
58
+ hint: 'GitHub Copilot agents, instructions, skills',
59
+ value: 'vscode',
60
+ },
61
+ {
62
+ label: 'Cursor',
63
+ hint: '.cursorrules & .cursor/rules/*.mdc',
64
+ value: 'cursor',
65
+ },
66
+ {
67
+ label: 'Claude Code',
68
+ hint: 'CLAUDE.md & .claude/ commands, skills',
69
+ value: 'claude-code',
70
+ },
71
+ {
72
+ label: 'OpenCode',
73
+ hint: 'AGENTS.md & opencode.json',
74
+ value: 'opencode',
75
+ },
76
+ ]);
77
+ if (ides.length === 0) {
78
+ console.log(` ${c.yellow('Please select at least one IDE.')}`);
79
+ }
80
+ }
81
+ // ── Tech Tools (multiselect, 0-N) ──────────────────────────────
82
+ // Pre-select tools already detected in the repo
83
+ const detectedTools = new Set([
84
+ ...(repoInfo.cms ?? []),
85
+ ...(repoInfo.databases ?? []),
86
+ ...(repoInfo.deployment ?? []),
87
+ ...(repoInfo.monorepo ? [repoInfo.monorepo] : []),
73
88
  ]);
74
- const stack = { cms: cms, db: db, pm: pm, notifications: notifications };
75
- console.log(`\n Installing for ${ide}...`);
76
- console.log(` Stack: CMS=${stack.cms}, DB=${stack.db}, PM=${stack.pm}, Notifications=${stack.notifications}\n`);
89
+ console.log(` ${c.bold('── Tech Tools ────────────────────────────────')}`);
90
+ const techTools = await multiselect('Which tools does your project use?', TECH_PLUGINS.map((p) => ({
91
+ label: p.label,
92
+ hint: p.hint,
93
+ value: p.id,
94
+ ...((p.preselected || detectedTools.has(p.id)) && { selected: true }),
95
+ })));
96
+ // ── Team Tools (multiselect, 0-N) ──────────────────────────────
97
+ console.log(` ${c.bold('── Team Tools ────────────────────────────────')}`);
98
+ const teamTools = await multiselect('Which team tools do you use?', TEAM_PLUGINS.map((p) => ({
99
+ label: p.label,
100
+ hint: p.hint,
101
+ value: p.id,
102
+ ...(p.preselected && { selected: true }),
103
+ })));
104
+ const stack = {
105
+ ides: ides,
106
+ techTools: techTools,
107
+ teamTools: teamTools,
108
+ };
109
+ // ── Merge user choices into detected info ────────────────────
110
+ const combinedRepoInfo = mergeStackIntoRepoInfo(repoInfo, stack);
111
+ const ideNames = ides.map((id) => IDE_DISPLAY[id]).join(', ');
112
+ console.log(`\n Installing for ${c.cyan(ideNames)}...`);
113
+ if (techTools.length > 0) {
114
+ console.log(` Tech: ${c.green(techTools.join(', '))}`);
115
+ }
116
+ if (teamTools.length > 0) {
117
+ console.log(` Team: ${c.green(teamTools.join(', '))}`);
118
+ }
119
+ console.log();
77
120
  // ── Dry run ─────────────────────────────────────────────────────
78
121
  if (dryRun) {
79
- const adapter = await ADAPTERS[ide]();
80
- const managed = adapter.getManagedPaths();
81
- console.log(' [dry-run] Files that would be created:\n');
82
- for (const p of managed.framework) {
83
- console.log(` + ${p}`);
84
- }
85
- for (const p of managed.customizable) {
86
- console.log(` + ${p}`);
122
+ for (const ide of ides) {
123
+ const adapter = await ADAPTERS[ide]();
124
+ const managed = adapter.getManagedPaths();
125
+ console.log(` ${c.dim(`[dry-run] ${IDE_DISPLAY[ide]} files:`)}\n`);
126
+ for (const p of managed.framework) {
127
+ console.log(` ${c.green('+')} ${p}`);
128
+ }
129
+ for (const p of managed.customizable) {
130
+ console.log(` ${c.green('+')} ${p}`);
131
+ }
87
132
  }
88
- console.log(` + .opencastle.json`);
89
- console.log(` + .gitignore (OpenCastle entries)`);
90
- console.log('\n No files were written.\n');
133
+ console.log(` ${c.green('+')} .opencastle.json`);
134
+ console.log(` ${c.green('+')} .gitignore (OpenCastle entries)`);
135
+ console.log(`\n ${c.dim('No files were written.')}\n`);
91
136
  closePrompts();
92
137
  return;
93
138
  }
@@ -103,11 +148,12 @@ export default async function init({ pkgRoot, args }) {
103
148
  await unlink(fullPath);
104
149
  }
105
150
  }
106
- // Remove MCP config so it gets regenerated with new stack
151
+ // Remove MCP configs so they get regenerated with new stack
107
152
  const mcpCandidates = [
108
153
  '.vscode/mcp.json',
109
154
  '.cursor/mcp.json',
110
155
  '.claude/mcp.json',
156
+ 'opencode.json',
111
157
  ];
112
158
  for (const mcpPath of mcpCandidates) {
113
159
  const fullPath = resolve(projectRoot, mcpPath);
@@ -116,56 +162,73 @@ export default async function init({ pkgRoot, args }) {
116
162
  }
117
163
  }
118
164
  }
119
- // ── Run adapter ─────────────────────────────────────────────────
120
- const adapter = await ADAPTERS[ide]();
121
- const results = await adapter.install(pkgRoot, projectRoot, stack);
165
+ // ── Run adapters for each selected IDE ──────────────────────────
166
+ let totalCreated = 0;
167
+ let totalSkipped = 0;
168
+ const allManagedPaths = { framework: [], customizable: [] };
169
+ for (const ide of ides) {
170
+ const adapter = await ADAPTERS[ide]();
171
+ const results = await adapter.install(pkgRoot, projectRoot, stack, combinedRepoInfo);
172
+ totalCreated += results.created.length;
173
+ totalSkipped += results.skipped.length;
174
+ const managed = adapter.getManagedPaths();
175
+ allManagedPaths.framework.push(...managed.framework);
176
+ allManagedPaths.customizable.push(...managed.customizable);
177
+ }
122
178
  // ── Write manifest ──────────────────────────────────────────────
123
- const manifest = createManifest(pkg.version, ide);
124
- manifest.managedPaths = adapter.getManagedPaths();
179
+ const manifest = createManifest(pkg.version, ides[0], ides);
180
+ manifest.managedPaths = allManagedPaths;
125
181
  manifest.stack = stack;
182
+ manifest.repoInfo = combinedRepoInfo;
126
183
  await writeManifest(projectRoot, manifest);
127
184
  // ── Update .gitignore ───────────────────────────────────────────
128
- const managedPaths = adapter.getManagedPaths();
129
- const gitignoreResult = await updateGitignore(projectRoot, managedPaths);
185
+ const gitignoreResult = await updateGitignore(projectRoot, allManagedPaths);
130
186
  // ── Summary ─────────────────────────────────────────────────────
131
- const created = results.created.length;
132
- const skipped = results.skipped.length;
133
- console.log(` ✓ Created ${created} files`);
187
+ console.log(` ${c.green('✓')} Created ${c.bold(String(totalCreated))} files`);
134
188
  if (gitignoreResult === 'created') {
135
- console.log(' ✓ Created .gitignore with OpenCastle entries');
189
+ console.log(` ${c.green('✓')} Created .gitignore with OpenCastle entries`);
136
190
  }
137
191
  else if (gitignoreResult === 'updated') {
138
- console.log(' ✓ Updated .gitignore with OpenCastle entries');
192
+ console.log(` ${c.green('✓')} Updated .gitignore with OpenCastle entries`);
139
193
  }
140
- if (skipped > 0) {
141
- console.log(` → Skipped ${skipped} existing files`);
194
+ if (totalSkipped > 0) {
195
+ console.log(` ${c.dim('')} Skipped ${totalSkipped} existing files`);
142
196
  }
143
197
  // ── Env var notice ──────────────────────────────────────────────
144
- const envVars = getRequiredMcpEnvVars(stack);
198
+ const envVars = getRequiredMcpEnvVars(stack, combinedRepoInfo);
145
199
  if (envVars.length > 0) {
146
- console.log(`\n ⚠ Required environment variables for MCP servers:\n`);
200
+ console.log(`\n ${c.yellow('')} Required environment variables for MCP servers:\n`);
147
201
  for (const { envVar, hint } of envVars) {
148
- console.log(` ${envVar}`);
149
- console.log(` └ ${hint}\n`);
202
+ console.log(` ${c.bold(envVar)}`);
203
+ console.log(` ${c.dim('')} ${c.dim(hint)}\n`);
150
204
  }
151
205
  }
152
206
  // ── OAuth setup guides ────────────────────────────────────────
153
- if (stack.notifications === 'slack') {
154
- console.log(` 📖 Slack MCP requires a Slack App with a bot token.`);
155
- console.log(` Setup guide: https://www.opencastle.dev/guides/slack-mcp-setup\n`);
156
- }
157
- console.log(`\n Next steps:`);
158
- if (ide === 'vscode') {
159
- console.log(' 0. Reload VS Code window (Cmd+Shift+P → "Reload Window") to pick up agents');
207
+ if (teamTools.includes('slack')) {
208
+ console.log(` ${c.cyan('📖')} Slack MCP requires a Slack App with a bot token.`);
209
+ console.log(` Setup guide: ${c.cyan('https://www.opencastle.dev/guides/plugins#slack')}\n`);
160
210
  }
161
- else if (ide === 'cursor') {
162
- console.log(' 0. Reload Cursor window to pick up the new rule files');
211
+ console.log(`\n ${c.bold('Next steps:')}`);
212
+ let step = 0;
213
+ // Reload window messages for relevant IDEs
214
+ const needsReload = ides.filter((id) => ['vscode', 'cursor'].includes(id));
215
+ if (needsReload.length > 0) {
216
+ step++;
217
+ if (needsReload.includes('vscode')) {
218
+ console.log(` ${step}. ${c.yellow('Reload VS Code window')} (Cmd+Shift+P → "Developer: Reload Window")`);
219
+ }
220
+ if (needsReload.includes('cursor')) {
221
+ console.log(` ${step}. ${c.yellow('Reload Cursor window')} to pick up the new rule files`);
222
+ }
163
223
  }
164
224
  if (envVars.length > 0) {
165
- console.log(` 1. Set the environment variable${envVars.length > 1 ? 's' : ''} listed above`);
225
+ step++;
226
+ console.log(` ${step}. Set the environment variable${envVars.length > 1 ? 's' : ''} listed above`);
166
227
  }
167
- console.log(` ${envVars.length > 0 ? '2' : '1'}. Run the "Bootstrap Customizations" prompt to configure for your project`);
168
- console.log(` ${envVars.length > 0 ? '3' : '2'}. Commit the customizations/ folder to your repository`);
228
+ step++;
229
+ console.log(` ${step}. Run the ${c.cyan('"Bootstrap Customizations"')} prompt to configure for your project`);
230
+ step++;
231
+ console.log(` ${step}. Commit the customizations/ folder to your repository`);
169
232
  console.log();
170
233
  closePrompts();
171
234
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -10,5 +10,5 @@ export declare function writeManifest(projectRoot: string, manifest: Manifest):
10
10
  /**
11
11
  * Create a fresh manifest object.
12
12
  */
13
- export declare function createManifest(version: string, ide: string): Manifest;
13
+ export declare function createManifest(version: string, ide: string, ides?: string[]): Manifest;
14
14
  //# sourceMappingURL=manifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAU1B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAOrE"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAU1B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAQtF"}
@@ -23,10 +23,11 @@ export async function writeManifest(projectRoot, manifest) {
23
23
  /**
24
24
  * Create a fresh manifest object.
25
25
  */
26
- export function createManifest(version, ide) {
26
+ export function createManifest(version, ide, ides) {
27
27
  return {
28
28
  version,
29
29
  ide,
30
+ ides: ides ?? [ide],
30
31
  installedAt: new Date().toISOString(),
31
32
  updatedAt: new Date().toISOString(),
32
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,EACnC,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,QAAkB;IAElB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAW;IACzD,OAAO;QACL,OAAO;QACP,GAAG;QACH,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,EACnC,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,QAAkB;IAElB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAW,EAAE,IAAe;IAC1E,OAAO;QACL,OAAO;QACP,GAAG;QACH,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC;QACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC"}
package/dist/cli/mcp.d.ts CHANGED
@@ -1,15 +1,15 @@
1
- import type { ScaffoldResult, StackConfig } from './types.js';
1
+ import type { ScaffoldResult, StackConfig, RepoInfo, IdeChoice } from './types.js';
2
2
  /**
3
3
  * Scaffold or merge the MCP server config into the target project.
4
4
  *
5
- * Reads the template from `opencastle/src/orchestrator/mcp.json`,
6
- * writes it to `<projectRoot>/<destRelPath>` (e.g. `.vscode/mcp.json`).
5
+ * Builds the server list from plugin configs based on the user's
6
+ * stack selection. Writes to `<projectRoot>/<destRelPath>`
7
+ * (e.g. `.vscode/mcp.json`).
7
8
  *
8
- * When a StackConfig is provided, only servers relevant to the chosen
9
- * CMS/DB stack (plus core servers) are included.
9
+ * The output format is adapted to match the target IDE's expectations.
10
10
  *
11
11
  * If the file already exists, missing servers are merged in without
12
12
  * overwriting any existing server configs.
13
13
  */
14
- export declare function scaffoldMcpConfig(pkgRoot: string, projectRoot: string, destRelPath: string, stack?: StackConfig): Promise<ScaffoldResult>;
14
+ export declare function scaffoldMcpConfig(projectRoot: string, destRelPath: string, stack?: StackConfig, repoInfo?: RepoInfo, ide?: IdeChoice): Promise<ScaffoldResult>;
15
15
  //# sourceMappingURL=mcp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC,CA8EzB"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA6EnF;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,QAAQ,EACnB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,cAAc,CAAC,CAiFzB"}
package/dist/cli/mcp.js CHANGED
@@ -1,65 +1,136 @@
1
1
  import { resolve, dirname } from 'node:path';
2
2
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
3
  import { existsSync } from 'node:fs';
4
- import { getOrchestratorRoot } from './copy.js';
5
4
  import { getIncludedMcpServers } from './stack-config.js';
5
+ import { PLUGINS } from '../orchestrator/plugins/index.js';
6
+ /**
7
+ * Transform a VS Code–format MCP config into the format
8
+ * expected by the given IDE.
9
+ */
10
+ function transformMcpForIde(ide, servers, inputs) {
11
+ switch (ide) {
12
+ case 'cursor':
13
+ case 'claude-code': {
14
+ // mcpServers format — no 'type' field
15
+ const mcpServers = {};
16
+ for (const [name, server] of Object.entries(servers)) {
17
+ if (server.type === 'stdio') {
18
+ mcpServers[name] = {
19
+ command: server.command,
20
+ args: server.args,
21
+ ...(server.env && { env: server.env }),
22
+ };
23
+ }
24
+ else if (server.type === 'http') {
25
+ // Strip VS Code ${input:...} placeholders for non-VS Code IDEs
26
+ let url = server.url ?? '';
27
+ url = url.replace(/\$\{input:\w+\}/g, 'REPLACE_ME');
28
+ mcpServers[name] = { url };
29
+ }
30
+ }
31
+ return { mcpServers };
32
+ }
33
+ case 'opencode': {
34
+ // OpenCode format — type: "local"/"remote", command as array
35
+ const mcp = {};
36
+ for (const [name, server] of Object.entries(servers)) {
37
+ if (server.type === 'stdio') {
38
+ mcp[name] = {
39
+ type: 'local',
40
+ command: [server.command, ...(server.args ?? [])],
41
+ ...(server.env && { environment: server.env }),
42
+ };
43
+ }
44
+ else if (server.type === 'http') {
45
+ let url = server.url ?? '';
46
+ url = url.replace(/\$\{input:\w+\}/g, 'REPLACE_ME');
47
+ mcp[name] = {
48
+ type: 'remote',
49
+ url,
50
+ };
51
+ }
52
+ }
53
+ return { mcp };
54
+ }
55
+ default: {
56
+ // VS Code — return as-is (keep type, inputs, envFile)
57
+ const result = { servers };
58
+ if (inputs && inputs.length > 0) {
59
+ result.inputs = inputs;
60
+ }
61
+ return result;
62
+ }
63
+ }
64
+ }
6
65
  /**
7
66
  * Scaffold or merge the MCP server config into the target project.
8
67
  *
9
- * Reads the template from `opencastle/src/orchestrator/mcp.json`,
10
- * writes it to `<projectRoot>/<destRelPath>` (e.g. `.vscode/mcp.json`).
68
+ * Builds the server list from plugin configs based on the user's
69
+ * stack selection. Writes to `<projectRoot>/<destRelPath>`
70
+ * (e.g. `.vscode/mcp.json`).
11
71
  *
12
- * When a StackConfig is provided, only servers relevant to the chosen
13
- * CMS/DB stack (plus core servers) are included.
72
+ * The output format is adapted to match the target IDE's expectations.
14
73
  *
15
74
  * If the file already exists, missing servers are merged in without
16
75
  * overwriting any existing server configs.
17
76
  */
18
- export async function scaffoldMcpConfig(pkgRoot, projectRoot, destRelPath, stack) {
77
+ export async function scaffoldMcpConfig(projectRoot, destRelPath, stack, repoInfo, ide) {
19
78
  const destPath = resolve(projectRoot, destRelPath);
20
- const srcRoot = getOrchestratorRoot(pkgRoot);
21
- const templatePath = resolve(srcRoot, 'mcp.json');
22
- const content = await readFile(templatePath, 'utf8');
23
- const template = JSON.parse(content);
24
- // Filter servers based on stack config
79
+ // Build server list from plugin configs
80
+ const servers = {};
81
+ let inputs = [];
25
82
  if (stack) {
26
- const included = getIncludedMcpServers(stack);
27
- template.servers = Object.fromEntries(Object.entries(template.servers).filter(([key]) => included.has(key)));
28
- // Filter inputs to only include those referenced by included servers
29
- if (template.inputs) {
30
- const serverJson = JSON.stringify(template.servers);
31
- template.inputs = template.inputs.filter((input) => serverJson.includes(`\${input:${input.id}}`));
32
- if (template.inputs.length === 0) {
33
- delete template.inputs;
83
+ const included = getIncludedMcpServers(stack, repoInfo);
84
+ for (const plugin of Object.values(PLUGINS)) {
85
+ if (plugin.mcpServerKey && included.has(plugin.mcpServerKey)) {
86
+ servers[plugin.mcpServerKey] = plugin.mcpConfig;
87
+ if (plugin.mcpInputs) {
88
+ inputs.push(...plugin.mcpInputs);
89
+ }
34
90
  }
35
91
  }
36
92
  }
93
+ // Transform to IDE-specific format
94
+ const resolvedIde = ide ?? 'vscode';
95
+ const output = transformMcpForIde(resolvedIde, servers, inputs.length > 0 ? inputs : undefined);
37
96
  if (existsSync(destPath)) {
38
97
  // Merge: add missing servers without overwriting existing ones
39
98
  const existingContent = await readFile(destPath, 'utf8');
40
99
  const existing = JSON.parse(existingContent);
41
- if (!existing.servers) {
42
- existing.servers = {};
100
+ // Determine the server container key for this IDE
101
+ const containerKey = resolvedIde === 'opencode'
102
+ ? 'mcp'
103
+ : resolvedIde === 'vscode'
104
+ ? 'servers'
105
+ : 'mcpServers';
106
+ if (!existing[containerKey]) {
107
+ existing[containerKey] = {};
43
108
  }
109
+ const existingServers = existing[containerKey];
110
+ const newServers = output[containerKey];
44
111
  let added = 0;
45
- for (const [key, value] of Object.entries(template.servers)) {
46
- if (!(key in existing.servers)) {
47
- existing.servers[key] = value;
48
- added++;
112
+ if (newServers) {
113
+ for (const [key, value] of Object.entries(newServers)) {
114
+ if (!(key in existingServers)) {
115
+ existingServers[key] = value;
116
+ added++;
117
+ }
49
118
  }
50
119
  }
51
- // Merge inputs: add missing input definitions
52
- if (template.inputs && template.inputs.length > 0) {
53
- if (!existing.inputs) {
54
- existing.inputs = [];
55
- }
56
- const existingIds = new Set(existing.inputs.map((i) => i.id));
57
- for (const input of template.inputs) {
120
+ // For VS Code: merge inputs
121
+ if (resolvedIde === 'vscode' && output.inputs) {
122
+ const existingInputs = existing.inputs ?? [];
123
+ const existingIds = new Set(existingInputs.map((i) => i.id));
124
+ const newInputs = output.inputs;
125
+ for (const input of newInputs) {
58
126
  if (!existingIds.has(input.id)) {
59
- existing.inputs.push(input);
127
+ existingInputs.push(input);
60
128
  added++;
61
129
  }
62
130
  }
131
+ if (existingInputs.length > 0) {
132
+ existing.inputs = existingInputs;
133
+ }
63
134
  }
64
135
  if (added === 0) {
65
136
  return { path: destPath, action: 'skipped' };
@@ -68,7 +139,7 @@ export async function scaffoldMcpConfig(pkgRoot, projectRoot, destRelPath, stack
68
139
  return { path: destPath, action: 'created' };
69
140
  }
70
141
  await mkdir(dirname(destPath), { recursive: true });
71
- await writeFile(destPath, JSON.stringify(template, null, 2) + '\n');
142
+ await writeFile(destPath, JSON.stringify(output, null, 2) + '\n');
72
143
  return { path: destPath, action: 'created' };
73
144
  }
74
145
  //# sourceMappingURL=mcp.js.map