opencastle 0.35.0 → 0.35.2

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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/adapters/antigravity.d.ts +13 -7
  3. package/dist/cli/adapters/antigravity.d.ts.map +1 -1
  4. package/dist/cli/adapters/antigravity.js +15 -9
  5. package/dist/cli/adapters/antigravity.js.map +1 -1
  6. package/dist/cli/adapters/claude-code.d.ts +1 -1
  7. package/dist/cli/adapters/claude-code.js +2 -2
  8. package/dist/cli/adapters/claude-code.js.map +1 -1
  9. package/dist/cli/adapters/codex.d.ts +1 -1
  10. package/dist/cli/adapters/codex.js +1 -1
  11. package/dist/cli/adapters/opencode.d.ts +1 -1
  12. package/dist/cli/adapters/opencode.js +1 -1
  13. package/dist/cli/adapters/single-file-base.d.ts.map +1 -1
  14. package/dist/cli/adapters/single-file-base.js +17 -18
  15. package/dist/cli/adapters/single-file-base.js.map +1 -1
  16. package/dist/cli/bootstrap.d.ts.map +1 -1
  17. package/dist/cli/bootstrap.js +3 -0
  18. package/dist/cli/bootstrap.js.map +1 -1
  19. package/dist/cli/detect.d.ts.map +1 -1
  20. package/dist/cli/detect.js +12 -0
  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 +31 -26
  24. package/dist/cli/init.js.map +1 -1
  25. package/dist/cli/init.test.js +24 -21
  26. package/dist/cli/init.test.js.map +1 -1
  27. package/dist/cli/mcp.d.ts.map +1 -1
  28. package/dist/cli/mcp.js +13 -4
  29. package/dist/cli/mcp.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/cli/adapters/antigravity.ts +15 -9
  32. package/src/cli/adapters/claude-code.ts +2 -2
  33. package/src/cli/adapters/codex.ts +1 -1
  34. package/src/cli/adapters/opencode.ts +1 -1
  35. package/src/cli/adapters/single-file-base.ts +20 -17
  36. package/src/cli/bootstrap.ts +4 -0
  37. package/src/cli/detect.ts +12 -0
  38. package/src/cli/init.test.ts +27 -21
  39. package/src/cli/init.ts +29 -25
  40. package/src/cli/mcp.ts +13 -4
  41. package/src/dashboard/dist/data/convoys/demo-api-v2.json +3 -3
  42. package/src/dashboard/dist/data/convoys/demo-auth-revamp.json +4 -4
  43. package/src/dashboard/dist/data/convoys/demo-dashboard-ui.json +6 -6
  44. package/src/dashboard/dist/data/convoys/demo-data-pipeline.json +3 -3
  45. package/src/dashboard/dist/data/convoys/demo-deploy-ci.json +1 -1
  46. package/src/dashboard/dist/data/convoys/demo-docs-update.json +3 -3
  47. package/src/dashboard/dist/data/convoys/demo-perf-opt.json +4 -4
  48. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  49. package/src/dashboard/public/data/convoys/demo-api-v2.json +3 -3
  50. package/src/dashboard/public/data/convoys/demo-auth-revamp.json +4 -4
  51. package/src/dashboard/public/data/convoys/demo-dashboard-ui.json +6 -6
  52. package/src/dashboard/public/data/convoys/demo-data-pipeline.json +3 -3
  53. package/src/dashboard/public/data/convoys/demo-deploy-ci.json +1 -1
  54. package/src/dashboard/public/data/convoys/demo-docs-update.json +3 -3
  55. package/src/dashboard/public/data/convoys/demo-perf-opt.json +4 -4
  56. package/src/orchestrator/agents/copywriter.agent.md +1 -1
  57. package/src/orchestrator/agents/data-expert.agent.md +1 -1
  58. package/src/orchestrator/agents/devops-expert.agent.md +1 -1
  59. package/src/orchestrator/agents/documentation-writer.agent.md +1 -1
  60. package/src/orchestrator/agents/release-manager.agent.md +1 -1
  61. package/src/orchestrator/agents/reviewer.agent.md +1 -1
  62. package/src/orchestrator/agents/seo-specialist.agent.md +1 -1
  63. package/src/orchestrator/agents/session-guard.agent.md +1 -1
  64. package/src/orchestrator/agents/team-lead.agent.md +1 -1
  65. package/src/orchestrator/agents/testing-expert.agent.md +1 -1
  66. package/src/orchestrator/customizations/agents/agent-registry.md +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencastle",
3
- "version": "0.35.0",
3
+ "version": "0.35.2",
4
4
  "type": "module",
5
5
  "description": "Multi-agent orchestration framework for AI coding assistants",
6
6
  "bin": {
@@ -3,23 +3,29 @@ import { createSingleFileAdapter } from './single-file-base.js'
3
3
  /**
4
4
  * Antigravity adapter (Google).
5
5
  *
6
- * Generates GEMINI.md (root instructions) and .gemini/ structure.
6
+ * Generates GEMINI.md (workspace rules) and .agents/ structure. Antigravity
7
+ * natively recognizes the .agents/ directory at the workspace root.
7
8
  *
8
9
  * copilot-instructions.md -> GEMINI.md (combined with instructions/)
9
- * skills/*\/SKILL.md -> .gemini/skills/<name>.md
10
- * agents/*.agent.md -> .gemini/agents/<name>.md
11
- * agent-workflows/*.md -> .gemini/workflows/<name>.md
12
- * prompts/*.prompt.md -> .gemini/prompts/<name>.md
13
- * customizations/ -> .gemini/customizations/ (scaffolded once)
14
- * mcp.json -> .gemini/mcp.json (mcpServers format)
10
+ * skills/<name>/SKILL.md -> .agents/skills/<name>/SKILL.md (+ sibling resources, frontmatter preserved)
11
+ * agents/*.agent.md -> .agents/agents/<name>.md
12
+ * agent-workflows/*.md -> .agents/workflows/<name>.md
13
+ * prompts/*.prompt.md -> .agents/prompts/<name>.md
14
+ * customizations/ -> .agents/customizations/ (scaffolded once)
15
+ * mcp.json -> .agents/mcp_config.json (mcpServers format)
16
+ *
17
+ * Note: Antigravity's MCP integration officially reads ~/.gemini/antigravity/mcp_config.json
18
+ * (global only); per-workspace MCP support is a known gap. The workspace
19
+ * mcp_config.json is scaffolded for parity with other adapters and so users
20
+ * can copy/symlink it globally if desired.
15
21
  */
16
22
 
17
23
  export const IDE_ID = 'antigravity'
18
24
 
19
25
  const { install, update, getManagedPaths, getDoctorChecks } = createSingleFileAdapter({
20
26
  rootFile: 'GEMINI.md',
21
- dotDir: '.gemini',
22
- mcpConfigPath: '.gemini/mcp.json',
27
+ dotDir: '.agents',
28
+ mcpConfigPath: '.agents/mcp_config.json',
23
29
  mcpFormat: 'antigravity',
24
30
  promptsDir: 'prompts',
25
31
  workflowsDir: 'workflows',
@@ -6,7 +6,7 @@ import { createSingleFileAdapter } from './single-file-base.js'
6
6
  * Generates CLAUDE.md (root instructions) and .claude/ structure.
7
7
  *
8
8
  * copilot-instructions.md → CLAUDE.md (combined with instructions/)
9
- * skills/\*\/SKILL.md → .claude/skills/<name>.md
9
+ * skills/<name>/SKILL.md → .claude/skills/<name>/SKILL.md (+ sibling resources, frontmatter preserved)
10
10
  * agent-workflows/*.md → .claude/commands/workflow-<name>.md
11
11
  * prompts/*.prompt.md → .claude/commands/<name>.md
12
12
  * customizations/ → .claude/customizations/ (scaffolded once)
@@ -21,7 +21,7 @@ export const IDE_ID = 'claude-code'
21
21
  const { install, update, getManagedPaths, getDoctorChecks } = createSingleFileAdapter({
22
22
  rootFile: 'CLAUDE.md',
23
23
  dotDir: '.claude',
24
- mcpConfigPath: '.claude/mcp.json',
24
+ mcpConfigPath: '.mcp.json',
25
25
  mcpFormat: 'claude-code',
26
26
  promptsDir: 'commands',
27
27
  workflowsDir: 'commands',
@@ -6,7 +6,7 @@ import { createSingleFileAdapter } from './single-file-base.js'
6
6
  * Generates AGENTS.md (root instructions) and .codex/ structure.
7
7
  *
8
8
  * copilot-instructions.md -> AGENTS.md (combined with instructions/)
9
- * skills/*\/SKILL.md -> .codex/skills/<name>.md
9
+ * skills/<name>/SKILL.md -> .codex/skills/<name>/SKILL.md (+ sibling resources, frontmatter preserved)
10
10
  * agents/*.agent.md -> .codex/agents/<name>.md
11
11
  * agent-workflows/*.md -> .codex/workflows/<name>.md
12
12
  * prompts/*.prompt.md -> .codex/prompts/<name>.md
@@ -6,7 +6,7 @@ import { createSingleFileAdapter } from './single-file-base.js'
6
6
  * Generates AGENTS.md (root instructions) and .opencode/ structure.
7
7
  *
8
8
  * copilot-instructions.md → AGENTS.md (combined with instructions/)
9
- * skills/*\/SKILL.md → .opencode/skills/<name>.md
9
+ * skills/<name>/SKILL.md → .opencode/skills/<name>/SKILL.md (+ sibling resources, frontmatter preserved)
10
10
  * agents/*.agent.md → .opencode/agents/<name>.md
11
11
  * agent-workflows/*.md → .opencode/workflows/<name>.md
12
12
  * prompts/*.prompt.md → .opencode/prompts/<name>.md
@@ -1,5 +1,5 @@
1
1
  import { resolve, basename } from 'node:path'
2
- import { mkdir, writeFile, readdir, readFile, unlink, rm } from 'node:fs/promises'
2
+ import { mkdir, writeFile, readdir, readFile, unlink, rm, copyFile } from 'node:fs/promises'
3
3
  import { existsSync } from 'node:fs'
4
4
  import { copyDir, getOrchestratorRoot, getPluginsRoot, getPluginSkillEntries } from '../copy.js'
5
5
  import { scaffoldMcpConfig } from '../mcp.js'
@@ -115,6 +115,8 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
115
115
  const subdirs = (
116
116
  await readdir(skillsDir, { withFileTypes: true })
117
117
  ).filter((e) => e.isDirectory())
118
+ const skillRef = (name: string): string =>
119
+ `${config.dotDir}/skills/${name}/SKILL.md`
118
120
  for (const entry of subdirs.sort((a, b) =>
119
121
  a.name.localeCompare(b.name)
120
122
  )) {
@@ -124,7 +126,7 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
124
126
  const meta = parseFrontmatterMeta(await readFile(skillFile, 'utf8'))
125
127
  const desc = meta['description'] ?? ''
126
128
  skillLines.push(
127
- `- **${entry.name}** (\`${config.dotDir}/skills/${entry.name}.md\`): ${desc}`
129
+ `- **${entry.name}** (\`${skillRef(entry.name)}\`): ${desc}`
128
130
  )
129
131
  }
130
132
 
@@ -136,7 +138,7 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
136
138
  const pluginMeta = parseFrontmatterMeta(await readFile(skillPath, 'utf8'))
137
139
  const pluginDesc = pluginMeta['description'] ?? ''
138
140
  skillLines.push(
139
- `- **${id}** (\`${config.dotDir}/skills/${id}.md\`): ${pluginDesc}`
141
+ `- **${id}** (\`${skillRef(id)}\`): ${pluginDesc}`
140
142
  )
141
143
  }
142
144
 
@@ -170,7 +172,9 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
170
172
  }
171
173
  }
172
174
 
173
- // 3. Skills → dotDir/skills/<name>.md
175
+ // 3. Skills → dotDir/skills/<name>/SKILL.md (+ sibling resources, frontmatter preserved).
176
+ // Matches the SKILL.md-per-folder format used by Claude Code, OpenCode, Codex,
177
+ // and Antigravity — agents discover skills via the description: frontmatter field.
174
178
  const skillsDir = resolve(srcRoot, 'skills')
175
179
  if (existsSync(skillsDir)) {
176
180
  const destSkills = resolve(dotDirPath, 'skills')
@@ -182,18 +186,16 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
182
186
  if (excludedSkills.has(entry.name)) continue
183
187
  const skillFile = resolve(skillsDir, entry.name, 'SKILL.md')
184
188
  if (!existsSync(skillFile)) continue
185
- const destPath = resolve(destSkills, `${entry.name}.md`)
186
- if (existsSync(destPath)) {
187
- results.skipped.push(destPath)
188
- continue
189
- }
190
- const content = await readFile(skillFile, 'utf8')
191
- await writeFile(destPath, stripFrontmatter(content) + '\n')
192
- results.created.push(destPath)
189
+ const sub = await copyDir(
190
+ resolve(skillsDir, entry.name),
191
+ resolve(destSkills, entry.name)
192
+ )
193
+ results.created.push(...sub.created)
194
+ results.skipped.push(...sub.skipped)
193
195
  }
194
196
  }
195
197
 
196
- // 3b. Plugin skills → dotDir/skills/<plugin-id>.md
198
+ // 3b. Plugin skills → dotDir/skills/<plugin-id>/SKILL.md
197
199
  {
198
200
  const pluginsRoot = getPluginsRoot(pkgRoot)
199
201
  const includedPlugins = stack ? getIncludedPluginIds(stack) : undefined
@@ -201,13 +203,14 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
201
203
  const destSkills = resolve(dotDirPath, 'skills')
202
204
  await mkdir(destSkills, { recursive: true })
203
205
  for (const { id, skillPath } of pluginEntries) {
204
- const destPath = resolve(destSkills, `${id}.md`)
206
+ const pluginDestDir = resolve(destSkills, id)
207
+ await mkdir(pluginDestDir, { recursive: true })
208
+ const destPath = resolve(pluginDestDir, 'SKILL.md')
205
209
  if (existsSync(destPath)) {
206
210
  results.skipped.push(destPath)
207
211
  continue
208
212
  }
209
- const content = await readFile(skillPath, 'utf8')
210
- await writeFile(destPath, stripFrontmatter(content) + '\n')
213
+ await copyFile(skillPath, destPath)
211
214
  results.created.push(destPath)
212
215
  }
213
216
  }
@@ -310,7 +313,7 @@ export function createSingleFileAdapter(config: SingleFileAdapterConfig): IdeAda
310
313
  const checks: DoctorCheck[] = [
311
314
  { label: 'Root instructions file', path: config.rootFile, type: 'file' },
312
315
  { label: 'Agent definitions', path: `${config.dotDir}/agents/`, type: 'dir', countContents: true, countFilter: '.md' },
313
- { label: 'Skills directory', path: `${config.dotDir}/skills/`, type: 'dir', countContents: true, countFilter: '.md' },
316
+ { label: 'Skills directory', path: `${config.dotDir}/skills/`, type: 'dir', countContents: true },
314
317
  ]
315
318
  if (config.promptsDir === config.workflowsDir) {
316
319
  checks.push({ label: 'Commands directory', path: `${config.dotDir}/${config.promptsDir}/`, type: 'dir', countContents: true })
@@ -201,6 +201,10 @@ async function populateTestingConfig(
201
201
 
202
202
  const introLine = 'Project-specific testing details referenced by the `browser-testing` skill.'
203
203
  if (content.includes(introLine)) {
204
+ // Strip any previously-added content to make this idempotent
205
+ const existingAdditionRegex = /\n\n\*\*Test frameworks:\*\*[^\n]*(\n\n\*\*Config files:\*\*[^\n]*)?/;
206
+ content = content.replace(existingAdditionRegex, '');
207
+
204
208
  const cfg = filterConfigFiles(info.configFiles, [
205
209
  'vitest.config.ts',
206
210
  'vitest.config.js',
package/src/cli/detect.ts CHANGED
@@ -2,6 +2,7 @@ import { resolve } from 'node:path';
2
2
  import { readFile, readdir, access } from 'node:fs/promises';
3
3
  import { existsSync } from 'node:fs';
4
4
  import type { IdeChoice, RepoInfo, StackConfig } from './types.js';
5
+ import { getPluginsBySubCategory } from '../orchestrator/plugins/index.js';
5
6
 
6
7
  // ── IDE detection ───────────────────────────────────────────────
7
8
 
@@ -660,6 +661,17 @@ export function mergeStackIntoRepoInfo(info: RepoInfo, stack: StackConfig): Repo
660
661
  }
661
662
  }
662
663
 
664
+ const testingPluginIds = new Set([
665
+ ...getPluginsBySubCategory('testing').map(p => p.id),
666
+ ...getPluginsBySubCategory('e2e-testing').map(p => p.id),
667
+ ]);
668
+ const selectedTesting = stack.techTools.filter(t => testingPluginIds.has(t));
669
+ if (selectedTesting.length > 0) {
670
+ merged.testing = selectedTesting;
671
+ } else {
672
+ delete merged.testing;
673
+ }
674
+
663
675
  return merged;
664
676
  }
665
677
 
@@ -825,21 +825,27 @@ describe('Claude Code adapter install', () => {
825
825
  expect(devAgent).toContain('Developer')
826
826
  })
827
827
 
828
- it('creates skills as flat .md files stripped of frontmatter', async () => {
828
+ it('creates skills as <name>/SKILL.md subfolders with frontmatter preserved', async () => {
829
829
  const adapter = await IDE_ADAPTERS['claude-code']()
830
830
  await adapter.install(PKG_ROOT, tempDir, STACK_SANITY_LINEAR, EMPTY_REPO_INFO)
831
831
 
832
832
  const skillsDir = join(tempDir, '.claude', 'skills')
833
- const skills = await readdir(skillsDir)
833
+ const entries = await readdir(skillsDir)
834
834
 
835
- expect(skills).toContain('self-improvement.md')
836
- expect(skills).toContain('sanity.md')
837
- expect(skills).toContain('linear.md')
838
- expect(skills).not.toContain('supabase.md')
835
+ // Skills are subdirectories (Anthropic's Claude Code Skills format)
836
+ expect(entries).toContain('self-improvement')
837
+ expect(entries).toContain('sanity')
838
+ expect(entries).toContain('linear')
839
+ expect(entries).not.toContain('supabase')
839
840
 
840
- // Verify frontmatter is stripped
841
- const skillContent = await readFile(join(skillsDir, 'self-improvement.md'), 'utf8')
842
- expect(skillContent).not.toMatch(/^---\n/)
841
+ // SKILL.md exists inside each skill subdirectory
842
+ const skillContent = await readFile(
843
+ join(skillsDir, 'self-improvement', 'SKILL.md'),
844
+ 'utf8'
845
+ )
846
+ // Frontmatter is preserved — Claude Code uses the description: field for skill discovery
847
+ expect(skillContent).toMatch(/^---\n/)
848
+ expect(skillContent).toMatch(/\ndescription:/)
843
849
  })
844
850
 
845
851
  it('generates Claude Code MCP config with mcpServers format', async () => {
@@ -847,7 +853,7 @@ describe('Claude Code adapter install', () => {
847
853
  await adapter.install(PKG_ROOT, tempDir, STACK_SANITY_LINEAR, EMPTY_REPO_INFO)
848
854
 
849
855
  const mcpConfig = await readJson<Record<string, unknown>>(
850
- join(tempDir, '.claude', 'mcp.json')
856
+ join(tempDir, '.mcp.json')
851
857
  )
852
858
  expect(mcpConfig).toHaveProperty('mcpServers')
853
859
  expect(mcpConfig).not.toHaveProperty('servers')
@@ -887,7 +893,7 @@ describe('Claude Code adapter install', () => {
887
893
  expect(paths.framework).toContain('.claude/commands/')
888
894
 
889
895
  expect(paths.customizable).toContain('.opencastle/')
890
- expect(paths.customizable).toContain('.claude/mcp.json')
896
+ expect(paths.customizable).toContain('.mcp.json')
891
897
  })
892
898
  })
893
899
 
@@ -1128,31 +1134,31 @@ describe('Antigravity adapter install', () => {
1128
1134
  await adapter.install(PKG_ROOT, tmpDir, STACK_SANITY_LINEAR)
1129
1135
  const content = await readFile(join(tmpDir, 'GEMINI.md'), 'utf8')
1130
1136
  expect(content).toContain('Project Instructions')
1131
- expect(content).toContain('.gemini/')
1137
+ expect(content).toContain('.agents/')
1132
1138
  })
1133
1139
 
1134
- it('creates files in .gemini/ directory structure', async () => {
1140
+ it('creates files in .agents/ directory structure', async () => {
1135
1141
  const adapter = await IDE_ADAPTERS['antigravity']()
1136
1142
  await adapter.install(PKG_ROOT, tmpDir, STACK_SANITY_LINEAR)
1137
- expect(existsSync(join(tmpDir, '.gemini', 'agents'))).toBe(true)
1138
- expect(existsSync(join(tmpDir, '.gemini', 'skills'))).toBe(true)
1143
+ expect(existsSync(join(tmpDir, '.agents', 'agents'))).toBe(true)
1144
+ expect(existsSync(join(tmpDir, '.agents', 'skills'))).toBe(true)
1139
1145
  })
1140
1146
 
1141
1147
  it('generates Antigravity MCP config with mcpServers format', async () => {
1142
1148
  const adapter = await IDE_ADAPTERS['antigravity']()
1143
1149
  await adapter.install(PKG_ROOT, tmpDir, STACK_SANITY_LINEAR)
1144
- const mcpPath = join(tmpDir, '.gemini', 'mcp.json')
1150
+ const mcpPath = join(tmpDir, '.agents', 'mcp_config.json')
1145
1151
  expect(existsSync(mcpPath)).toBe(true)
1146
1152
  const mcp = await readJson(mcpPath)
1147
1153
  expect(mcp).toHaveProperty('mcpServers')
1148
1154
  })
1149
1155
 
1150
- it('getManagedPaths includes GEMINI.md and .gemini dirs', async () => {
1156
+ it('getManagedPaths includes GEMINI.md and .agents dirs', async () => {
1151
1157
  const adapter = await IDE_ADAPTERS['antigravity']()
1152
1158
  const paths = adapter.getManagedPaths()
1153
1159
  expect(paths.framework).toContain('GEMINI.md')
1154
- expect(paths.framework.some(p => p.includes('.gemini/'))).toBe(true)
1155
- expect(paths.customizable).toContain('.gemini/mcp.json')
1160
+ expect(paths.framework.some(p => p.includes('.agents/'))).toBe(true)
1161
+ expect(paths.customizable).toContain('.agents/mcp_config.json')
1156
1162
  })
1157
1163
  })
1158
1164
 
@@ -1185,7 +1191,7 @@ describe('MCP config format per IDE', () => {
1185
1191
  const paths: Record<string, string> = {
1186
1192
  vscode: join(dir, '.vscode', 'mcp.json'),
1187
1193
  cursor: join(dir, '.cursor', 'mcp.json'),
1188
- 'claude-code': join(dir, '.claude', 'mcp.json'),
1194
+ 'claude-code': join(dir, '.mcp.json'),
1189
1195
  opencode: join(dir, 'opencode.json'),
1190
1196
  }
1191
1197
 
@@ -1241,7 +1247,7 @@ describe('agent and skill parity across adapters', () => {
1241
1247
  opencode: join(dir, '.opencode', 'agents'),
1242
1248
  windsurf: join(dir, '.windsurf', 'rules', 'agents'),
1243
1249
  codex: join(dir, '.codex', 'agents'),
1244
- antigravity: join(dir, '.gemini', 'agents'),
1250
+ antigravity: join(dir, '.agents', 'agents'),
1245
1251
  }
1246
1252
 
1247
1253
  const agents = await readdir(agentPaths[ideId])
package/src/cli/init.ts CHANGED
@@ -110,7 +110,7 @@ export default async function init({ pkgRoot, args }: CliContext): Promise<void>
110
110
  },
111
111
  {
112
112
  label: 'Antigravity',
113
- hint: 'GEMINI.md & .gemini/',
113
+ hint: 'GEMINI.md & .agents/',
114
114
  value: 'antigravity',
115
115
  ...(detectedIde === 'antigravity' && { selected: true }),
116
116
  },
@@ -121,6 +121,12 @@ export default async function init({ pkgRoot, args }: CliContext): Promise<void>
121
121
  // Pre-select tools already detected in the repo
122
122
  const detectedTools = buildDetectedToolsSet(repoInfo)
123
123
 
124
+ const existingTools = new Set<string>()
125
+ if (isReinit && existing?.stack) {
126
+ for (const t of existing.stack.techTools ?? []) existingTools.add(t)
127
+ for (const t of existing.stack.teamTools ?? []) existingTools.add(t)
128
+ }
129
+
124
130
  console.log(` ${c.bold('── Stack ─────────────────────────────────────')}`)
125
131
 
126
132
  const categorySteps: Array<{ title: string; subCategories: string[]; target: 'tech' | 'team' }> = [
@@ -152,7 +158,7 @@ export default async function init({ pkgRoot, args }: CliContext): Promise<void>
152
158
  label: p.label,
153
159
  hint: p.hint,
154
160
  value: p.id,
155
- ...((p.preselected || detectedTools.has(p.id)) && { selected: true }),
161
+ ...((p.preselected || detectedTools.has(p.id) || existingTools.has(p.id)) && { selected: true }),
156
162
  }))
157
163
  )
158
164
  for (const id of selected) {
@@ -203,29 +209,21 @@ export default async function init({ pkgRoot, args }: CliContext): Promise<void>
203
209
 
204
210
  // ── Clean up previous installation on re-init ────────────────
205
211
  if (isReinit && existing) {
206
- const frameworkPaths = existing.managedPaths?.framework ?? []
207
- for (const p of frameworkPaths) {
208
- const fullPath = resolve(projectRoot, p)
209
- if (p.endsWith('/')) {
210
- await removeDirIfExists(fullPath)
211
- } else if (existsSync(fullPath)) {
212
- await unlink(fullPath)
213
- }
212
+ const oldIde = existing.stack?.ides?.[0]
213
+ let removeOldFiles = true
214
+ if (oldIde && oldIde !== ides[0]) {
215
+ const oldIdeLabel = IDE_LABELS[oldIde]
216
+ removeOldFiles = await confirm(`Remove ${oldIdeLabel} files from previous installation?`, false)
214
217
  }
215
- // Remove MCP configs so they get regenerated with new stack
216
- const mcpCandidates = [
217
- '.vscode/mcp.json',
218
- '.cursor/mcp.json',
219
- '.claude/mcp.json',
220
- 'opencode.json',
221
- '.windsurf/mcp.json',
222
- '.codex/mcp.json',
223
- '.gemini/mcp.json',
224
- ]
225
- for (const mcpPath of mcpCandidates) {
226
- const fullPath = resolve(projectRoot, mcpPath)
227
- if (existsSync(fullPath)) {
228
- await unlink(fullPath)
218
+ if (removeOldFiles) {
219
+ const frameworkPaths = existing.managedPaths?.framework ?? []
220
+ for (const p of frameworkPaths) {
221
+ const fullPath = resolve(projectRoot, p)
222
+ if (p.endsWith('/')) {
223
+ await removeDirIfExists(fullPath)
224
+ } else if (existsSync(fullPath)) {
225
+ await unlink(fullPath)
226
+ }
229
227
  }
230
228
  }
231
229
  }
@@ -353,7 +351,13 @@ export default async function init({ pkgRoot, args }: CliContext): Promise<void>
353
351
  const envContent = await readFile(envPath, 'utf8')
354
352
  const missing = envVars.filter(({ envVar }) => !envContent.includes(envVar))
355
353
  if (missing.length > 0) {
356
- console.log(` ${c.dim('→')} Your .env is missing: ${missing.map((m) => m.envVar).join(', ')}`)
354
+ const appendEnv = await confirm(`Append ${missing.length} missing variable(s) to .env?`, true)
355
+ if (appendEnv) {
356
+ const { appendFile } = await import('node:fs/promises')
357
+ const lines = missing.map(({ envVar, hint }) => `# ${hint}\n${envVar}=\n`)
358
+ await appendFile(envPath, '\n' + lines.join('\n'))
359
+ console.log(` ${c.green('✓')} Appended ${missing.length} placeholder(s) to .env`)
360
+ }
357
361
  } else {
358
362
  console.log(` ${c.green('✓')} All required variables found in .env`)
359
363
  }
package/src/cli/mcp.ts CHANGED
@@ -108,13 +108,23 @@ export async function scaffoldMcpConfig(
108
108
  // Build server list from plugin configs
109
109
  const servers: Record<string, VsCodeServer> = {};
110
110
  let inputs: McpInput[] = [];
111
+ const resolvedIde = ide ?? 'vscode';
111
112
 
112
113
  if (stack) {
113
114
  const included = getIncludedMcpServers(stack, repoInfo);
114
115
 
115
116
  for (const plugin of Object.values(PLUGINS)) {
116
117
  if (plugin.mcpServerKey && included.has(plugin.mcpServerKey)) {
117
- servers[plugin.mcpServerKey] = plugin.mcpConfig! as VsCodeServer;
118
+ const serverConfig = { ...plugin.mcpConfig! } as VsCodeServer;
119
+ if (resolvedIde !== 'vscode' && plugin.envVars.length > 0) {
120
+ const envBlock: Record<string, string> = { ...(serverConfig.env ?? {}) };
121
+ for (const ev of plugin.envVars) {
122
+ envBlock[ev.name] = `\${${ev.name}}`;
123
+ }
124
+ serverConfig.env = envBlock;
125
+ delete serverConfig.envFile;
126
+ }
127
+ servers[plugin.mcpServerKey] = serverConfig;
118
128
  if (plugin.mcpInputs) {
119
129
  inputs.push(...plugin.mcpInputs);
120
130
  }
@@ -123,7 +133,6 @@ export async function scaffoldMcpConfig(
123
133
  }
124
134
 
125
135
  // Transform to IDE-specific format
126
- const resolvedIde = ide ?? 'vscode';
127
136
  const output = transformMcpForIde(resolvedIde, servers, inputs.length > 0 ? inputs : undefined);
128
137
 
129
138
  if (existsSync(destPath)) {
@@ -197,7 +206,7 @@ function getMcpConfigRelPath(ide: IdeChoice): string {
197
206
  case 'cursor':
198
207
  return '.cursor/mcp.json';
199
208
  case 'claude-code':
200
- return '.claude/mcp.json';
209
+ return '.mcp.json';
201
210
  case 'opencode':
202
211
  return 'opencode.json';
203
212
  case 'windsurf':
@@ -205,7 +214,7 @@ function getMcpConfigRelPath(ide: IdeChoice): string {
205
214
  case 'codex':
206
215
  return '.codex/mcp.json';
207
216
  case 'antigravity':
208
- return '.gemini/mcp.json';
217
+ return '.agents/mcp_config.json';
209
218
  }
210
219
  }
211
220
 
@@ -51,21 +51,21 @@
51
51
  "name": "docs/api-v2-contract.json",
52
52
  "type": "json",
53
53
  "task_id": "api-t1",
54
- "created_at": "2026-04-16T08:09:50.091Z"
54
+ "created_at": "2026-05-16T18:35:05.680Z"
55
55
  },
56
56
  {
57
57
  "id": "artifact-demo-api-v2-reports-security-gate-failure-md",
58
58
  "name": "reports/security-gate-failure.md",
59
59
  "type": "summary",
60
60
  "task_id": "api-t3",
61
- "created_at": "2026-04-16T08:09:50.091Z"
61
+ "created_at": "2026-05-16T18:35:05.680Z"
62
62
  },
63
63
  {
64
64
  "id": "artifact-demo-api-v2-src-api-rate-limiter-ts",
65
65
  "name": "src/api/rate-limiter.ts",
66
66
  "type": "file",
67
67
  "task_id": "api-t2",
68
- "created_at": "2026-04-16T08:09:50.091Z"
68
+ "created_at": "2026-05-16T18:35:05.680Z"
69
69
  }
70
70
  ],
71
71
  "has_more_events": false,
@@ -42,28 +42,28 @@
42
42
  "name": "libs/auth/src/jwt-middleware.ts",
43
43
  "type": "file",
44
44
  "task_id": "auth-t2",
45
- "created_at": "2026-04-16T08:09:50.090Z"
45
+ "created_at": "2026-05-16T18:35:05.679Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-auth-revamp-libs-auth-src-rls-policies-sql",
49
49
  "name": "libs/auth/src/rls-policies.sql",
50
50
  "type": "file",
51
51
  "task_id": "auth-t3",
52
- "created_at": "2026-04-16T08:09:50.090Z"
52
+ "created_at": "2026-05-16T18:35:05.679Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-auth-revamp-reports-auth-review-summary-md",
56
56
  "name": "reports/auth-review-summary.md",
57
57
  "type": "summary",
58
58
  "task_id": "auth-t5",
59
- "created_at": "2026-04-16T08:09:50.090Z"
59
+ "created_at": "2026-05-16T18:35:05.679Z"
60
60
  },
61
61
  {
62
62
  "id": "artifact-demo-auth-revamp-tests-auth-integration-test-ts",
63
63
  "name": "tests/auth/integration.test.ts",
64
64
  "type": "file",
65
65
  "task_id": "auth-t4",
66
- "created_at": "2026-04-16T08:09:50.090Z"
66
+ "created_at": "2026-05-16T18:35:05.679Z"
67
67
  }
68
68
  ],
69
69
  "has_more_events": false,
@@ -51,42 +51,42 @@
51
51
  "name": "reports/visual-regression.json",
52
52
  "type": "json",
53
53
  "task_id": "ui-t6",
54
- "created_at": "2026-04-16T08:09:50.090Z"
54
+ "created_at": "2026-05-16T18:35:05.679Z"
55
55
  },
56
56
  {
57
57
  "id": "artifact-demo-dashboard-ui-src-components-DonutChart-tsx",
58
58
  "name": "src/components/DonutChart.tsx",
59
59
  "type": "file",
60
60
  "task_id": "ui-t3",
61
- "created_at": "2026-04-16T08:09:50.090Z"
61
+ "created_at": "2026-05-16T18:35:05.679Z"
62
62
  },
63
63
  {
64
64
  "id": "artifact-demo-dashboard-ui-src-components-KpiCard-tsx",
65
65
  "name": "src/components/KpiCard.tsx",
66
66
  "type": "file",
67
67
  "task_id": "ui-t2",
68
- "created_at": "2026-04-16T08:09:50.090Z"
68
+ "created_at": "2026-05-16T18:35:05.679Z"
69
69
  },
70
70
  {
71
71
  "id": "artifact-demo-dashboard-ui-src-components-design-tokens-ts",
72
72
  "name": "src/components/design-tokens.ts",
73
73
  "type": "file",
74
74
  "task_id": "ui-t1",
75
- "created_at": "2026-04-16T08:09:50.090Z"
75
+ "created_at": "2026-05-16T18:35:05.679Z"
76
76
  },
77
77
  {
78
78
  "id": "artifact-demo-dashboard-ui-src-styles-animations-css",
79
79
  "name": "src/styles/animations.css",
80
80
  "type": "file",
81
81
  "task_id": "ui-t4",
82
- "created_at": "2026-04-16T08:09:50.090Z"
82
+ "created_at": "2026-05-16T18:35:05.679Z"
83
83
  },
84
84
  {
85
85
  "id": "artifact-demo-dashboard-ui-reports-panel-review-dashboard-md",
86
86
  "name": "reports/panel-review-dashboard.md",
87
87
  "type": "summary",
88
88
  "task_id": "ui-t7",
89
- "created_at": "2026-04-16T08:09:50.091Z"
89
+ "created_at": "2026-05-16T18:35:05.680Z"
90
90
  }
91
91
  ],
92
92
  "has_more_events": false,