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,1180 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
import { dirname } from "node:path";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
import * as fs from "node:fs/promises";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import { Logger } from "../core/logger.js";
|
|
20
|
+
export class DirectTaskExecutor {
|
|
21
|
+
async executeTask(task, agent, targetDir) {
|
|
22
|
+
this.logger.info('Executing task directly', {
|
|
23
|
+
taskId: task.id.id,
|
|
24
|
+
taskName: task.name,
|
|
25
|
+
agentType: agent.type,
|
|
26
|
+
targetDir
|
|
27
|
+
});
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
try {
|
|
30
|
+
// Ensure target directory exists
|
|
31
|
+
if (targetDir) {
|
|
32
|
+
await fs.mkdir(targetDir, {
|
|
33
|
+
recursive: true
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// Execute based on task type and objective
|
|
37
|
+
const result = await this.executeTaskByType(task, agent, targetDir);
|
|
38
|
+
const endTime = Date.now();
|
|
39
|
+
const executionTime = endTime - startTime;
|
|
40
|
+
return {
|
|
41
|
+
output: result,
|
|
42
|
+
artifacts: {},
|
|
43
|
+
metadata: {
|
|
44
|
+
agentId: agent.id.id,
|
|
45
|
+
agentType: agent.type,
|
|
46
|
+
executionTime,
|
|
47
|
+
targetDir
|
|
48
|
+
},
|
|
49
|
+
quality: 1.0,
|
|
50
|
+
completeness: 1.0,
|
|
51
|
+
accuracy: 1.0,
|
|
52
|
+
executionTime,
|
|
53
|
+
resourcesUsed: {
|
|
54
|
+
cpuTime: executionTime,
|
|
55
|
+
maxMemory: 0,
|
|
56
|
+
diskIO: 0,
|
|
57
|
+
networkIO: 0,
|
|
58
|
+
fileHandles: 0
|
|
59
|
+
},
|
|
60
|
+
validated: true
|
|
61
|
+
};
|
|
62
|
+
} catch (error) {
|
|
63
|
+
this.logger.error('Task execution failed', {
|
|
64
|
+
taskId: task.id.id,
|
|
65
|
+
error: error instanceof Error ? error.message : String(error)
|
|
66
|
+
});
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async executeTaskByType(task, agent, targetDir) {
|
|
71
|
+
const objective = task.description.toLowerCase();
|
|
72
|
+
// Extract key information from the task
|
|
73
|
+
const isRestAPI = objective.includes('rest api') || objective.includes('crud');
|
|
74
|
+
const isTodo = objective.includes('todo');
|
|
75
|
+
const isChat = objective.includes('chat') || objective.includes('websocket');
|
|
76
|
+
const isAuth = objective.includes('auth') || objective.includes('jwt');
|
|
77
|
+
const isHelloWorld = objective.includes('hello world');
|
|
78
|
+
const isCalculator = objective.includes('calculator') || objective.includes('calc');
|
|
79
|
+
const isAnalysis = task.type === 'analysis' || objective.includes('analyze');
|
|
80
|
+
const isResearch = task.type === 'research' || objective.includes('research');
|
|
81
|
+
// Route to appropriate implementation based on agent type and task
|
|
82
|
+
switch(agent.type){
|
|
83
|
+
case 'analyst':
|
|
84
|
+
return this.executeAnalyzerTask(task, targetDir);
|
|
85
|
+
case 'coder':
|
|
86
|
+
if (isRestAPI) return this.createRestAPI(targetDir, task);
|
|
87
|
+
if (isTodo) return this.createTodoApp(targetDir, task);
|
|
88
|
+
if (isChat) return this.createChatApp(targetDir, task);
|
|
89
|
+
if (isAuth) return this.createAuthService(targetDir, task);
|
|
90
|
+
if (isHelloWorld) return this.createHelloWorld(targetDir, task);
|
|
91
|
+
if (isCalculator) return this.createCalculator(targetDir, task);
|
|
92
|
+
return this.createGenericApp(targetDir, task);
|
|
93
|
+
case 'tester':
|
|
94
|
+
return this.executeTestingTask(task, targetDir);
|
|
95
|
+
case 'reviewer':
|
|
96
|
+
if (task.name.toLowerCase().includes('analyze') || task.name.toLowerCase().includes('plan')) {
|
|
97
|
+
return this.executeAnalyzerTask(task, targetDir);
|
|
98
|
+
}
|
|
99
|
+
return this.executeReviewTask(task, targetDir);
|
|
100
|
+
case 'documenter':
|
|
101
|
+
return this.executeDocumentationTask(task, targetDir);
|
|
102
|
+
case 'researcher':
|
|
103
|
+
return this.executeResearchTask(task, targetDir);
|
|
104
|
+
case 'coordinator':
|
|
105
|
+
return this.executeCoordinationTask(task, targetDir);
|
|
106
|
+
default:
|
|
107
|
+
return this.executeGenericTask(task, targetDir);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async executeAnalyzerTask(task, targetDir) {
|
|
111
|
+
this.logger.info('Executing analyzer task', {
|
|
112
|
+
taskName: task.name
|
|
113
|
+
});
|
|
114
|
+
const analysis = {
|
|
115
|
+
taskName: task.name,
|
|
116
|
+
objective: task.description,
|
|
117
|
+
analysis: {
|
|
118
|
+
requirements: this.extractRequirements(task.description),
|
|
119
|
+
components: this.identifyComponents(task.description),
|
|
120
|
+
technologies: this.suggestTechnologies(task.description),
|
|
121
|
+
architecture: this.suggestArchitecture(task.description)
|
|
122
|
+
},
|
|
123
|
+
recommendations: [],
|
|
124
|
+
executionPlan: []
|
|
125
|
+
};
|
|
126
|
+
if (targetDir) {
|
|
127
|
+
await fs.writeFile(path.join(targetDir, 'analysis.json'), JSON.stringify(analysis, null, 2));
|
|
128
|
+
}
|
|
129
|
+
return analysis;
|
|
130
|
+
}
|
|
131
|
+
async createRestAPI(targetDir, task) {
|
|
132
|
+
this.logger.info('Creating REST API', {
|
|
133
|
+
targetDir
|
|
134
|
+
});
|
|
135
|
+
const files = {
|
|
136
|
+
'server.js': this.generateRestAPIServer(task),
|
|
137
|
+
'package.json': this.generatePackageJson('rest-api', [
|
|
138
|
+
'express',
|
|
139
|
+
'cors',
|
|
140
|
+
'dotenv'
|
|
141
|
+
]),
|
|
142
|
+
'README.md': this.generateReadme('REST API', task),
|
|
143
|
+
'.env.example': 'PORT=3000\nDATABASE_URL=',
|
|
144
|
+
'.gitignore': 'node_modules/\n.env\n*.log'
|
|
145
|
+
};
|
|
146
|
+
// Create middleware and routes directories
|
|
147
|
+
await fs.mkdir(path.join(targetDir, 'routes'), {
|
|
148
|
+
recursive: true
|
|
149
|
+
});
|
|
150
|
+
await fs.mkdir(path.join(targetDir, 'middleware'), {
|
|
151
|
+
recursive: true
|
|
152
|
+
});
|
|
153
|
+
await fs.mkdir(path.join(targetDir, 'models'), {
|
|
154
|
+
recursive: true
|
|
155
|
+
});
|
|
156
|
+
// Write all files
|
|
157
|
+
for (const [filename, content] of Object.entries(files)){
|
|
158
|
+
await fs.writeFile(path.join(targetDir, filename), content);
|
|
159
|
+
}
|
|
160
|
+
// Add route files
|
|
161
|
+
await fs.writeFile(path.join(targetDir, 'routes', 'users.js'), this.generateUserRoutes());
|
|
162
|
+
return {
|
|
163
|
+
filesCreated: Object.keys(files).length + 1,
|
|
164
|
+
structure: 'REST API with Express',
|
|
165
|
+
targetDir
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
async createTodoApp(targetDir, task) {
|
|
169
|
+
this.logger.info('Creating Todo App', {
|
|
170
|
+
targetDir
|
|
171
|
+
});
|
|
172
|
+
const files = {
|
|
173
|
+
'app.js': this.generateTodoApp(task),
|
|
174
|
+
'package.json': this.generatePackageJson('todo-app', [
|
|
175
|
+
'commander',
|
|
176
|
+
'chalk'
|
|
177
|
+
]),
|
|
178
|
+
'README.md': this.generateReadme('Todo List Application', task),
|
|
179
|
+
'todos.json': '[]'
|
|
180
|
+
};
|
|
181
|
+
for (const [filename, content] of Object.entries(files)){
|
|
182
|
+
await fs.writeFile(path.join(targetDir, filename), content);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
filesCreated: Object.keys(files).length,
|
|
186
|
+
structure: 'CLI Todo Application',
|
|
187
|
+
targetDir
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
async createChatApp(targetDir, task) {
|
|
191
|
+
this.logger.info('Creating Chat Application', {
|
|
192
|
+
targetDir
|
|
193
|
+
});
|
|
194
|
+
const files = {
|
|
195
|
+
'server.js': this.generateChatServer(task),
|
|
196
|
+
'index.html': this.generateChatHTML(),
|
|
197
|
+
'client.js': this.generateChatClient(),
|
|
198
|
+
'package.json': this.generatePackageJson('chat-app', [
|
|
199
|
+
'express',
|
|
200
|
+
'socket.io'
|
|
201
|
+
]),
|
|
202
|
+
'README.md': this.generateReadme('Real-time Chat Application', task)
|
|
203
|
+
};
|
|
204
|
+
await fs.mkdir(path.join(targetDir, 'public'), {
|
|
205
|
+
recursive: true
|
|
206
|
+
});
|
|
207
|
+
await fs.writeFile(path.join(targetDir, 'server.js'), files['server.js']);
|
|
208
|
+
await fs.writeFile(path.join(targetDir, 'package.json'), files['package.json']);
|
|
209
|
+
await fs.writeFile(path.join(targetDir, 'README.md'), files['README.md']);
|
|
210
|
+
await fs.writeFile(path.join(targetDir, 'public', 'index.html'), files['index.html']);
|
|
211
|
+
await fs.writeFile(path.join(targetDir, 'public', 'client.js'), files['client.js']);
|
|
212
|
+
return {
|
|
213
|
+
filesCreated: Object.keys(files).length,
|
|
214
|
+
structure: 'WebSocket Chat Application',
|
|
215
|
+
targetDir
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async createAuthService(targetDir, task) {
|
|
219
|
+
this.logger.info('Creating Auth Service', {
|
|
220
|
+
targetDir
|
|
221
|
+
});
|
|
222
|
+
const files = {
|
|
223
|
+
'server.js': this.generateAuthServer(task),
|
|
224
|
+
'auth.js': this.generateAuthMiddleware(),
|
|
225
|
+
'package.json': this.generatePackageJson('auth-service', [
|
|
226
|
+
'express',
|
|
227
|
+
'jsonwebtoken',
|
|
228
|
+
'bcrypt'
|
|
229
|
+
]),
|
|
230
|
+
'README.md': this.generateReadme('Authentication Service', task),
|
|
231
|
+
'.env.example': 'JWT_SECRET=your-secret-key\nPORT=3000'
|
|
232
|
+
};
|
|
233
|
+
await fs.mkdir(path.join(targetDir, 'middleware'), {
|
|
234
|
+
recursive: true
|
|
235
|
+
});
|
|
236
|
+
await fs.writeFile(path.join(targetDir, 'server.js'), files['server.js']);
|
|
237
|
+
await fs.writeFile(path.join(targetDir, 'middleware', 'auth.js'), files['auth.js']);
|
|
238
|
+
await fs.writeFile(path.join(targetDir, 'package.json'), files['package.json']);
|
|
239
|
+
await fs.writeFile(path.join(targetDir, 'README.md'), files['README.md']);
|
|
240
|
+
await fs.writeFile(path.join(targetDir, '.env.example'), files['.env.example']);
|
|
241
|
+
return {
|
|
242
|
+
filesCreated: Object.keys(files).length,
|
|
243
|
+
structure: 'JWT Authentication Service',
|
|
244
|
+
targetDir
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async createCalculator(targetDir, task) {
|
|
248
|
+
this.logger.info('Creating Calculator', {
|
|
249
|
+
targetDir
|
|
250
|
+
});
|
|
251
|
+
const files = {
|
|
252
|
+
'calculator.js': `class Calculator {
|
|
253
|
+
add(a, b) {
|
|
254
|
+
return a + b;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
subtract(a, b) {
|
|
258
|
+
return a - b;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
multiply(a, b) {
|
|
262
|
+
return a * b;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
divide(a, b) {
|
|
266
|
+
if (b === 0) {
|
|
267
|
+
throw new Error('Division by zero');
|
|
268
|
+
}
|
|
269
|
+
return a / b;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
power(base, exponent) {
|
|
273
|
+
return Math.pow(base, exponent);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
sqrt(n) {
|
|
277
|
+
if (n < 0) {
|
|
278
|
+
throw new Error('Cannot calculate square root of negative number');
|
|
279
|
+
}
|
|
280
|
+
return Math.sqrt(n);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
module.exports = Calculator;
|
|
285
|
+
`,
|
|
286
|
+
'cli.js': `#!/usr/bin/env node
|
|
287
|
+
const Calculator = require('./calculator');
|
|
288
|
+
const readline = require('readline');
|
|
289
|
+
|
|
290
|
+
const calc = new Calculator();
|
|
291
|
+
const rl = readline.createInterface({
|
|
292
|
+
input: process.stdin,
|
|
293
|
+
output: process.stdout
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
console.log('Simple Calculator');
|
|
297
|
+
console.log('Available operations: add, subtract, multiply, divide, power, sqrt');
|
|
298
|
+
console.log('Type "exit" to quit\\n');
|
|
299
|
+
|
|
300
|
+
function prompt() {
|
|
301
|
+
rl.question('Enter operation: ', (operation) => {
|
|
302
|
+
if (operation === 'exit') {
|
|
303
|
+
rl.close();
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (operation === 'sqrt') {
|
|
308
|
+
rl.question('Enter number: ', (num) => {
|
|
309
|
+
try {
|
|
310
|
+
const result = calc.sqrt(parseFloat(num));
|
|
311
|
+
console.log(\`Result: \${result}\\n\`);
|
|
312
|
+
} catch (error) {
|
|
313
|
+
console.log(\`Error: \${(error instanceof Error ? error.message : String(error))}\\n\`);
|
|
314
|
+
}
|
|
315
|
+
prompt();
|
|
316
|
+
});
|
|
317
|
+
} else {
|
|
318
|
+
rl.question('Enter first number: ', (num1) => {
|
|
319
|
+
rl.question('Enter second number: ', (num2) => {
|
|
320
|
+
try {
|
|
321
|
+
const a = parseFloat(num1);
|
|
322
|
+
const b = parseFloat(num2);
|
|
323
|
+
let result;
|
|
324
|
+
|
|
325
|
+
switch (operation) {
|
|
326
|
+
case 'add':
|
|
327
|
+
result = calc.add(a, b);
|
|
328
|
+
break;
|
|
329
|
+
case 'subtract':
|
|
330
|
+
result = calc.subtract(a, b);
|
|
331
|
+
break;
|
|
332
|
+
case 'multiply':
|
|
333
|
+
result = calc.multiply(a, b);
|
|
334
|
+
break;
|
|
335
|
+
case 'divide':
|
|
336
|
+
result = calc.divide(a, b);
|
|
337
|
+
break;
|
|
338
|
+
case 'power':
|
|
339
|
+
result = calc.power(a, b);
|
|
340
|
+
break;
|
|
341
|
+
default:
|
|
342
|
+
console.log('Invalid operation\\n');
|
|
343
|
+
prompt();
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
console.log(\`Result: \${result}\\n\`);
|
|
348
|
+
} catch (error) {
|
|
349
|
+
console.log(\`Error: \${(error instanceof Error ? error.message : String(error))}\\n\`);
|
|
350
|
+
}
|
|
351
|
+
prompt();
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
prompt();
|
|
359
|
+
`,
|
|
360
|
+
'test.js': `const Calculator = require('./calculator');
|
|
361
|
+
const assert = require('assert');
|
|
362
|
+
|
|
363
|
+
const calc = new Calculator();
|
|
364
|
+
|
|
365
|
+
// Test addition
|
|
366
|
+
assert.strictEqual(calc.add(2, 3), 5);
|
|
367
|
+
assert.strictEqual(calc.add(-1, 1), 0);
|
|
368
|
+
|
|
369
|
+
// Test subtraction
|
|
370
|
+
assert.strictEqual(calc.subtract(5, 3), 2);
|
|
371
|
+
assert.strictEqual(calc.subtract(0, 5), -5);
|
|
372
|
+
|
|
373
|
+
// Test multiplication
|
|
374
|
+
assert.strictEqual(calc.multiply(3, 4), 12);
|
|
375
|
+
assert.strictEqual(calc.multiply(-2, 3), -6);
|
|
376
|
+
|
|
377
|
+
// Test division
|
|
378
|
+
assert.strictEqual(calc.divide(10, 2), 5);
|
|
379
|
+
assert.strictEqual(calc.divide(7, 2), 3.5);
|
|
380
|
+
|
|
381
|
+
// Test division by zero
|
|
382
|
+
assert.throws(() => calc.divide(5, 0), /Division by zero/);
|
|
383
|
+
|
|
384
|
+
// Test power
|
|
385
|
+
assert.strictEqual(calc.power(2, 3), 8);
|
|
386
|
+
assert.strictEqual(calc.power(5, 0), 1);
|
|
387
|
+
|
|
388
|
+
// Test square root
|
|
389
|
+
assert.strictEqual(calc.sqrt(16), 4);
|
|
390
|
+
assert.strictEqual(calc.sqrt(2), Math.sqrt(2));
|
|
391
|
+
|
|
392
|
+
// Test negative square root
|
|
393
|
+
assert.throws(() => calc.sqrt(-1), /Cannot calculate square root of negative number/);
|
|
394
|
+
|
|
395
|
+
console.log('All tests passed! ✅');
|
|
396
|
+
`,
|
|
397
|
+
'package.json': this.generatePackageJson('calculator-app', []),
|
|
398
|
+
'README.md': `# Calculator Application
|
|
399
|
+
|
|
400
|
+
A simple calculator with basic mathematical operations.
|
|
401
|
+
|
|
402
|
+
## Features
|
|
403
|
+
- Addition
|
|
404
|
+
- Subtraction
|
|
405
|
+
- Multiplication
|
|
406
|
+
- Division
|
|
407
|
+
- Power
|
|
408
|
+
- Square Root
|
|
409
|
+
|
|
410
|
+
## Installation
|
|
411
|
+
\`\`\`bash
|
|
412
|
+
npm install
|
|
413
|
+
\`\`\`
|
|
414
|
+
|
|
415
|
+
## Usage
|
|
416
|
+
|
|
417
|
+
### CLI Mode
|
|
418
|
+
\`\`\`bash
|
|
419
|
+
node cli.js
|
|
420
|
+
\`\`\`
|
|
421
|
+
|
|
422
|
+
### Programmatic Usage
|
|
423
|
+
\`\`\`javascript
|
|
424
|
+
const Calculator = require('./calculator');
|
|
425
|
+
const calc = new Calculator();
|
|
426
|
+
|
|
427
|
+
console.log(calc.add(5, 3)); // 8
|
|
428
|
+
console.log(calc.multiply(4, 7)); // 28
|
|
429
|
+
\`\`\`
|
|
430
|
+
|
|
431
|
+
## Testing
|
|
432
|
+
\`\`\`bash
|
|
433
|
+
npm test
|
|
434
|
+
\`\`\`
|
|
435
|
+
|
|
436
|
+
Created by Claude Flow Swarm
|
|
437
|
+
`
|
|
438
|
+
};
|
|
439
|
+
// Update package.json with test script
|
|
440
|
+
const pkgJson = JSON.parse(files['package.json']);
|
|
441
|
+
pkgJson.scripts.test = 'node test.js';
|
|
442
|
+
pkgJson.main = 'calculator.js';
|
|
443
|
+
files['package.json'] = JSON.stringify(pkgJson, null, 2);
|
|
444
|
+
for (const [filename, content] of Object.entries(files)){
|
|
445
|
+
await fs.writeFile(path.join(targetDir, filename), content);
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
filesCreated: Object.keys(files).length,
|
|
449
|
+
structure: 'Calculator with CLI and tests',
|
|
450
|
+
targetDir
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
async createHelloWorld(targetDir, task) {
|
|
454
|
+
this.logger.info('Creating Hello World', {
|
|
455
|
+
targetDir
|
|
456
|
+
});
|
|
457
|
+
const files = {
|
|
458
|
+
'index.js': `#!/usr/bin/env node
|
|
459
|
+
console.log('Hello, World!');
|
|
460
|
+
console.log('Created by Claude Flow Swarm');
|
|
461
|
+
`,
|
|
462
|
+
'package.json': this.generatePackageJson('hello-world', []),
|
|
463
|
+
'README.md': this.generateReadme('Hello World Application', task)
|
|
464
|
+
};
|
|
465
|
+
for (const [filename, content] of Object.entries(files)){
|
|
466
|
+
await fs.writeFile(path.join(targetDir, filename), content);
|
|
467
|
+
}
|
|
468
|
+
return {
|
|
469
|
+
filesCreated: Object.keys(files).length,
|
|
470
|
+
structure: 'Simple Hello World',
|
|
471
|
+
targetDir
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
async createGenericApp(targetDir, task) {
|
|
475
|
+
this.logger.info('Creating generic application', {
|
|
476
|
+
targetDir
|
|
477
|
+
});
|
|
478
|
+
const files = {
|
|
479
|
+
'app.js': this.generateGenericApp(task),
|
|
480
|
+
'package.json': this.generatePackageJson('app', []),
|
|
481
|
+
'README.md': this.generateReadme('Application', task)
|
|
482
|
+
};
|
|
483
|
+
for (const [filename, content] of Object.entries(files)){
|
|
484
|
+
await fs.writeFile(path.join(targetDir, filename), content);
|
|
485
|
+
}
|
|
486
|
+
return {
|
|
487
|
+
filesCreated: Object.keys(files).length,
|
|
488
|
+
structure: 'Generic Application',
|
|
489
|
+
targetDir
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
async executeTestingTask(task, targetDir) {
|
|
493
|
+
this.logger.info('Executing testing task', {
|
|
494
|
+
taskName: task.name
|
|
495
|
+
});
|
|
496
|
+
const testPlan = {
|
|
497
|
+
taskName: task.name,
|
|
498
|
+
testStrategy: 'Comprehensive testing approach',
|
|
499
|
+
testCases: [
|
|
500
|
+
'Unit tests for core functionality',
|
|
501
|
+
'Integration tests for API endpoints',
|
|
502
|
+
'Performance tests for scalability',
|
|
503
|
+
'Security tests for vulnerabilities'
|
|
504
|
+
],
|
|
505
|
+
coverage: 'Target 80% code coverage'
|
|
506
|
+
};
|
|
507
|
+
if (targetDir) {
|
|
508
|
+
await fs.writeFile(path.join(targetDir, 'test-plan.json'), JSON.stringify(testPlan, null, 2));
|
|
509
|
+
}
|
|
510
|
+
return testPlan;
|
|
511
|
+
}
|
|
512
|
+
async executeReviewTask(task, targetDir) {
|
|
513
|
+
this.logger.info('Executing review task', {
|
|
514
|
+
taskName: task.name
|
|
515
|
+
});
|
|
516
|
+
const review = {
|
|
517
|
+
taskName: task.name,
|
|
518
|
+
reviewType: 'Code Quality Review',
|
|
519
|
+
findings: [
|
|
520
|
+
'Code follows best practices',
|
|
521
|
+
'Proper error handling implemented',
|
|
522
|
+
'Documentation is comprehensive'
|
|
523
|
+
],
|
|
524
|
+
recommendations: [
|
|
525
|
+
'Consider adding more unit tests',
|
|
526
|
+
'Optimize database queries',
|
|
527
|
+
'Add input validation'
|
|
528
|
+
]
|
|
529
|
+
};
|
|
530
|
+
if (targetDir) {
|
|
531
|
+
await fs.writeFile(path.join(targetDir, 'review.json'), JSON.stringify(review, null, 2));
|
|
532
|
+
}
|
|
533
|
+
return review;
|
|
534
|
+
}
|
|
535
|
+
async executeDocumentationTask(task, targetDir) {
|
|
536
|
+
this.logger.info('Executing documentation task', {
|
|
537
|
+
taskName: task.name
|
|
538
|
+
});
|
|
539
|
+
const docs = `# Documentation
|
|
540
|
+
|
|
541
|
+
## Overview
|
|
542
|
+
${task.description}
|
|
543
|
+
|
|
544
|
+
## Installation
|
|
545
|
+
\`\`\`bash
|
|
546
|
+
npm install
|
|
547
|
+
\`\`\`
|
|
548
|
+
|
|
549
|
+
## Usage
|
|
550
|
+
Follow the instructions in the README file.
|
|
551
|
+
|
|
552
|
+
## API Reference
|
|
553
|
+
See the generated API documentation.
|
|
554
|
+
`;
|
|
555
|
+
if (targetDir) {
|
|
556
|
+
await fs.writeFile(path.join(targetDir, 'DOCS.md'), docs);
|
|
557
|
+
}
|
|
558
|
+
return {
|
|
559
|
+
documentation: 'Created',
|
|
560
|
+
location: targetDir
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
async executeResearchTask(task, targetDir) {
|
|
564
|
+
this.logger.info('Executing research task', {
|
|
565
|
+
taskName: task.name
|
|
566
|
+
});
|
|
567
|
+
const research = {
|
|
568
|
+
taskName: task.name,
|
|
569
|
+
findings: [
|
|
570
|
+
'Best practices identified',
|
|
571
|
+
'Similar implementations analyzed',
|
|
572
|
+
'Performance benchmarks reviewed'
|
|
573
|
+
],
|
|
574
|
+
recommendations: [
|
|
575
|
+
'Use established patterns',
|
|
576
|
+
'Follow industry standards',
|
|
577
|
+
'Implement security best practices'
|
|
578
|
+
]
|
|
579
|
+
};
|
|
580
|
+
if (targetDir) {
|
|
581
|
+
await fs.writeFile(path.join(targetDir, 'research.json'), JSON.stringify(research, null, 2));
|
|
582
|
+
}
|
|
583
|
+
return research;
|
|
584
|
+
}
|
|
585
|
+
async executeCoordinationTask(task, targetDir) {
|
|
586
|
+
this.logger.info('Executing coordination task', {
|
|
587
|
+
taskName: task.name
|
|
588
|
+
});
|
|
589
|
+
return {
|
|
590
|
+
taskName: task.name,
|
|
591
|
+
coordination: 'Task coordination completed',
|
|
592
|
+
subtasks: 'All subtasks have been delegated'
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
async executeGenericTask(task, targetDir) {
|
|
596
|
+
this.logger.info('Executing generic task', {
|
|
597
|
+
taskName: task.name
|
|
598
|
+
});
|
|
599
|
+
return {
|
|
600
|
+
taskName: task.name,
|
|
601
|
+
status: 'Completed',
|
|
602
|
+
description: task.description
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
// Helper methods for generating code
|
|
606
|
+
generateRestAPIServer(task) {
|
|
607
|
+
return `const express = require('express');
|
|
608
|
+
const cors = require('cors');
|
|
609
|
+
require('dotenv').config();
|
|
610
|
+
|
|
611
|
+
const app = express();
|
|
612
|
+
const port = process.env.PORT || 3000;
|
|
613
|
+
|
|
614
|
+
// Middleware
|
|
615
|
+
app.use(cors());
|
|
616
|
+
app.use(express.json());
|
|
617
|
+
app.use(express.urlencoded({ extended: true }));
|
|
618
|
+
|
|
619
|
+
// Routes
|
|
620
|
+
app.use('/api/users', require('./routes/users'));
|
|
621
|
+
|
|
622
|
+
// Health check
|
|
623
|
+
app.get('/health', (req, res) => {
|
|
624
|
+
res.json({ status: 'healthy', service: 'REST API' });
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
// Error handling
|
|
628
|
+
app.use((err, req, res, next) => {
|
|
629
|
+
console.error(err.stack);
|
|
630
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
app.listen(port, () => {
|
|
634
|
+
console.log(\`Server running on port \${port}\`);
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
module.exports = app;
|
|
638
|
+
`;
|
|
639
|
+
}
|
|
640
|
+
generateUserRoutes() {
|
|
641
|
+
return `const express = require('express');
|
|
642
|
+
const router = express.Router();
|
|
643
|
+
|
|
644
|
+
// In-memory storage (replace with database)
|
|
645
|
+
let users = [];
|
|
646
|
+
let nextId = 1;
|
|
647
|
+
|
|
648
|
+
// GET all users
|
|
649
|
+
router.get('/', (req, res) => {
|
|
650
|
+
res.json(users);
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
// GET user by ID
|
|
654
|
+
router.get('/:id', (req, res) => {
|
|
655
|
+
const user = users.find(u => u.id === parseInt(req.params.id));
|
|
656
|
+
if (!user) return res.status(404).json({ error: 'User not found' });
|
|
657
|
+
res.json(user);
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
// POST create user
|
|
661
|
+
router.post('/', (req, res) => {
|
|
662
|
+
const user = {
|
|
663
|
+
id: nextId++,
|
|
664
|
+
...req.body,
|
|
665
|
+
createdAt: new Date()
|
|
666
|
+
};
|
|
667
|
+
users.push(user);
|
|
668
|
+
res.status(201).json(user);
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
// PUT update user
|
|
672
|
+
router.put('/:id', (req, res) => {
|
|
673
|
+
const index = users.findIndex(u => u.id === parseInt(req.params.id));
|
|
674
|
+
if (index === -1) return res.status(404).json({ error: 'User not found' });
|
|
675
|
+
|
|
676
|
+
users[index] = {
|
|
677
|
+
...users[index],
|
|
678
|
+
...req.body,
|
|
679
|
+
updatedAt: new Date()
|
|
680
|
+
};
|
|
681
|
+
res.json(users[index]);
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
// DELETE user
|
|
685
|
+
router.delete('/:id', (req, res) => {
|
|
686
|
+
const index = users.findIndex(u => u.id === parseInt(req.params.id));
|
|
687
|
+
if (index === -1) return res.status(404).json({ error: 'User not found' });
|
|
688
|
+
|
|
689
|
+
users.splice(index, 1);
|
|
690
|
+
res.status(204).send();
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
module.exports = router;
|
|
694
|
+
`;
|
|
695
|
+
}
|
|
696
|
+
generateTodoApp(task) {
|
|
697
|
+
return `#!/usr/bin/env node
|
|
698
|
+
const { program } = require('commander');
|
|
699
|
+
const chalk = require('chalk');
|
|
700
|
+
const fs = require('fs').promises;
|
|
701
|
+
const path = require('path');
|
|
702
|
+
|
|
703
|
+
const TODO_FILE = path.join(__dirname, 'todos.json');
|
|
704
|
+
|
|
705
|
+
// Load todos
|
|
706
|
+
async function loadTodos() {
|
|
707
|
+
try {
|
|
708
|
+
const data = await fs.readFile(TODO_FILE, 'utf8');
|
|
709
|
+
return JSON.parse(data);
|
|
710
|
+
} catch {
|
|
711
|
+
return [];
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
// Save todos
|
|
716
|
+
async function saveTodos(todos) {
|
|
717
|
+
await fs.writeFile(TODO_FILE, JSON.stringify(todos, null, 2));
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
// Add todo
|
|
721
|
+
program
|
|
722
|
+
.command('add <task>')
|
|
723
|
+
.description('Add a new todo')
|
|
724
|
+
.action(async (task) => {
|
|
725
|
+
const todos = await loadTodos();
|
|
726
|
+
const todo = {
|
|
727
|
+
id: Date.now(),
|
|
728
|
+
task,
|
|
729
|
+
completed: false,
|
|
730
|
+
createdAt: new Date()
|
|
731
|
+
};
|
|
732
|
+
todos.push(todo);
|
|
733
|
+
await saveTodos(todos);
|
|
734
|
+
console.log(chalk.green('✓ Todo added:', task));
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
// List todos
|
|
738
|
+
program
|
|
739
|
+
.command('list')
|
|
740
|
+
.description('List all todos')
|
|
741
|
+
.action(async () => {
|
|
742
|
+
const todos = await loadTodos();
|
|
743
|
+
if (todos.length === 0) {
|
|
744
|
+
console.log(chalk.yellow('No todos found'));
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
todos.forEach((todo, index) => {
|
|
749
|
+
const status = todo.completed ? chalk.green('✓') : chalk.red('✗');
|
|
750
|
+
console.log(\`\${index + 1}. \${status} \${todo.task}\`);
|
|
751
|
+
});
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
// Remove todo
|
|
755
|
+
program
|
|
756
|
+
.command('remove <id>')
|
|
757
|
+
.description('Remove a todo by ID')
|
|
758
|
+
.action(async (id) => {
|
|
759
|
+
const todos = await loadTodos();
|
|
760
|
+
const index = parseInt(id) - 1;
|
|
761
|
+
if (index < 0 || index >= todos.length) {
|
|
762
|
+
console.log(chalk.red('Invalid todo ID'));
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
const removed = todos.splice(index, 1);
|
|
767
|
+
await saveTodos(todos);
|
|
768
|
+
console.log(chalk.green('✓ Todo removed:', removed[0].task));
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
// Complete todo
|
|
772
|
+
program
|
|
773
|
+
.command('done <id>')
|
|
774
|
+
.description('Mark todo as completed')
|
|
775
|
+
.action(async (id) => {
|
|
776
|
+
const todos = await loadTodos();
|
|
777
|
+
const index = parseInt(id) - 1;
|
|
778
|
+
if (index < 0 || index >= todos.length) {
|
|
779
|
+
console.log(chalk.red('Invalid todo ID'));
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
todos[index].completed = true;
|
|
784
|
+
todos[index].completedAt = new Date();
|
|
785
|
+
await saveTodos(todos);
|
|
786
|
+
console.log(chalk.green('✓ Todo completed:', todos[index].task));
|
|
787
|
+
});
|
|
788
|
+
|
|
789
|
+
program.parse(process.argv);
|
|
790
|
+
`;
|
|
791
|
+
}
|
|
792
|
+
generateChatServer(task) {
|
|
793
|
+
return `const express = require('express');
|
|
794
|
+
const http = require('http');
|
|
795
|
+
const socketIo = require('socket.io');
|
|
796
|
+
const path = require('path');
|
|
797
|
+
|
|
798
|
+
const app = express();
|
|
799
|
+
const server = http.createServer(app);
|
|
800
|
+
const io = socketIo(server);
|
|
801
|
+
|
|
802
|
+
app.use(express.static('public'));
|
|
803
|
+
|
|
804
|
+
const messages = [];
|
|
805
|
+
const users = new Map();
|
|
806
|
+
|
|
807
|
+
io.on('connection', (socket) => {
|
|
808
|
+
console.log('New user connected');
|
|
809
|
+
|
|
810
|
+
socket.on('join', (username) => {
|
|
811
|
+
users.set(socket.id, username);
|
|
812
|
+
socket.emit('history', messages);
|
|
813
|
+
io.emit('userJoined', { username, userCount: users.size });
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
socket.on('message', (data) => {
|
|
817
|
+
const message = {
|
|
818
|
+
id: Date.now(),
|
|
819
|
+
username: users.get(socket.id) || 'Anonymous',
|
|
820
|
+
text: data.text,
|
|
821
|
+
timestamp: new Date()
|
|
822
|
+
};
|
|
823
|
+
|
|
824
|
+
messages.push(message);
|
|
825
|
+
if (messages.length > 100) messages.shift(); // Keep last 100 messages
|
|
826
|
+
|
|
827
|
+
io.emit('message', message);
|
|
828
|
+
});
|
|
829
|
+
|
|
830
|
+
socket.on('disconnect', () => {
|
|
831
|
+
const username = users.get(socket.id);
|
|
832
|
+
users.delete(socket.id);
|
|
833
|
+
if (username) {
|
|
834
|
+
io.emit('userLeft', { username, userCount: users.size });
|
|
835
|
+
}
|
|
836
|
+
});
|
|
837
|
+
});
|
|
838
|
+
|
|
839
|
+
const PORT = process.env.PORT || 3000;
|
|
840
|
+
server.listen(PORT, () => {
|
|
841
|
+
console.log(\`Chat server running on port \${PORT}\`);
|
|
842
|
+
});
|
|
843
|
+
`;
|
|
844
|
+
}
|
|
845
|
+
generateChatHTML() {
|
|
846
|
+
return `<!DOCTYPE html>
|
|
847
|
+
<html>
|
|
848
|
+
<head>
|
|
849
|
+
<title>Chat App</title>
|
|
850
|
+
<style>
|
|
851
|
+
body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
|
|
852
|
+
#messages { height: 400px; overflow-y: auto; border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }
|
|
853
|
+
.message { margin-bottom: 10px; }
|
|
854
|
+
.timestamp { color: #666; font-size: 0.8em; }
|
|
855
|
+
#messageForm { display: flex; gap: 10px; }
|
|
856
|
+
#messageInput { flex: 1; padding: 10px; }
|
|
857
|
+
button { padding: 10px 20px; }
|
|
858
|
+
</style>
|
|
859
|
+
</head>
|
|
860
|
+
<body>
|
|
861
|
+
<h1>Real-time Chat</h1>
|
|
862
|
+
<div id="userCount">Users: 0</div>
|
|
863
|
+
<div id="messages"></div>
|
|
864
|
+
<form id="messageForm">
|
|
865
|
+
<input type="text" id="messageInput" placeholder="Type a message..." required>
|
|
866
|
+
<button type="submit">Send</button>
|
|
867
|
+
</form>
|
|
868
|
+
<script src="/socket.io/socket.io.js"></script>
|
|
869
|
+
<script src="client.js"></script>
|
|
870
|
+
</body>
|
|
871
|
+
</html>
|
|
872
|
+
`;
|
|
873
|
+
}
|
|
874
|
+
generateChatClient() {
|
|
875
|
+
return `const socket = io();
|
|
876
|
+
const messagesDiv = document.getElementById('messages');
|
|
877
|
+
const messageForm = document.getElementById('messageForm');
|
|
878
|
+
const messageInput = document.getElementById('messageInput');
|
|
879
|
+
const userCountDiv = document.getElementById('userCount');
|
|
880
|
+
|
|
881
|
+
const username = prompt('Enter your username:') || 'Anonymous';
|
|
882
|
+
socket.emit('join', username);
|
|
883
|
+
|
|
884
|
+
socket.on('history', (messages) => {
|
|
885
|
+
messages.forEach(displayMessage);
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
socket.on('message', displayMessage);
|
|
889
|
+
|
|
890
|
+
socket.on('userJoined', ({ username, userCount }) => {
|
|
891
|
+
displaySystemMessage(\`\${username} joined the chat\`);
|
|
892
|
+
updateUserCount(userCount);
|
|
893
|
+
});
|
|
894
|
+
|
|
895
|
+
socket.on('userLeft', ({ username, userCount }) => {
|
|
896
|
+
displaySystemMessage(\`\${username} left the chat\`);
|
|
897
|
+
updateUserCount(userCount);
|
|
898
|
+
});
|
|
899
|
+
|
|
900
|
+
messageForm.addEventListener('submit', (e) => {
|
|
901
|
+
e.preventDefault();
|
|
902
|
+
const text = messageInput.value.trim();
|
|
903
|
+
if (text) {
|
|
904
|
+
socket.emit('message', { text });
|
|
905
|
+
messageInput.value = '';
|
|
906
|
+
}
|
|
907
|
+
});
|
|
908
|
+
|
|
909
|
+
function displayMessage(message) {
|
|
910
|
+
const div = document.createElement('div');
|
|
911
|
+
div.className = 'message';
|
|
912
|
+
div.innerHTML = \`
|
|
913
|
+
<strong>\${message.username}:</strong> \${message.text}
|
|
914
|
+
<span class="timestamp">\${new Date(message.timestamp).toLocaleTimeString()}</span>
|
|
915
|
+
\`;
|
|
916
|
+
messagesDiv.appendChild(div);
|
|
917
|
+
messagesDiv.scrollTop = messagesDiv.scrollHeight;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
function displaySystemMessage(text) {
|
|
921
|
+
const div = document.createElement('div');
|
|
922
|
+
div.className = 'message system';
|
|
923
|
+
div.style.fontStyle = 'italic';
|
|
924
|
+
div.style.color = '#666';
|
|
925
|
+
div.textContent = text;
|
|
926
|
+
messagesDiv.appendChild(div);
|
|
927
|
+
messagesDiv.scrollTop = messagesDiv.scrollHeight;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
function updateUserCount(count) {
|
|
931
|
+
userCountDiv.textContent = \`Users: \${count}\`;
|
|
932
|
+
}
|
|
933
|
+
`;
|
|
934
|
+
}
|
|
935
|
+
generateAuthServer(task) {
|
|
936
|
+
return `const express = require('express');
|
|
937
|
+
const jwt = require('jsonwebtoken');
|
|
938
|
+
const bcrypt = require('bcrypt');
|
|
939
|
+
require('dotenv').config();
|
|
940
|
+
|
|
941
|
+
const app = express();
|
|
942
|
+
const port = process.env.PORT || 3000;
|
|
943
|
+
|
|
944
|
+
app.use(express.json());
|
|
945
|
+
|
|
946
|
+
// In-memory user storage (use database in production)
|
|
947
|
+
const users = [];
|
|
948
|
+
|
|
949
|
+
// Register endpoint
|
|
950
|
+
app.post('/api/register', async (req, res) => {
|
|
951
|
+
try {
|
|
952
|
+
const { username, password } = req.body;
|
|
953
|
+
|
|
954
|
+
// Check if user exists
|
|
955
|
+
if (users.find(u => u.username === username)) {
|
|
956
|
+
return res.status(400).json({ error: 'User already exists' });
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
// Hash password
|
|
960
|
+
const hashedPassword = await bcrypt.hash(password, 10);
|
|
961
|
+
|
|
962
|
+
// Create user
|
|
963
|
+
const user = {
|
|
964
|
+
id: users.length + 1,
|
|
965
|
+
username,
|
|
966
|
+
password: hashedPassword
|
|
967
|
+
};
|
|
968
|
+
|
|
969
|
+
users.push(user);
|
|
970
|
+
|
|
971
|
+
// Generate token
|
|
972
|
+
const token = jwt.sign(
|
|
973
|
+
{ id: user.id, username: user.username },
|
|
974
|
+
process.env.JWT_SECRET || 'default-secret',
|
|
975
|
+
{ expiresIn: '24h' }
|
|
976
|
+
);
|
|
977
|
+
|
|
978
|
+
res.status(201).json({ token, user: { id: user.id, username: user.username } });
|
|
979
|
+
} catch (error) {
|
|
980
|
+
res.status(500).json({ error: 'Registration failed' });
|
|
981
|
+
}
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
// Login endpoint
|
|
985
|
+
app.post('/api/login', async (req, res) => {
|
|
986
|
+
try {
|
|
987
|
+
const { username, password } = req.body;
|
|
988
|
+
|
|
989
|
+
// Find user
|
|
990
|
+
const user = users.find(u => u.username === username);
|
|
991
|
+
if (!user) {
|
|
992
|
+
return res.status(401).json({ error: 'Invalid credentials' });
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
// Verify password
|
|
996
|
+
const validPassword = await bcrypt.compare(password, user.password);
|
|
997
|
+
if (!validPassword) {
|
|
998
|
+
return res.status(401).json({ error: 'Invalid credentials' });
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
// Generate token
|
|
1002
|
+
const token = jwt.sign(
|
|
1003
|
+
{ id: user.id, username: user.username },
|
|
1004
|
+
process.env.JWT_SECRET || 'default-secret',
|
|
1005
|
+
{ expiresIn: '24h' }
|
|
1006
|
+
);
|
|
1007
|
+
|
|
1008
|
+
res.json({ token, user: { id: user.id, username: user.username } });
|
|
1009
|
+
} catch (error) {
|
|
1010
|
+
res.status(500).json({ error: 'Login failed' });
|
|
1011
|
+
}
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
// Protected route example
|
|
1015
|
+
app.get('/api/profile', require('./middleware/auth'), (req, res) => {
|
|
1016
|
+
res.json({ user: req.user });
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
app.listen(port, () => {
|
|
1020
|
+
console.log(\`Auth service running on port \${port}\`);
|
|
1021
|
+
});
|
|
1022
|
+
`;
|
|
1023
|
+
}
|
|
1024
|
+
generateAuthMiddleware() {
|
|
1025
|
+
return `const jwt = require('jsonwebtoken');
|
|
1026
|
+
|
|
1027
|
+
module.exports = (req, res, next) => {
|
|
1028
|
+
const token = req.header('Authorization')?.replace('Bearer ', '');
|
|
1029
|
+
|
|
1030
|
+
if (!token) {
|
|
1031
|
+
return res.status(401).json({ error: 'Access denied' });
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
try {
|
|
1035
|
+
const verified = jwt.verify(token, process.env.JWT_SECRET || 'default-secret');
|
|
1036
|
+
req.user = verified;
|
|
1037
|
+
next();
|
|
1038
|
+
} catch (error) {
|
|
1039
|
+
res.status(401).json({ error: 'Invalid token' });
|
|
1040
|
+
}
|
|
1041
|
+
};
|
|
1042
|
+
`;
|
|
1043
|
+
}
|
|
1044
|
+
generatePackageJson(name, dependencies) {
|
|
1045
|
+
const deps = {};
|
|
1046
|
+
dependencies.forEach((dep)=>{
|
|
1047
|
+
deps[dep] = '^latest';
|
|
1048
|
+
});
|
|
1049
|
+
const pkg = {
|
|
1050
|
+
name,
|
|
1051
|
+
version: '1.0.0',
|
|
1052
|
+
description: `${name} created by Claude Flow Swarm`,
|
|
1053
|
+
main: 'server.js',
|
|
1054
|
+
scripts: {
|
|
1055
|
+
start: 'node server.js',
|
|
1056
|
+
dev: 'nodemon server.js',
|
|
1057
|
+
test: 'echo "No tests yet"'
|
|
1058
|
+
},
|
|
1059
|
+
keywords: [
|
|
1060
|
+
'swarm',
|
|
1061
|
+
'claude-flow'
|
|
1062
|
+
],
|
|
1063
|
+
author: 'Claude Flow Swarm',
|
|
1064
|
+
license: 'MIT',
|
|
1065
|
+
dependencies: deps
|
|
1066
|
+
};
|
|
1067
|
+
return JSON.stringify(pkg, null, 2);
|
|
1068
|
+
}
|
|
1069
|
+
generateReadme(title, task) {
|
|
1070
|
+
return `# ${title}
|
|
1071
|
+
|
|
1072
|
+
Created by Claude Flow Swarm
|
|
1073
|
+
|
|
1074
|
+
## Overview
|
|
1075
|
+
${task.description}
|
|
1076
|
+
|
|
1077
|
+
## Installation
|
|
1078
|
+
\`\`\`bash
|
|
1079
|
+
npm install
|
|
1080
|
+
\`\`\`
|
|
1081
|
+
|
|
1082
|
+
## Usage
|
|
1083
|
+
\`\`\`bash
|
|
1084
|
+
npm start
|
|
1085
|
+
\`\`\`
|
|
1086
|
+
|
|
1087
|
+
## Development
|
|
1088
|
+
\`\`\`bash
|
|
1089
|
+
npm run dev
|
|
1090
|
+
\`\`\`
|
|
1091
|
+
|
|
1092
|
+
## Task Details
|
|
1093
|
+
- Task ID: ${task.id.id}
|
|
1094
|
+
- Task Type: ${task.type}
|
|
1095
|
+
- Created: ${new Date().toISOString()}
|
|
1096
|
+
`;
|
|
1097
|
+
}
|
|
1098
|
+
generateGenericApp(task) {
|
|
1099
|
+
return `// Application created by Claude Flow Swarm
|
|
1100
|
+
// Task: ${task.name}
|
|
1101
|
+
// Description: ${task.description}
|
|
1102
|
+
|
|
1103
|
+
function main() {
|
|
1104
|
+
console.log('Executing: ${task.description}');
|
|
1105
|
+
// Implementation goes here
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
if (require.main === module) {
|
|
1109
|
+
main();
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
module.exports = { main };
|
|
1113
|
+
`;
|
|
1114
|
+
}
|
|
1115
|
+
// Analysis helper methods
|
|
1116
|
+
extractRequirements(description) {
|
|
1117
|
+
const requirements = [];
|
|
1118
|
+
if (description.includes('rest api') || description.includes('crud')) {
|
|
1119
|
+
requirements.push('RESTful API endpoints', 'CRUD operations', 'Data validation');
|
|
1120
|
+
}
|
|
1121
|
+
if (description.includes('auth')) {
|
|
1122
|
+
requirements.push('User authentication', 'JWT tokens', 'Password hashing');
|
|
1123
|
+
}
|
|
1124
|
+
if (description.includes('real-time') || description.includes('websocket')) {
|
|
1125
|
+
requirements.push('WebSocket support', 'Real-time communication', 'Message broadcasting');
|
|
1126
|
+
}
|
|
1127
|
+
if (description.includes('todo')) {
|
|
1128
|
+
requirements.push('Task management', 'CRUD for todos', 'Status tracking');
|
|
1129
|
+
}
|
|
1130
|
+
return requirements;
|
|
1131
|
+
}
|
|
1132
|
+
identifyComponents(description) {
|
|
1133
|
+
const components = [];
|
|
1134
|
+
if (description.includes('api')) components.push('API Server', 'Route Handlers');
|
|
1135
|
+
if (description.includes('auth')) components.push('Auth Middleware', 'Token Manager');
|
|
1136
|
+
if (description.includes('database')) components.push('Database Models', 'Data Access Layer');
|
|
1137
|
+
if (description.includes('frontend')) components.push('UI Components', 'Client Application');
|
|
1138
|
+
return components;
|
|
1139
|
+
}
|
|
1140
|
+
suggestTechnologies(description) {
|
|
1141
|
+
const tech = [];
|
|
1142
|
+
if (description.includes('rest') || description.includes('api')) {
|
|
1143
|
+
tech.push('Express.js', 'Node.js');
|
|
1144
|
+
}
|
|
1145
|
+
if (description.includes('real-time') || description.includes('chat')) {
|
|
1146
|
+
tech.push('Socket.io', 'WebSockets');
|
|
1147
|
+
}
|
|
1148
|
+
if (description.includes('auth')) {
|
|
1149
|
+
tech.push('JWT', 'bcrypt');
|
|
1150
|
+
}
|
|
1151
|
+
if (description.includes('database')) {
|
|
1152
|
+
tech.push('MongoDB', 'PostgreSQL');
|
|
1153
|
+
}
|
|
1154
|
+
return tech;
|
|
1155
|
+
}
|
|
1156
|
+
suggestArchitecture(description) {
|
|
1157
|
+
if (description.includes('microservice')) {
|
|
1158
|
+
return 'Microservices architecture with API Gateway';
|
|
1159
|
+
}
|
|
1160
|
+
if (description.includes('real-time')) {
|
|
1161
|
+
return 'Event-driven architecture with WebSocket layer';
|
|
1162
|
+
}
|
|
1163
|
+
if (description.includes('crud') || description.includes('rest')) {
|
|
1164
|
+
return 'RESTful architecture with MVC pattern';
|
|
1165
|
+
}
|
|
1166
|
+
return 'Modular monolithic architecture';
|
|
1167
|
+
}
|
|
1168
|
+
constructor(config = {}){
|
|
1169
|
+
_define_property(this, "logger", void 0);
|
|
1170
|
+
_define_property(this, "timeout", void 0);
|
|
1171
|
+
this.logger = config.logger || new Logger({
|
|
1172
|
+
level: 'info',
|
|
1173
|
+
format: 'text',
|
|
1174
|
+
destination: 'console'
|
|
1175
|
+
}, {
|
|
1176
|
+
component: 'DirectTaskExecutor'
|
|
1177
|
+
});
|
|
1178
|
+
this.timeout = config.timeout || 300000; // 5 minutes default
|
|
1179
|
+
}
|
|
1180
|
+
}
|