From c0d948f528a7bb250c489682bc69de296cef58ad Mon Sep 17 00:00:00 2001 From: AshokkumarKaruppasamy Date: Thu, 26 Mar 2026 13:34:19 +0530 Subject: [PATCH 1/4] feat: add Code Studio tool integration --- docs/supported-tools.md | 3 +- .../adapters/code-studio.ts | 30 +++++++++++++++++++ src/core/command-generation/adapters/index.ts | 1 + src/core/command-generation/registry.ts | 2 ++ src/core/config.ts | 1 + test/core/command-generation/adapters.test.ts | 22 +++++++++++++- 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/core/command-generation/adapters/code-studio.ts diff --git a/docs/supported-tools.md b/docs/supported-tools.md index 524e597f2..0d4a5dc6b 100644 --- a/docs/supported-tools.md +++ b/docs/supported-tools.md @@ -27,6 +27,7 @@ You can enable expanded workflows (`new`, `continue`, `ff`, `verify`, `sync`, `b | Claude Code (`claude`) | `.claude/skills/openspec-*/SKILL.md` | `.claude/commands/opsx/.md` | | Cline (`cline`) | `.cline/skills/openspec-*/SKILL.md` | `.clinerules/workflows/opsx-.md` | | CodeBuddy (`codebuddy`) | `.codebuddy/skills/openspec-*/SKILL.md` | `.codebuddy/commands/opsx/.md` | +| Code Studio (`code-studio`) | `.code-studio/skills/openspec-*/SKILL.md` | `.code-studio/prompts/opsx-.prompt.md` | | Codex (`codex`) | `.codex/skills/openspec-*/SKILL.md` | `$CODEX_HOME/prompts/opsx-.md`\* | | Continue (`continue`) | `.continue/skills/openspec-*/SKILL.md` | `.continue/prompts/opsx-.prompt` | | CoStrict (`costrict`) | `.cospec/skills/openspec-*/SKILL.md` | `.cospec/openspec/commands/opsx-.md` | @@ -68,7 +69,7 @@ openspec init --tools none openspec init --profile core ``` -**Available tool IDs (`--tools`):** `amazon-q`, `antigravity`, `auggie`, `claude`, `cline`, `codex`, `codebuddy`, `continue`, `costrict`, `crush`, `cursor`, `factory`, `gemini`, `github-copilot`, `iflow`, `kilocode`, `kiro`, `opencode`, `pi`, `qoder`, `qwen`, `roocode`, `trae`, `windsurf` +**Available tool IDs (`--tools`):** `amazon-q`, `antigravity`, `auggie`, `claude`, `cline`, `codex`, `codebuddy`, `code-studio`, `continue`, `costrict`, `crush`, `cursor`, `factory`, `gemini`, `github-copilot`, `iflow`, `kilocode`, `kiro`, `opencode`, `pi`, `qoder`, `qwen`, `roocode`, `trae`, `windsurf` ## Workflow-Dependent Installation diff --git a/src/core/command-generation/adapters/code-studio.ts b/src/core/command-generation/adapters/code-studio.ts new file mode 100644 index 000000000..ea045a0f8 --- /dev/null +++ b/src/core/command-generation/adapters/code-studio.ts @@ -0,0 +1,30 @@ +/** + * Code Studio Command Adapter + * + * Formats commands for Syncfusion Code Studio following its .prompt.md specification. + */ + +import path from 'path'; +import type { CommandContent, ToolCommandAdapter } from '../types.js'; + +/** + * Code Studio adapter for command generation. + * File path: .code-studio/prompts/opsx-.prompt.md + * Frontmatter: description + */ +export const codeStudioAdapter: ToolCommandAdapter = { + toolId: 'code-studio', + + getFilePath(commandId: string): string { + return path.join('.code-studio', 'prompts', `opsx-${commandId}.prompt.md`); + }, + + formatFile(content: CommandContent): string { + return `--- +description: ${content.description} +--- + +${content.body} +`; + }, +}; diff --git a/src/core/command-generation/adapters/index.ts b/src/core/command-generation/adapters/index.ts index 06f7a7ae7..a8351e081 100644 --- a/src/core/command-generation/adapters/index.ts +++ b/src/core/command-generation/adapters/index.ts @@ -11,6 +11,7 @@ export { claudeAdapter } from './claude.js'; export { clineAdapter } from './cline.js'; export { codexAdapter } from './codex.js'; export { codebuddyAdapter } from './codebuddy.js'; +export { codeStudioAdapter } from './code-studio.js'; export { continueAdapter } from './continue.js'; export { costrictAdapter } from './costrict.js'; export { crushAdapter } from './crush.js'; diff --git a/src/core/command-generation/registry.ts b/src/core/command-generation/registry.ts index a69a98adc..5fa4c9cbe 100644 --- a/src/core/command-generation/registry.ts +++ b/src/core/command-generation/registry.ts @@ -13,6 +13,7 @@ import { claudeAdapter } from './adapters/claude.js'; import { clineAdapter } from './adapters/cline.js'; import { codexAdapter } from './adapters/codex.js'; import { codebuddyAdapter } from './adapters/codebuddy.js'; +import { codeStudioAdapter } from './adapters/code-studio.js'; import { continueAdapter } from './adapters/continue.js'; import { costrictAdapter } from './adapters/costrict.js'; import { crushAdapter } from './adapters/crush.js'; @@ -45,6 +46,7 @@ export class CommandAdapterRegistry { CommandAdapterRegistry.register(clineAdapter); CommandAdapterRegistry.register(codexAdapter); CommandAdapterRegistry.register(codebuddyAdapter); + CommandAdapterRegistry.register(codeStudioAdapter); CommandAdapterRegistry.register(continueAdapter); CommandAdapterRegistry.register(costrictAdapter); CommandAdapterRegistry.register(crushAdapter); diff --git a/src/core/config.ts b/src/core/config.ts index f35f92861..046d65c87 100644 --- a/src/core/config.ts +++ b/src/core/config.ts @@ -25,6 +25,7 @@ export const AI_TOOLS: AIToolOption[] = [ { name: 'Cline', value: 'cline', available: true, successLabel: 'Cline', skillsDir: '.cline' }, { name: 'Codex', value: 'codex', available: true, successLabel: 'Codex', skillsDir: '.codex' }, { name: 'CodeBuddy Code (CLI)', value: 'codebuddy', available: true, successLabel: 'CodeBuddy Code', skillsDir: '.codebuddy' }, + { name: 'Code Studio', value: 'code-studio', available: true, successLabel: 'Code Studio', skillsDir: '.code-studio' }, { name: 'Continue', value: 'continue', available: true, successLabel: 'Continue (VS Code / JetBrains / Cli)', skillsDir: '.continue' }, { name: 'CoStrict', value: 'costrict', available: true, successLabel: 'CoStrict', skillsDir: '.cospec' }, { name: 'Crush', value: 'crush', available: true, successLabel: 'Crush', skillsDir: '.crush' }, diff --git a/test/core/command-generation/adapters.test.ts b/test/core/command-generation/adapters.test.ts index dab19bf3d..b866a8507 100644 --- a/test/core/command-generation/adapters.test.ts +++ b/test/core/command-generation/adapters.test.ts @@ -8,6 +8,7 @@ import { claudeAdapter } from '../../../src/core/command-generation/adapters/cla import { clineAdapter } from '../../../src/core/command-generation/adapters/cline.js'; import { codexAdapter } from '../../../src/core/command-generation/adapters/codex.js'; import { codebuddyAdapter } from '../../../src/core/command-generation/adapters/codebuddy.js'; +import { codeStudioAdapter } from '../../../src/core/command-generation/adapters/code-studio.js'; import { continueAdapter } from '../../../src/core/command-generation/adapters/continue.js'; import { costrictAdapter } from '../../../src/core/command-generation/adapters/costrict.js'; import { crushAdapter } from '../../../src/core/command-generation/adapters/crush.js'; @@ -277,6 +278,25 @@ describe('command-generation/adapters', () => { }); }); + describe('codeStudioAdapter', () => { + it('should have correct toolId', () => { + expect(codeStudioAdapter.toolId).toBe('code-studio'); + }); + + it('should generate correct file path with .prompt.md extension', () => { + const filePath = codeStudioAdapter.getFilePath('explore'); + expect(filePath).toBe(path.join('.code-studio', 'prompts', 'opsx-explore.prompt.md')); + }); + + it('should format file with description frontmatter', () => { + const output = codeStudioAdapter.formatFile(sampleContent); + expect(output).toContain('---\n'); + expect(output).toContain('description: Enter explore mode for thinking'); + expect(output).toContain('---\n\n'); + expect(output).toContain('This is the command body.'); + }); + }); + describe('continueAdapter', () => { it('should have correct toolId', () => { expect(continueAdapter.toolId).toBe('continue'); @@ -607,7 +627,7 @@ describe('command-generation/adapters', () => { // Verify all adapters produce valid paths const adapters = [ amazonQAdapter, antigravityAdapter, auggieAdapter, clineAdapter, - codexAdapter, codebuddyAdapter, continueAdapter, costrictAdapter, + codexAdapter, codebuddyAdapter, codeStudioAdapter, continueAdapter, costrictAdapter, crushAdapter, factoryAdapter, geminiAdapter, githubCopilotAdapter, iflowAdapter, kilocodeAdapter, opencodeAdapter, piAdapter, qoderAdapter, qwenAdapter, roocodeAdapter From b7b7072a8327a7c3feaf75444a545e7748f580e7 Mon Sep 17 00:00:00 2001 From: AshokkumarKaruppasamy Date: Thu, 26 Mar 2026 15:23:46 +0530 Subject: [PATCH 2/4] feat: add Code Studio tool integration --- docs/supported-tools.md | 2 +- .../adapters/{code-studio.ts => codestudio.ts} | 4 ++-- src/core/config.ts | 2 +- test/core/command-generation/adapters.test.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename src/core/command-generation/adapters/{code-studio.ts => codestudio.ts} (80%) diff --git a/docs/supported-tools.md b/docs/supported-tools.md index 0d4a5dc6b..9100e739c 100644 --- a/docs/supported-tools.md +++ b/docs/supported-tools.md @@ -27,7 +27,7 @@ You can enable expanded workflows (`new`, `continue`, `ff`, `verify`, `sync`, `b | Claude Code (`claude`) | `.claude/skills/openspec-*/SKILL.md` | `.claude/commands/opsx/.md` | | Cline (`cline`) | `.cline/skills/openspec-*/SKILL.md` | `.clinerules/workflows/opsx-.md` | | CodeBuddy (`codebuddy`) | `.codebuddy/skills/openspec-*/SKILL.md` | `.codebuddy/commands/opsx/.md` | -| Code Studio (`code-studio`) | `.code-studio/skills/openspec-*/SKILL.md` | `.code-studio/prompts/opsx-.prompt.md` | +| Code Studio (`code-studio`) | `.codestudio/skills/openspec-*/SKILL.md` | `.codestudio/prompts/opsx-.prompt.md` | | Codex (`codex`) | `.codex/skills/openspec-*/SKILL.md` | `$CODEX_HOME/prompts/opsx-.md`\* | | Continue (`continue`) | `.continue/skills/openspec-*/SKILL.md` | `.continue/prompts/opsx-.prompt` | | CoStrict (`costrict`) | `.cospec/skills/openspec-*/SKILL.md` | `.cospec/openspec/commands/opsx-.md` | diff --git a/src/core/command-generation/adapters/code-studio.ts b/src/core/command-generation/adapters/codestudio.ts similarity index 80% rename from src/core/command-generation/adapters/code-studio.ts rename to src/core/command-generation/adapters/codestudio.ts index ea045a0f8..7821b19ca 100644 --- a/src/core/command-generation/adapters/code-studio.ts +++ b/src/core/command-generation/adapters/codestudio.ts @@ -9,14 +9,14 @@ import type { CommandContent, ToolCommandAdapter } from '../types.js'; /** * Code Studio adapter for command generation. - * File path: .code-studio/prompts/opsx-.prompt.md + * File path: .codestudio/prompts/opsx-.prompt.md * Frontmatter: description */ export const codeStudioAdapter: ToolCommandAdapter = { toolId: 'code-studio', getFilePath(commandId: string): string { - return path.join('.code-studio', 'prompts', `opsx-${commandId}.prompt.md`); + return path.join('.codestudio', 'prompts', `opsx-${commandId}.prompt.md`); }, formatFile(content: CommandContent): string { diff --git a/src/core/config.ts b/src/core/config.ts index 046d65c87..f17d3b007 100644 --- a/src/core/config.ts +++ b/src/core/config.ts @@ -25,7 +25,7 @@ export const AI_TOOLS: AIToolOption[] = [ { name: 'Cline', value: 'cline', available: true, successLabel: 'Cline', skillsDir: '.cline' }, { name: 'Codex', value: 'codex', available: true, successLabel: 'Codex', skillsDir: '.codex' }, { name: 'CodeBuddy Code (CLI)', value: 'codebuddy', available: true, successLabel: 'CodeBuddy Code', skillsDir: '.codebuddy' }, - { name: 'Code Studio', value: 'code-studio', available: true, successLabel: 'Code Studio', skillsDir: '.code-studio' }, + { name: 'Code Studio', value: 'code-studio', available: true, successLabel: 'Code Studio', skillsDir: '.codestudio' }, { name: 'Continue', value: 'continue', available: true, successLabel: 'Continue (VS Code / JetBrains / Cli)', skillsDir: '.continue' }, { name: 'CoStrict', value: 'costrict', available: true, successLabel: 'CoStrict', skillsDir: '.cospec' }, { name: 'Crush', value: 'crush', available: true, successLabel: 'Crush', skillsDir: '.crush' }, diff --git a/test/core/command-generation/adapters.test.ts b/test/core/command-generation/adapters.test.ts index b866a8507..7bff247fd 100644 --- a/test/core/command-generation/adapters.test.ts +++ b/test/core/command-generation/adapters.test.ts @@ -285,7 +285,7 @@ describe('command-generation/adapters', () => { it('should generate correct file path with .prompt.md extension', () => { const filePath = codeStudioAdapter.getFilePath('explore'); - expect(filePath).toBe(path.join('.code-studio', 'prompts', 'opsx-explore.prompt.md')); + expect(filePath).toBe(path.join('.codestudio', 'prompts', 'opsx-explore.prompt.md')); }); it('should format file with description frontmatter', () => { From 942de707df720b4f28bf8c7df925354e286f4fc9 Mon Sep 17 00:00:00 2001 From: AshokkumarKaruppasamy Date: Thu, 26 Mar 2026 15:27:27 +0530 Subject: [PATCH 3/4] feat: add Code Studio tool integration --- docs/supported-tools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/supported-tools.md b/docs/supported-tools.md index 9100e739c..051a58e90 100644 --- a/docs/supported-tools.md +++ b/docs/supported-tools.md @@ -27,7 +27,7 @@ You can enable expanded workflows (`new`, `continue`, `ff`, `verify`, `sync`, `b | Claude Code (`claude`) | `.claude/skills/openspec-*/SKILL.md` | `.claude/commands/opsx/.md` | | Cline (`cline`) | `.cline/skills/openspec-*/SKILL.md` | `.clinerules/workflows/opsx-.md` | | CodeBuddy (`codebuddy`) | `.codebuddy/skills/openspec-*/SKILL.md` | `.codebuddy/commands/opsx/.md` | -| Code Studio (`code-studio`) | `.codestudio/skills/openspec-*/SKILL.md` | `.codestudio/prompts/opsx-.prompt.md` | +| Code Studio (`codestudio`) | `.codestudio/skills/openspec-*/SKILL.md` | `.codestudio/prompts/opsx-.prompt.md` | | Codex (`codex`) | `.codex/skills/openspec-*/SKILL.md` | `$CODEX_HOME/prompts/opsx-.md`\* | | Continue (`continue`) | `.continue/skills/openspec-*/SKILL.md` | `.continue/prompts/opsx-.prompt` | | CoStrict (`costrict`) | `.cospec/skills/openspec-*/SKILL.md` | `.cospec/openspec/commands/opsx-.md` | From 6a00712b3f0046fb319e366ed521ab34b4f745bc Mon Sep 17 00:00:00 2001 From: AshokkumarKaruppasamy Date: Thu, 26 Mar 2026 15:37:08 +0530 Subject: [PATCH 4/4] feat: add Code Studio tool integration --- docs/supported-tools.md | 2 +- src/core/command-generation/adapters/codestudio.ts | 2 +- src/core/command-generation/adapters/index.ts | 2 +- src/core/command-generation/registry.ts | 2 +- src/core/config.ts | 2 +- test/core/command-generation/adapters.test.ts | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/supported-tools.md b/docs/supported-tools.md index 051a58e90..5239ff90d 100644 --- a/docs/supported-tools.md +++ b/docs/supported-tools.md @@ -69,7 +69,7 @@ openspec init --tools none openspec init --profile core ``` -**Available tool IDs (`--tools`):** `amazon-q`, `antigravity`, `auggie`, `claude`, `cline`, `codex`, `codebuddy`, `code-studio`, `continue`, `costrict`, `crush`, `cursor`, `factory`, `gemini`, `github-copilot`, `iflow`, `kilocode`, `kiro`, `opencode`, `pi`, `qoder`, `qwen`, `roocode`, `trae`, `windsurf` +**Available tool IDs (`--tools`):** `amazon-q`, `antigravity`, `auggie`, `claude`, `cline`, `codex`, `codebuddy`, `codestudio`, `continue`, `costrict`, `crush`, `cursor`, `factory`, `gemini`, `github-copilot`, `iflow`, `kilocode`, `kiro`, `opencode`, `pi`, `qoder`, `qwen`, `roocode`, `trae`, `windsurf` ## Workflow-Dependent Installation diff --git a/src/core/command-generation/adapters/codestudio.ts b/src/core/command-generation/adapters/codestudio.ts index 7821b19ca..c233d30ac 100644 --- a/src/core/command-generation/adapters/codestudio.ts +++ b/src/core/command-generation/adapters/codestudio.ts @@ -13,7 +13,7 @@ import type { CommandContent, ToolCommandAdapter } from '../types.js'; * Frontmatter: description */ export const codeStudioAdapter: ToolCommandAdapter = { - toolId: 'code-studio', + toolId: 'codestudio', getFilePath(commandId: string): string { return path.join('.codestudio', 'prompts', `opsx-${commandId}.prompt.md`); diff --git a/src/core/command-generation/adapters/index.ts b/src/core/command-generation/adapters/index.ts index a8351e081..d3ee978a1 100644 --- a/src/core/command-generation/adapters/index.ts +++ b/src/core/command-generation/adapters/index.ts @@ -11,7 +11,7 @@ export { claudeAdapter } from './claude.js'; export { clineAdapter } from './cline.js'; export { codexAdapter } from './codex.js'; export { codebuddyAdapter } from './codebuddy.js'; -export { codeStudioAdapter } from './code-studio.js'; +export { codeStudioAdapter } from './codestudio.js'; export { continueAdapter } from './continue.js'; export { costrictAdapter } from './costrict.js'; export { crushAdapter } from './crush.js'; diff --git a/src/core/command-generation/registry.ts b/src/core/command-generation/registry.ts index 5fa4c9cbe..c334a29ef 100644 --- a/src/core/command-generation/registry.ts +++ b/src/core/command-generation/registry.ts @@ -13,7 +13,7 @@ import { claudeAdapter } from './adapters/claude.js'; import { clineAdapter } from './adapters/cline.js'; import { codexAdapter } from './adapters/codex.js'; import { codebuddyAdapter } from './adapters/codebuddy.js'; -import { codeStudioAdapter } from './adapters/code-studio.js'; +import { codeStudioAdapter } from './adapters/codestudio.js'; import { continueAdapter } from './adapters/continue.js'; import { costrictAdapter } from './adapters/costrict.js'; import { crushAdapter } from './adapters/crush.js'; diff --git a/src/core/config.ts b/src/core/config.ts index f17d3b007..1a9d73b95 100644 --- a/src/core/config.ts +++ b/src/core/config.ts @@ -25,7 +25,7 @@ export const AI_TOOLS: AIToolOption[] = [ { name: 'Cline', value: 'cline', available: true, successLabel: 'Cline', skillsDir: '.cline' }, { name: 'Codex', value: 'codex', available: true, successLabel: 'Codex', skillsDir: '.codex' }, { name: 'CodeBuddy Code (CLI)', value: 'codebuddy', available: true, successLabel: 'CodeBuddy Code', skillsDir: '.codebuddy' }, - { name: 'Code Studio', value: 'code-studio', available: true, successLabel: 'Code Studio', skillsDir: '.codestudio' }, + { name: 'Code Studio', value: 'codestudio', available: true, successLabel: 'Code Studio', skillsDir: '.codestudio' }, { name: 'Continue', value: 'continue', available: true, successLabel: 'Continue (VS Code / JetBrains / Cli)', skillsDir: '.continue' }, { name: 'CoStrict', value: 'costrict', available: true, successLabel: 'CoStrict', skillsDir: '.cospec' }, { name: 'Crush', value: 'crush', available: true, successLabel: 'Crush', skillsDir: '.crush' }, diff --git a/test/core/command-generation/adapters.test.ts b/test/core/command-generation/adapters.test.ts index 7bff247fd..9e4aa869e 100644 --- a/test/core/command-generation/adapters.test.ts +++ b/test/core/command-generation/adapters.test.ts @@ -8,7 +8,7 @@ import { claudeAdapter } from '../../../src/core/command-generation/adapters/cla import { clineAdapter } from '../../../src/core/command-generation/adapters/cline.js'; import { codexAdapter } from '../../../src/core/command-generation/adapters/codex.js'; import { codebuddyAdapter } from '../../../src/core/command-generation/adapters/codebuddy.js'; -import { codeStudioAdapter } from '../../../src/core/command-generation/adapters/code-studio.js'; +import { codeStudioAdapter } from '../../../src/core/command-generation/adapters/codestudio.js'; import { continueAdapter } from '../../../src/core/command-generation/adapters/continue.js'; import { costrictAdapter } from '../../../src/core/command-generation/adapters/costrict.js'; import { crushAdapter } from '../../../src/core/command-generation/adapters/crush.js'; @@ -280,7 +280,7 @@ describe('command-generation/adapters', () => { describe('codeStudioAdapter', () => { it('should have correct toolId', () => { - expect(codeStudioAdapter.toolId).toBe('code-studio'); + expect(codeStudioAdapter.toolId).toBe('codestudio'); }); it('should generate correct file path with .prompt.md extension', () => {