claude-flow-novice 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
// post-init-validator.js - Post-initialization verification checks
|
|
3
|
+
|
|
4
|
+
export class PostInitValidator {
|
|
5
|
+
constructor(workingDir) {
|
|
6
|
+
this.workingDir = workingDir;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Check file integrity (existence, size, readability)
|
|
11
|
+
*/
|
|
12
|
+
async checkFileIntegrity() {
|
|
13
|
+
const result = {
|
|
14
|
+
success: true,
|
|
15
|
+
errors: [],
|
|
16
|
+
warnings: [],
|
|
17
|
+
files: {},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const expectedFiles = [
|
|
21
|
+
{ path: 'CLAUDE.md', minSize: 100 },
|
|
22
|
+
{ path: 'memory-bank.md', minSize: 50 },
|
|
23
|
+
{ path: 'coordination.md', minSize: 50 },
|
|
24
|
+
{ path: 'memory/claude-flow-data.json', minSize: 10 },
|
|
25
|
+
{ path: 'memory/agents/README.md', minSize: 10 },
|
|
26
|
+
{ path: 'memory/sessions/README.md', minSize: 10 },
|
|
27
|
+
{ path: 'claude-flow', minSize: 50, executable: true },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
for (const file of expectedFiles) {
|
|
31
|
+
const filePath = `${this.workingDir}/${file.path}`;
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const stat = await fs.stat(filePath);
|
|
35
|
+
|
|
36
|
+
// Check if it exists and is a file
|
|
37
|
+
if (!stat.isFile) {
|
|
38
|
+
result.success = false;
|
|
39
|
+
result.errors.push(`Expected file but found directory: ${file.path}`);
|
|
40
|
+
result.files[file.path] = { status: 'not_file' };
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Check file size
|
|
45
|
+
if (stat.size < file.minSize) {
|
|
46
|
+
result.success = false;
|
|
47
|
+
result.errors.push(
|
|
48
|
+
`File too small: ${file.path} (${stat.size} bytes, expected >= ${file.minSize})`,
|
|
49
|
+
);
|
|
50
|
+
result.files[file.path] = { status: 'too_small', size: stat.size };
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Check if executable (if required)
|
|
55
|
+
if (file.executable && Deno.build.os !== 'windows') {
|
|
56
|
+
const isExecutable = (stat.mode & 0o111) !== 0;
|
|
57
|
+
if (!isExecutable) {
|
|
58
|
+
result.warnings.push(`File not executable: ${file.path}`);
|
|
59
|
+
result.files[file.path] = { status: 'not_executable', size: stat.size };
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Try to read the file
|
|
65
|
+
try {
|
|
66
|
+
await fs.readFile(filePath, 'utf8');
|
|
67
|
+
result.files[file.path] = { status: 'ok', size: stat.size };
|
|
68
|
+
} catch (readError) {
|
|
69
|
+
result.success = false;
|
|
70
|
+
result.errors.push(`Cannot read file: ${file.path} - ${readError.message}`);
|
|
71
|
+
result.files[file.path] = { status: 'unreadable', size: stat.size };
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
result.success = false;
|
|
75
|
+
result.errors.push(`File not found: ${file.path}`);
|
|
76
|
+
result.files[file.path] = { status: 'missing' };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Check completeness of initialization
|
|
85
|
+
*/
|
|
86
|
+
async checkCompleteness() {
|
|
87
|
+
const result = {
|
|
88
|
+
success: true,
|
|
89
|
+
errors: [],
|
|
90
|
+
warnings: [],
|
|
91
|
+
missing: [],
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const requiredDirs = [
|
|
95
|
+
'memory',
|
|
96
|
+
'memory/agents',
|
|
97
|
+
'memory/sessions',
|
|
98
|
+
'coordination',
|
|
99
|
+
'coordination/memory_bank',
|
|
100
|
+
'coordination/subtasks',
|
|
101
|
+
'coordination/orchestration',
|
|
102
|
+
'.claude',
|
|
103
|
+
'.claude/commands',
|
|
104
|
+
'.claude/logs',
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
const optionalDirs = [
|
|
108
|
+
'.roo',
|
|
109
|
+
'.roo/templates',
|
|
110
|
+
'.roo/workflows',
|
|
111
|
+
'.roo/modes',
|
|
112
|
+
'.roo/configs',
|
|
113
|
+
'.claude/commands/sparc',
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
// Check required directories
|
|
117
|
+
for (const dir of requiredDirs) {
|
|
118
|
+
const dirPath = `${this.workingDir}/${dir}`;
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const stat = await fs.stat(dirPath);
|
|
122
|
+
if (!stat.isDirectory) {
|
|
123
|
+
result.success = false;
|
|
124
|
+
result.errors.push(`Expected directory but found file: ${dir}`);
|
|
125
|
+
result.missing.push(dir);
|
|
126
|
+
}
|
|
127
|
+
} catch {
|
|
128
|
+
result.success = false;
|
|
129
|
+
result.errors.push(`Required directory missing: ${dir}`);
|
|
130
|
+
result.missing.push(dir);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Check optional directories (SPARC-related)
|
|
135
|
+
for (const dir of optionalDirs) {
|
|
136
|
+
const dirPath = `${this.workingDir}/${dir}`;
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
await fs.stat(dirPath);
|
|
140
|
+
} catch {
|
|
141
|
+
if (dir.includes('.roo') || dir.includes('sparc')) {
|
|
142
|
+
result.warnings.push(`Optional SPARC directory missing: ${dir}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Validate directory structure and organization
|
|
152
|
+
*/
|
|
153
|
+
async validateStructure() {
|
|
154
|
+
const result = {
|
|
155
|
+
success: true,
|
|
156
|
+
errors: [],
|
|
157
|
+
warnings: [],
|
|
158
|
+
structure: {},
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
// Check memory structure
|
|
163
|
+
const memoryStructure = await this.validateMemoryStructure();
|
|
164
|
+
result.structure.memory = memoryStructure;
|
|
165
|
+
if (!memoryStructure.valid) {
|
|
166
|
+
result.warnings.push('Memory directory structure is incomplete');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Check coordination structure
|
|
170
|
+
const coordinationStructure = await this.validateCoordinationStructure();
|
|
171
|
+
result.structure.coordination = coordinationStructure;
|
|
172
|
+
if (!coordinationStructure.valid) {
|
|
173
|
+
result.warnings.push('Coordination directory structure is incomplete');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Check Claude integration structure
|
|
177
|
+
const claudeStructure = await this.validateClaudeStructure();
|
|
178
|
+
result.structure.claude = claudeStructure;
|
|
179
|
+
if (!claudeStructure.valid) {
|
|
180
|
+
result.warnings.push('Claude integration structure is incomplete');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Check SPARC structure (if present)
|
|
184
|
+
const sparcExists = await this.checkSparcExists();
|
|
185
|
+
if (sparcExists) {
|
|
186
|
+
const sparcStructure = await this.validateSparcStructure();
|
|
187
|
+
result.structure.sparc = sparcStructure;
|
|
188
|
+
if (!sparcStructure.valid) {
|
|
189
|
+
result.warnings.push('SPARC structure is incomplete');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch (error) {
|
|
193
|
+
result.success = false;
|
|
194
|
+
result.errors.push(`Structure validation failed: ${error.message}`);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Check permissions on created files and directories
|
|
202
|
+
*/
|
|
203
|
+
async checkPermissions() {
|
|
204
|
+
const result = {
|
|
205
|
+
success: true,
|
|
206
|
+
errors: [],
|
|
207
|
+
warnings: [],
|
|
208
|
+
permissions: {},
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const itemsToCheck = [
|
|
212
|
+
{ path: 'CLAUDE.md', type: 'file', requiredMode: 0o644 },
|
|
213
|
+
{ path: 'memory-bank.md', type: 'file', requiredMode: 0o644 },
|
|
214
|
+
{ path: 'coordination.md', type: 'file', requiredMode: 0o644 },
|
|
215
|
+
{ path: 'claude-flow', type: 'file', requiredMode: 0o755 },
|
|
216
|
+
{ path: 'memory', type: 'dir', requiredMode: 0o755 },
|
|
217
|
+
{ path: 'coordination', type: 'dir', requiredMode: 0o755 },
|
|
218
|
+
{ path: '.claude', type: 'dir', requiredMode: 0o755 },
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
// Skip permission checks on Windows
|
|
222
|
+
if (Deno.build.os === 'windows') {
|
|
223
|
+
result.warnings.push('Permission checks skipped on Windows');
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
for (const item of itemsToCheck) {
|
|
228
|
+
const itemPath = `${this.workingDir}/${item.path}`;
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
const stat = await fs.stat(itemPath);
|
|
232
|
+
const actualMode = stat.mode & 0o777;
|
|
233
|
+
const expectedMode = item.requiredMode;
|
|
234
|
+
|
|
235
|
+
result.permissions[item.path] = {
|
|
236
|
+
actual: actualMode.toString(8),
|
|
237
|
+
expected: expectedMode.toString(8),
|
|
238
|
+
correct: actualMode === expectedMode,
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
if (actualMode !== expectedMode) {
|
|
242
|
+
result.warnings.push(
|
|
243
|
+
`Incorrect permissions on ${item.path}: ` +
|
|
244
|
+
`${actualMode.toString(8)} (expected ${expectedMode.toString(8)})`,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
} catch (error) {
|
|
248
|
+
result.warnings.push(`Could not check permissions for ${item.path}: ${error.message}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Helper methods
|
|
256
|
+
|
|
257
|
+
async validateMemoryStructure() {
|
|
258
|
+
const structure = {
|
|
259
|
+
valid: true,
|
|
260
|
+
dirs: [],
|
|
261
|
+
files: [],
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
const expectedDirs = ['agents', 'sessions'];
|
|
265
|
+
const expectedFiles = ['claude-flow-data.json', 'agents/README.md', 'sessions/README.md'];
|
|
266
|
+
|
|
267
|
+
for (const dir of expectedDirs) {
|
|
268
|
+
try {
|
|
269
|
+
await fs.stat(`${this.workingDir}/memory/${dir}`);
|
|
270
|
+
structure.dirs.push(dir);
|
|
271
|
+
} catch {
|
|
272
|
+
structure.valid = false;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
for (const file of expectedFiles) {
|
|
277
|
+
try {
|
|
278
|
+
await fs.stat(`${this.workingDir}/memory/${file}`);
|
|
279
|
+
structure.files.push(file);
|
|
280
|
+
} catch {
|
|
281
|
+
structure.valid = false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return structure;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
async validateCoordinationStructure() {
|
|
289
|
+
const structure = {
|
|
290
|
+
valid: true,
|
|
291
|
+
dirs: [],
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const expectedDirs = ['memory_bank', 'subtasks', 'orchestration'];
|
|
295
|
+
|
|
296
|
+
for (const dir of expectedDirs) {
|
|
297
|
+
try {
|
|
298
|
+
await fs.stat(`${this.workingDir}/coordination/${dir}`);
|
|
299
|
+
structure.dirs.push(dir);
|
|
300
|
+
} catch {
|
|
301
|
+
structure.valid = false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return structure;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async validateClaudeStructure() {
|
|
309
|
+
const structure = {
|
|
310
|
+
valid: true,
|
|
311
|
+
dirs: [],
|
|
312
|
+
hasCommands: false,
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
const expectedDirs = ['commands', 'logs'];
|
|
316
|
+
|
|
317
|
+
for (const dir of expectedDirs) {
|
|
318
|
+
try {
|
|
319
|
+
await fs.stat(`${this.workingDir}/.claude/${dir}`);
|
|
320
|
+
structure.dirs.push(dir);
|
|
321
|
+
} catch {
|
|
322
|
+
structure.valid = false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Check if there are any command files
|
|
327
|
+
try {
|
|
328
|
+
const entries = [];
|
|
329
|
+
for await (const entry of fs.readdir(`${this.workingDir}/.claude/commands`)) {
|
|
330
|
+
if (entry.isFile && entry.name.endsWith('.js')) {
|
|
331
|
+
entries.push(entry.name);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
structure.hasCommands = entries.length > 0;
|
|
335
|
+
structure.commandCount = entries.length;
|
|
336
|
+
} catch {
|
|
337
|
+
structure.hasCommands = false;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return structure;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async checkSparcExists() {
|
|
344
|
+
try {
|
|
345
|
+
await fs.stat(`${this.workingDir}/.roomodes`);
|
|
346
|
+
return true;
|
|
347
|
+
} catch {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
async validateSparcStructure() {
|
|
353
|
+
const structure = {
|
|
354
|
+
valid: true,
|
|
355
|
+
hasRoomodes: false,
|
|
356
|
+
hasRooDir: false,
|
|
357
|
+
dirs: [],
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
// Check .roomodes file
|
|
361
|
+
try {
|
|
362
|
+
const stat = await fs.stat(`${this.workingDir}/.roomodes`);
|
|
363
|
+
structure.hasRoomodes = stat.isFile;
|
|
364
|
+
} catch {
|
|
365
|
+
structure.valid = false;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Check .roo directory
|
|
369
|
+
try {
|
|
370
|
+
const stat = await fs.stat(`${this.workingDir}/.roo`);
|
|
371
|
+
structure.hasRooDir = stat.isDirectory;
|
|
372
|
+
|
|
373
|
+
if (structure.hasRooDir) {
|
|
374
|
+
const expectedDirs = ['templates', 'workflows', 'modes', 'configs'];
|
|
375
|
+
for (const dir of expectedDirs) {
|
|
376
|
+
try {
|
|
377
|
+
await fs.stat(`${this.workingDir}/.roo/${dir}`);
|
|
378
|
+
structure.dirs.push(dir);
|
|
379
|
+
} catch {
|
|
380
|
+
// Optional subdirectories
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
} catch {
|
|
385
|
+
// .roo directory is optional
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return structure;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// pre-init-validator.js - Pre-initialization validation checks
|
|
2
|
+
|
|
3
|
+
import { printWarning } from '../../../utils.js';
|
|
4
|
+
|
|
5
|
+
export class PreInitValidator {
|
|
6
|
+
constructor(workingDir) {
|
|
7
|
+
this.workingDir = workingDir;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Check file system permissions
|
|
12
|
+
*/
|
|
13
|
+
async checkPermissions() {
|
|
14
|
+
const result = {
|
|
15
|
+
success: true,
|
|
16
|
+
errors: [],
|
|
17
|
+
warnings: [],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
// Test write permission in working directory
|
|
22
|
+
const testFile = `${this.workingDir}/.claude-flow-permission-test`;
|
|
23
|
+
await Deno.writeTextFile(testFile, 'test');
|
|
24
|
+
await Deno.remove(testFile);
|
|
25
|
+
|
|
26
|
+
// Test directory creation permission
|
|
27
|
+
const testDir = `${this.workingDir}/.claude-flow-dir-test`;
|
|
28
|
+
await Deno.mkdir(testDir);
|
|
29
|
+
await Deno.remove(testDir);
|
|
30
|
+
} catch (error) {
|
|
31
|
+
result.success = false;
|
|
32
|
+
result.errors.push(`Insufficient permissions in ${this.workingDir}: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Check available disk space
|
|
40
|
+
*/
|
|
41
|
+
async checkDiskSpace() {
|
|
42
|
+
const result = {
|
|
43
|
+
success: true,
|
|
44
|
+
errors: [],
|
|
45
|
+
warnings: [],
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
// Get disk usage information
|
|
50
|
+
const command = new Deno.Command('df', {
|
|
51
|
+
args: ['-k', this.workingDir],
|
|
52
|
+
stdout: 'piped',
|
|
53
|
+
stderr: 'piped',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const { stdout, success } = await command.output();
|
|
57
|
+
|
|
58
|
+
if (success) {
|
|
59
|
+
const output = new TextDecoder().decode(stdout);
|
|
60
|
+
const lines = output.trim().split('\n');
|
|
61
|
+
|
|
62
|
+
if (lines.length >= 2) {
|
|
63
|
+
const dataLine = lines[1];
|
|
64
|
+
const parts = dataLine.split(/\s+/);
|
|
65
|
+
|
|
66
|
+
if (parts.length >= 4) {
|
|
67
|
+
const availableKB = parseInt(parts[3]);
|
|
68
|
+
const availableMB = availableKB / 1024;
|
|
69
|
+
|
|
70
|
+
// Require at least 100MB free space
|
|
71
|
+
if (availableMB < 100) {
|
|
72
|
+
result.success = false;
|
|
73
|
+
result.errors.push(
|
|
74
|
+
`Insufficient disk space: ${availableMB.toFixed(2)}MB available (minimum 100MB required)`,
|
|
75
|
+
);
|
|
76
|
+
} else if (availableMB < 500) {
|
|
77
|
+
result.warnings.push(`Low disk space: ${availableMB.toFixed(2)}MB available`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
// Non-critical - just warn if we can't check disk space
|
|
84
|
+
result.warnings.push(`Could not check disk space: ${error.message}`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Check for existing files and conflicts
|
|
92
|
+
*/
|
|
93
|
+
async checkConflicts(force = false) {
|
|
94
|
+
const result = {
|
|
95
|
+
success: true,
|
|
96
|
+
errors: [],
|
|
97
|
+
warnings: [],
|
|
98
|
+
conflicts: [],
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const criticalFiles = [
|
|
102
|
+
'CLAUDE.md',
|
|
103
|
+
'memory-bank.md',
|
|
104
|
+
'coordination.md',
|
|
105
|
+
'.roomodes',
|
|
106
|
+
'memory/claude-flow-data.json',
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
const criticalDirs = ['.roo', '.claude', 'memory', 'coordination'];
|
|
110
|
+
|
|
111
|
+
// Check critical files
|
|
112
|
+
for (const file of criticalFiles) {
|
|
113
|
+
try {
|
|
114
|
+
const stat = await Deno.stat(`${this.workingDir}/${file}`);
|
|
115
|
+
if (stat.isFile) {
|
|
116
|
+
result.conflicts.push(file);
|
|
117
|
+
if (!force) {
|
|
118
|
+
result.success = false;
|
|
119
|
+
result.errors.push(`File already exists: ${file}`);
|
|
120
|
+
} else {
|
|
121
|
+
result.warnings.push(`File will be overwritten: ${file}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} catch {
|
|
125
|
+
// File doesn't exist - good
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Check critical directories
|
|
130
|
+
for (const dir of criticalDirs) {
|
|
131
|
+
try {
|
|
132
|
+
const stat = await Deno.stat(`${this.workingDir}/${dir}`);
|
|
133
|
+
if (stat.isDirectory) {
|
|
134
|
+
// Check if directory has important content
|
|
135
|
+
const entries = [];
|
|
136
|
+
for await (const entry of Deno.readDir(`${this.workingDir}/${dir}`)) {
|
|
137
|
+
entries.push(entry.name);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (entries.length > 0) {
|
|
141
|
+
result.conflicts.push(`${dir}/ (${entries.length} items)`);
|
|
142
|
+
if (!force) {
|
|
143
|
+
result.warnings.push(`Directory exists with content: ${dir}/`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
} catch {
|
|
148
|
+
// Directory doesn't exist - good
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Check for required dependencies
|
|
157
|
+
*/
|
|
158
|
+
async checkDependencies() {
|
|
159
|
+
const result = {
|
|
160
|
+
success: true,
|
|
161
|
+
errors: [],
|
|
162
|
+
warnings: [],
|
|
163
|
+
dependencies: {},
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const dependencies = [
|
|
167
|
+
{ name: 'node', command: 'node', args: ['--version'], required: true },
|
|
168
|
+
{ name: 'npm', command: 'npm', args: ['--version'], required: true },
|
|
169
|
+
{ name: 'git', command: 'git', args: ['--version'], required: false },
|
|
170
|
+
{ name: 'npx', command: 'npx', args: ['--version'], required: true },
|
|
171
|
+
];
|
|
172
|
+
|
|
173
|
+
for (const dep of dependencies) {
|
|
174
|
+
try {
|
|
175
|
+
const command = new Deno.Command(dep.command, {
|
|
176
|
+
args: dep.args,
|
|
177
|
+
stdout: 'piped',
|
|
178
|
+
stderr: 'piped',
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
const { stdout, success } = await command.output();
|
|
182
|
+
|
|
183
|
+
if (success) {
|
|
184
|
+
const version = new TextDecoder().decode(stdout).trim();
|
|
185
|
+
result.dependencies[dep.name] = {
|
|
186
|
+
available: true,
|
|
187
|
+
version,
|
|
188
|
+
};
|
|
189
|
+
} else {
|
|
190
|
+
throw new Error('Command failed');
|
|
191
|
+
}
|
|
192
|
+
} catch (error) {
|
|
193
|
+
result.dependencies[dep.name] = {
|
|
194
|
+
available: false,
|
|
195
|
+
error: error.message,
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
if (dep.required) {
|
|
199
|
+
result.success = false;
|
|
200
|
+
result.errors.push(`Required dependency '${dep.name}' is not available`);
|
|
201
|
+
} else {
|
|
202
|
+
result.warnings.push(`Optional dependency '${dep.name}' is not available`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Check environment variables and configuration
|
|
212
|
+
*/
|
|
213
|
+
async checkEnvironment() {
|
|
214
|
+
const result = {
|
|
215
|
+
success: true,
|
|
216
|
+
errors: [],
|
|
217
|
+
warnings: [],
|
|
218
|
+
environment: {},
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Check for important environment variables
|
|
222
|
+
const envVars = [
|
|
223
|
+
{ name: 'HOME', required: false },
|
|
224
|
+
{ name: 'PATH', required: true },
|
|
225
|
+
{ name: 'PWD', required: false },
|
|
226
|
+
{ name: 'CLAUDE_FLOW_DEBUG', required: false },
|
|
227
|
+
];
|
|
228
|
+
|
|
229
|
+
for (const envVar of envVars) {
|
|
230
|
+
const value = Deno.env.get(envVar.name);
|
|
231
|
+
|
|
232
|
+
if (value) {
|
|
233
|
+
result.environment[envVar.name] = 'set';
|
|
234
|
+
} else {
|
|
235
|
+
result.environment[envVar.name] = 'not set';
|
|
236
|
+
|
|
237
|
+
if (envVar.required) {
|
|
238
|
+
result.success = false;
|
|
239
|
+
result.errors.push(`Required environment variable ${envVar.name} is not set`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Check if we're in a git repository
|
|
245
|
+
try {
|
|
246
|
+
const command = new Deno.Command('git', {
|
|
247
|
+
args: ['rev-parse', '--git-dir'],
|
|
248
|
+
cwd: this.workingDir,
|
|
249
|
+
stdout: 'piped',
|
|
250
|
+
stderr: 'piped',
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
const { success } = await command.output();
|
|
254
|
+
result.environment.gitRepo = success;
|
|
255
|
+
|
|
256
|
+
if (!success) {
|
|
257
|
+
result.warnings.push('Not in a git repository - version control recommended');
|
|
258
|
+
}
|
|
259
|
+
} catch {
|
|
260
|
+
result.environment.gitRepo = false;
|
|
261
|
+
result.warnings.push('Could not check git repository status');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Run all pre-initialization checks
|
|
269
|
+
*/
|
|
270
|
+
async runAllChecks(options = {}) {
|
|
271
|
+
const results = {
|
|
272
|
+
permissions: await this.checkPermissions(),
|
|
273
|
+
diskSpace: await this.checkDiskSpace(),
|
|
274
|
+
conflicts: await this.checkConflicts(options.force),
|
|
275
|
+
dependencies: await this.checkDependencies(),
|
|
276
|
+
environment: await this.checkEnvironment(),
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const overallSuccess = Object.values(results).every((r) => r.success);
|
|
280
|
+
const allErrors = Object.values(results).flatMap((r) => r.errors || []);
|
|
281
|
+
const allWarnings = Object.values(results).flatMap((r) => r.warnings || []);
|
|
282
|
+
|
|
283
|
+
return {
|
|
284
|
+
success: overallSuccess,
|
|
285
|
+
results,
|
|
286
|
+
errors: allErrors,
|
|
287
|
+
warnings: allWarnings,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|