feat(veai): add skills-only support (#848)

* feat: Add support for Veai coding agent

* chore(changeset): track Veai support

* docs(changeset): clarify Veai user impact

---------

Co-authored-by: TabishB <tabishbidiwale@gmail.com>
Co-authored-by: Clay Good <hi@claygood.com>
This commit is contained in:
Yurii Kostyukov
2026-09-29 18:25:53 +00:00
committed by GitHub
co-authored by TabishB Clay Good
parent 3c3e6e3d42
commit 5a360c2088
4 changed files with 23 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
---
"@fission-ai/openspec": minor
---
### New Features
- **Veai support**: select `veai` during init to install OpenSpec workflows as project skills under `.veai/skills/`.
+1
View File
@@ -48,6 +48,7 @@ The id goes to `openspec init --tools <id>` to skip the picker ([CLI](cli.md)).
| Qoder | `qoder` | `.qoder/skills/` | `/openspec-apply-change` | `.qoder/commands/opsx/` | `/opsx:apply` |
| Qwen Code | `qwen` | `.qwen/skills/` | `/openspec-apply-change` | `.qwen/commands/` | `/opsx-apply` |
| Trae | `trae` | `.trae/skills/` | `/openspec-apply-change` | `.trae/commands/` | `/opsx-apply` |
| [Veai](https://veai.ru/docs/veai/download) | `veai` | `.veai/skills/` | `/openspec-apply-change` | none | none |
| ZCode | `zcode` | `.zcode/skills/` | `/openspec-apply-change` | `.zcode/commands/opsx/` | `/opsx:apply` |
| Zoo Code | `roocode` | `.roo/skills/` | `/openspec-apply-change` | `.roo/commands/` | `/opsx-apply` |
| Other / Universal | `agents` | `.agents/skills/` | `/openspec-apply-change` | none | none |
+1
View File
@@ -82,6 +82,7 @@ export const AI_TOOLS: AIToolOption[] = [
{ name: 'Rovo Dev CLI', value: 'rovodev', available: true, successLabel: 'Rovo Dev CLI', skillsDir: '.rovodev', detectionPaths: ['.rovodev/skills', '.rovodev'] },
{ name: 'Zoo Code', value: 'roocode', available: true, successLabel: 'Zoo Code', skillsDir: '.roo', requiresIdeRestart: true },
{ name: 'Trae', value: 'trae', available: true, successLabel: 'Trae', skillsDir: '.trae', requiresIdeRestart: true },
{ name: 'Veai', value: 'veai', available: true, successLabel: 'Veai', skillsDir: '.veai' },
{ name: 'Zed Agent', value: 'zed', available: true, successLabel: 'Zed Agent', skillsDir: '.agents', detectionPaths: ['.zed', '.agents/skills'] },
{ name: 'ZCode', value: 'zcode', available: true, successLabel: 'ZCode', skillsDir: '.zcode' },
// Vendor-neutral target for assistants that read the shared `.agents` root.
+14
View File
@@ -2217,6 +2217,20 @@ describe('InitCommand - profile and detection features', () => {
expect(startHint).not.toContain('/opsx:propose');
});
it('should install Veai as a skills-only tool', async () => {
const initCommand = new InitCommand({ tools: 'veai', force: true });
await initCommand.execute(testDir);
const skillFile = path.join(testDir, '.veai', 'skills', 'openspec-apply-change', 'SKILL.md');
expect(await fileExists(skillFile)).toBe(true);
expect(await directoryExists(path.join(testDir, '.veai', 'commands'))).toBe(false);
const skillContent = await fs.readFile(skillFile, 'utf-8');
expect(skillContent).toContain('/openspec-');
expect(skillContent).not.toContain('/opsx:');
expect(skillContent).not.toContain('/opsx-');
});
it('should name the workflows the core profile leaves out (#1076)', async () => {
const initCommand = new InitCommand({ tools: 'claude', force: true });
await initCommand.execute(testDir);