@sparkleideas/cli 3.1.0-alpha.20 → 3.1.0-alpha.22
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/dist/src/appliance/rvfa-builder.js +4 -4
- package/dist/src/appliance/rvfa-format.d.ts +1 -1
- package/dist/src/appliance/rvfa-format.js +1 -1
- package/dist/src/appliance/rvfa-runner.js +8 -8
- package/dist/src/commands/agent.js +15 -15
- package/dist/src/commands/analyze.js +52 -52
- package/dist/src/commands/appliance-advanced.js +1 -1
- package/dist/src/commands/appliance.js +16 -16
- package/dist/src/commands/benchmark.js +16 -16
- package/dist/src/commands/categories.js +1 -1
- package/dist/src/commands/claims.js +17 -17
- package/dist/src/commands/completions.js +37 -37
- package/dist/src/commands/config.js +10 -10
- package/dist/src/commands/daemon.js +26 -26
- package/dist/src/commands/deployment.js +20 -20
- package/dist/src/commands/doctor.js +30 -30
- package/dist/src/commands/embeddings.js +51 -51
- package/dist/src/commands/guidance.js +23 -23
- package/dist/src/commands/hive-mind.js +21 -21
- package/dist/src/commands/hooks.js +114 -114
- package/dist/src/commands/init.js +41 -41
- package/dist/src/commands/issues.js +6 -6
- package/dist/src/commands/mcp.js +13 -13
- package/dist/src/commands/memory.js +35 -35
- package/dist/src/commands/migrate.js +13 -13
- package/dist/src/commands/neural.js +34 -34
- package/dist/src/commands/performance.js +13 -13
- package/dist/src/commands/plugins.js +26 -26
- package/dist/src/commands/process.js +36 -36
- package/dist/src/commands/progress.js +6 -6
- package/dist/src/commands/providers.js +13 -13
- package/dist/src/commands/route.js +26 -26
- package/dist/src/commands/ruvector/backup.js +9 -9
- package/dist/src/commands/ruvector/benchmark.js +4 -4
- package/dist/src/commands/ruvector/import.d.ts +3 -3
- package/dist/src/commands/ruvector/import.js +11 -11
- package/dist/src/commands/ruvector/index.js +9 -9
- package/dist/src/commands/ruvector/init.js +7 -7
- package/dist/src/commands/ruvector/migrate.js +5 -5
- package/dist/src/commands/ruvector/optimize.js +7 -7
- package/dist/src/commands/ruvector/setup.d.ts +3 -3
- package/dist/src/commands/ruvector/setup.js +9 -9
- package/dist/src/commands/ruvector/status.js +4 -4
- package/dist/src/commands/security.js +19 -19
- package/dist/src/commands/session.js +13 -13
- package/dist/src/commands/start.js +17 -17
- package/dist/src/commands/status.js +10 -10
- package/dist/src/commands/swarm.js +7 -7
- package/dist/src/commands/task.js +9 -9
- package/dist/src/commands/transfer-store.js +16 -16
- package/dist/src/commands/update.js +2 -2
- package/dist/src/commands/workflow.js +13 -13
- package/dist/src/config-adapter.js +5 -5
- package/dist/src/index.js +1 -1
- package/dist/src/init/claudemd-generator.js +1 -1
- package/dist/src/init/executor.js +47 -47
- package/dist/src/init/helpers-generator.js +14 -14
- package/dist/src/init/mcp-generator.js +6 -6
- package/dist/src/init/settings-generator.js +4 -4
- package/dist/src/init/statusline-generator.js +27 -27
- package/dist/src/init/types.d.ts +6 -6
- package/dist/src/init/types.js +3 -3
- package/dist/src/mcp-server.js +2 -2
- package/dist/src/mcp-tools/agent-tools.js +1 -1
- package/dist/src/mcp-tools/auto-install.js +5 -5
- package/dist/src/mcp-tools/claims-tools.js +1 -1
- package/dist/src/mcp-tools/config-tools.js +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +1 -1
- package/dist/src/mcp-tools/daa-tools.js +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +1 -1
- package/dist/src/mcp-tools/github-tools.js +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +3 -3
- package/dist/src/mcp-tools/hooks-tools.js +2 -2
- package/dist/src/mcp-tools/memory-tools.js +1 -1
- package/dist/src/mcp-tools/neural-tools.js +7 -7
- package/dist/src/mcp-tools/performance-tools.js +1 -1
- package/dist/src/mcp-tools/progress-tools.js +1 -1
- package/dist/src/mcp-tools/security-tools.js +2 -2
- package/dist/src/mcp-tools/session-tools.js +1 -1
- package/dist/src/mcp-tools/system-tools.js +2 -2
- package/dist/src/mcp-tools/task-tools.js +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +1 -1
- package/dist/src/memory/intelligence.js +5 -5
- package/dist/src/memory/memory-bridge.d.ts +4 -4
- package/dist/src/memory/memory-bridge.js +17 -17
- package/dist/src/memory/memory-initializer.js +11 -11
- package/dist/src/plugins/manager.js +10 -10
- package/dist/src/plugins/store/discovery.js +1 -1
- package/dist/src/plugins/tests/demo-plugin-store.js +6 -6
- package/dist/src/ruvector/enhanced-model-router.js +3 -3
- package/dist/src/services/agentic-flow-bridge.d.ts +11 -11
- package/dist/src/services/agentic-flow-bridge.js +11 -11
- package/dist/src/services/claim-service.js +1 -1
- package/dist/src/services/container-worker-pool.js +4 -4
- package/dist/src/services/headless-worker-executor.js +2 -2
- package/dist/src/services/worker-daemon.js +14 -14
- package/dist/src/services/worker-queue.js +1 -1
- package/dist/src/suggest.js +1 -1
- package/dist/src/transfer/models/seraphine.js +1 -1
- package/dist/src/transfer/serialization/cfp.js +1 -1
- package/dist/src/transfer/store/discovery.js +1 -1
- package/dist/src/transfer/store/registry.js +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/update/executor.js +1 -1
- package/dist/src/update/rate-limiter.js +1 -1
- package/dist/src/update/validator.js +1 -1
- package/package.json +1 -1
|
@@ -32,7 +32,7 @@ const SKILLS_MAP = {
|
|
|
32
32
|
],
|
|
33
33
|
browser: ['browser'], // agent-browser integration
|
|
34
34
|
dualMode: ['dual-mode'], // Claude Code + Codex hybrid execution
|
|
35
|
-
|
|
35
|
+
agentdb: [
|
|
36
36
|
'agentdb-advanced',
|
|
37
37
|
'agentdb-learning',
|
|
38
38
|
'agentdb-memory-patterns',
|
|
@@ -121,13 +121,13 @@ const DIRECTORIES = {
|
|
|
121
121
|
'.claude/helpers',
|
|
122
122
|
],
|
|
123
123
|
runtime: [
|
|
124
|
-
'
|
|
125
|
-
'
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
'
|
|
129
|
-
'
|
|
130
|
-
'
|
|
124
|
+
'.claude-flow',
|
|
125
|
+
'.claude-flow/data',
|
|
126
|
+
'.claude-flow/logs',
|
|
127
|
+
'.claude-flow/sessions',
|
|
128
|
+
'.claude-flow/hooks',
|
|
129
|
+
'.claude-flow/agents',
|
|
130
|
+
'.claude-flow/workflows',
|
|
131
131
|
],
|
|
132
132
|
};
|
|
133
133
|
/**
|
|
@@ -343,9 +343,9 @@ export async function executeUpgrade(targetDir, upgradeSettings = false) {
|
|
|
343
343
|
// Ensure required directories exist
|
|
344
344
|
const dirs = [
|
|
345
345
|
'.claude/helpers',
|
|
346
|
-
'
|
|
347
|
-
'
|
|
348
|
-
'
|
|
346
|
+
'.claude-flow/metrics',
|
|
347
|
+
'.claude-flow/security',
|
|
348
|
+
'.claude-flow/learning',
|
|
349
349
|
];
|
|
350
350
|
for (const dir of dirs) {
|
|
351
351
|
const fullPath = path.join(targetDir, dir);
|
|
@@ -418,8 +418,8 @@ export async function executeUpgrade(targetDir, upgradeSettings = false) {
|
|
|
418
418
|
}
|
|
419
419
|
fs.writeFileSync(statuslinePath, statuslineContent, 'utf-8');
|
|
420
420
|
// 2. Create MISSING metrics files only (preserve existing data)
|
|
421
|
-
const metricsDir = path.join(targetDir, '
|
|
422
|
-
const securityDir = path.join(targetDir, '
|
|
421
|
+
const metricsDir = path.join(targetDir, '.claude-flow', 'metrics');
|
|
422
|
+
const securityDir = path.join(targetDir, '.claude-flow', 'security');
|
|
423
423
|
// v3-progress.json
|
|
424
424
|
const progressPath = path.join(metricsDir, 'v3-progress.json');
|
|
425
425
|
if (!fs.existsSync(progressPath)) {
|
|
@@ -433,10 +433,10 @@ export async function executeUpgrade(targetDir, upgradeSettings = false) {
|
|
|
433
433
|
_note: 'Metrics will update as you use Claude Flow'
|
|
434
434
|
};
|
|
435
435
|
fs.writeFileSync(progressPath, JSON.stringify(progress, null, 2), 'utf-8');
|
|
436
|
-
result.created.push('
|
|
436
|
+
result.created.push('.claude-flow/metrics/v3-progress.json');
|
|
437
437
|
}
|
|
438
438
|
else {
|
|
439
|
-
result.preserved.push('
|
|
439
|
+
result.preserved.push('.claude-flow/metrics/v3-progress.json');
|
|
440
440
|
}
|
|
441
441
|
// swarm-activity.json
|
|
442
442
|
const activityPath = path.join(metricsDir, 'swarm-activity.json');
|
|
@@ -449,10 +449,10 @@ export async function executeUpgrade(targetDir, upgradeSettings = false) {
|
|
|
449
449
|
_initialized: true
|
|
450
450
|
};
|
|
451
451
|
fs.writeFileSync(activityPath, JSON.stringify(activity, null, 2), 'utf-8');
|
|
452
|
-
result.created.push('
|
|
452
|
+
result.created.push('.claude-flow/metrics/swarm-activity.json');
|
|
453
453
|
}
|
|
454
454
|
else {
|
|
455
|
-
result.preserved.push('
|
|
455
|
+
result.preserved.push('.claude-flow/metrics/swarm-activity.json');
|
|
456
456
|
}
|
|
457
457
|
// learning.json
|
|
458
458
|
const learningPath = path.join(metricsDir, 'learning.json');
|
|
@@ -465,10 +465,10 @@ export async function executeUpgrade(targetDir, upgradeSettings = false) {
|
|
|
465
465
|
_note: 'Intelligence grows as you use Claude Flow'
|
|
466
466
|
};
|
|
467
467
|
fs.writeFileSync(learningPath, JSON.stringify(learning, null, 2), 'utf-8');
|
|
468
|
-
result.created.push('
|
|
468
|
+
result.created.push('.claude-flow/metrics/learning.json');
|
|
469
469
|
}
|
|
470
470
|
else {
|
|
471
|
-
result.preserved.push('
|
|
471
|
+
result.preserved.push('.claude-flow/metrics/learning.json');
|
|
472
472
|
}
|
|
473
473
|
// audit-status.json
|
|
474
474
|
const auditPath = path.join(securityDir, 'audit-status.json');
|
|
@@ -482,10 +482,10 @@ export async function executeUpgrade(targetDir, upgradeSettings = false) {
|
|
|
482
482
|
_note: 'Run: npx @sparkleideas/cli@latest security scan'
|
|
483
483
|
};
|
|
484
484
|
fs.writeFileSync(auditPath, JSON.stringify(audit, null, 2), 'utf-8');
|
|
485
|
-
result.created.push('
|
|
485
|
+
result.created.push('.claude-flow/security/audit-status.json');
|
|
486
486
|
}
|
|
487
487
|
else {
|
|
488
|
-
result.preserved.push('
|
|
488
|
+
result.preserved.push('.claude-flow/security/audit-status.json');
|
|
489
489
|
}
|
|
490
490
|
// 3. Merge settings if requested
|
|
491
491
|
if (upgradeSettings) {
|
|
@@ -678,8 +678,8 @@ async function copySkills(targetDir, options, result) {
|
|
|
678
678
|
else {
|
|
679
679
|
if (skillsConfig.core)
|
|
680
680
|
skillsToCopy.push(...SKILLS_MAP.core);
|
|
681
|
-
if (skillsConfig
|
|
682
|
-
skillsToCopy.push(...SKILLS_MAP
|
|
681
|
+
if (skillsConfig.agentdb)
|
|
682
|
+
skillsToCopy.push(...SKILLS_MAP.agentdb);
|
|
683
683
|
if (skillsConfig.github)
|
|
684
684
|
skillsToCopy.push(...SKILLS_MAP.github);
|
|
685
685
|
if (skillsConfig.flowNexus)
|
|
@@ -1020,12 +1020,12 @@ async function writeStatusline(targetDir, options, result) {
|
|
|
1020
1020
|
}
|
|
1021
1021
|
}
|
|
1022
1022
|
/**
|
|
1023
|
-
* Write runtime configuration (
|
|
1023
|
+
* Write runtime configuration (.claude-flow/)
|
|
1024
1024
|
*/
|
|
1025
1025
|
async function writeRuntimeConfig(targetDir, options, result) {
|
|
1026
|
-
const configPath = path.join(targetDir, '
|
|
1026
|
+
const configPath = path.join(targetDir, '.claude-flow', 'config.yaml');
|
|
1027
1027
|
if (fs.existsSync(configPath) && !options.force) {
|
|
1028
|
-
result.skipped.push('
|
|
1028
|
+
result.skipped.push('.claude-flow/config.yaml');
|
|
1029
1029
|
return;
|
|
1030
1030
|
}
|
|
1031
1031
|
const config = `# RuFlo V3 Runtime Configuration
|
|
@@ -1042,7 +1042,7 @@ swarm:
|
|
|
1042
1042
|
memory:
|
|
1043
1043
|
backend: ${options.runtime.memoryBackend}
|
|
1044
1044
|
enableHNSW: ${options.runtime.enableHNSW}
|
|
1045
|
-
persistPath:
|
|
1045
|
+
persistPath: .claude-flow/data
|
|
1046
1046
|
cacheSize: 100
|
|
1047
1047
|
# ADR-049: Self-Learning Memory
|
|
1048
1048
|
learningBridge:
|
|
@@ -1062,7 +1062,7 @@ memory:
|
|
|
1062
1062
|
|
|
1063
1063
|
neural:
|
|
1064
1064
|
enabled: ${options.runtime.enableNeural}
|
|
1065
|
-
modelPath:
|
|
1065
|
+
modelPath: .claude-flow/neural
|
|
1066
1066
|
|
|
1067
1067
|
hooks:
|
|
1068
1068
|
enabled: true
|
|
@@ -1073,9 +1073,9 @@ mcp:
|
|
|
1073
1073
|
port: ${options.mcp.port}
|
|
1074
1074
|
`;
|
|
1075
1075
|
fs.writeFileSync(configPath, config, 'utf-8');
|
|
1076
|
-
result.created.files.push('
|
|
1076
|
+
result.created.files.push('.claude-flow/config.yaml');
|
|
1077
1077
|
// Write .gitignore
|
|
1078
|
-
const gitignorePath = path.join(targetDir, '
|
|
1078
|
+
const gitignorePath = path.join(targetDir, '.claude-flow', '.gitignore');
|
|
1079
1079
|
const gitignore = `# Claude Flow runtime files
|
|
1080
1080
|
data/
|
|
1081
1081
|
logs/
|
|
@@ -1086,7 +1086,7 @@ neural/
|
|
|
1086
1086
|
`;
|
|
1087
1087
|
if (!fs.existsSync(gitignorePath) || options.force) {
|
|
1088
1088
|
fs.writeFileSync(gitignorePath, gitignore, 'utf-8');
|
|
1089
|
-
result.created.files.push('
|
|
1089
|
+
result.created.files.push('.claude-flow/.gitignore');
|
|
1090
1090
|
}
|
|
1091
1091
|
// Write CAPABILITIES.md with full system overview
|
|
1092
1092
|
await writeCapabilitiesDoc(targetDir, options, result);
|
|
@@ -1096,9 +1096,9 @@ neural/
|
|
|
1096
1096
|
* Creates baseline data so statusline shows meaningful state instead of all zeros
|
|
1097
1097
|
*/
|
|
1098
1098
|
async function writeInitialMetrics(targetDir, options, result) {
|
|
1099
|
-
const metricsDir = path.join(targetDir, '
|
|
1100
|
-
const learningDir = path.join(targetDir, '
|
|
1101
|
-
const securityDir = path.join(targetDir, '
|
|
1099
|
+
const metricsDir = path.join(targetDir, '.claude-flow', 'metrics');
|
|
1100
|
+
const learningDir = path.join(targetDir, '.claude-flow', 'learning');
|
|
1101
|
+
const securityDir = path.join(targetDir, '.claude-flow', 'security');
|
|
1102
1102
|
// Ensure directories exist
|
|
1103
1103
|
for (const dir of [metricsDir, learningDir, securityDir]) {
|
|
1104
1104
|
if (!fs.existsSync(dir)) {
|
|
@@ -1135,7 +1135,7 @@ async function writeInitialMetrics(targetDir, options, result) {
|
|
|
1135
1135
|
_note: 'Metrics will update as you use Claude Flow. Run: npx @sparkleideas/cli@latest daemon start'
|
|
1136
1136
|
};
|
|
1137
1137
|
fs.writeFileSync(progressPath, JSON.stringify(progress, null, 2), 'utf-8');
|
|
1138
|
-
result.created.files.push('
|
|
1138
|
+
result.created.files.push('.claude-flow/metrics/v3-progress.json');
|
|
1139
1139
|
}
|
|
1140
1140
|
// Create initial swarm-activity.json
|
|
1141
1141
|
const activityPath = path.join(metricsDir, 'swarm-activity.json');
|
|
@@ -1159,7 +1159,7 @@ async function writeInitialMetrics(targetDir, options, result) {
|
|
|
1159
1159
|
_initialized: true
|
|
1160
1160
|
};
|
|
1161
1161
|
fs.writeFileSync(activityPath, JSON.stringify(activity, null, 2), 'utf-8');
|
|
1162
|
-
result.created.files.push('
|
|
1162
|
+
result.created.files.push('.claude-flow/metrics/swarm-activity.json');
|
|
1163
1163
|
}
|
|
1164
1164
|
// Create initial learning.json
|
|
1165
1165
|
const learningPath = path.join(metricsDir, 'learning.json');
|
|
@@ -1182,7 +1182,7 @@ async function writeInitialMetrics(targetDir, options, result) {
|
|
|
1182
1182
|
_note: 'Intelligence grows as you use Claude Flow'
|
|
1183
1183
|
};
|
|
1184
1184
|
fs.writeFileSync(learningPath, JSON.stringify(learning, null, 2), 'utf-8');
|
|
1185
|
-
result.created.files.push('
|
|
1185
|
+
result.created.files.push('.claude-flow/metrics/learning.json');
|
|
1186
1186
|
}
|
|
1187
1187
|
// Create initial audit-status.json
|
|
1188
1188
|
const auditPath = path.join(securityDir, 'audit-status.json');
|
|
@@ -1196,16 +1196,16 @@ async function writeInitialMetrics(targetDir, options, result) {
|
|
|
1196
1196
|
_note: 'Run: npx @sparkleideas/cli@latest security scan'
|
|
1197
1197
|
};
|
|
1198
1198
|
fs.writeFileSync(auditPath, JSON.stringify(audit, null, 2), 'utf-8');
|
|
1199
|
-
result.created.files.push('
|
|
1199
|
+
result.created.files.push('.claude-flow/security/audit-status.json');
|
|
1200
1200
|
}
|
|
1201
1201
|
}
|
|
1202
1202
|
/**
|
|
1203
1203
|
* Write CAPABILITIES.md - comprehensive overview of all Claude Flow features
|
|
1204
1204
|
*/
|
|
1205
1205
|
async function writeCapabilitiesDoc(targetDir, options, result) {
|
|
1206
|
-
const capabilitiesPath = path.join(targetDir, '
|
|
1206
|
+
const capabilitiesPath = path.join(targetDir, '.claude-flow', 'CAPABILITIES.md');
|
|
1207
1207
|
if (fs.existsSync(capabilitiesPath) && !options.force) {
|
|
1208
|
-
result.skipped.push('
|
|
1208
|
+
result.skipped.push('.claude-flow/CAPABILITIES.md');
|
|
1209
1209
|
return;
|
|
1210
1210
|
}
|
|
1211
1211
|
const capabilities = `# RuFlo V3 - Complete Capabilities Reference
|
|
@@ -1545,25 +1545,25 @@ npx @sparkleideas/cli@latest hive-mind consensus --propose "task"
|
|
|
1545
1545
|
### Integrated Packages
|
|
1546
1546
|
| Package | Version | Purpose |
|
|
1547
1547
|
|---------|---------|---------|
|
|
1548
|
-
|
|
|
1549
|
-
|
|
|
1548
|
+
| agentic-flow | 3.0.0-alpha.1 | Core coordination + ReasoningBank + Router |
|
|
1549
|
+
| agentdb | 3.0.0-alpha.10 | Vector database + 8 controllers |
|
|
1550
1550
|
| @ruvector/attention | 0.1.3 | Flash attention |
|
|
1551
1551
|
| @ruvector/sona | 0.1.5 | Neural learning |
|
|
1552
1552
|
|
|
1553
1553
|
### Optional Integrations
|
|
1554
1554
|
| Package | Command |
|
|
1555
1555
|
|---------|---------|
|
|
1556
|
-
|
|
|
1556
|
+
| ruv-swarm | \`npx ruv-swarm mcp start\` |
|
|
1557
1557
|
| flow-nexus | \`npx flow-nexus@latest mcp start\` |
|
|
1558
1558
|
| agentic-jujutsu | \`npx agentic-jujutsu@latest\` |
|
|
1559
1559
|
|
|
1560
1560
|
### MCP Server Setup
|
|
1561
1561
|
\`\`\`bash
|
|
1562
1562
|
# Add Claude Flow MCP
|
|
1563
|
-
claude mcp add
|
|
1563
|
+
claude mcp add claude-flow -- npx -y @sparkleideas/cli@latest
|
|
1564
1564
|
|
|
1565
1565
|
# Optional servers
|
|
1566
|
-
claude mcp add
|
|
1566
|
+
claude mcp add ruv-swarm -- npx -y ruv-swarm mcp start
|
|
1567
1567
|
claude mcp add flow-nexus -- npx -y flow-nexus@latest mcp start
|
|
1568
1568
|
\`\`\`
|
|
1569
1569
|
|
|
@@ -1596,7 +1596,7 @@ npx @sparkleideas/cli@latest hooks worker dispatch --trigger optimize
|
|
|
1596
1596
|
|
|
1597
1597
|
### File Structure
|
|
1598
1598
|
\`\`\`
|
|
1599
|
-
|
|
1599
|
+
.claude-flow/
|
|
1600
1600
|
├── config.yaml # Runtime configuration
|
|
1601
1601
|
├── CAPABILITIES.md # This file
|
|
1602
1602
|
├── data/ # Memory storage
|
|
@@ -1613,7 +1613,7 @@ npx @sparkleideas/cli@latest hooks worker dispatch --trigger optimize
|
|
|
1613
1613
|
**Issues**: https://github.com/ruvnet/claude-flow/issues
|
|
1614
1614
|
`;
|
|
1615
1615
|
fs.writeFileSync(capabilitiesPath, capabilities, 'utf-8');
|
|
1616
|
-
result.created.files.push('
|
|
1616
|
+
result.created.files.push('.claude-flow/CAPABILITIES.md');
|
|
1617
1617
|
}
|
|
1618
1618
|
/**
|
|
1619
1619
|
* Write CLAUDE.md with swarm guidance
|
|
@@ -48,7 +48,7 @@ COMMIT_MSG=$(git log -1 --pretty=%B)
|
|
|
48
48
|
|
|
49
49
|
echo "📊 Recording commit metrics..."
|
|
50
50
|
|
|
51
|
-
# Notify
|
|
51
|
+
# Notify claude-flow of commit
|
|
52
52
|
npx @sparkleideas/cli hooks notify \\
|
|
53
53
|
--message "Commit: $COMMIT_MSG" \\
|
|
54
54
|
--level info \\
|
|
@@ -70,7 +70,7 @@ export function generateSessionManager() {
|
|
|
70
70
|
const fs = require('fs');
|
|
71
71
|
const path = require('path');
|
|
72
72
|
|
|
73
|
-
const SESSION_DIR = path.join(process.cwd(), '
|
|
73
|
+
const SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');
|
|
74
74
|
const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
|
|
75
75
|
|
|
76
76
|
const commands = {
|
|
@@ -275,7 +275,7 @@ export function generateMemoryHelper() {
|
|
|
275
275
|
const fs = require('fs');
|
|
276
276
|
const path = require('path');
|
|
277
277
|
|
|
278
|
-
const MEMORY_DIR = path.join(process.cwd(), '
|
|
278
|
+
const MEMORY_DIR = path.join(process.cwd(), '.claude-flow', 'data');
|
|
279
279
|
const MEMORY_FILE = path.join(MEMORY_DIR, 'memory.json');
|
|
280
280
|
|
|
281
281
|
function loadMemory() {
|
|
@@ -604,11 +604,11 @@ export function generateIntelligenceStub() {
|
|
|
604
604
|
"const path = require('path');",
|
|
605
605
|
"const os = require('os');",
|
|
606
606
|
'',
|
|
607
|
-
"const DATA_DIR = path.join(process.cwd(), '
|
|
607
|
+
"const DATA_DIR = path.join(process.cwd(), '.claude-flow', 'data');",
|
|
608
608
|
"const STORE_PATH = path.join(DATA_DIR, 'auto-memory-store.json');",
|
|
609
609
|
"const RANKED_PATH = path.join(DATA_DIR, 'ranked-context.json');",
|
|
610
610
|
"const PENDING_PATH = path.join(DATA_DIR, 'pending-insights.jsonl');",
|
|
611
|
-
"const SESSION_DIR = path.join(process.cwd(), '
|
|
611
|
+
"const SESSION_DIR = path.join(process.cwd(), '.claude-flow', 'sessions');",
|
|
612
612
|
"const SESSION_FILE = path.join(SESSION_DIR, 'current.json');",
|
|
613
613
|
'',
|
|
614
614
|
'function ensureDir(dir) {',
|
|
@@ -652,7 +652,7 @@ export function generateIntelligenceStub() {
|
|
|
652
652
|
' var entries = [];',
|
|
653
653
|
' var candidates = [',
|
|
654
654
|
' path.join(os.homedir(), ".claude", "projects"),',
|
|
655
|
-
' path.join(process.cwd(), "
|
|
655
|
+
' path.join(process.cwd(), ".claude-flow", "memory"),',
|
|
656
656
|
' path.join(process.cwd(), ".claude", "memory"),',
|
|
657
657
|
' ];',
|
|
658
658
|
' for (var i = 0; i < candidates.length; i++) {',
|
|
@@ -816,7 +816,7 @@ import { fileURLToPath } from 'url';
|
|
|
816
816
|
const __filename = fileURLToPath(import.meta.url);
|
|
817
817
|
const __dirname = dirname(__filename);
|
|
818
818
|
const PROJECT_ROOT = join(__dirname, '../..');
|
|
819
|
-
const DATA_DIR = join(PROJECT_ROOT, '
|
|
819
|
+
const DATA_DIR = join(PROJECT_ROOT, '.claude-flow', 'data');
|
|
820
820
|
const STORE_PATH = join(DATA_DIR, 'auto-memory-store.json');
|
|
821
821
|
|
|
822
822
|
const DIM = '\\x1b[2m';
|
|
@@ -828,7 +828,7 @@ if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
|
|
|
828
828
|
|
|
829
829
|
async function loadMemoryPackage() {
|
|
830
830
|
// Strategy 1: Use createRequire for CJS-style resolution (handles nested node_modules
|
|
831
|
-
// when installed as a transitive dependency via npx
|
|
831
|
+
// when installed as a transitive dependency via npx ruflo / npx claude-flow)
|
|
832
832
|
try {
|
|
833
833
|
const { createRequire } = await import('module');
|
|
834
834
|
const require = createRequire(join(PROJECT_ROOT, 'package.json'));
|
|
@@ -918,7 +918,7 @@ param(
|
|
|
918
918
|
)
|
|
919
919
|
|
|
920
920
|
$ErrorActionPreference = 'SilentlyContinue'
|
|
921
|
-
$ClaudeFlowDir = Join-Path $PWD '
|
|
921
|
+
$ClaudeFlowDir = Join-Path $PWD '.claude-flow'
|
|
922
922
|
$PidDir = Join-Path $ClaudeFlowDir 'pids'
|
|
923
923
|
|
|
924
924
|
# Ensure directories exist
|
|
@@ -951,7 +951,7 @@ function Start-SwarmMonitor {
|
|
|
951
951
|
Write-Host "Starting swarm monitor..." -ForegroundColor Cyan
|
|
952
952
|
$process = Start-Process -FilePath 'node' -ArgumentList @(
|
|
953
953
|
'-e',
|
|
954
|
-
'setInterval(() => { require("fs").writeFileSync("
|
|
954
|
+
'setInterval(() => { require("fs").writeFileSync(".claude-flow/metrics/swarm-activity.json", JSON.stringify({swarm:{active:true,agent_count:0},timestamp:Date.now()})) }, 5000)'
|
|
955
955
|
) -PassThru -WindowStyle Hidden
|
|
956
956
|
|
|
957
957
|
$process.Id | Out-File $pidFile
|
|
@@ -1040,18 +1040,18 @@ const homeDir = os.homedir();
|
|
|
1040
1040
|
|
|
1041
1041
|
// Get data directory based on platform
|
|
1042
1042
|
function getDataDir() {
|
|
1043
|
-
const localDir = path.join(process.cwd(), '
|
|
1043
|
+
const localDir = path.join(process.cwd(), '.claude-flow', 'sessions');
|
|
1044
1044
|
if (fs.existsSync(path.dirname(localDir))) {
|
|
1045
1045
|
return localDir;
|
|
1046
1046
|
}
|
|
1047
1047
|
|
|
1048
1048
|
switch (platform) {
|
|
1049
1049
|
case 'win32':
|
|
1050
|
-
return path.join(process.env.APPDATA || homeDir, '
|
|
1050
|
+
return path.join(process.env.APPDATA || homeDir, 'claude-flow', 'sessions');
|
|
1051
1051
|
case 'darwin':
|
|
1052
|
-
return path.join(homeDir, 'Library', 'Application Support', '
|
|
1052
|
+
return path.join(homeDir, 'Library', 'Application Support', 'claude-flow', 'sessions');
|
|
1053
1053
|
default:
|
|
1054
|
-
return path.join(homeDir, '
|
|
1054
|
+
return path.join(homeDir, '.claude-flow', 'sessions');
|
|
1055
1055
|
}
|
|
1056
1056
|
}
|
|
1057
1057
|
|
|
@@ -42,7 +42,7 @@ export function generateMCPConfig(options) {
|
|
|
42
42
|
};
|
|
43
43
|
// Claude Flow MCP server (core)
|
|
44
44
|
if (config.claudeFlow) {
|
|
45
|
-
mcpServers['
|
|
45
|
+
mcpServers['claude-flow'] = createMCPServerEntry(['@sparkleideas/cli@latest', 'mcp', 'start'], {
|
|
46
46
|
...npmEnv,
|
|
47
47
|
CLAUDE_FLOW_MODE: 'v3',
|
|
48
48
|
CLAUDE_FLOW_HOOKS_ENABLED: 'true',
|
|
@@ -53,7 +53,7 @@ export function generateMCPConfig(options) {
|
|
|
53
53
|
}
|
|
54
54
|
// Ruv-Swarm MCP server (enhanced coordination)
|
|
55
55
|
if (config.ruvSwarm) {
|
|
56
|
-
mcpServers['
|
|
56
|
+
mcpServers['ruv-swarm'] = createMCPServerEntry(['ruv-swarm', 'mcp', 'start'], { ...npmEnv }, { optional: true });
|
|
57
57
|
}
|
|
58
58
|
// Flow Nexus MCP server (cloud features)
|
|
59
59
|
if (config.flowNexus) {
|
|
@@ -76,10 +76,10 @@ export function generateMCPCommands(options) {
|
|
|
76
76
|
const config = options.mcp;
|
|
77
77
|
if (isWindows()) {
|
|
78
78
|
if (config.claudeFlow) {
|
|
79
|
-
commands.push('claude mcp add
|
|
79
|
+
commands.push('claude mcp add claude-flow -- cmd /c npx -y @sparkleideas/cli@latest mcp start');
|
|
80
80
|
}
|
|
81
81
|
if (config.ruvSwarm) {
|
|
82
|
-
commands.push('claude mcp add
|
|
82
|
+
commands.push('claude mcp add ruv-swarm -- cmd /c npx -y ruv-swarm mcp start');
|
|
83
83
|
}
|
|
84
84
|
if (config.flowNexus) {
|
|
85
85
|
commands.push('claude mcp add flow-nexus -- cmd /c npx -y flow-nexus@latest mcp start');
|
|
@@ -87,10 +87,10 @@ export function generateMCPCommands(options) {
|
|
|
87
87
|
}
|
|
88
88
|
else {
|
|
89
89
|
if (config.claudeFlow) {
|
|
90
|
-
commands.push("claude mcp add
|
|
90
|
+
commands.push("claude mcp add claude-flow -- npx -y @sparkleideas/cli@latest mcp start");
|
|
91
91
|
}
|
|
92
92
|
if (config.ruvSwarm) {
|
|
93
|
-
commands.push("claude mcp add
|
|
93
|
+
commands.push("claude mcp add ruv-swarm -- npx -y ruv-swarm mcp start");
|
|
94
94
|
}
|
|
95
95
|
if (config.flowNexus) {
|
|
96
96
|
commands.push("claude mcp add flow-nexus -- npx -y flow-nexus@latest mcp start");
|
|
@@ -20,7 +20,7 @@ export function generateSettings(options) {
|
|
|
20
20
|
settings.permissions = {
|
|
21
21
|
allow: [
|
|
22
22
|
'Bash(npx @claude-flow*)',
|
|
23
|
-
'Bash(npx
|
|
23
|
+
'Bash(npx claude-flow*)',
|
|
24
24
|
'Bash(node .claude/*)',
|
|
25
25
|
'mcp__claude-flow__:*',
|
|
26
26
|
],
|
|
@@ -29,10 +29,10 @@ export function generateSettings(options) {
|
|
|
29
29
|
'Read(./.env.*)',
|
|
30
30
|
],
|
|
31
31
|
};
|
|
32
|
-
// Add
|
|
32
|
+
// Add claude-flow attribution for git commits and PRs
|
|
33
33
|
settings.attribution = {
|
|
34
|
-
commit: 'Co-Authored-By:
|
|
35
|
-
pr: '🤖 Generated with [
|
|
34
|
+
commit: 'Co-Authored-By: claude-flow <ruv@ruv.net>',
|
|
35
|
+
pr: '🤖 Generated with [claude-flow](https://github.com/ruvnet/claude-flow)',
|
|
36
36
|
};
|
|
37
37
|
// Note: Claude Code expects 'model' to be a string, not an object
|
|
38
38
|
// Model preferences are stored in claudeFlow settings instead
|
|
@@ -202,10 +202,10 @@ function getModelName() {
|
|
|
202
202
|
function getLearningStats() {
|
|
203
203
|
const memoryPaths = [
|
|
204
204
|
path.join(CWD, '.swarm', 'memory.db'),
|
|
205
|
-
path.join(CWD, '
|
|
205
|
+
path.join(CWD, '.claude-flow', 'memory.db'),
|
|
206
206
|
path.join(CWD, '.claude', 'memory.db'),
|
|
207
207
|
path.join(CWD, 'data', 'memory.db'),
|
|
208
|
-
path.join(CWD, '
|
|
208
|
+
path.join(CWD, '.agentdb', 'memory.db'),
|
|
209
209
|
];
|
|
210
210
|
|
|
211
211
|
for (const dbPath of memoryPaths) {
|
|
@@ -237,7 +237,7 @@ function getV3Progress() {
|
|
|
237
237
|
const learning = getLearningStats();
|
|
238
238
|
const totalDomains = 5;
|
|
239
239
|
|
|
240
|
-
const dddData = readJSON(path.join(CWD, '
|
|
240
|
+
const dddData = readJSON(path.join(CWD, '.claude-flow', 'metrics', 'ddd-progress.json'));
|
|
241
241
|
let dddProgress = dddData ? (dddData.progress || 0) : 0;
|
|
242
242
|
let domainsCompleted = Math.min(5, Math.floor(dddProgress / 20));
|
|
243
243
|
|
|
@@ -260,7 +260,7 @@ function getV3Progress() {
|
|
|
260
260
|
// Security status (pure file reads)
|
|
261
261
|
function getSecurityStatus() {
|
|
262
262
|
const totalCves = 3;
|
|
263
|
-
const auditData = readJSON(path.join(CWD, '
|
|
263
|
+
const auditData = readJSON(path.join(CWD, '.claude-flow', 'security', 'audit-status.json'));
|
|
264
264
|
if (auditData) {
|
|
265
265
|
return {
|
|
266
266
|
status: auditData.status || 'PENDING',
|
|
@@ -286,7 +286,7 @@ function getSecurityStatus() {
|
|
|
286
286
|
|
|
287
287
|
// Swarm status (pure file reads, NO ps aux)
|
|
288
288
|
function getSwarmStatus() {
|
|
289
|
-
const activityData = readJSON(path.join(CWD, '
|
|
289
|
+
const activityData = readJSON(path.join(CWD, '.claude-flow', 'metrics', 'swarm-activity.json'));
|
|
290
290
|
if (activityData && activityData.swarm) {
|
|
291
291
|
return {
|
|
292
292
|
activeAgents: activityData.swarm.agent_count || 0,
|
|
@@ -295,7 +295,7 @@ function getSwarmStatus() {
|
|
|
295
295
|
};
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
-
const progressData = readJSON(path.join(CWD, '
|
|
298
|
+
const progressData = readJSON(path.join(CWD, '.claude-flow', 'metrics', 'v3-progress.json'));
|
|
299
299
|
if (progressData && progressData.swarm) {
|
|
300
300
|
return {
|
|
301
301
|
activeAgents: progressData.swarm.activeAgents || progressData.swarm.agent_count || 0,
|
|
@@ -311,10 +311,10 @@ function getSwarmStatus() {
|
|
|
311
311
|
function getSystemMetrics() {
|
|
312
312
|
const memoryMB = Math.floor(process.memoryUsage().heapUsed / 1024 / 1024);
|
|
313
313
|
const learning = getLearningStats();
|
|
314
|
-
const
|
|
314
|
+
const agentdb = getAgentDBStats();
|
|
315
315
|
|
|
316
316
|
// Intelligence from learning.json
|
|
317
|
-
const learningData = readJSON(path.join(CWD, '
|
|
317
|
+
const learningData = readJSON(path.join(CWD, '.claude-flow', 'metrics', 'learning.json'));
|
|
318
318
|
let intelligencePct = 0;
|
|
319
319
|
let contextPct = 0;
|
|
320
320
|
|
|
@@ -322,7 +322,7 @@ function getSystemMetrics() {
|
|
|
322
322
|
intelligencePct = Math.min(100, Math.floor(learningData.intelligence.score));
|
|
323
323
|
} else {
|
|
324
324
|
const fromPatterns = learning.patterns > 0 ? Math.min(100, Math.floor(learning.patterns / 10)) : 0;
|
|
325
|
-
const fromVectors =
|
|
325
|
+
const fromVectors = agentdb.vectorCount > 0 ? Math.min(100, Math.floor(agentdb.vectorCount / 100)) : 0;
|
|
326
326
|
intelligencePct = Math.max(fromPatterns, fromVectors);
|
|
327
327
|
}
|
|
328
328
|
|
|
@@ -347,7 +347,7 @@ function getSystemMetrics() {
|
|
|
347
347
|
|
|
348
348
|
// Sub-agents from file metrics (no ps aux)
|
|
349
349
|
let subAgents = 0;
|
|
350
|
-
const activityData = readJSON(path.join(CWD, '
|
|
350
|
+
const activityData = readJSON(path.join(CWD, '.claude-flow', 'metrics', 'swarm-activity.json'));
|
|
351
351
|
if (activityData && activityData.processes && activityData.processes.estimated_agents) {
|
|
352
352
|
subAgents = activityData.processes.estimated_agents;
|
|
353
353
|
}
|
|
@@ -357,7 +357,7 @@ function getSystemMetrics() {
|
|
|
357
357
|
|
|
358
358
|
// ADR status (count files only — don't read contents)
|
|
359
359
|
function getADRStatus() {
|
|
360
|
-
const complianceData = readJSON(path.join(CWD, '
|
|
360
|
+
const complianceData = readJSON(path.join(CWD, '.claude-flow', 'metrics', 'adr-compliance.json'));
|
|
361
361
|
if (complianceData) {
|
|
362
362
|
const checks = complianceData.checks || {};
|
|
363
363
|
const total = Object.keys(checks).length;
|
|
@@ -369,7 +369,7 @@ function getADRStatus() {
|
|
|
369
369
|
const adrPaths = [
|
|
370
370
|
path.join(CWD, 'v3', 'implementation', 'adrs'),
|
|
371
371
|
path.join(CWD, 'docs', 'adrs'),
|
|
372
|
-
path.join(CWD, '
|
|
372
|
+
path.join(CWD, '.claude-flow', 'adrs'),
|
|
373
373
|
];
|
|
374
374
|
|
|
375
375
|
for (const adrPath of adrPaths) {
|
|
@@ -421,7 +421,7 @@ function getAgentDBStats() {
|
|
|
421
421
|
|
|
422
422
|
const dbFiles = [
|
|
423
423
|
path.join(CWD, '.swarm', 'memory.db'),
|
|
424
|
-
path.join(CWD, '
|
|
424
|
+
path.join(CWD, '.claude-flow', 'memory.db'),
|
|
425
425
|
path.join(CWD, '.claude', 'memory.db'),
|
|
426
426
|
path.join(CWD, 'data', 'memory.db'),
|
|
427
427
|
];
|
|
@@ -438,9 +438,9 @@ function getAgentDBStats() {
|
|
|
438
438
|
|
|
439
439
|
if (vectorCount === 0) {
|
|
440
440
|
const dbDirs = [
|
|
441
|
-
path.join(CWD, '
|
|
442
|
-
path.join(CWD, '.swarm', '
|
|
443
|
-
path.join(CWD, '
|
|
441
|
+
path.join(CWD, '.claude-flow', 'agentdb'),
|
|
442
|
+
path.join(CWD, '.swarm', 'agentdb'),
|
|
443
|
+
path.join(CWD, '.agentdb'),
|
|
444
444
|
];
|
|
445
445
|
for (const dir of dbDirs) {
|
|
446
446
|
try {
|
|
@@ -460,7 +460,7 @@ function getAgentDBStats() {
|
|
|
460
460
|
|
|
461
461
|
const hnswPaths = [
|
|
462
462
|
path.join(CWD, '.swarm', 'hnsw.index'),
|
|
463
|
-
path.join(CWD, '
|
|
463
|
+
path.join(CWD, '.claude-flow', 'hnsw.index'),
|
|
464
464
|
];
|
|
465
465
|
for (const p of hnswPaths) {
|
|
466
466
|
const stat = safeStat(p);
|
|
@@ -529,7 +529,7 @@ function getIntegrationStatus() {
|
|
|
529
529
|
}
|
|
530
530
|
}
|
|
531
531
|
|
|
532
|
-
const hasDatabase = ['.swarm/memory.db', '
|
|
532
|
+
const hasDatabase = ['.swarm/memory.db', '.claude-flow/memory.db', 'data/memory.db']
|
|
533
533
|
.some(p => fs.existsSync(path.join(CWD, p)));
|
|
534
534
|
const hasApi = !!(process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY);
|
|
535
535
|
|
|
@@ -538,7 +538,7 @@ function getIntegrationStatus() {
|
|
|
538
538
|
|
|
539
539
|
// Session stats (pure file reads)
|
|
540
540
|
function getSessionStats() {
|
|
541
|
-
var sessionPaths = ['
|
|
541
|
+
var sessionPaths = ['.claude-flow/session.json', '.claude/session.json'];
|
|
542
542
|
for (var i = 0; i < sessionPaths.length; i++) {
|
|
543
543
|
const data = readJSON(path.join(CWD, sessionPaths[i]));
|
|
544
544
|
if (data && data.startTime) {
|
|
@@ -571,7 +571,7 @@ function generateStatusline() {
|
|
|
571
571
|
const system = getSystemMetrics();
|
|
572
572
|
const adrs = getADRStatus();
|
|
573
573
|
const hooks = getHooksStatus();
|
|
574
|
-
const
|
|
574
|
+
const agentdb = getAgentDBStats();
|
|
575
575
|
const tests = getTestStats();
|
|
576
576
|
const session = getSessionStats();
|
|
577
577
|
const integration = getIntegrationStatus();
|
|
@@ -614,8 +614,8 @@ function generateStatusline() {
|
|
|
614
614
|
// Line 1: DDD Domains
|
|
615
615
|
const domainsColor = progress.domainsCompleted >= 3 ? c.brightGreen : progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
616
616
|
let perfIndicator;
|
|
617
|
-
if (
|
|
618
|
-
const speedup =
|
|
617
|
+
if (agentdb.hasHnsw && agentdb.vectorCount > 0) {
|
|
618
|
+
const speedup = agentdb.vectorCount > 10000 ? '12500x' : agentdb.vectorCount > 1000 ? '150x' : '10x';
|
|
619
619
|
perfIndicator = c.brightGreen + '\\u26A1 HNSW ' + speedup + c.reset;
|
|
620
620
|
} else if (progress.patternsLearned > 0) {
|
|
621
621
|
const pk = progress.patternsLearned >= 1000 ? (progress.patternsLearned / 1000).toFixed(1) + 'k' : String(progress.patternsLearned);
|
|
@@ -658,9 +658,9 @@ function generateStatusline() {
|
|
|
658
658
|
);
|
|
659
659
|
|
|
660
660
|
// Line 4: AgentDB, Tests, Integration
|
|
661
|
-
const hnswInd =
|
|
662
|
-
const sizeDisp =
|
|
663
|
-
const vectorColor =
|
|
661
|
+
const hnswInd = agentdb.hasHnsw ? c.brightGreen + '\\u26A1' + c.reset : '';
|
|
662
|
+
const sizeDisp = agentdb.dbSizeKB >= 1024 ? (agentdb.dbSizeKB / 1024).toFixed(1) + 'MB' : agentdb.dbSizeKB + 'KB';
|
|
663
|
+
const vectorColor = agentdb.vectorCount > 0 ? c.brightGreen : c.dim;
|
|
664
664
|
const testColor = tests.testFiles > 0 ? c.brightGreen : c.dim;
|
|
665
665
|
|
|
666
666
|
let integStr = '';
|
|
@@ -675,7 +675,7 @@ function generateStatusline() {
|
|
|
675
675
|
|
|
676
676
|
lines.push(
|
|
677
677
|
c.brightCyan + '\\uD83D\\uDCCA AgentDB' + c.reset + ' ' +
|
|
678
|
-
c.cyan + 'Vectors' + c.reset + ' ' + vectorColor + '\\u25CF' +
|
|
678
|
+
c.cyan + 'Vectors' + c.reset + ' ' + vectorColor + '\\u25CF' + agentdb.vectorCount + hnswInd + c.reset + ' ' + c.dim + '\\u2502' + c.reset + ' ' +
|
|
679
679
|
c.cyan + 'Size' + c.reset + ' ' + c.brightWhite + sizeDisp + c.reset + ' ' + c.dim + '\\u2502' + c.reset + ' ' +
|
|
680
680
|
c.cyan + 'Tests' + c.reset + ' ' + testColor + '\\u25CF' + tests.testFiles + c.reset + ' ' + c.dim + '(~' + tests.testCases + ' cases)' + c.reset + ' ' + c.dim + '\\u2502' + c.reset + ' ' +
|
|
681
681
|
integStr
|
|
@@ -695,7 +695,7 @@ function generateJSON() {
|
|
|
695
695
|
system: getSystemMetrics(),
|
|
696
696
|
adrs: getADRStatus(),
|
|
697
697
|
hooks: getHooksStatus(),
|
|
698
|
-
|
|
698
|
+
agentdb: getAgentDBStats(),
|
|
699
699
|
tests: getTestStats(),
|
|
700
700
|
git: { modified: git.modified, untracked: git.untracked, staged: git.staged, ahead: git.ahead, behind: git.behind },
|
|
701
701
|
lastUpdated: new Date().toISOString(),
|