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
|
@@ -1,44 +1,37 @@
|
|
|
1
1
|
// template-copier.js - Copy template files instead of generating them dynamically
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { fileURLToPath } from 'url';
|
|
7
|
-
|
|
2
|
+
import { existsSync } from "../../node-compat.js";
|
|
3
|
+
import { promises as fs } from "fs";
|
|
4
|
+
import { dirname, join, relative } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
8
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
7
|
const __dirname = dirname(__filename);
|
|
10
|
-
|
|
11
8
|
/**
|
|
12
9
|
* Find the templates directory (bundled or local)
|
|
13
10
|
* @param {string} templateType - Template type (basic-swarm, fleet-manager, etc.)
|
|
14
11
|
* @returns {Promise<string>} Path to templates directory
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
continue;
|
|
12
|
+
*/ async function findTemplatesDirectory(templateType = 'basic-swarm') {
|
|
13
|
+
// Try multiple possible template locations
|
|
14
|
+
const possiblePaths = [
|
|
15
|
+
// 1. Bundled templates (npm package installed)
|
|
16
|
+
join(__dirname, '..', '..', '..', '..', 'templates', templateType),
|
|
17
|
+
// 2. Source templates during development
|
|
18
|
+
join(__dirname, 'templates'),
|
|
19
|
+
// 3. Legacy templates location
|
|
20
|
+
join(__dirname, 'templates', templateType),
|
|
21
|
+
// 4. Project root templates
|
|
22
|
+
join(process.cwd(), 'templates', templateType)
|
|
23
|
+
];
|
|
24
|
+
for (const path of possiblePaths){
|
|
25
|
+
try {
|
|
26
|
+
await fs.access(path);
|
|
27
|
+
return path;
|
|
28
|
+
} catch (err) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
35
31
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// Fallback to local templates directory
|
|
39
|
-
return join(__dirname, 'templates');
|
|
32
|
+
// Fallback to local templates directory
|
|
33
|
+
return join(__dirname, 'templates');
|
|
40
34
|
}
|
|
41
|
-
|
|
42
35
|
/**
|
|
43
36
|
* Copy template files from the templates directory to the target directory
|
|
44
37
|
* @param {string} targetDir - The directory to copy templates to
|
|
@@ -52,566 +45,461 @@ async function findTemplatesDirectory(templateType = 'basic-swarm') {
|
|
|
52
45
|
* @param {boolean} options.force - Whether to overwrite existing files
|
|
53
46
|
* @param {string[]} options.selectedModes - Selected SPARC modes to copy
|
|
54
47
|
* @returns {Promise<{success: boolean, copiedFiles: string[], errors: string[]}>}
|
|
55
|
-
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
: '
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
},
|
|
98
|
-
];
|
|
99
|
-
|
|
100
|
-
// Copy core files
|
|
101
|
-
for (const file of coreFiles) {
|
|
102
|
-
// Skip files if requested
|
|
103
|
-
if (options.skipClaudeMd && file.destination === 'CLAUDE.md') continue;
|
|
104
|
-
if (options.skipSettings && file.destination.includes('settings')) continue;
|
|
105
|
-
|
|
106
|
-
const sourceFile =
|
|
107
|
-
file.useVariant && existsSync(join(templatesDir, `${file.source}.${templateVariant}`))
|
|
108
|
-
? `${file.source}.${templateVariant}`
|
|
109
|
-
: file.source;
|
|
110
|
-
|
|
111
|
-
const sourcePath = join(templatesDir, sourceFile);
|
|
112
|
-
const destPath = join(targetDir, file.destination);
|
|
113
|
-
|
|
114
|
-
if (await copyFile(sourcePath, destPath, options)) {
|
|
115
|
-
results.copiedFiles.push(file.destination);
|
|
116
|
-
} else if (!options.dryRun) {
|
|
117
|
-
results.errors.push(`Failed to copy ${file.destination}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Copy .claude directory structure
|
|
122
|
-
if (options.enhanced || !options.minimal) {
|
|
123
|
-
const claudeDir = join(targetDir, '.claude');
|
|
124
|
-
|
|
125
|
-
// Copy settings.json unless skipped
|
|
126
|
-
if (!options.skipSettings) {
|
|
127
|
-
const settingsSource =
|
|
128
|
-
options.verify || options.pair
|
|
129
|
-
? 'settings.json.verification'
|
|
130
|
-
: options.enhanced
|
|
131
|
-
? 'settings.json.enhanced'
|
|
132
|
-
: 'settings.json';
|
|
133
|
-
const settingsPath = join(templatesDir, settingsSource);
|
|
134
|
-
const settingsDest = join(claudeDir, 'settings.json');
|
|
135
|
-
|
|
136
|
-
if (!options.dryRun) {
|
|
137
|
-
await fs.mkdir(claudeDir, { recursive: true });
|
|
48
|
+
*/ export async function copyTemplates(targetDir, options = {}) {
|
|
49
|
+
const results = {
|
|
50
|
+
success: true,
|
|
51
|
+
copiedFiles: [],
|
|
52
|
+
errors: []
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
// Determine templates directory (bundled or local)
|
|
56
|
+
const templatesDir = await findTemplatesDirectory(options.template || 'basic-swarm');
|
|
57
|
+
// Determine which template variants to use
|
|
58
|
+
const templateVariant = options.verify || options.pair ? 'verification' : options.optimized ? 'optimized' : options.enhanced ? 'enhanced' : options.minimal ? 'minimal' : options.sparc ? 'sparc' : 'full';
|
|
59
|
+
// Core files to copy
|
|
60
|
+
const coreFiles = [
|
|
61
|
+
{
|
|
62
|
+
source: 'CLAUDE.md',
|
|
63
|
+
destination: 'CLAUDE.md',
|
|
64
|
+
useVariant: true
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
source: 'memory-bank.md',
|
|
68
|
+
destination: 'memory-bank.md',
|
|
69
|
+
useVariant: true
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
source: 'coordination.md',
|
|
73
|
+
destination: 'coordination.md',
|
|
74
|
+
useVariant: true
|
|
75
|
+
}
|
|
76
|
+
];
|
|
77
|
+
// Copy core files
|
|
78
|
+
for (const file of coreFiles){
|
|
79
|
+
// Skip files if requested
|
|
80
|
+
if (options.skipClaudeMd && file.destination === 'CLAUDE.md') continue;
|
|
81
|
+
if (options.skipSettings && file.destination.includes('settings')) continue;
|
|
82
|
+
const sourceFile = file.useVariant && existsSync(join(templatesDir, `${file.source}.${templateVariant}`)) ? `${file.source}.${templateVariant}` : file.source;
|
|
83
|
+
const sourcePath = join(templatesDir, sourceFile);
|
|
84
|
+
const destPath = join(targetDir, file.destination);
|
|
85
|
+
if (await copyFile(sourcePath, destPath, options)) {
|
|
86
|
+
results.copiedFiles.push(file.destination);
|
|
87
|
+
} else if (!options.dryRun) {
|
|
88
|
+
results.errors.push(`Failed to copy ${file.destination}`);
|
|
89
|
+
}
|
|
138
90
|
}
|
|
139
|
-
|
|
140
|
-
if (
|
|
141
|
-
|
|
91
|
+
// Copy .claude directory structure
|
|
92
|
+
if (options.enhanced || !options.minimal) {
|
|
93
|
+
const claudeDir = join(targetDir, '.claude');
|
|
94
|
+
// Copy settings.json unless skipped
|
|
95
|
+
if (!options.skipSettings) {
|
|
96
|
+
const settingsSource = options.verify || options.pair ? 'settings.json.verification' : options.enhanced ? 'settings.json.enhanced' : 'settings.json';
|
|
97
|
+
const settingsPath = join(templatesDir, settingsSource);
|
|
98
|
+
const settingsDest = join(claudeDir, 'settings.json');
|
|
99
|
+
if (!options.dryRun) {
|
|
100
|
+
await fs.mkdir(claudeDir, {
|
|
101
|
+
recursive: true
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (await copyFile(settingsPath, settingsDest, options)) {
|
|
105
|
+
results.copiedFiles.push('.claude/settings.json');
|
|
106
|
+
}
|
|
107
|
+
} else if (!options.dryRun) {
|
|
108
|
+
// Still create the directory even if skipping settings
|
|
109
|
+
await fs.mkdir(claudeDir, {
|
|
110
|
+
recursive: true
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Copy command templates
|
|
114
|
+
if (options.sparc || options.enhanced) {
|
|
115
|
+
await copyCommandTemplates(templatesDir, targetDir, options, results);
|
|
116
|
+
}
|
|
117
|
+
// Copy helper scripts (enhanced mode only)
|
|
118
|
+
if (options.enhanced) {
|
|
119
|
+
await copyHelperScripts(templatesDir, targetDir, options, results);
|
|
120
|
+
}
|
|
142
121
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
await
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Copy SPARC-specific files
|
|
160
|
-
if (options.sparc) {
|
|
161
|
-
await copySparcTemplates(templatesDir, targetDir, options, results);
|
|
122
|
+
// Copy SPARC-specific files
|
|
123
|
+
if (options.sparc) {
|
|
124
|
+
await copySparcTemplates(templatesDir, targetDir, options, results);
|
|
125
|
+
}
|
|
126
|
+
// Copy wrapper scripts
|
|
127
|
+
await copyWrapperScripts(templatesDir, targetDir, options, results);
|
|
128
|
+
// Create directory structure
|
|
129
|
+
await createDirectoryStructure(targetDir, options);
|
|
130
|
+
// Create README files for memory directories
|
|
131
|
+
await createMemoryReadmeFiles(targetDir, options, results);
|
|
132
|
+
} catch (err) {
|
|
133
|
+
results.success = false;
|
|
134
|
+
results.errors.push(`Template copy failed: ${err.message}`);
|
|
162
135
|
}
|
|
163
|
-
|
|
164
|
-
// Copy wrapper scripts
|
|
165
|
-
await copyWrapperScripts(templatesDir, targetDir, options, results);
|
|
166
|
-
|
|
167
|
-
// Create directory structure
|
|
168
|
-
await createDirectoryStructure(targetDir, options);
|
|
169
|
-
|
|
170
|
-
// Create README files for memory directories
|
|
171
|
-
await createMemoryReadmeFiles(targetDir, options, results);
|
|
172
|
-
} catch (err) {
|
|
173
|
-
results.success = false;
|
|
174
|
-
results.errors.push(`Template copy failed: ${err.message}`);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return results;
|
|
136
|
+
return results;
|
|
178
137
|
}
|
|
179
|
-
|
|
180
138
|
/**
|
|
181
139
|
* Copy a single file with options
|
|
182
|
-
*/
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
140
|
+
*/ async function copyFile(source, destination, options) {
|
|
141
|
+
try {
|
|
142
|
+
// Check if source exists
|
|
143
|
+
if (!existsSync(source)) {
|
|
144
|
+
// Try reading from templates directory as fallback
|
|
145
|
+
const templateContent = await getTemplateContent(source);
|
|
146
|
+
if (templateContent) {
|
|
147
|
+
if (!options.dryRun) {
|
|
148
|
+
await fs.writeFile(destination, templateContent);
|
|
149
|
+
}
|
|
150
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} ${relative(process.cwd(), destination)}`);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
console.log(` ⚠️ Template not found: ${relative(process.cwd(), source)}`);
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// Check if destination exists and handle force flag
|
|
157
|
+
if (existsSync(destination) && !options.force) {
|
|
158
|
+
console.log(` ⚠️ File already exists: ${relative(process.cwd(), destination)} (use --force to overwrite)`);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
190
161
|
if (!options.dryRun) {
|
|
191
|
-
|
|
162
|
+
// Ensure destination directory exists
|
|
163
|
+
await fs.mkdir(dirname(destination), {
|
|
164
|
+
recursive: true
|
|
165
|
+
});
|
|
166
|
+
// Copy the file
|
|
167
|
+
const content = await fs.readFile(source, 'utf8');
|
|
168
|
+
await fs.writeFile(destination, content);
|
|
169
|
+
// Preserve file permissions for executable scripts
|
|
170
|
+
if (source.endsWith('.sh') || source.includes('claude-flow')) {
|
|
171
|
+
await fs.chmod(destination, 0o755);
|
|
172
|
+
}
|
|
192
173
|
}
|
|
193
|
-
console.log(
|
|
194
|
-
` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} ${relative(process.cwd(), destination)}`,
|
|
195
|
-
);
|
|
174
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would copy' : '✓ Copied'} ${relative(process.cwd(), destination)}`);
|
|
196
175
|
return true;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Check if destination exists and handle force flag
|
|
203
|
-
if (existsSync(destination) && !options.force) {
|
|
204
|
-
console.log(
|
|
205
|
-
` ⚠️ File already exists: ${relative(process.cwd(), destination)} (use --force to overwrite)`,
|
|
206
|
-
);
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (!options.dryRun) {
|
|
211
|
-
// Ensure destination directory exists
|
|
212
|
-
await fs.mkdir(dirname(destination), { recursive: true });
|
|
213
|
-
|
|
214
|
-
// Copy the file
|
|
215
|
-
const content = await fs.readFile(source, 'utf8');
|
|
216
|
-
await fs.writeFile(destination, content);
|
|
217
|
-
|
|
218
|
-
// Preserve file permissions for executable scripts
|
|
219
|
-
if (source.endsWith('.sh') || source.includes('claude-flow')) {
|
|
220
|
-
await fs.chmod(destination, 0o755);
|
|
221
|
-
}
|
|
176
|
+
} catch (err) {
|
|
177
|
+
console.log(` ❌ Failed to copy ${relative(process.cwd(), destination)}: ${err.message}`);
|
|
178
|
+
return false;
|
|
222
179
|
}
|
|
223
|
-
|
|
224
|
-
console.log(
|
|
225
|
-
` ${options.dryRun ? '[DRY RUN] Would copy' : '✓ Copied'} ${relative(process.cwd(), destination)}`,
|
|
226
|
-
);
|
|
227
|
-
return true;
|
|
228
|
-
} catch (err) {
|
|
229
|
-
console.log(` ❌ Failed to copy ${relative(process.cwd(), destination)}: ${err.message}`);
|
|
230
|
-
return false;
|
|
231
|
-
}
|
|
232
180
|
}
|
|
233
|
-
|
|
234
181
|
/**
|
|
235
182
|
* Copy command templates
|
|
236
|
-
*/
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
// Use generated command templates as fallback
|
|
243
|
-
return await generateCommandTemplates(targetDir, options, results);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
try {
|
|
247
|
-
if (!options.dryRun) {
|
|
248
|
-
await fs.mkdir(commandsDestDir, { recursive: true });
|
|
183
|
+
*/ async function copyCommandTemplates(templatesDir, targetDir, options, results) {
|
|
184
|
+
const commandsSourceDir = join(templatesDir, 'commands');
|
|
185
|
+
const commandsDestDir = join(targetDir, '.claude', 'commands');
|
|
186
|
+
if (!existsSync(commandsSourceDir)) {
|
|
187
|
+
// Use generated command templates as fallback
|
|
188
|
+
return await generateCommandTemplates(targetDir, options, results);
|
|
249
189
|
}
|
|
250
|
-
|
|
251
|
-
// Copy command categories
|
|
252
|
-
const categories = await fs.readdir(commandsSourceDir);
|
|
253
|
-
|
|
254
|
-
for (const category of categories) {
|
|
255
|
-
const categoryPath = join(commandsSourceDir, category);
|
|
256
|
-
const stat = await fs.stat(categoryPath);
|
|
257
|
-
|
|
258
|
-
if (stat.isDirectory()) {
|
|
259
|
-
const destCategoryPath = join(commandsDestDir, category);
|
|
260
|
-
|
|
190
|
+
try {
|
|
261
191
|
if (!options.dryRun) {
|
|
262
|
-
|
|
192
|
+
await fs.mkdir(commandsDestDir, {
|
|
193
|
+
recursive: true
|
|
194
|
+
});
|
|
263
195
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
196
|
+
// Copy command categories
|
|
197
|
+
const categories = await fs.readdir(commandsSourceDir);
|
|
198
|
+
for (const category of categories){
|
|
199
|
+
const categoryPath = join(commandsSourceDir, category);
|
|
200
|
+
const stat = await fs.stat(categoryPath);
|
|
201
|
+
if (stat.isDirectory()) {
|
|
202
|
+
const destCategoryPath = join(commandsDestDir, category);
|
|
203
|
+
if (!options.dryRun) {
|
|
204
|
+
await fs.mkdir(destCategoryPath, {
|
|
205
|
+
recursive: true
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
// Copy files in category
|
|
209
|
+
const files = await fs.readdir(categoryPath);
|
|
210
|
+
for (const file of files){
|
|
211
|
+
const sourcePath = join(categoryPath, file);
|
|
212
|
+
const destPath = join(destCategoryPath, file);
|
|
213
|
+
if (await copyFile(sourcePath, destPath, options)) {
|
|
214
|
+
results.copiedFiles.push(join('.claude', 'commands', category, file));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
274
218
|
}
|
|
275
|
-
|
|
219
|
+
} catch (err) {
|
|
220
|
+
results.errors.push(`Failed to copy command templates: ${err.message}`);
|
|
276
221
|
}
|
|
277
|
-
} catch (err) {
|
|
278
|
-
results.errors.push(`Failed to copy command templates: ${err.message}`);
|
|
279
|
-
}
|
|
280
222
|
}
|
|
281
|
-
|
|
282
223
|
/**
|
|
283
224
|
* Copy SPARC templates
|
|
284
|
-
*/
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
// Create sparc-modes.md overview
|
|
322
|
-
const overviewPath = join(sparcDir, 'sparc-modes.md');
|
|
323
|
-
if (!options.dryRun) {
|
|
324
|
-
await fs.writeFile(overviewPath, createSparcModesOverview());
|
|
225
|
+
*/ async function copySparcTemplates(templatesDir, targetDir, options, results) {
|
|
226
|
+
const sparcDir = join(targetDir, '.claude', 'commands', 'sparc');
|
|
227
|
+
try {
|
|
228
|
+
if (!options.dryRun) {
|
|
229
|
+
await fs.mkdir(sparcDir, {
|
|
230
|
+
recursive: true
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// Get SPARC mode templates
|
|
234
|
+
const { createSparcModeTemplates, createSparcModesOverview } = await import("./templates/sparc-modes.js");
|
|
235
|
+
const sparcTemplates = createSparcModeTemplates();
|
|
236
|
+
// Filter templates if selectedModes is specified
|
|
237
|
+
const templatesToCreate = options.selectedModes ? Object.entries(sparcTemplates).filter(([filename])=>{
|
|
238
|
+
const mode = filename.replace('.md', '');
|
|
239
|
+
return options.selectedModes.includes(mode);
|
|
240
|
+
}) : Object.entries(sparcTemplates);
|
|
241
|
+
// Write SPARC mode files
|
|
242
|
+
for (const [filename, content] of templatesToCreate){
|
|
243
|
+
const destPath = join(sparcDir, filename);
|
|
244
|
+
if (!options.dryRun) {
|
|
245
|
+
await fs.writeFile(destPath, content);
|
|
246
|
+
}
|
|
247
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} .claude/commands/sparc/${filename}`);
|
|
248
|
+
results.copiedFiles.push(join('.claude', 'commands', 'sparc', filename));
|
|
249
|
+
}
|
|
250
|
+
// Create sparc-modes.md overview
|
|
251
|
+
const overviewPath = join(sparcDir, 'sparc-modes.md');
|
|
252
|
+
if (!options.dryRun) {
|
|
253
|
+
await fs.writeFile(overviewPath, createSparcModesOverview());
|
|
254
|
+
}
|
|
255
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} .claude/commands/sparc/sparc-modes.md`);
|
|
256
|
+
results.copiedFiles.push('.claude/commands/sparc/sparc-modes.md');
|
|
257
|
+
// Copy swarm templates
|
|
258
|
+
await copySwarmTemplates(templatesDir, targetDir, options, results);
|
|
259
|
+
} catch (err) {
|
|
260
|
+
results.errors.push(`Failed to copy SPARC templates: ${err.message}`);
|
|
325
261
|
}
|
|
326
|
-
console.log(
|
|
327
|
-
` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} .claude/commands/sparc/sparc-modes.md`,
|
|
328
|
-
);
|
|
329
|
-
results.copiedFiles.push('.claude/commands/sparc/sparc-modes.md');
|
|
330
|
-
|
|
331
|
-
// Copy swarm templates
|
|
332
|
-
await copySwarmTemplates(templatesDir, targetDir, options, results);
|
|
333
|
-
} catch (err) {
|
|
334
|
-
results.errors.push(`Failed to copy SPARC templates: ${err.message}`);
|
|
335
|
-
}
|
|
336
262
|
}
|
|
337
|
-
|
|
338
263
|
/**
|
|
339
264
|
* Copy swarm strategy templates
|
|
340
|
-
*/
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} .claude/commands/swarm/${filename}`,
|
|
363
|
-
);
|
|
364
|
-
results.copiedFiles.push(join('.claude', 'commands', 'swarm', filename));
|
|
265
|
+
*/ async function copySwarmTemplates(templatesDir, targetDir, options, results) {
|
|
266
|
+
const swarmDir = join(targetDir, '.claude', 'commands', 'swarm');
|
|
267
|
+
try {
|
|
268
|
+
if (!options.dryRun) {
|
|
269
|
+
await fs.mkdir(swarmDir, {
|
|
270
|
+
recursive: true
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// Get swarm strategy templates
|
|
274
|
+
const { createSwarmStrategyTemplates } = await import("./templates/sparc-modes.js");
|
|
275
|
+
const swarmTemplates = createSwarmStrategyTemplates();
|
|
276
|
+
// Write swarm strategy files
|
|
277
|
+
for (const [filename, content] of Object.entries(swarmTemplates)){
|
|
278
|
+
const destPath = join(swarmDir, filename);
|
|
279
|
+
if (!options.dryRun) {
|
|
280
|
+
await fs.writeFile(destPath, content);
|
|
281
|
+
}
|
|
282
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} .claude/commands/swarm/${filename}`);
|
|
283
|
+
results.copiedFiles.push(join('.claude', 'commands', 'swarm', filename));
|
|
284
|
+
}
|
|
285
|
+
} catch (err) {
|
|
286
|
+
results.errors.push(`Failed to copy swarm templates: ${err.message}`);
|
|
365
287
|
}
|
|
366
|
-
} catch (err) {
|
|
367
|
-
results.errors.push(`Failed to copy swarm templates: ${err.message}`);
|
|
368
|
-
}
|
|
369
288
|
}
|
|
370
|
-
|
|
371
289
|
/**
|
|
372
290
|
* Copy helper scripts (enhanced mode)
|
|
373
|
-
*/
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
try {
|
|
378
|
-
if (!options.dryRun) {
|
|
379
|
-
await fs.mkdir(helpersDir, { recursive: true });
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
const helpers = [
|
|
383
|
-
'setup-mcp.sh',
|
|
384
|
-
'quick-start.sh',
|
|
385
|
-
'github-setup.sh',
|
|
386
|
-
'github-safe.js',
|
|
387
|
-
'checkpoint-manager.sh',
|
|
388
|
-
'standard-checkpoint-hooks.sh',
|
|
389
|
-
];
|
|
390
|
-
const { createHelperScript } = await import('./templates/enhanced-templates.js');
|
|
391
|
-
|
|
392
|
-
for (const helper of helpers) {
|
|
393
|
-
const content = createHelperScript(helper);
|
|
394
|
-
if (content) {
|
|
395
|
-
const destPath = join(helpersDir, helper);
|
|
396
|
-
|
|
291
|
+
*/ async function copyHelperScripts(templatesDir, targetDir, options, results) {
|
|
292
|
+
const helpersDir = join(targetDir, '.claude', 'helpers');
|
|
293
|
+
try {
|
|
397
294
|
if (!options.dryRun) {
|
|
398
|
-
|
|
399
|
-
|
|
295
|
+
await fs.mkdir(helpersDir, {
|
|
296
|
+
recursive: true
|
|
297
|
+
});
|
|
400
298
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
299
|
+
const helpers = [
|
|
300
|
+
'setup-mcp.sh',
|
|
301
|
+
'quick-start.sh',
|
|
302
|
+
'github-setup.sh',
|
|
303
|
+
'github-safe.js',
|
|
304
|
+
'checkpoint-manager.sh',
|
|
305
|
+
'standard-checkpoint-hooks.sh'
|
|
306
|
+
];
|
|
307
|
+
const { createHelperScript } = await import("./templates/enhanced-templates.js");
|
|
308
|
+
for (const helper of helpers){
|
|
309
|
+
const content = createHelperScript(helper);
|
|
310
|
+
if (content) {
|
|
311
|
+
const destPath = join(helpersDir, helper);
|
|
312
|
+
if (!options.dryRun) {
|
|
313
|
+
await fs.writeFile(destPath, content);
|
|
314
|
+
await fs.chmod(destPath, 0o755);
|
|
315
|
+
}
|
|
316
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} .claude/helpers/${helper}`);
|
|
317
|
+
results.copiedFiles.push(join('.claude', 'helpers', helper));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
} catch (err) {
|
|
321
|
+
results.errors.push(`Failed to copy helper scripts: ${err.message}`);
|
|
407
322
|
}
|
|
408
|
-
} catch (err) {
|
|
409
|
-
results.errors.push(`Failed to copy helper scripts: ${err.message}`);
|
|
410
|
-
}
|
|
411
323
|
}
|
|
412
|
-
|
|
413
324
|
/**
|
|
414
325
|
* Copy wrapper scripts
|
|
415
|
-
*/
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
if (await copyFile(psWrapperSource, psWrapperPath, options)) {
|
|
442
|
-
results.copiedFiles.push('claude-flow.ps1');
|
|
326
|
+
*/ async function copyWrapperScripts(templatesDir, targetDir, options, results) {
|
|
327
|
+
try {
|
|
328
|
+
// Unix wrapper
|
|
329
|
+
const unixWrapperPath = join(targetDir, 'claude-flow');
|
|
330
|
+
const unixWrapperSource = join(templatesDir, 'claude-flow-universal');
|
|
331
|
+
if (await copyFile(unixWrapperSource, unixWrapperPath, options)) {
|
|
332
|
+
if (!options.dryRun) {
|
|
333
|
+
await fs.chmod(unixWrapperPath, 0o755);
|
|
334
|
+
}
|
|
335
|
+
results.copiedFiles.push('claude-flow');
|
|
336
|
+
}
|
|
337
|
+
// Windows batch wrapper
|
|
338
|
+
const batchWrapperPath = join(targetDir, 'claude-flow.bat');
|
|
339
|
+
const batchWrapperSource = join(templatesDir, 'claude-flow.bat');
|
|
340
|
+
if (await copyFile(batchWrapperSource, batchWrapperPath, options)) {
|
|
341
|
+
results.copiedFiles.push('claude-flow.bat');
|
|
342
|
+
}
|
|
343
|
+
// PowerShell wrapper
|
|
344
|
+
const psWrapperPath = join(targetDir, 'claude-flow.ps1');
|
|
345
|
+
const psWrapperSource = join(templatesDir, 'claude-flow.ps1');
|
|
346
|
+
if (await copyFile(psWrapperSource, psWrapperPath, options)) {
|
|
347
|
+
results.copiedFiles.push('claude-flow.ps1');
|
|
348
|
+
}
|
|
349
|
+
} catch (err) {
|
|
350
|
+
results.errors.push(`Failed to copy wrapper scripts: ${err.message}`);
|
|
443
351
|
}
|
|
444
|
-
} catch (err) {
|
|
445
|
-
results.errors.push(`Failed to copy wrapper scripts: ${err.message}`);
|
|
446
|
-
}
|
|
447
352
|
}
|
|
448
|
-
|
|
449
353
|
/**
|
|
450
354
|
* Create directory structure
|
|
451
|
-
*/
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
355
|
+
*/ async function createDirectoryStructure(targetDir, options) {
|
|
356
|
+
const directories = [
|
|
357
|
+
'memory',
|
|
358
|
+
'memory/agents',
|
|
359
|
+
'memory/sessions',
|
|
360
|
+
'coordination',
|
|
361
|
+
'coordination/memory_bank',
|
|
362
|
+
'coordination/subtasks',
|
|
363
|
+
'coordination/orchestration',
|
|
364
|
+
'.claude',
|
|
365
|
+
'.claude/commands',
|
|
366
|
+
'.claude/logs',
|
|
367
|
+
'.swarm'
|
|
368
|
+
];
|
|
369
|
+
if (options.sparc) {
|
|
370
|
+
directories.push('.claude/commands/sparc', '.claude/commands/swarm');
|
|
371
|
+
}
|
|
372
|
+
for (const dir of directories){
|
|
373
|
+
const dirPath = join(targetDir, dir);
|
|
374
|
+
try {
|
|
375
|
+
if (!options.dryRun) {
|
|
376
|
+
await fs.mkdir(dirPath, {
|
|
377
|
+
recursive: true
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} ${dir}/ directory`);
|
|
381
|
+
} catch (err) {
|
|
382
|
+
if (err.code !== 'EEXIST') {
|
|
383
|
+
console.log(` ❌ Failed to create ${dir}/: ${err.message}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
482
386
|
}
|
|
483
|
-
}
|
|
484
387
|
}
|
|
485
|
-
|
|
486
388
|
/**
|
|
487
389
|
* Create README files for memory directories
|
|
488
|
-
*/
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
390
|
+
*/ async function createMemoryReadmeFiles(targetDir, options, results) {
|
|
391
|
+
const { createAgentsReadme, createSessionsReadme } = await import("./templates/readme-files.js");
|
|
392
|
+
const readmeFiles = [
|
|
393
|
+
{
|
|
394
|
+
path: 'memory/agents/README.md',
|
|
395
|
+
content: createAgentsReadme()
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
path: 'memory/sessions/README.md',
|
|
399
|
+
content: createSessionsReadme()
|
|
400
|
+
}
|
|
401
|
+
];
|
|
402
|
+
for (const { path, content } of readmeFiles){
|
|
403
|
+
const fullPath = join(targetDir, path);
|
|
404
|
+
try {
|
|
405
|
+
if (!options.dryRun) {
|
|
406
|
+
await fs.mkdir(dirname(fullPath), {
|
|
407
|
+
recursive: true
|
|
408
|
+
});
|
|
409
|
+
await fs.writeFile(fullPath, content);
|
|
410
|
+
}
|
|
411
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} ${path}`);
|
|
412
|
+
results.copiedFiles.push(path);
|
|
413
|
+
} catch (err) {
|
|
414
|
+
results.errors.push(`Failed to create ${path}: ${err.message}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// Initialize persistence database
|
|
418
|
+
const dbPath = join(targetDir, 'memory', 'claude-flow-data.json');
|
|
419
|
+
const initialData = {
|
|
420
|
+
agents: [],
|
|
421
|
+
tasks: [],
|
|
422
|
+
lastUpdated: Date.now()
|
|
423
|
+
};
|
|
500
424
|
try {
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
results.copiedFiles.push(path);
|
|
425
|
+
if (!options.dryRun) {
|
|
426
|
+
await fs.writeFile(dbPath, JSON.stringify(initialData, null, 2));
|
|
427
|
+
}
|
|
428
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} memory/claude-flow-data.json (persistence database)`);
|
|
429
|
+
results.copiedFiles.push('memory/claude-flow-data.json');
|
|
507
430
|
} catch (err) {
|
|
508
|
-
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
// Initialize persistence database
|
|
513
|
-
const dbPath = join(targetDir, 'memory', 'claude-flow-data.json');
|
|
514
|
-
const initialData = {
|
|
515
|
-
agents: [],
|
|
516
|
-
tasks: [],
|
|
517
|
-
lastUpdated: Date.now(),
|
|
518
|
-
};
|
|
519
|
-
|
|
520
|
-
try {
|
|
521
|
-
if (!options.dryRun) {
|
|
522
|
-
await fs.writeFile(dbPath, JSON.stringify(initialData, null, 2));
|
|
431
|
+
results.errors.push(`Failed to create persistence database: ${err.message}`);
|
|
523
432
|
}
|
|
524
|
-
console.log(
|
|
525
|
-
` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} memory/claude-flow-data.json (persistence database)`,
|
|
526
|
-
);
|
|
527
|
-
results.copiedFiles.push('memory/claude-flow-data.json');
|
|
528
|
-
} catch (err) {
|
|
529
|
-
results.errors.push(`Failed to create persistence database: ${err.message}`);
|
|
530
|
-
}
|
|
531
433
|
}
|
|
532
|
-
|
|
533
434
|
/**
|
|
534
435
|
* Get template content from template file (BUNDLED OR LOCAL)
|
|
535
|
-
*/
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
return content;
|
|
561
|
-
} catch (err) {
|
|
562
|
-
// Try next path
|
|
563
|
-
continue;
|
|
436
|
+
*/ async function getTemplateContent(templatePath) {
|
|
437
|
+
const filename = templatePath.split('/').pop();
|
|
438
|
+
// Try to read from the actual template file
|
|
439
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
440
|
+
const __dirname = dirname(__filename);
|
|
441
|
+
// Try multiple possible template locations
|
|
442
|
+
// Priority: bundled templates > local templates > dist templates
|
|
443
|
+
const templatePaths = [
|
|
444
|
+
// 1. Bundled templates (npm package)
|
|
445
|
+
join(__dirname, '..', '..', '..', '..', 'templates', 'basic-swarm', filename),
|
|
446
|
+
// 2. Source location during development
|
|
447
|
+
join(__dirname, 'templates', filename),
|
|
448
|
+
// 3. Dist location (files copied directly)
|
|
449
|
+
join(__dirname, filename),
|
|
450
|
+
// 4. Relative to project root
|
|
451
|
+
join(process.cwd(), 'templates', 'basic-swarm', filename)
|
|
452
|
+
];
|
|
453
|
+
for (const actualTemplatePath of templatePaths){
|
|
454
|
+
try {
|
|
455
|
+
const content = await fs.readFile(actualTemplatePath, 'utf8');
|
|
456
|
+
console.log(` ✓ Using template from ${actualTemplatePath}`);
|
|
457
|
+
return content;
|
|
458
|
+
} catch (err) {
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
564
461
|
}
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
console.log(` 💡 Template files must be present in templates/ or src/cli/simple-commands/init/templates/`);
|
|
570
|
-
return null;
|
|
462
|
+
// NO FALLBACK TO GENERATION - Template file must exist
|
|
463
|
+
console.log(` ⚠️ Template file not found for ${filename}`);
|
|
464
|
+
console.log(` 💡 Template files must be present in templates/ or src/cli/simple-commands/init/templates/`);
|
|
465
|
+
return null;
|
|
571
466
|
}
|
|
572
|
-
|
|
573
467
|
/**
|
|
574
468
|
* Generate command templates as fallback
|
|
575
|
-
*/
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
// Create category README
|
|
587
|
-
const categoryReadme = `# ${category.charAt(0).toUpperCase() + category.slice(1)} Commands
|
|
469
|
+
*/ async function generateCommandTemplates(targetDir, options, results) {
|
|
470
|
+
const { COMMAND_STRUCTURE, createCommandDoc } = await import("./templates/enhanced-templates.js");
|
|
471
|
+
for (const [category, commands] of Object.entries(COMMAND_STRUCTURE)){
|
|
472
|
+
const categoryDir = join(targetDir, '.claude', 'commands', category);
|
|
473
|
+
try {
|
|
474
|
+
if (!options.dryRun) {
|
|
475
|
+
await fs.mkdir(categoryDir, {
|
|
476
|
+
recursive: true
|
|
477
|
+
});
|
|
478
|
+
// Create category README
|
|
479
|
+
const categoryReadme = `# ${category.charAt(0).toUpperCase() + category.slice(1)} Commands
|
|
588
480
|
|
|
589
481
|
Commands for ${category} operations in Claude Flow.
|
|
590
482
|
|
|
591
483
|
## Available Commands
|
|
592
484
|
|
|
593
|
-
${commands.map((cmd)
|
|
485
|
+
${commands.map((cmd)=>`- [${cmd}](./${cmd}.md)`).join('\n')}
|
|
594
486
|
`;
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
487
|
+
await fs.writeFile(join(categoryDir, 'README.md'), categoryReadme);
|
|
488
|
+
}
|
|
489
|
+
// Create individual command docs
|
|
490
|
+
for (const command of commands){
|
|
491
|
+
const doc = createCommandDoc(category, command);
|
|
492
|
+
if (doc) {
|
|
493
|
+
const docPath = join(categoryDir, `${command}.md`);
|
|
494
|
+
if (!options.dryRun) {
|
|
495
|
+
await fs.writeFile(docPath, doc);
|
|
496
|
+
}
|
|
497
|
+
results.copiedFiles.push(join('.claude', 'commands', category, `${command}.md`));
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
console.log(` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} ${commands.length} ${category} command docs`);
|
|
501
|
+
} catch (err) {
|
|
502
|
+
results.errors.push(`Failed to generate ${category} command templates: ${err.message}`);
|
|
607
503
|
}
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
console.log(
|
|
611
|
-
` ${options.dryRun ? '[DRY RUN] Would create' : '✓ Created'} ${commands.length} ${category} command docs`,
|
|
612
|
-
);
|
|
613
|
-
} catch (err) {
|
|
614
|
-
results.errors.push(`Failed to generate ${category} command templates: ${err.message}`);
|
|
615
504
|
}
|
|
616
|
-
}
|
|
617
505
|
}
|