opencastle 0.6.0 → 0.8.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 (223) hide show
  1. package/README.md +8 -7
  2. package/dist/cli/adapters/claude-code.d.ts.map +1 -1
  3. package/dist/cli/adapters/claude-code.js +30 -3
  4. package/dist/cli/adapters/claude-code.js.map +1 -1
  5. package/dist/cli/adapters/cursor.d.ts.map +1 -1
  6. package/dist/cli/adapters/cursor.js +27 -3
  7. package/dist/cli/adapters/cursor.js.map +1 -1
  8. package/dist/cli/adapters/opencode.d.ts +20 -0
  9. package/dist/cli/adapters/opencode.d.ts.map +1 -0
  10. package/dist/cli/adapters/opencode.js +265 -0
  11. package/dist/cli/adapters/opencode.js.map +1 -0
  12. package/dist/cli/adapters/vscode.d.ts.map +1 -1
  13. package/dist/cli/adapters/vscode.js +37 -6
  14. package/dist/cli/adapters/vscode.js.map +1 -1
  15. package/dist/cli/copy.d.ts +12 -0
  16. package/dist/cli/copy.d.ts.map +1 -1
  17. package/dist/cli/copy.js +27 -0
  18. package/dist/cli/copy.js.map +1 -1
  19. package/dist/cli/detect.d.ts +1 -1
  20. package/dist/cli/detect.js +21 -15
  21. package/dist/cli/detect.js.map +1 -1
  22. package/dist/cli/init.d.ts.map +1 -1
  23. package/dist/cli/init.js +143 -94
  24. package/dist/cli/init.js.map +1 -1
  25. package/dist/cli/manifest.d.ts +1 -1
  26. package/dist/cli/manifest.d.ts.map +1 -1
  27. package/dist/cli/manifest.js +2 -1
  28. package/dist/cli/manifest.js.map +1 -1
  29. package/dist/cli/mcp.d.ts +6 -6
  30. package/dist/cli/mcp.d.ts.map +1 -1
  31. package/dist/cli/mcp.js +104 -33
  32. package/dist/cli/mcp.js.map +1 -1
  33. package/dist/cli/prompt.d.ts +19 -0
  34. package/dist/cli/prompt.d.ts.map +1 -1
  35. package/dist/cli/prompt.js +143 -0
  36. package/dist/cli/prompt.js.map +1 -1
  37. package/dist/cli/stack-config.d.ts +23 -0
  38. package/dist/cli/stack-config.d.ts.map +1 -1
  39. package/dist/cli/stack-config.js +128 -124
  40. package/dist/cli/stack-config.js.map +1 -1
  41. package/dist/cli/types.d.ts +26 -9
  42. package/dist/cli/types.d.ts.map +1 -1
  43. package/dist/cli/types.js +26 -1
  44. package/dist/cli/types.js.map +1 -1
  45. package/dist/cli/update.d.ts.map +1 -1
  46. package/dist/cli/update.js +60 -19
  47. package/dist/cli/update.js.map +1 -1
  48. package/dist/orchestrator/plugins/chrome-devtools/config.d.ts +3 -0
  49. package/dist/orchestrator/plugins/chrome-devtools/config.d.ts.map +1 -0
  50. package/dist/orchestrator/plugins/chrome-devtools/config.js +28 -0
  51. package/dist/orchestrator/plugins/chrome-devtools/config.js.map +1 -0
  52. package/dist/orchestrator/plugins/contentful/config.d.ts +3 -0
  53. package/dist/orchestrator/plugins/contentful/config.d.ts.map +1 -0
  54. package/dist/orchestrator/plugins/contentful/config.js +48 -0
  55. package/dist/orchestrator/plugins/contentful/config.js.map +1 -0
  56. package/dist/orchestrator/plugins/convex/config.d.ts +3 -0
  57. package/dist/orchestrator/plugins/convex/config.d.ts.map +1 -0
  58. package/dist/orchestrator/plugins/convex/config.js +32 -0
  59. package/dist/orchestrator/plugins/convex/config.js.map +1 -0
  60. package/dist/orchestrator/plugins/index.d.ts +28 -0
  61. package/dist/orchestrator/plugins/index.d.ts.map +1 -0
  62. package/dist/orchestrator/plugins/index.js +63 -0
  63. package/dist/orchestrator/plugins/index.js.map +1 -0
  64. package/dist/orchestrator/plugins/jira/config.d.ts +3 -0
  65. package/dist/orchestrator/plugins/jira/config.d.ts.map +1 -0
  66. package/dist/orchestrator/plugins/jira/config.js +29 -0
  67. package/dist/orchestrator/plugins/jira/config.js.map +1 -0
  68. package/dist/orchestrator/plugins/linear/config.d.ts +3 -0
  69. package/dist/orchestrator/plugins/linear/config.d.ts.map +1 -0
  70. package/dist/orchestrator/plugins/linear/config.js +33 -0
  71. package/dist/orchestrator/plugins/linear/config.js.map +1 -0
  72. package/dist/orchestrator/plugins/nx/config.d.ts +3 -0
  73. package/dist/orchestrator/plugins/nx/config.d.ts.map +1 -0
  74. package/dist/orchestrator/plugins/nx/config.js +28 -0
  75. package/dist/orchestrator/plugins/nx/config.js.map +1 -0
  76. package/dist/orchestrator/plugins/sanity/config.d.ts +3 -0
  77. package/dist/orchestrator/plugins/sanity/config.d.ts.map +1 -0
  78. package/dist/orchestrator/plugins/sanity/config.js +43 -0
  79. package/dist/orchestrator/plugins/sanity/config.js.map +1 -0
  80. package/dist/orchestrator/plugins/slack/config.d.ts +3 -0
  81. package/dist/orchestrator/plugins/slack/config.d.ts.map +1 -0
  82. package/dist/orchestrator/plugins/slack/config.js +34 -0
  83. package/dist/orchestrator/plugins/slack/config.js.map +1 -0
  84. package/dist/orchestrator/plugins/strapi/config.d.ts +3 -0
  85. package/dist/orchestrator/plugins/strapi/config.d.ts.map +1 -0
  86. package/dist/orchestrator/plugins/strapi/config.js +40 -0
  87. package/dist/orchestrator/plugins/strapi/config.js.map +1 -0
  88. package/dist/orchestrator/plugins/supabase/config.d.ts +3 -0
  89. package/dist/orchestrator/plugins/supabase/config.d.ts.map +1 -0
  90. package/dist/orchestrator/plugins/supabase/config.js +33 -0
  91. package/dist/orchestrator/plugins/supabase/config.js.map +1 -0
  92. package/dist/orchestrator/plugins/teams/config.d.ts +3 -0
  93. package/dist/orchestrator/plugins/teams/config.d.ts.map +1 -0
  94. package/dist/orchestrator/plugins/teams/config.js +43 -0
  95. package/dist/orchestrator/plugins/teams/config.js.map +1 -0
  96. package/dist/orchestrator/plugins/types.d.ts +61 -0
  97. package/dist/orchestrator/plugins/types.d.ts.map +1 -0
  98. package/dist/orchestrator/plugins/types.js +2 -0
  99. package/dist/orchestrator/plugins/types.js.map +1 -0
  100. package/dist/orchestrator/plugins/vercel/config.d.ts +3 -0
  101. package/dist/orchestrator/plugins/vercel/config.d.ts.map +1 -0
  102. package/dist/orchestrator/plugins/vercel/config.js +32 -0
  103. package/dist/orchestrator/plugins/vercel/config.js.map +1 -0
  104. package/package.json +1 -1
  105. package/src/cli/adapters/claude-code.ts +36 -4
  106. package/src/cli/adapters/cursor.ts +42 -4
  107. package/src/cli/adapters/opencode.ts +320 -0
  108. package/src/cli/adapters/vscode.ts +40 -8
  109. package/src/cli/copy.ts +32 -0
  110. package/src/cli/detect.ts +17 -17
  111. package/src/cli/init.ts +157 -99
  112. package/src/cli/manifest.ts +2 -1
  113. package/src/cli/mcp.ts +129 -50
  114. package/src/cli/prompt.ts +176 -0
  115. package/src/cli/stack-config.ts +174 -145
  116. package/src/cli/types.ts +39 -8
  117. package/src/cli/update.ts +71 -20
  118. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  119. package/src/orchestrator/agent-workflows/README.md +1 -1
  120. package/src/orchestrator/agent-workflows/bug-fix.md +12 -12
  121. package/src/orchestrator/agent-workflows/data-pipeline.md +21 -20
  122. package/src/orchestrator/agent-workflows/database-migration.md +11 -11
  123. package/src/orchestrator/agent-workflows/feature-implementation.md +19 -12
  124. package/src/orchestrator/agent-workflows/performance-optimization.md +6 -6
  125. package/src/orchestrator/agent-workflows/refactoring.md +10 -10
  126. package/src/orchestrator/agent-workflows/schema-changes.md +8 -8
  127. package/src/orchestrator/agent-workflows/security-audit.md +12 -12
  128. package/src/orchestrator/agent-workflows/shared-delivery-phase.md +5 -5
  129. package/src/orchestrator/agents/api-designer.agent.md +1 -1
  130. package/src/orchestrator/agents/architect.agent.md +2 -2
  131. package/src/orchestrator/agents/content-engineer.agent.md +3 -3
  132. package/src/orchestrator/agents/copywriter.agent.md +2 -2
  133. package/src/orchestrator/agents/data-expert.agent.md +6 -6
  134. package/src/orchestrator/agents/database-engineer.agent.md +3 -3
  135. package/src/orchestrator/agents/developer.agent.md +4 -4
  136. package/src/orchestrator/agents/devops-expert.agent.md +5 -5
  137. package/src/orchestrator/agents/documentation-writer.agent.md +1 -1
  138. package/src/orchestrator/agents/performance-expert.agent.md +2 -2
  139. package/src/orchestrator/agents/release-manager.agent.md +4 -4
  140. package/src/orchestrator/agents/researcher.agent.md +3 -3
  141. package/src/orchestrator/agents/reviewer.agent.md +1 -1
  142. package/src/orchestrator/agents/security-expert.agent.md +4 -4
  143. package/src/orchestrator/agents/seo-specialist.agent.md +2 -2
  144. package/src/orchestrator/agents/team-lead.agent.md +56 -38
  145. package/src/orchestrator/agents/testing-expert.agent.md +5 -5
  146. package/src/orchestrator/agents/ui-ux-expert.agent.md +6 -6
  147. package/src/orchestrator/copilot-instructions.md +1 -1
  148. package/src/orchestrator/customizations/AGENT-FAILURES.md +1 -1
  149. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +12 -12
  150. package/src/orchestrator/customizations/DISPUTES.md +5 -5
  151. package/src/orchestrator/customizations/KNOWN-ISSUES.md +30 -0
  152. package/src/orchestrator/customizations/LESSONS-LEARNED.md +7 -7
  153. package/src/orchestrator/customizations/README.md +5 -2
  154. package/src/orchestrator/customizations/agents/agent-registry.md +1 -1
  155. package/src/orchestrator/customizations/agents/skill-matrix.md +12 -7
  156. package/src/orchestrator/customizations/logs/README.md +1 -1
  157. package/src/orchestrator/customizations/project/decisions.md +31 -0
  158. package/src/orchestrator/customizations/project/docs-structure.md +16 -5
  159. package/src/orchestrator/customizations/project/roadmap.md +24 -0
  160. package/src/orchestrator/customizations/project/tracker-config.md +1 -1
  161. package/src/orchestrator/customizations/stack/cms-config.md +1 -1
  162. package/src/orchestrator/customizations/stack/notifications-config.md +1 -1
  163. package/src/orchestrator/instructions/ai-optimization.instructions.md +2 -2
  164. package/src/orchestrator/instructions/general.instructions.md +102 -40
  165. package/src/orchestrator/{skills/browser-testing → plugins/chrome-devtools}/SKILL.md +1 -1
  166. package/src/orchestrator/plugins/chrome-devtools/config.ts +29 -0
  167. package/src/orchestrator/{skills/contentful-cms → plugins/contentful}/SKILL.md +1 -1
  168. package/src/orchestrator/plugins/contentful/config.ts +49 -0
  169. package/src/orchestrator/{skills/convex-database → plugins/convex}/SKILL.md +1 -1
  170. package/src/orchestrator/plugins/convex/config.ts +33 -0
  171. package/src/orchestrator/plugins/index.ts +85 -0
  172. package/src/orchestrator/{skills/jira-management → plugins/jira}/SKILL.md +3 -3
  173. package/src/orchestrator/plugins/jira/config.ts +30 -0
  174. package/src/orchestrator/{skills/task-management → plugins/linear}/SKILL.md +3 -3
  175. package/src/orchestrator/plugins/linear/config.ts +34 -0
  176. package/src/orchestrator/{skills/nx-workspace → plugins/nx}/SKILL.md +1 -1
  177. package/src/orchestrator/plugins/nx/config.ts +29 -0
  178. package/src/orchestrator/{skills/sanity-cms → plugins/sanity}/SKILL.md +1 -1
  179. package/src/orchestrator/plugins/sanity/config.ts +44 -0
  180. package/src/orchestrator/{skills/slack-notifications → plugins/slack}/SKILL.md +2 -2
  181. package/src/orchestrator/plugins/slack/config.ts +35 -0
  182. package/src/orchestrator/{skills/strapi-cms → plugins/strapi}/SKILL.md +1 -1
  183. package/src/orchestrator/plugins/strapi/config.ts +41 -0
  184. package/src/orchestrator/{skills/supabase-database → plugins/supabase}/SKILL.md +1 -1
  185. package/src/orchestrator/plugins/supabase/config.ts +34 -0
  186. package/src/orchestrator/{skills/teams-notifications → plugins/teams}/SKILL.md +2 -2
  187. package/src/orchestrator/plugins/teams/config.ts +44 -0
  188. package/src/orchestrator/plugins/types.ts +79 -0
  189. package/src/orchestrator/plugins/vercel/config.ts +33 -0
  190. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +8 -8
  191. package/src/orchestrator/prompts/brainstorm.prompt.md +3 -3
  192. package/src/orchestrator/prompts/bug-fix.prompt.md +27 -22
  193. package/src/orchestrator/prompts/create-skill.prompt.md +50 -32
  194. package/src/orchestrator/prompts/generate-task-spec.prompt.md +3 -3
  195. package/src/orchestrator/prompts/implement-feature.prompt.md +34 -29
  196. package/src/orchestrator/prompts/metrics-report.prompt.md +11 -11
  197. package/src/orchestrator/prompts/quick-refinement.prompt.md +23 -19
  198. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +19 -5
  199. package/src/orchestrator/skills/accessibility-standards/SKILL.md +1 -1
  200. package/src/orchestrator/skills/agent-hooks/SKILL.md +27 -18
  201. package/src/orchestrator/skills/agent-memory/SKILL.md +7 -7
  202. package/src/orchestrator/skills/api-patterns/SKILL.md +6 -6
  203. package/src/orchestrator/skills/code-commenting/SKILL.md +1 -1
  204. package/src/orchestrator/skills/context-map/SKILL.md +4 -4
  205. package/src/orchestrator/skills/data-engineering/SKILL.md +7 -4
  206. package/src/orchestrator/skills/deployment-infrastructure/SKILL.md +2 -2
  207. package/src/orchestrator/skills/documentation-standards/SKILL.md +1 -1
  208. package/src/orchestrator/skills/fast-review/SKILL.md +18 -7
  209. package/src/orchestrator/skills/frontend-design/SKILL.md +1 -1
  210. package/src/orchestrator/skills/memory-merger/SKILL.md +8 -8
  211. package/src/orchestrator/skills/nextjs-patterns/SKILL.md +1 -1
  212. package/src/orchestrator/skills/panel-majority-vote/SKILL.md +2 -2
  213. package/src/orchestrator/skills/panel-majority-vote/panel-report.template.md +1 -1
  214. package/src/orchestrator/skills/performance-optimization/SKILL.md +1 -1
  215. package/src/orchestrator/skills/react-development/SKILL.md +3 -3
  216. package/src/orchestrator/skills/security-hardening/SKILL.md +27 -27
  217. package/src/orchestrator/skills/self-improvement/SKILL.md +14 -13
  218. package/src/orchestrator/skills/seo-patterns/SKILL.md +1 -1
  219. package/src/orchestrator/skills/session-checkpoints/SKILL.md +19 -19
  220. package/src/orchestrator/skills/team-lead-reference/SKILL.md +9 -9
  221. package/src/orchestrator/skills/testing-workflow/SKILL.md +13 -13
  222. package/src/orchestrator/skills/validation-gates/SKILL.md +157 -27
  223. package/src/orchestrator/mcp.json +0 -69
package/dist/cli/init.js CHANGED
@@ -1,16 +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';
9
10
  import { detectRepoInfo, mergeStackIntoRepoInfo, formatRepoInfo } from './detect.js';
10
11
  const ADAPTERS = {
11
12
  vscode: () => import('./adapters/vscode.js'),
12
13
  cursor: () => import('./adapters/cursor.js'),
13
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',
14
23
  };
15
24
  export default async function init({ pkgRoot, args }) {
16
25
  const projectRoot = process.cwd();
@@ -19,7 +28,7 @@ export default async function init({ pkgRoot, args }) {
19
28
  const existing = await readManifest(projectRoot);
20
29
  let isReinit = false;
21
30
  if (existing) {
22
- 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);
23
32
  if (!proceed) {
24
33
  console.log(' Aborted.');
25
34
  return;
@@ -27,80 +36,103 @@ export default async function init({ pkgRoot, args }) {
27
36
  isReinit = true;
28
37
  }
29
38
  const pkg = JSON.parse(await readFile(resolve(pkgRoot, 'package.json'), 'utf8'));
30
- console.log(`\n 🏰 OpenCastle v${pkg.version}`);
31
- console.log(' Multi-agent orchestration framework for AI coding assistants\n');
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`);
32
41
  // ── Repo research ───────────────────────────────────────────────
33
- console.log(' Scanning repository...');
42
+ console.log(` ${c.dim('Scanning repository...')}`);
34
43
  const repoInfo = await detectRepoInfo(projectRoot);
35
44
  const summary = formatRepoInfo(repoInfo);
36
45
  if (summary) {
37
- console.log(' Detected:\n' + summary + '\n');
46
+ console.log(` ${c.green('Detected:')}\n` + summary + '\n');
38
47
  }
39
48
  else {
40
- console.log(' No tooling detected (empty project?)\n');
41
- }
42
- // ── IDE selection ───────────────────────────────────────────────
43
- const ide = await select('Which IDE are you using?', [
44
- {
45
- label: 'VS Code',
46
- hint: 'GitHub Copilot .github/ agents, instructions, skills',
47
- value: 'vscode',
48
- },
49
- {
50
- label: 'Cursor',
51
- hint: '.cursorrules & .cursor/rules/*.mdc',
52
- value: 'cursor',
53
- },
54
- {
55
- label: 'Claude Code',
56
- hint: 'CLAUDE.md & .claude/ commands, skills',
57
- value: 'claude-code',
58
- },
59
- ]);
60
- // ── CMS selection ───────────────────────────────────────────────
61
- const cms = await select('Which CMS are you using?', [
62
- { label: 'Sanity', hint: 'GROQ queries, real-time collaboration', value: 'sanity' },
63
- { label: 'Contentful', hint: 'GraphQL / REST API, structured content', value: 'contentful' },
64
- { label: 'Strapi', hint: 'Open-source headless CMS', value: 'strapi' },
65
- { label: 'None', hint: 'No CMS — skip CMS skills and agents', value: 'none' },
66
- ]);
67
- // ── Database selection ──────────────────────────────────────────
68
- const db = await select('Which database are you using?', [
69
- { label: 'Supabase', hint: 'Postgres + Auth + RLS + Edge Functions', value: 'supabase' },
70
- { label: 'Convex', hint: 'Reactive backend with real-time sync', value: 'convex' },
71
- { label: 'None', hint: 'No database — skip DB skills and agents', value: 'none' },
72
- ]);
73
- // ── Project management selection ────────────────────────────────
74
- const pm = await select('Which project management tool are you using?', [
75
- { label: 'Linear', hint: 'Issue tracking with MCP integration', value: 'linear' },
76
- { label: 'Jira', hint: 'Atlassian issue tracking via Rovo MCP', value: 'jira' },
77
- { label: 'None', hint: 'No project management — skip PM skills', value: 'none' },
78
- ]);
79
- // ── Notifications selection ────────────────────────────────────
80
- const notifications = await select('Which notifications tool are you using?', [
81
- { label: 'Slack', hint: 'Agent notifications and bi-directional communication', value: 'slack' },
82
- { label: 'Microsoft Teams', hint: 'Agent notifications via Teams channels', value: 'teams' },
83
- { label: 'None', hint: 'No notifications — skip messaging skills', value: 'none' },
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] : []),
84
88
  ]);
85
- const stack = { cms: cms, db: db, pm: pm, notifications: notifications };
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
+ };
86
109
  // ── Merge user choices into detected info ────────────────────
87
110
  const combinedRepoInfo = mergeStackIntoRepoInfo(repoInfo, stack);
88
- console.log(`\n Installing for ${ide}...`);
89
- console.log(` Stack: CMS=${stack.cms}, DB=${stack.db}, PM=${stack.pm}, Notifications=${stack.notifications}\n`);
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();
90
120
  // ── Dry run ─────────────────────────────────────────────────────
91
121
  if (dryRun) {
92
- const adapter = await ADAPTERS[ide]();
93
- const managed = adapter.getManagedPaths();
94
- console.log(' [dry-run] Files that would be created:\n');
95
- for (const p of managed.framework) {
96
- console.log(` + ${p}`);
97
- }
98
- for (const p of managed.customizable) {
99
- 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
+ }
100
132
  }
101
- console.log(` + .opencastle.json`);
102
- console.log(` + .gitignore (OpenCastle entries)`);
103
- 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`);
104
136
  closePrompts();
105
137
  return;
106
138
  }
@@ -116,11 +148,12 @@ export default async function init({ pkgRoot, args }) {
116
148
  await unlink(fullPath);
117
149
  }
118
150
  }
119
- // Remove MCP config so it gets regenerated with new stack
151
+ // Remove MCP configs so they get regenerated with new stack
120
152
  const mcpCandidates = [
121
153
  '.vscode/mcp.json',
122
154
  '.cursor/mcp.json',
123
155
  '.claude/mcp.json',
156
+ 'opencode.json',
124
157
  ];
125
158
  for (const mcpPath of mcpCandidates) {
126
159
  const fullPath = resolve(projectRoot, mcpPath);
@@ -129,57 +162,73 @@ export default async function init({ pkgRoot, args }) {
129
162
  }
130
163
  }
131
164
  }
132
- // ── Run adapter ─────────────────────────────────────────────────
133
- const adapter = await ADAPTERS[ide]();
134
- const results = await adapter.install(pkgRoot, projectRoot, stack, combinedRepoInfo);
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
+ }
135
178
  // ── Write manifest ──────────────────────────────────────────────
136
- const manifest = createManifest(pkg.version, ide);
137
- manifest.managedPaths = adapter.getManagedPaths();
179
+ const manifest = createManifest(pkg.version, ides[0], ides);
180
+ manifest.managedPaths = allManagedPaths;
138
181
  manifest.stack = stack;
139
182
  manifest.repoInfo = combinedRepoInfo;
140
183
  await writeManifest(projectRoot, manifest);
141
184
  // ── Update .gitignore ───────────────────────────────────────────
142
- const managedPaths = adapter.getManagedPaths();
143
- const gitignoreResult = await updateGitignore(projectRoot, managedPaths);
185
+ const gitignoreResult = await updateGitignore(projectRoot, allManagedPaths);
144
186
  // ── Summary ─────────────────────────────────────────────────────
145
- const created = results.created.length;
146
- const skipped = results.skipped.length;
147
- console.log(` ✓ Created ${created} files`);
187
+ console.log(` ${c.green('✓')} Created ${c.bold(String(totalCreated))} files`);
148
188
  if (gitignoreResult === 'created') {
149
- console.log(' ✓ Created .gitignore with OpenCastle entries');
189
+ console.log(` ${c.green('✓')} Created .gitignore with OpenCastle entries`);
150
190
  }
151
191
  else if (gitignoreResult === 'updated') {
152
- console.log(' ✓ Updated .gitignore with OpenCastle entries');
192
+ console.log(` ${c.green('✓')} Updated .gitignore with OpenCastle entries`);
153
193
  }
154
- if (skipped > 0) {
155
- console.log(` → Skipped ${skipped} existing files`);
194
+ if (totalSkipped > 0) {
195
+ console.log(` ${c.dim('')} Skipped ${totalSkipped} existing files`);
156
196
  }
157
197
  // ── Env var notice ──────────────────────────────────────────────
158
198
  const envVars = getRequiredMcpEnvVars(stack, combinedRepoInfo);
159
199
  if (envVars.length > 0) {
160
- console.log(`\n ⚠ Required environment variables for MCP servers:\n`);
200
+ console.log(`\n ${c.yellow('')} Required environment variables for MCP servers:\n`);
161
201
  for (const { envVar, hint } of envVars) {
162
- console.log(` ${envVar}`);
163
- console.log(` └ ${hint}\n`);
202
+ console.log(` ${c.bold(envVar)}`);
203
+ console.log(` ${c.dim('')} ${c.dim(hint)}\n`);
164
204
  }
165
205
  }
166
206
  // ── OAuth setup guides ────────────────────────────────────────
167
- if (stack.notifications === 'slack') {
168
- console.log(` 📖 Slack MCP requires a Slack App with a bot token.`);
169
- console.log(` Setup guide: https://www.opencastle.dev/guides/slack-mcp-setup\n`);
170
- }
171
- console.log(`\n Next steps:`);
172
- if (ide === 'vscode') {
173
- console.log(' 0. Reload VS Code window (Cmd+Shift+P → "Developer: 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`);
174
210
  }
175
- else if (ide === 'cursor') {
176
- 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
+ }
177
223
  }
178
224
  if (envVars.length > 0) {
179
- 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`);
180
227
  }
181
- console.log(` ${envVars.length > 0 ? '2' : '1'}. Run the "Bootstrap Customizations" prompt to configure for your project`);
182
- 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`);
183
232
  console.log();
184
233
  closePrompts();
185
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, RepoInfo } 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, repoInfo?: RepoInfo): 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,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExE;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,QAAQ,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, repoInfo) {
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
83
  const included = getIncludedMcpServers(stack, repoInfo);
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;
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