Three from the current issue backlog, all confirmed in source before touching anything, and all with a test that fails without the fix. #3224 — curateIndex() rebuilt MEMORY.md from the bridge's own topic files and overwrote whatever was there. The #1556 guard only skips the write when NOTHING matched, but the bridge writes the first topic file itself, so after the first insight the guard stops applying and the rebuild replaces a hand-maintained index with a stub: 75 curated lines and 49 links down to 6 in the reported case. The bridge only knows its own topic files, so everything else looks like nothing to it. A curate may now grow or reorder the index and never shrink it; when the generated view is smaller it is written beside the file as MEMORY.generated.md and the bridge emits index:preserved rather than going quiet. #3278 — the autostart disable check read claude-flow.config.json with the key daemon.autostart, while init generates .claude/settings.json with claudeFlow.daemon.autoStart. A different file AND a different capital S, so the one setting a fresh project actually ships was never consulted. It is written false under the comment "Opt-in only — prevents unintended token consumption (#1427, #1330)", which the runtime then ignored. Both files and both spellings are now read: someone who wrote autostart false anywhere sensible meant it. #3228 (half) — 3.41.1 disclosed the sibling AgentDB store from `memory list` only. retrieve, search and an empty list kept returning a clean negative while the rows sat in the file this interface does not read; the reported Windows install has 31,673 rows in that other store answering found:false. A confident negative is worse than an error, because nothing prompts anyone to look further. That was a gap in my own fix, not a new defect. Verified the tests are worth having by reverting each fix and re-running: #3224 fails 1/2, #3278 fails 2/4, and all six pass again restored. Claude-Session: https://claude.ai/code/session_013u4pmL9ZUAXb6usVQgNo67
CLI Module Tests
This directory contains comprehensive tests for the V3 CLI module using Vitest.
Test Files
1. cli.test.ts (~15+ tests)
Tests for the main CLI class covering:
- Version command (
--version,-V) - Help output (
--help,-h) - Command parsing (long flags, short flags, equals syntax)
- Positional arguments
- Boolean flags and negation
- Global flags (
--quiet,--format,--config,--no-color) - Error handling (unknown commands, missing options)
- Subcommand execution and aliases
- Exit codes
2. mcp-client.test.ts (~10+ tests)
Tests for MCP tool invocation:
callMCPTool()- Tool execution with various inputsgetToolMetadata()- Metadata retrievallistMCPTools()- Tool listing and filtering by categoryhasTool()- Tool existence checksgetToolCategories()- Category enumerationvalidateToolInput()- Input validation against schemasMCPClientError- Custom error handling
3. commands.test.ts (~48+ tests)
Tests for all CLI commands:
Agent Commands (spawn, list, status, stop, metrics):
- Spawning agents with various configurations
- Listing agents with filters
- Getting agent status and metrics
- Stopping agents (graceful/force)
- Agent performance metrics
Swarm Commands (init, start, status, stop, scale, coordinate):
- Initializing swarms with different topologies
- Starting swarm execution with objectives
- Checking swarm status
- Stopping and scaling swarms
- V3 15-agent coordination structure
Memory Commands (store, retrieve, search, list, delete, stats, configure):
- Storing data in memory (with/without vectors)
- Retrieving data by key
- Semantic/vector search
- Listing memory entries
- Deleting entries
- Viewing statistics
- Backend configuration
Config Commands (init, get, set, providers, reset, export, import):
- Initializing configuration
- Getting/setting config values
- Managing AI providers
- Resetting to defaults
- Exporting/importing configuration
Mocking Strategy
MCP Tools
All MCP tools are mocked at the module level to prevent actual tool execution:
agent-tools.js- Mocked agent operationsswarm-tools.js- Mocked swarm coordinationmemory-tools.js- Mocked memory operationsconfig-tools.js- Mocked configuration
Output
The output module is fully mocked to capture formatted output without console pollution.
Prompts
Interactive prompts (select, confirm, input, multiSelect) are mocked to return default values for non-interactive testing.
Process
process.exit() is mocked to throw errors instead of terminating the test process.
Running Tests
# Run all CLI tests
npm test -- v3/@claude-flow/cli/__tests__/
# Run specific test file
npm test -- v3/@claude-flow/cli/__tests__/cli.test.ts
# Run with coverage
npm test -- v3/@claude-flow/cli/__tests__/ --coverage
# Run in watch mode
npm test -- v3/@claude-flow/cli/__tests__/ --watch
Test Coverage Goals
- Statements: >80%
- Branches: >75%
- Functions: >80%
- Lines: >80%
Key Testing Patterns
1. Command Execution
const result = await command.action!(ctx);
expect(result.success).toBe(true);
expect(result.data).toHaveProperty('expectedField');
2. Flag Parsing
ctx.flags = { myFlag: 'value', _: [] };
await command.action!(ctx);
// Assertions in action callback
3. Error Handling
try {
await cli.run(['invalid-command']);
} catch (e) {
expect((e as Error).message).toContain('process.exit');
}
4. Output Validation
const output = consoleOutput.join('');
expect(output).toContain('Expected text');
Notes
- All tests are non-interactive (
interactive: false) - Console output is captured for verification
- Process exits are converted to exceptions
- MCP client is fully isolated from actual MCP server
- Tests use unique command names to avoid conflicts