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.
- package/README.md +1 -1
- package/dist/cli/adapters/antigravity.d.ts +13 -7
- package/dist/cli/adapters/antigravity.d.ts.map +1 -1
- package/dist/cli/adapters/antigravity.js +15 -9
- package/dist/cli/adapters/antigravity.js.map +1 -1
- package/dist/cli/adapters/claude-code.d.ts +1 -1
- package/dist/cli/adapters/claude-code.js +2 -2
- package/dist/cli/adapters/claude-code.js.map +1 -1
- package/dist/cli/adapters/codex.d.ts +1 -1
- package/dist/cli/adapters/codex.js +1 -1
- package/dist/cli/adapters/opencode.d.ts +1 -1
- package/dist/cli/adapters/opencode.js +1 -1
- package/dist/cli/adapters/single-file-base.d.ts.map +1 -1
- package/dist/cli/adapters/single-file-base.js +17 -18
- package/dist/cli/adapters/single-file-base.js.map +1 -1
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +3 -0
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/detect.d.ts.map +1 -1
- package/dist/cli/detect.js +12 -0
- package/dist/cli/detect.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +31 -26
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init.test.js +24 -21
- package/dist/cli/init.test.js.map +1 -1
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +13 -4
- package/dist/cli/mcp.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/adapters/antigravity.ts +15 -9
- package/src/cli/adapters/claude-code.ts +2 -2
- package/src/cli/adapters/codex.ts +1 -1
- package/src/cli/adapters/opencode.ts +1 -1
- package/src/cli/adapters/single-file-base.ts +20 -17
- package/src/cli/bootstrap.ts +4 -0
- package/src/cli/detect.ts +12 -0
- package/src/cli/init.test.ts +27 -21
- package/src/cli/init.ts +29 -25
- package/src/cli/mcp.ts +13 -4
- package/src/dashboard/dist/data/convoys/demo-api-v2.json +3 -3
- package/src/dashboard/dist/data/convoys/demo-auth-revamp.json +4 -4
- package/src/dashboard/dist/data/convoys/demo-dashboard-ui.json +6 -6
- package/src/dashboard/dist/data/convoys/demo-data-pipeline.json +3 -3
- package/src/dashboard/dist/data/convoys/demo-deploy-ci.json +1 -1
- package/src/dashboard/dist/data/convoys/demo-docs-update.json +3 -3
- package/src/dashboard/dist/data/convoys/demo-perf-opt.json +4 -4
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
- package/src/dashboard/public/data/convoys/demo-api-v2.json +3 -3
- package/src/dashboard/public/data/convoys/demo-auth-revamp.json +4 -4
- package/src/dashboard/public/data/convoys/demo-dashboard-ui.json +6 -6
- package/src/dashboard/public/data/convoys/demo-data-pipeline.json +3 -3
- package/src/dashboard/public/data/convoys/demo-deploy-ci.json +1 -1
- package/src/dashboard/public/data/convoys/demo-docs-update.json +3 -3
- package/src/dashboard/public/data/convoys/demo-perf-opt.json +4 -4
- package/src/orchestrator/agents/copywriter.agent.md +1 -1
- package/src/orchestrator/agents/data-expert.agent.md +1 -1
- package/src/orchestrator/agents/devops-expert.agent.md +1 -1
- package/src/orchestrator/agents/documentation-writer.agent.md +1 -1
- package/src/orchestrator/agents/release-manager.agent.md +1 -1
- package/src/orchestrator/agents/reviewer.agent.md +1 -1
- package/src/orchestrator/agents/seo-specialist.agent.md +1 -1
- package/src/orchestrator/agents/session-guard.agent.md +1 -1
- package/src/orchestrator/agents/team-lead.agent.md +1 -1
- package/src/orchestrator/agents/testing-expert.agent.md +1 -1
- package/src/orchestrator/customizations/agents/agent-registry.md +8 -8
package/dist/cli/mcp.js.map
CHANGED
|
@@ -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
|
@@ -3,23 +3,29 @@ import { createSingleFileAdapter } from './single-file-base.js'
|
|
|
3
3
|
/**
|
|
4
4
|
* Antigravity adapter (Google).
|
|
5
5
|
*
|
|
6
|
-
* Generates GEMINI.md (
|
|
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
|
|
10
|
-
* agents/*.agent.md -> .
|
|
11
|
-
* agent-workflows/*.md -> .
|
|
12
|
-
* prompts/*.prompt.md -> .
|
|
13
|
-
* customizations/ -> .
|
|
14
|
-
* mcp.json -> .
|
|
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: '.
|
|
22
|
-
mcpConfigPath: '.
|
|
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
|
|
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: '.
|
|
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
|
|
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
|
|
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}** (\`${
|
|
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}** (\`${
|
|
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
|
|
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
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 })
|
package/src/cli/bootstrap.ts
CHANGED
|
@@ -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
|
|
package/src/cli/init.test.ts
CHANGED
|
@@ -825,21 +825,27 @@ describe('Claude Code adapter install', () => {
|
|
|
825
825
|
expect(devAgent).toContain('Developer')
|
|
826
826
|
})
|
|
827
827
|
|
|
828
|
-
it('creates skills as
|
|
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
|
|
833
|
+
const entries = await readdir(skillsDir)
|
|
834
834
|
|
|
835
|
-
|
|
836
|
-
expect(
|
|
837
|
-
expect(
|
|
838
|
-
expect(
|
|
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
|
-
//
|
|
841
|
-
const skillContent = await readFile(
|
|
842
|
-
|
|
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, '.
|
|
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('.
|
|
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('.
|
|
1137
|
+
expect(content).toContain('.agents/')
|
|
1132
1138
|
})
|
|
1133
1139
|
|
|
1134
|
-
it('creates files in .
|
|
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, '.
|
|
1138
|
-
expect(existsSync(join(tmpDir, '.
|
|
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, '.
|
|
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 .
|
|
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('.
|
|
1155
|
-
expect(paths.customizable).toContain('.
|
|
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, '.
|
|
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, '.
|
|
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 & .
|
|
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
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 '.
|
|
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 '.
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
89
|
+
"created_at": "2026-05-16T18:35:05.680Z"
|
|
90
90
|
}
|
|
91
91
|
],
|
|
92
92
|
"has_more_events": false,
|