feat(forge): mosaic forge CLI surface (#412)
Some checks failed
ci/woodpecker/push/publish Pipeline failed
ci/woodpecker/push/ci Pipeline failed

This commit was merged in pull request #412.
This commit is contained in:
2026-04-05 06:08:50 +00:00
parent 4ebce3422d
commit 641e4604d5
8 changed files with 849 additions and 3 deletions

View File

@@ -0,0 +1,57 @@
import { Command } from 'commander';
import { describe, expect, it } from 'vitest';
import { registerForgeCommand } from './cli.js';
describe('registerForgeCommand', () => {
it('registers a "forge" command on the parent program', () => {
const program = new Command();
registerForgeCommand(program);
const forgeCmd = program.commands.find((c) => c.name() === 'forge');
expect(forgeCmd).toBeDefined();
});
it('registers the four required subcommands under forge', () => {
const program = new Command();
registerForgeCommand(program);
const forgeCmd = program.commands.find((c) => c.name() === 'forge');
expect(forgeCmd).toBeDefined();
const subNames = forgeCmd!.commands.map((c) => c.name());
expect(subNames).toContain('run');
expect(subNames).toContain('status');
expect(subNames).toContain('resume');
expect(subNames).toContain('personas');
});
it('registers "personas list" as a subcommand of "forge personas"', () => {
const program = new Command();
registerForgeCommand(program);
const forgeCmd = program.commands.find((c) => c.name() === 'forge');
const personasCmd = forgeCmd!.commands.find((c) => c.name() === 'personas');
expect(personasCmd).toBeDefined();
const personasSubNames = personasCmd!.commands.map((c) => c.name());
expect(personasSubNames).toContain('list');
});
it('does not modify the parent program name or description', () => {
const program = new Command('mosaic');
program.description('Mosaic Stack CLI');
registerForgeCommand(program);
expect(program.name()).toBe('mosaic');
expect(program.description()).toBe('Mosaic Stack CLI');
});
it('can be called multiple times without throwing', () => {
const program = new Command();
expect(() => {
registerForgeCommand(program);
}).not.toThrow();
});
});