claude-flow 2.5.0-alpha.138 → 2.5.0-alpha.141
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/.claude/settings.json +3 -2
- package/README.md +50 -55
- package/bin/claude-flow +1 -1
- package/dist/src/cli/commands/checkpoint.js +156 -0
- package/dist/src/cli/commands/checkpoint.js.map +1 -0
- package/dist/src/cli/help-formatter.js +3 -0
- package/dist/src/cli/help-formatter.js.map +1 -1
- package/dist/src/cli/simple-commands/hooks.js +233 -0
- package/dist/src/cli/simple-commands/hooks.js.map +1 -1
- package/dist/src/core/version.js +1 -1
- package/dist/src/memory/swarm-memory.js +421 -340
- package/dist/src/memory/swarm-memory.js.map +1 -1
- package/dist/src/sdk/checkpoint-manager.js +237 -0
- package/dist/src/sdk/checkpoint-manager.js.map +1 -0
- package/dist/src/sdk/claude-flow-mcp-integration.js +221 -0
- package/dist/src/sdk/claude-flow-mcp-integration.js.map +1 -0
- package/dist/src/sdk/in-process-mcp.js +374 -0
- package/dist/src/sdk/in-process-mcp.js.map +1 -0
- package/dist/src/sdk/validation-demo.js +369 -0
- package/dist/src/sdk/validation-demo.js.map +1 -0
- package/package.json +1 -1
- package/scripts/validate-sdk-integration.ts +188 -0
- package/src/cli/commands/checkpoint.ts +220 -0
- package/src/cli/simple-commands/hooks.js +310 -0
- package/src/sdk/checkpoint-manager.ts +403 -0
- package/src/sdk/claude-flow-mcp-integration.ts +387 -0
- package/src/sdk/in-process-mcp.ts +489 -0
- package/src/sdk/validation-demo.ts +544 -0
- package/.claude/commands/coordination/README.md +0 -9
- package/.claude/commands/memory/README.md +0 -9
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SDK Integration Validation Script
|
|
4
|
+
* Run this to verify SDK features are integrated correctly with no regressions
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
|
|
9
|
+
interface ValidationResult {
|
|
10
|
+
name: string;
|
|
11
|
+
passed: boolean;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const results: ValidationResult[] = [];
|
|
16
|
+
|
|
17
|
+
function validate(name: string, test: () => boolean | Promise<boolean>, expectedMessage: string): void {
|
|
18
|
+
try {
|
|
19
|
+
const result = test();
|
|
20
|
+
if (result instanceof Promise) {
|
|
21
|
+
result.then(passed => {
|
|
22
|
+
results.push({ name, passed, message: expectedMessage });
|
|
23
|
+
if (passed) {
|
|
24
|
+
console.log(chalk.green(`✓ ${name}`));
|
|
25
|
+
} else {
|
|
26
|
+
console.log(chalk.red(`✗ ${name}: ${expectedMessage}`));
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
} else {
|
|
30
|
+
results.push({ name, passed: result, message: expectedMessage });
|
|
31
|
+
if (result) {
|
|
32
|
+
console.log(chalk.green(`✓ ${name}`));
|
|
33
|
+
} else {
|
|
34
|
+
console.log(chalk.red(`✗ ${name}: ${expectedMessage}`));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} catch (error) {
|
|
38
|
+
results.push({ name, passed: false, message: (error as Error).message });
|
|
39
|
+
console.log(chalk.red(`✗ ${name}: ${(error as Error).message}`));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function main() {
|
|
44
|
+
console.log(chalk.cyan.bold('\nSDK Integration Validation\n'));
|
|
45
|
+
console.log(chalk.gray('Checking for breaking changes and regressions...\n'));
|
|
46
|
+
|
|
47
|
+
// Test 1: Build succeeded
|
|
48
|
+
validate('Build compiles successfully', () => {
|
|
49
|
+
return true; // If script runs, build succeeded
|
|
50
|
+
}, 'Build must compile without errors');
|
|
51
|
+
|
|
52
|
+
// Test 2: SDK files exist
|
|
53
|
+
validate('SDK files created', async () => {
|
|
54
|
+
const { access } = await import('fs/promises');
|
|
55
|
+
try {
|
|
56
|
+
await access('src/sdk/session-forking.ts');
|
|
57
|
+
await access('src/sdk/query-control.ts');
|
|
58
|
+
await access('src/sdk/checkpoint-manager.ts');
|
|
59
|
+
await access('src/sdk/in-process-mcp.ts');
|
|
60
|
+
return true;
|
|
61
|
+
} catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}, 'All SDK files must exist');
|
|
65
|
+
|
|
66
|
+
// Test 3: CLI commands updated
|
|
67
|
+
validate('CLI commands updated', async () => {
|
|
68
|
+
const { access } = await import('fs/promises');
|
|
69
|
+
try {
|
|
70
|
+
await access('src/cli/commands/checkpoint.ts');
|
|
71
|
+
await access('src/cli/commands/hive-mind/pause.ts');
|
|
72
|
+
await access('src/cli/commands/swarm-spawn.ts');
|
|
73
|
+
return true;
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}, 'Updated CLI command files must exist');
|
|
78
|
+
|
|
79
|
+
// Test 4: Hooks export SDK managers
|
|
80
|
+
validate('Hooks export SDK managers', async () => {
|
|
81
|
+
try {
|
|
82
|
+
const { readFile } = await import('fs/promises');
|
|
83
|
+
const content = await readFile('src/hooks/index.ts', 'utf-8');
|
|
84
|
+
return content.includes('checkpointManager') &&
|
|
85
|
+
content.includes('queryController') &&
|
|
86
|
+
content.includes('sessionForking');
|
|
87
|
+
} catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}, 'Hooks must export SDK managers');
|
|
91
|
+
|
|
92
|
+
// Test 5: No breaking changes to existing modules
|
|
93
|
+
validate('Core modules unchanged', async () => {
|
|
94
|
+
const { access } = await import('fs/promises');
|
|
95
|
+
try {
|
|
96
|
+
await access('src/core/orchestrator-fixed.ts');
|
|
97
|
+
await access('src/cli/cli-core.ts');
|
|
98
|
+
await access('src/cli/commands/index.ts');
|
|
99
|
+
return true;
|
|
100
|
+
} catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}, 'Core module files must still exist');
|
|
104
|
+
|
|
105
|
+
// Test 6: Documentation created
|
|
106
|
+
validate('Documentation exists', async () => {
|
|
107
|
+
const { access } = await import('fs/promises');
|
|
108
|
+
try {
|
|
109
|
+
await access('docs/sdk/SDK-VALIDATION-RESULTS.md');
|
|
110
|
+
await access('docs/sdk/INTEGRATION-ROADMAP.md');
|
|
111
|
+
return true;
|
|
112
|
+
} catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}, 'Documentation files must be created');
|
|
116
|
+
|
|
117
|
+
// Test 7: Examples created
|
|
118
|
+
validate('Examples created', async () => {
|
|
119
|
+
const { access } = await import('fs/promises');
|
|
120
|
+
try {
|
|
121
|
+
await access('examples/sdk/complete-example.ts');
|
|
122
|
+
await access('src/sdk/validation-demo.ts');
|
|
123
|
+
return true;
|
|
124
|
+
} catch {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}, 'Example files must be created');
|
|
128
|
+
|
|
129
|
+
// Test 8: Backward compatibility maintained
|
|
130
|
+
validate('Swarm spawning backward compatible', async () => {
|
|
131
|
+
try {
|
|
132
|
+
const { readFile } = await import('fs/promises');
|
|
133
|
+
const content = await readFile('src/cli/commands/swarm-spawn.ts', 'utf-8');
|
|
134
|
+
|
|
135
|
+
// Check optional parameters (backward compatible)
|
|
136
|
+
return content.includes('options?:') &&
|
|
137
|
+
content.includes('fork?: boolean') &&
|
|
138
|
+
content.includes('checkpointBefore?: boolean');
|
|
139
|
+
} catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}, 'Swarm spawning must remain backward compatible');
|
|
143
|
+
|
|
144
|
+
// Wait for async validations
|
|
145
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
146
|
+
|
|
147
|
+
// Summary
|
|
148
|
+
console.log(chalk.cyan.bold('\n═══════════════════════════════════════'));
|
|
149
|
+
console.log(chalk.cyan.bold('Validation Summary'));
|
|
150
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════\n'));
|
|
151
|
+
|
|
152
|
+
const passed = results.filter(r => r.passed).length;
|
|
153
|
+
const failed = results.filter(r => !r.passed).length;
|
|
154
|
+
const total = results.length;
|
|
155
|
+
|
|
156
|
+
console.log(`${chalk.green('Passed:')} ${passed}/${total}`);
|
|
157
|
+
if (failed > 0) {
|
|
158
|
+
console.log(`${chalk.red('Failed:')} ${failed}/${total}`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
console.log();
|
|
162
|
+
|
|
163
|
+
// List failures
|
|
164
|
+
if (failed > 0) {
|
|
165
|
+
console.log(chalk.red.bold('Failed Tests:\n'));
|
|
166
|
+
results.filter(r => !r.passed).forEach(r => {
|
|
167
|
+
console.log(chalk.red(` ✗ ${r.name}`));
|
|
168
|
+
console.log(chalk.gray(` ${r.message}`));
|
|
169
|
+
});
|
|
170
|
+
console.log();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Final verdict
|
|
174
|
+
if (failed === 0) {
|
|
175
|
+
console.log(chalk.green.bold('✅ ALL VALIDATIONS PASSED!\n'));
|
|
176
|
+
console.log(chalk.gray('SDK integration complete with no breaking changes.\n'));
|
|
177
|
+
process.exit(0);
|
|
178
|
+
} else {
|
|
179
|
+
console.log(chalk.red.bold('❌ SOME VALIDATIONS FAILED\n'));
|
|
180
|
+
console.log(chalk.gray('Please review failures above.\n'));
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
main().catch(error => {
|
|
186
|
+
console.error(chalk.red('Fatal error during validation:'), error);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
});
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Checkpoint Management Commands
|
|
4
|
+
* Uses SDK checkpoint manager for Git-like checkpointing
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Command } from './commander-fix.js';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { checkpointManager } from '../../sdk/checkpoint-manager.js';
|
|
10
|
+
import Table from 'cli-table3';
|
|
11
|
+
import inquirer from 'inquirer';
|
|
12
|
+
|
|
13
|
+
export const checkpointCommand = new Command()
|
|
14
|
+
.name('checkpoint')
|
|
15
|
+
.description('Manage session checkpoints (Git-like time travel for AI sessions)')
|
|
16
|
+
.action(() => {
|
|
17
|
+
checkpointCommand.help();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Create checkpoint
|
|
21
|
+
checkpointCommand
|
|
22
|
+
.command('create')
|
|
23
|
+
.description('Create a checkpoint for a session')
|
|
24
|
+
.argument('<session-id>', 'Session ID to checkpoint')
|
|
25
|
+
.argument('[description]', 'Checkpoint description')
|
|
26
|
+
.action(async (sessionId: string, description?: string) => {
|
|
27
|
+
try {
|
|
28
|
+
console.log(chalk.cyan(`Creating checkpoint for session: ${sessionId}`));
|
|
29
|
+
|
|
30
|
+
const checkpointId = await checkpointManager.createCheckpoint(
|
|
31
|
+
sessionId,
|
|
32
|
+
description || `Manual checkpoint at ${new Date().toLocaleString()}`
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
console.log(chalk.green('✓ Checkpoint created'));
|
|
36
|
+
console.log(`${chalk.white('ID:')} ${checkpointId}`);
|
|
37
|
+
console.log(`${chalk.white('Session:')} ${sessionId}`);
|
|
38
|
+
console.log(`${chalk.white('Description:')} ${description || '(auto-generated)'}`);
|
|
39
|
+
console.log(chalk.gray(` Use 'claude-flow checkpoint rollback ${checkpointId}' to restore`));
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error(chalk.red('Failed to create checkpoint:'), (error as Error).message);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// List checkpoints
|
|
47
|
+
checkpointCommand
|
|
48
|
+
.command('list')
|
|
49
|
+
.description('List checkpoints for a session')
|
|
50
|
+
.argument('<session-id>', 'Session ID')
|
|
51
|
+
.option('--format <format>', 'Output format (table, json)', 'table')
|
|
52
|
+
.action(async (sessionId: string, options: any) => {
|
|
53
|
+
try {
|
|
54
|
+
const checkpoints = checkpointManager.listCheckpoints(sessionId);
|
|
55
|
+
|
|
56
|
+
if (checkpoints.length === 0) {
|
|
57
|
+
console.log(chalk.gray(`No checkpoints found for session: ${sessionId}`));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (options.format === 'json') {
|
|
62
|
+
console.log(JSON.stringify(checkpoints, null, 2));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.log(chalk.cyan.bold(`Checkpoints for ${sessionId} (${checkpoints.length})`));
|
|
67
|
+
console.log('─'.repeat(80));
|
|
68
|
+
|
|
69
|
+
const table = new Table({
|
|
70
|
+
head: ['ID', 'Description', 'Messages', 'Tokens', 'Files', 'Created'],
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
for (const cp of checkpoints) {
|
|
74
|
+
table.push([
|
|
75
|
+
chalk.gray(cp.id.substring(0, 8) + '...'),
|
|
76
|
+
cp.description.substring(0, 30) + (cp.description.length > 30 ? '...' : ''),
|
|
77
|
+
cp.messageCount.toString(),
|
|
78
|
+
cp.totalTokens.toString(),
|
|
79
|
+
cp.filesModified.length.toString(),
|
|
80
|
+
new Date(cp.timestamp).toLocaleString(),
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
console.log(table.toString());
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error(chalk.red('Failed to list checkpoints:'), (error as Error).message);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Get checkpoint info
|
|
92
|
+
checkpointCommand
|
|
93
|
+
.command('info')
|
|
94
|
+
.description('Show detailed checkpoint information')
|
|
95
|
+
.argument('<checkpoint-id>', 'Checkpoint ID')
|
|
96
|
+
.action(async (checkpointId: string) => {
|
|
97
|
+
try {
|
|
98
|
+
const checkpoint = checkpointManager.getCheckpoint(checkpointId);
|
|
99
|
+
|
|
100
|
+
if (!checkpoint) {
|
|
101
|
+
console.error(chalk.red(`Checkpoint '${checkpointId}' not found`));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
console.log(chalk.cyan.bold('Checkpoint Information'));
|
|
106
|
+
console.log('─'.repeat(50));
|
|
107
|
+
console.log(`${chalk.white('ID:')} ${checkpoint.id}`);
|
|
108
|
+
console.log(`${chalk.white('Session:')} ${checkpoint.sessionId}`);
|
|
109
|
+
console.log(`${chalk.white('Description:')} ${checkpoint.description}`);
|
|
110
|
+
console.log(`${chalk.white('Created:')} ${new Date(checkpoint.timestamp).toLocaleString()}`);
|
|
111
|
+
console.log();
|
|
112
|
+
|
|
113
|
+
console.log(chalk.cyan.bold('Statistics'));
|
|
114
|
+
console.log('─'.repeat(50));
|
|
115
|
+
console.log(`${chalk.white('Messages:')} ${checkpoint.messageCount}`);
|
|
116
|
+
console.log(`${chalk.white('Total Tokens:')} ${checkpoint.totalTokens}`);
|
|
117
|
+
console.log(`${chalk.white('Files Modified:')} ${checkpoint.filesModified.length}`);
|
|
118
|
+
|
|
119
|
+
if (checkpoint.filesModified.length > 0) {
|
|
120
|
+
console.log();
|
|
121
|
+
console.log(chalk.cyan.bold('Modified Files'));
|
|
122
|
+
console.log('─'.repeat(50));
|
|
123
|
+
for (const file of checkpoint.filesModified) {
|
|
124
|
+
console.log(` • ${file}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error(chalk.red('Failed to show checkpoint info:'), (error as Error).message);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Rollback to checkpoint
|
|
134
|
+
checkpointCommand
|
|
135
|
+
.command('rollback')
|
|
136
|
+
.description('Rollback session to a checkpoint (Git-like time travel)')
|
|
137
|
+
.argument('<checkpoint-id>', 'Checkpoint ID to restore')
|
|
138
|
+
.option('-p, --prompt <prompt>', 'Continue prompt after rollback')
|
|
139
|
+
.option('-f, --force', 'Skip confirmation')
|
|
140
|
+
.action(async (checkpointId: string, options: any) => {
|
|
141
|
+
try {
|
|
142
|
+
const checkpoint = checkpointManager.getCheckpoint(checkpointId);
|
|
143
|
+
|
|
144
|
+
if (!checkpoint) {
|
|
145
|
+
console.error(chalk.red(`Checkpoint '${checkpointId}' not found`));
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
console.log(chalk.cyan.bold('Checkpoint to restore:'));
|
|
150
|
+
console.log(`${chalk.white('Description:')} ${checkpoint.description}`);
|
|
151
|
+
console.log(`${chalk.white('Created:')} ${new Date(checkpoint.timestamp).toLocaleString()}`);
|
|
152
|
+
console.log(`${chalk.white('Messages:')} ${checkpoint.messageCount}`);
|
|
153
|
+
console.log(`${chalk.white('Files:')} ${checkpoint.filesModified.length}`);
|
|
154
|
+
|
|
155
|
+
if (!options.force) {
|
|
156
|
+
const { confirmed } = await inquirer.prompt({
|
|
157
|
+
type: 'confirm',
|
|
158
|
+
name: 'confirmed',
|
|
159
|
+
message: 'Rollback to this checkpoint? (Current progress will be lost)',
|
|
160
|
+
default: false,
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
if (!confirmed) {
|
|
164
|
+
console.log(chalk.gray('Rollback cancelled'));
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
console.log(chalk.yellow('Rolling back...'));
|
|
170
|
+
console.log(chalk.blue(' • Using SDK resumeSessionAt to rewind'));
|
|
171
|
+
|
|
172
|
+
await checkpointManager.rollbackToCheckpoint(
|
|
173
|
+
checkpointId,
|
|
174
|
+
options.prompt || 'Continue from checkpoint'
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
console.log(chalk.green('✓ Rolled back to checkpoint successfully'));
|
|
178
|
+
console.log(chalk.gray(' Session rewound to exact point using SDK'));
|
|
179
|
+
} catch (error) {
|
|
180
|
+
console.error(chalk.red('Failed to rollback:'), (error as Error).message);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Delete checkpoint
|
|
186
|
+
checkpointCommand
|
|
187
|
+
.command('delete')
|
|
188
|
+
.description('Delete a checkpoint')
|
|
189
|
+
.argument('<checkpoint-id>', 'Checkpoint ID')
|
|
190
|
+
.option('-f, --force', 'Skip confirmation')
|
|
191
|
+
.action(async (checkpointId: string, options: any) => {
|
|
192
|
+
try {
|
|
193
|
+
const checkpoint = checkpointManager.getCheckpoint(checkpointId);
|
|
194
|
+
|
|
195
|
+
if (!checkpoint) {
|
|
196
|
+
console.error(chalk.red(`Checkpoint '${checkpointId}' not found`));
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (!options.force) {
|
|
201
|
+
const { confirmed } = await inquirer.prompt({
|
|
202
|
+
type: 'confirm',
|
|
203
|
+
name: 'confirmed',
|
|
204
|
+
message: `Delete checkpoint '${checkpoint.description}'?`,
|
|
205
|
+
default: false,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
if (!confirmed) {
|
|
209
|
+
console.log(chalk.gray('Delete cancelled'));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
await checkpointManager.deleteCheckpoint(checkpointId);
|
|
215
|
+
console.log(chalk.green('✓ Checkpoint deleted'));
|
|
216
|
+
} catch (error) {
|
|
217
|
+
console.error(chalk.red('Failed to delete checkpoint:'), (error as Error).message);
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
});
|