claude-flow-novice 2.0.3 → 2.0.4
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/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Initialization Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates that swarm initialization is performed before spawning multiple agents.
|
|
5
|
+
* Ensures proper coordination and prevents inconsistent implementations across agents.
|
|
6
|
+
*
|
|
7
|
+
* @module validators/swarm-init-validator
|
|
8
|
+
*/ import { Logger } from "../core/logger.js";
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
requireSwarmForMultiAgent: true,
|
|
11
|
+
minAgentsRequiringSwarm: 2,
|
|
12
|
+
meshTopologyMaxAgents: 7,
|
|
13
|
+
hierarchicalTopologyMinAgents: 8
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Validates swarm initialization before agent spawning
|
|
17
|
+
*
|
|
18
|
+
* @param agentCount - Number of agents to spawn
|
|
19
|
+
* @param swarmStatus - Current swarm status (optional, will check environment if not provided)
|
|
20
|
+
* @param config - Validator configuration
|
|
21
|
+
* @returns Validation result with error messages and suggestions
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const result = await validateSwarmInit(3);
|
|
26
|
+
* if (!result.valid) {
|
|
27
|
+
* console.error(result.error);
|
|
28
|
+
* console.log(result.suggestion);
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/ export async function validateSwarmInit(agentCount, swarmStatus, config = {}) {
|
|
32
|
+
const logger = new Logger('SwarmInitValidator');
|
|
33
|
+
const cfg = {
|
|
34
|
+
...DEFAULT_CONFIG,
|
|
35
|
+
...config
|
|
36
|
+
};
|
|
37
|
+
// Single agent spawning doesn't require swarm
|
|
38
|
+
if (agentCount < cfg.minAgentsRequiringSwarm) {
|
|
39
|
+
return {
|
|
40
|
+
valid: true
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Check if swarm is required for this agent count
|
|
44
|
+
if (!cfg.requireSwarmForMultiAgent) {
|
|
45
|
+
logger.warn('Swarm validation is disabled in configuration');
|
|
46
|
+
return {
|
|
47
|
+
valid: true
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Get swarm status
|
|
51
|
+
const status = swarmStatus || await getSwarmStatus();
|
|
52
|
+
// Validate swarm is initialized
|
|
53
|
+
if (!status.initialized) {
|
|
54
|
+
const topology = agentCount <= cfg.meshTopologyMaxAgents ? 'mesh' : 'hierarchical';
|
|
55
|
+
return {
|
|
56
|
+
valid: false,
|
|
57
|
+
error: createErrorMessage(agentCount),
|
|
58
|
+
suggestion: createSuggestion(agentCount, topology),
|
|
59
|
+
topology,
|
|
60
|
+
maxAgents: agentCount
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// Validate topology matches agent count
|
|
64
|
+
const topologyValidation = validateTopology(agentCount, status, cfg);
|
|
65
|
+
if (!topologyValidation.valid) {
|
|
66
|
+
return topologyValidation;
|
|
67
|
+
}
|
|
68
|
+
// Validate max agents capacity
|
|
69
|
+
if (status.maxAgents && agentCount > status.maxAgents) {
|
|
70
|
+
return {
|
|
71
|
+
valid: false,
|
|
72
|
+
error: `Cannot spawn ${agentCount} agents. Swarm configured for maximum ${status.maxAgents} agents.`,
|
|
73
|
+
suggestion: `Reinitialize swarm with increased maxAgents:\n npx claude-flow-novice swarm init --topology ${status.topology} --max-agents ${agentCount}`
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
logger.info(`Swarm validation passed for ${agentCount} agents`);
|
|
77
|
+
return {
|
|
78
|
+
valid: true
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validates that topology matches agent count requirements
|
|
83
|
+
*/ function validateTopology(agentCount, status, config) {
|
|
84
|
+
const expectedTopology = agentCount <= config.meshTopologyMaxAgents ? 'mesh' : 'hierarchical';
|
|
85
|
+
if (status.topology && status.topology !== expectedTopology) {
|
|
86
|
+
return {
|
|
87
|
+
valid: false,
|
|
88
|
+
error: `Topology mismatch: ${agentCount} agents require '${expectedTopology}' topology, but swarm is using '${status.topology}'.`,
|
|
89
|
+
suggestion: `Reinitialize swarm with correct topology:\n npx claude-flow-novice swarm init --topology ${expectedTopology} --max-agents ${agentCount}`,
|
|
90
|
+
topology: expectedTopology,
|
|
91
|
+
maxAgents: agentCount
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
valid: true
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Creates error message for missing swarm initialization
|
|
100
|
+
*/ function createErrorMessage(agentCount) {
|
|
101
|
+
return `
|
|
102
|
+
❌ SWARM INITIALIZATION REQUIRED
|
|
103
|
+
|
|
104
|
+
You are attempting to spawn ${agentCount} agents without initializing swarm.
|
|
105
|
+
|
|
106
|
+
Without swarm coordination:
|
|
107
|
+
• Agents work independently with no shared context
|
|
108
|
+
• Results may be inconsistent (e.g., 3 different JWT secret solutions)
|
|
109
|
+
• No consensus validation or Byzantine fault tolerance
|
|
110
|
+
• Memory coordination is disabled
|
|
111
|
+
|
|
112
|
+
This violates the mandatory coordination requirements in CLAUDE.md.
|
|
113
|
+
`.trim();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Creates suggestion message with fix command
|
|
117
|
+
*/ function createSuggestion(agentCount, topology) {
|
|
118
|
+
return `
|
|
119
|
+
Fix:
|
|
120
|
+
1. Initialize swarm first:
|
|
121
|
+
npx claude-flow-novice swarm init --topology ${topology} --max-agents ${agentCount}
|
|
122
|
+
|
|
123
|
+
2. Then spawn agents:
|
|
124
|
+
[Your agent spawning command]
|
|
125
|
+
|
|
126
|
+
Topology Selection:
|
|
127
|
+
• mesh: 2-7 agents (peer-to-peer coordination)
|
|
128
|
+
• hierarchical: 8+ agents (coordinator-led structure)
|
|
129
|
+
|
|
130
|
+
See CLAUDE.md section "Swarm Initialization" for coordination requirements.
|
|
131
|
+
`.trim();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Gets current swarm status from environment or MCP server
|
|
135
|
+
*/ async function getSwarmStatus() {
|
|
136
|
+
const logger = new Logger('SwarmInitValidator');
|
|
137
|
+
// Check environment variables
|
|
138
|
+
const swarmId = process.env['CLAUDE_SWARM_ID'];
|
|
139
|
+
if (!swarmId) {
|
|
140
|
+
return {
|
|
141
|
+
initialized: false
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Try to get status from MCP server via swarm coordinator
|
|
145
|
+
try {
|
|
146
|
+
// Import dynamically to avoid circular dependencies
|
|
147
|
+
const { getSwarmCoordinator } = await import("../coordination/swarm-coordinator-factory.js").catch(()=>({
|
|
148
|
+
getSwarmCoordinator: null
|
|
149
|
+
}));
|
|
150
|
+
if (getSwarmCoordinator) {
|
|
151
|
+
const coordinator = getSwarmCoordinator();
|
|
152
|
+
if (coordinator) {
|
|
153
|
+
const status = coordinator.getSwarmStatus();
|
|
154
|
+
return {
|
|
155
|
+
initialized: true,
|
|
156
|
+
swarmId,
|
|
157
|
+
activeAgents: status.agents.total,
|
|
158
|
+
maxAgents: status.agents.total
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
logger.debug('Could not get swarm status from coordinator', error);
|
|
164
|
+
}
|
|
165
|
+
// If we have a swarm ID but can't get details, assume initialized
|
|
166
|
+
return {
|
|
167
|
+
initialized: true,
|
|
168
|
+
swarmId
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Validates swarm initialization and throws error if invalid
|
|
173
|
+
*
|
|
174
|
+
* This is a convenience wrapper for validateSwarmInit that throws on validation failure.
|
|
175
|
+
* Use this in CLI commands where you want to halt execution on validation errors.
|
|
176
|
+
*
|
|
177
|
+
* @param agentCount - Number of agents to spawn
|
|
178
|
+
* @param swarmStatus - Current swarm status (optional)
|
|
179
|
+
* @param config - Validator configuration
|
|
180
|
+
* @throws Error if validation fails
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```typescript
|
|
184
|
+
* try {
|
|
185
|
+
* await requireSwarmInit(3);
|
|
186
|
+
* // Proceed with spawning agents
|
|
187
|
+
* } catch (error) {
|
|
188
|
+
* console.error(error.message);
|
|
189
|
+
* process.exit(1);
|
|
190
|
+
* }
|
|
191
|
+
* ```
|
|
192
|
+
*/ export async function requireSwarmInit(agentCount, swarmStatus, config) {
|
|
193
|
+
const result = await validateSwarmInit(agentCount, swarmStatus, config);
|
|
194
|
+
if (!result.valid) {
|
|
195
|
+
const errorMessage = `${result.error}\n\n${result.suggestion}`;
|
|
196
|
+
throw new Error(errorMessage);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Gets recommended topology for agent count
|
|
201
|
+
*
|
|
202
|
+
* @param agentCount - Number of agents
|
|
203
|
+
* @param config - Validator configuration
|
|
204
|
+
* @returns Recommended topology
|
|
205
|
+
*/ export function getRecommendedTopology(agentCount, config = {}) {
|
|
206
|
+
const cfg = {
|
|
207
|
+
...DEFAULT_CONFIG,
|
|
208
|
+
...config
|
|
209
|
+
};
|
|
210
|
+
return agentCount <= cfg.meshTopologyMaxAgents ? 'mesh' : 'hierarchical';
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Checks if swarm initialization is required for agent count
|
|
214
|
+
*
|
|
215
|
+
* @param agentCount - Number of agents
|
|
216
|
+
* @param config - Validator configuration
|
|
217
|
+
* @returns true if swarm initialization is required
|
|
218
|
+
*/ export function isSwarmRequired(agentCount, config = {}) {
|
|
219
|
+
const cfg = {
|
|
220
|
+
...DEFAULT_CONFIG,
|
|
221
|
+
...config
|
|
222
|
+
};
|
|
223
|
+
return cfg.requireSwarmForMultiAgent && agentCount >= cfg.minAgentsRequiringSwarm;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Validates swarm configuration before initialization
|
|
227
|
+
*
|
|
228
|
+
* @param topology - Requested topology
|
|
229
|
+
* @param maxAgents - Maximum number of agents
|
|
230
|
+
* @param config - Validator configuration
|
|
231
|
+
* @returns Validation result
|
|
232
|
+
*/ export function validateSwarmConfig(topology, maxAgents, config = {}) {
|
|
233
|
+
const cfg = {
|
|
234
|
+
...DEFAULT_CONFIG,
|
|
235
|
+
...config
|
|
236
|
+
};
|
|
237
|
+
// Validate topology matches max agents
|
|
238
|
+
const recommendedTopology = getRecommendedTopology(maxAgents, config);
|
|
239
|
+
if (topology !== recommendedTopology) {
|
|
240
|
+
return {
|
|
241
|
+
valid: false,
|
|
242
|
+
error: `Topology '${topology}' is not optimal for ${maxAgents} agents.`,
|
|
243
|
+
suggestion: `Recommended topology: '${recommendedTopology}'\n • mesh: 2-${cfg.meshTopologyMaxAgents} agents\n • hierarchical: ${cfg.hierarchicalTopologyMinAgents}+ agents`,
|
|
244
|
+
topology: recommendedTopology,
|
|
245
|
+
maxAgents
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
valid: true
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Factory for creating a swarm coordinator factory module
|
|
254
|
+
* This is a placeholder that will be replaced with actual implementation
|
|
255
|
+
*/ export const SwarmCoordinatorFactory = {
|
|
256
|
+
getSwarmCoordinator () {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TodoWrite Batching Validator
|
|
3
|
+
*
|
|
4
|
+
* Detects and warns about TodoWrite anti-patterns where multiple small calls
|
|
5
|
+
* are made instead of a single batched call with 5-10+ items.
|
|
6
|
+
*
|
|
7
|
+
* Anti-pattern example (bad):
|
|
8
|
+
* TodoWrite([{...}]) // Call 1: 1 item
|
|
9
|
+
* TodoWrite([{...}]) // Call 2: 1 item
|
|
10
|
+
* TodoWrite([{...}]) // Call 3: 1 item
|
|
11
|
+
*
|
|
12
|
+
* Best practice (good):
|
|
13
|
+
* TodoWrite([{...}, {...}, {...}, {...}, {...}]) // Single call: 5+ items
|
|
14
|
+
*
|
|
15
|
+
* @module validators/todowrite-batching-validator
|
|
16
|
+
*/ function _define_property(obj, key, value) {
|
|
17
|
+
if (key in obj) {
|
|
18
|
+
Object.defineProperty(obj, key, {
|
|
19
|
+
value: value,
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true
|
|
23
|
+
});
|
|
24
|
+
} else {
|
|
25
|
+
obj[key] = value;
|
|
26
|
+
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validates TodoWrite call patterns to ensure proper batching behavior
|
|
31
|
+
*
|
|
32
|
+
* Tracks call frequency within a sliding time window and detects anti-patterns
|
|
33
|
+
* where multiple small calls are made instead of a single batched call.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const validator = new TodoWriteValidator({ strictMode: false });
|
|
38
|
+
*
|
|
39
|
+
* // Good: Single batched call
|
|
40
|
+
* validator.validateBatching([
|
|
41
|
+
* { content: "Task 1", status: "pending", activeForm: "Doing task 1" },
|
|
42
|
+
* { content: "Task 2", status: "pending", activeForm: "Doing task 2" },
|
|
43
|
+
* { content: "Task 3", status: "pending", activeForm: "Doing task 3" },
|
|
44
|
+
* { content: "Task 4", status: "pending", activeForm: "Doing task 4" },
|
|
45
|
+
* { content: "Task 5", status: "pending", activeForm: "Doing task 5" }
|
|
46
|
+
* ]); // ✅ No warning
|
|
47
|
+
*
|
|
48
|
+
* // Bad: Multiple small calls
|
|
49
|
+
* validator.validateBatching([{ content: "Task 1", status: "pending", activeForm: "Doing task 1" }]);
|
|
50
|
+
* validator.validateBatching([{ content: "Task 2", status: "pending", activeForm: "Doing task 2" }]);
|
|
51
|
+
* // ⚠️ Warning: Batching anti-pattern detected
|
|
52
|
+
* ```
|
|
53
|
+
*/ export class TodoWriteValidator {
|
|
54
|
+
/**
|
|
55
|
+
* Validates a TodoWrite call and checks for batching anti-patterns
|
|
56
|
+
*
|
|
57
|
+
* @param todos - Array of todos being written
|
|
58
|
+
* @throws Error if strictMode is enabled and anti-pattern detected
|
|
59
|
+
* @returns ValidationResult with detailed analysis
|
|
60
|
+
*/ validateBatching(todos) {
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
this.totalCallCount++;
|
|
63
|
+
// Log this call
|
|
64
|
+
this.callLog.push({
|
|
65
|
+
timestamp: now,
|
|
66
|
+
count: todos.length,
|
|
67
|
+
callIndex: this.totalCallCount
|
|
68
|
+
});
|
|
69
|
+
// Clean old entries outside time window
|
|
70
|
+
this.callLog = this.callLog.filter((entry)=>now - entry.timestamp < this.config.timeWindowMs);
|
|
71
|
+
// Calculate statistics
|
|
72
|
+
const totalItems = this.callLog.reduce((sum, entry)=>sum + entry.count, 0);
|
|
73
|
+
const averageItemsPerCall = totalItems / this.callLog.length;
|
|
74
|
+
const warnings = [];
|
|
75
|
+
const recommendations = [];
|
|
76
|
+
let isValid = true;
|
|
77
|
+
// Check for anti-pattern: too many calls in time window
|
|
78
|
+
if (this.callLog.length >= this.config.callThreshold) {
|
|
79
|
+
isValid = false;
|
|
80
|
+
const warningMessage = this.buildWarningMessage(totalItems, averageItemsPerCall);
|
|
81
|
+
warnings.push(warningMessage);
|
|
82
|
+
// Generate specific recommendations
|
|
83
|
+
recommendations.push(`Batch ALL todos in SINGLE TodoWrite call with ${this.config.minRecommendedItems}+ items`);
|
|
84
|
+
recommendations.push(`See CLAUDE.md: "TodoWrite batching requirement" and "1 MESSAGE = ALL RELATED OPERATIONS"`);
|
|
85
|
+
recommendations.push(`Example: TodoWrite([todo1, todo2, todo3, todo4, todo5]) instead of multiple calls`);
|
|
86
|
+
if (this.config.verbose) {
|
|
87
|
+
console.log("\n📊 TodoWrite Call Statistics:");
|
|
88
|
+
console.log(` Total calls in window: ${this.callLog.length}`);
|
|
89
|
+
console.log(` Total items: ${totalItems}`);
|
|
90
|
+
console.log(` Average items per call: ${averageItemsPerCall.toFixed(2)}`);
|
|
91
|
+
console.log(` Time window: ${this.config.timeWindowMs / 1000}s`);
|
|
92
|
+
}
|
|
93
|
+
// In strict mode, throw error
|
|
94
|
+
if (this.config.strictMode) {
|
|
95
|
+
throw new Error(`TodoWrite Batching Violation: ${warningMessage}\n\n` + `Recommendations:\n${recommendations.map((r)=>` - ${r}`).join("\n")}`);
|
|
96
|
+
}
|
|
97
|
+
// Otherwise, log warning
|
|
98
|
+
console.warn(warningMessage);
|
|
99
|
+
}
|
|
100
|
+
// Additional check: warn if single call has too few items (informational only)
|
|
101
|
+
if (todos.length < this.config.minRecommendedItems && this.callLog.length === 1) {
|
|
102
|
+
recommendations.push(`Consider adding more todos to this batch (current: ${todos.length}, recommended: ${this.config.minRecommendedItems}+)`);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
isValid,
|
|
106
|
+
callCount: this.callLog.length,
|
|
107
|
+
totalItems,
|
|
108
|
+
averageItemsPerCall,
|
|
109
|
+
warnings,
|
|
110
|
+
recommendations
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Builds a detailed warning message for batching anti-patterns
|
|
115
|
+
* @private
|
|
116
|
+
*/ buildWarningMessage(totalItems, averageItemsPerCall) {
|
|
117
|
+
const timeWindowMinutes = this.config.timeWindowMs / 60000;
|
|
118
|
+
return `
|
|
119
|
+
⚠️ TODOWRITE BATCHING ANTI-PATTERN DETECTED
|
|
120
|
+
|
|
121
|
+
You have made ${this.callLog.length} TodoWrite calls in the last ${timeWindowMinutes} minutes.
|
|
122
|
+
|
|
123
|
+
Best Practice: Batch ALL todos in SINGLE TodoWrite call with ${this.config.minRecommendedItems}-10+ items.
|
|
124
|
+
|
|
125
|
+
Current calls (within ${timeWindowMinutes}min window):
|
|
126
|
+
${this.callLog.map((entry, i)=>` ${i + 1}. Call #${entry.callIndex}: ${entry.count} item${entry.count !== 1 ? "s" : ""} (${this.formatTimestamp(entry.timestamp)})`).join("\n")}
|
|
127
|
+
|
|
128
|
+
Statistics:
|
|
129
|
+
- Total calls: ${this.callLog.length}
|
|
130
|
+
- Total items: ${totalItems}
|
|
131
|
+
- Average items per call: ${averageItemsPerCall.toFixed(2)}
|
|
132
|
+
- Recommended: 1 call with ${this.config.minRecommendedItems}+ items
|
|
133
|
+
|
|
134
|
+
Impact:
|
|
135
|
+
- Multiple calls waste API resources
|
|
136
|
+
- Harder to track task relationships
|
|
137
|
+
- Violates "1 MESSAGE = ALL RELATED OPERATIONS" principle
|
|
138
|
+
|
|
139
|
+
See CLAUDE.md: "TodoWrite batching requirement"
|
|
140
|
+
`.trim();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Formats timestamp for display in warning messages
|
|
144
|
+
* @private
|
|
145
|
+
*/ formatTimestamp(timestamp) {
|
|
146
|
+
const secondsAgo = Math.floor((Date.now() - timestamp) / 1000);
|
|
147
|
+
if (secondsAgo < 60) return `${secondsAgo}s ago`;
|
|
148
|
+
const minutesAgo = Math.floor(secondsAgo / 60);
|
|
149
|
+
return `${minutesAgo}m ago`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Gets current validation statistics
|
|
153
|
+
*/ getStatistics() {
|
|
154
|
+
return {
|
|
155
|
+
totalCalls: this.totalCallCount,
|
|
156
|
+
callsInWindow: this.callLog.length,
|
|
157
|
+
timeWindowMs: this.config.timeWindowMs,
|
|
158
|
+
threshold: this.config.callThreshold
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Resets the validator state (useful for testing)
|
|
163
|
+
*/ reset() {
|
|
164
|
+
this.callLog = [];
|
|
165
|
+
this.totalCallCount = 0;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Updates validator configuration
|
|
169
|
+
*/ updateConfig(config) {
|
|
170
|
+
this.config = {
|
|
171
|
+
...this.config,
|
|
172
|
+
...config
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Checks if validation is currently passing (no anti-patterns detected)
|
|
177
|
+
*/ isCurrentlyValid() {
|
|
178
|
+
return this.callLog.length < this.config.callThreshold;
|
|
179
|
+
}
|
|
180
|
+
constructor(config = {}){
|
|
181
|
+
_define_property(this, "callLog", []);
|
|
182
|
+
_define_property(this, "totalCallCount", 0);
|
|
183
|
+
_define_property(this, "config", void 0);
|
|
184
|
+
this.config = {
|
|
185
|
+
timeWindowMs: config.timeWindowMs ?? 300000,
|
|
186
|
+
callThreshold: config.callThreshold ?? 2,
|
|
187
|
+
strictMode: config.strictMode ?? false,
|
|
188
|
+
minRecommendedItems: config.minRecommendedItems ?? 5,
|
|
189
|
+
verbose: config.verbose ?? false
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Global singleton instance for use across the application
|
|
195
|
+
*/ let globalValidator = null;
|
|
196
|
+
/**
|
|
197
|
+
* Gets the global TodoWrite validator instance
|
|
198
|
+
* Creates one if it doesn't exist
|
|
199
|
+
*/ export function getGlobalValidator(config) {
|
|
200
|
+
if (!globalValidator) {
|
|
201
|
+
globalValidator = new TodoWriteValidator(config);
|
|
202
|
+
} else if (config) {
|
|
203
|
+
globalValidator.updateConfig(config);
|
|
204
|
+
}
|
|
205
|
+
return globalValidator;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Resets the global validator instance
|
|
209
|
+
* Useful for testing and cleanup
|
|
210
|
+
*/ export function resetGlobalValidator() {
|
|
211
|
+
if (globalValidator) {
|
|
212
|
+
globalValidator.reset();
|
|
213
|
+
}
|
|
214
|
+
globalValidator = null;
|
|
215
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TodoWrite Validator Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides CLI flag support and tool integration for the TodoWrite batching validator.
|
|
5
|
+
* Can be enabled via --validate-batching flag or VALIDATE_TODOWRITE_BATCHING env var.
|
|
6
|
+
*
|
|
7
|
+
* @module validators/todowrite-integration
|
|
8
|
+
*/ import { getGlobalValidator } from "./todowrite-batching-validator";
|
|
9
|
+
/**
|
|
10
|
+
* Environment variables for controlling validation
|
|
11
|
+
*/ const ENV_VALIDATE_BATCHING = "VALIDATE_TODOWRITE_BATCHING";
|
|
12
|
+
const ENV_STRICT_MODE = "TODOWRITE_STRICT_MODE";
|
|
13
|
+
const ENV_VERBOSE = "TODOWRITE_VERBOSE";
|
|
14
|
+
/**
|
|
15
|
+
* Checks if validation is enabled via environment or config
|
|
16
|
+
*/ export function isValidationEnabled(config) {
|
|
17
|
+
// Check environment variable first
|
|
18
|
+
if (process.env[ENV_VALIDATE_BATCHING] === "true") {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
// Check config
|
|
22
|
+
return config?.enabled ?? false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Gets integration config from environment and explicit config
|
|
26
|
+
*/ export function getIntegrationConfig(explicitConfig) {
|
|
27
|
+
return {
|
|
28
|
+
enabled: isValidationEnabled(explicitConfig),
|
|
29
|
+
strictMode: process.env[ENV_STRICT_MODE] === "true" || explicitConfig?.strictMode,
|
|
30
|
+
verbose: process.env[ENV_VERBOSE] === "true" || explicitConfig?.verbose,
|
|
31
|
+
timeWindowMs: explicitConfig?.timeWindowMs,
|
|
32
|
+
callThreshold: explicitConfig?.callThreshold,
|
|
33
|
+
minRecommendedItems: explicitConfig?.minRecommendedItems
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validates a TodoWrite call with integrated configuration
|
|
38
|
+
*
|
|
39
|
+
* @param todos - Array of todos being written
|
|
40
|
+
* @param config - Optional configuration override
|
|
41
|
+
* @returns Validation result if enabled, null if disabled
|
|
42
|
+
*/ export function validateTodoWrite(todos, config) {
|
|
43
|
+
const integrationConfig = getIntegrationConfig(config);
|
|
44
|
+
// Skip validation if not enabled
|
|
45
|
+
if (!integrationConfig.enabled) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// Get global validator and update config
|
|
49
|
+
const validator = getGlobalValidator({
|
|
50
|
+
strictMode: integrationConfig.strictMode,
|
|
51
|
+
verbose: integrationConfig.verbose,
|
|
52
|
+
timeWindowMs: integrationConfig.timeWindowMs,
|
|
53
|
+
callThreshold: integrationConfig.callThreshold,
|
|
54
|
+
minRecommendedItems: integrationConfig.minRecommendedItems
|
|
55
|
+
});
|
|
56
|
+
// Validate and return result
|
|
57
|
+
return validator.validateBatching(todos);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* CLI argument parser for validation flags
|
|
61
|
+
*/ export function parseValidationFlags(args) {
|
|
62
|
+
const config = {
|
|
63
|
+
enabled: false,
|
|
64
|
+
strictMode: false,
|
|
65
|
+
verbose: false
|
|
66
|
+
};
|
|
67
|
+
for(let i = 0; i < args.length; i++){
|
|
68
|
+
const arg = args[i];
|
|
69
|
+
switch(arg){
|
|
70
|
+
case "--validate-batching":
|
|
71
|
+
config.enabled = true;
|
|
72
|
+
break;
|
|
73
|
+
case "--strict":
|
|
74
|
+
case "--strict-mode":
|
|
75
|
+
config.strictMode = true;
|
|
76
|
+
break;
|
|
77
|
+
case "--verbose":
|
|
78
|
+
case "-v":
|
|
79
|
+
config.verbose = true;
|
|
80
|
+
break;
|
|
81
|
+
case "--time-window":
|
|
82
|
+
config.timeWindowMs = parseInt(args[++i], 10);
|
|
83
|
+
break;
|
|
84
|
+
case "--threshold":
|
|
85
|
+
config.callThreshold = parseInt(args[++i], 10);
|
|
86
|
+
break;
|
|
87
|
+
case "--min-items":
|
|
88
|
+
config.minRecommendedItems = parseInt(args[++i], 10);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return config;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Helper to display usage information
|
|
96
|
+
*/ export function displayValidationHelp() {
|
|
97
|
+
console.log(`
|
|
98
|
+
TodoWrite Batching Validator - Usage
|
|
99
|
+
|
|
100
|
+
Detects anti-patterns where multiple small TodoWrite calls are made
|
|
101
|
+
instead of a single batched call with 5-10+ items.
|
|
102
|
+
|
|
103
|
+
CLI Flags:
|
|
104
|
+
--validate-batching Enable TodoWrite batching validation
|
|
105
|
+
--strict, --strict-mode Throw error on anti-pattern (default: warn)
|
|
106
|
+
--verbose, -v Show detailed statistics
|
|
107
|
+
--time-window <ms> Time window for detection (default: 300000 = 5min)
|
|
108
|
+
--threshold <count> Number of calls before warning (default: 2)
|
|
109
|
+
--min-items <count> Minimum recommended items (default: 5)
|
|
110
|
+
|
|
111
|
+
Environment Variables:
|
|
112
|
+
VALIDATE_TODOWRITE_BATCHING=true Enable validation globally
|
|
113
|
+
TODOWRITE_STRICT_MODE=true Enable strict mode globally
|
|
114
|
+
TODOWRITE_VERBOSE=true Enable verbose logging globally
|
|
115
|
+
|
|
116
|
+
Examples:
|
|
117
|
+
# Enable validation with defaults
|
|
118
|
+
npx claude-flow-novice task --validate-batching
|
|
119
|
+
|
|
120
|
+
# Enable strict mode (throw error on anti-pattern)
|
|
121
|
+
npx claude-flow-novice task --validate-batching --strict
|
|
122
|
+
|
|
123
|
+
# Custom thresholds
|
|
124
|
+
npx claude-flow-novice task --validate-batching --threshold 3 --time-window 600000
|
|
125
|
+
|
|
126
|
+
# Via environment
|
|
127
|
+
export VALIDATE_TODOWRITE_BATCHING=true
|
|
128
|
+
npx claude-flow-novice task
|
|
129
|
+
|
|
130
|
+
Best Practice:
|
|
131
|
+
Always batch ALL todos in SINGLE TodoWrite call with 5-10+ items.
|
|
132
|
+
See CLAUDE.md: "TodoWrite batching requirement"
|
|
133
|
+
`.trim());
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Example integration with TodoWrite tool
|
|
137
|
+
* This function wraps the actual TodoWrite implementation
|
|
138
|
+
*/ export function todoWriteWithValidation(todos, config) {
|
|
139
|
+
// Validate first if enabled
|
|
140
|
+
const validationResult = validateTodoWrite(todos, config);
|
|
141
|
+
if (validationResult && !validationResult.isValid) {
|
|
142
|
+
console.warn("\n⚠️ TodoWrite Batching Issue Detected\n");
|
|
143
|
+
console.warn("Recommendations:");
|
|
144
|
+
validationResult.recommendations.forEach((rec, i)=>{
|
|
145
|
+
console.warn(` ${i + 1}. ${rec}`);
|
|
146
|
+
});
|
|
147
|
+
console.warn("");
|
|
148
|
+
}
|
|
149
|
+
// Proceed with actual TodoWrite implementation
|
|
150
|
+
// (This would call the real TodoWrite tool)
|
|
151
|
+
// For now, just log what would be written
|
|
152
|
+
if (config?.verbose) {
|
|
153
|
+
console.log(`\n✅ Writing ${todos.length} todos...`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Express middleware for validation (if using HTTP API)
|
|
158
|
+
*/ export function createValidationMiddleware(config) {
|
|
159
|
+
return (req, res, next)=>{
|
|
160
|
+
if (req.body && Array.isArray(req.body.todos)) {
|
|
161
|
+
try {
|
|
162
|
+
validateTodoWrite(req.body.todos, config);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
// In strict mode, validation errors become HTTP errors
|
|
165
|
+
if (config?.strictMode) {
|
|
166
|
+
return res.status(400).json({
|
|
167
|
+
error: "TodoWrite Batching Violation",
|
|
168
|
+
message: error.message
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
next();
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Integration status checker
|
|
178
|
+
*/ export function getValidationStatus() {
|
|
179
|
+
const config = getIntegrationConfig();
|
|
180
|
+
const validator = getGlobalValidator();
|
|
181
|
+
return {
|
|
182
|
+
enabled: config.enabled,
|
|
183
|
+
strictMode: config.strictMode ?? false,
|
|
184
|
+
verbose: config.verbose ?? false,
|
|
185
|
+
statistics: validator.getStatistics()
|
|
186
|
+
};
|
|
187
|
+
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow-novice",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "Simplified Claude Flow for beginners - AI agent orchestration made easy",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"mcpName": "io.github.ruvnet/claude-flow",
|
|
7
7
|
"main": "dist/src/index.js",
|
|
8
8
|
"bin": {
|
|
9
|
-
"claude-flow-novice": "dist/src/cli/
|
|
9
|
+
"claude-flow-novice": "dist/src/cli/main.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"dev": "tsx src/cli/main.ts",
|