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,619 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { LanguageDetector } from './language-detector.js';
|
|
4
|
+
import { ClaudeMdGenerator } from './claude-md-generator.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Integration System for Language Detection and CLAUDE.md Generation
|
|
8
|
+
*
|
|
9
|
+
* Orchestrates the complete workflow from project analysis to CLAUDE.md creation
|
|
10
|
+
* Handles project initialization, updates, and user preferences
|
|
11
|
+
*/
|
|
12
|
+
export class IntegrationSystem {
|
|
13
|
+
constructor(projectPath = process.cwd(), options = {}) {
|
|
14
|
+
this.projectPath = projectPath;
|
|
15
|
+
this.options = {
|
|
16
|
+
autoDetect: true,
|
|
17
|
+
autoGenerate: true,
|
|
18
|
+
watchForChanges: false,
|
|
19
|
+
backupExisting: true,
|
|
20
|
+
...options,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
this.detector = new LanguageDetector(projectPath);
|
|
24
|
+
this.generator = new ClaudeMdGenerator(projectPath, options);
|
|
25
|
+
this.preferencesPath = path.join(projectPath, '.claude-flow-novice', 'preferences');
|
|
26
|
+
this.configPath = path.join(this.preferencesPath, 'integration.json');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Main initialization method - sets up the entire system
|
|
31
|
+
*/
|
|
32
|
+
async initialize() {
|
|
33
|
+
console.log('๐ Initializing Claude Flow language detection and CLAUDE.md generation...');
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
// Step 1: Ensure directories exist
|
|
37
|
+
await this.ensureDirectoryStructure();
|
|
38
|
+
|
|
39
|
+
// Step 2: Load existing configuration
|
|
40
|
+
const config = await this.loadConfiguration();
|
|
41
|
+
|
|
42
|
+
// Step 3: Check if auto-detection is enabled
|
|
43
|
+
if (!config.autoDetect) {
|
|
44
|
+
console.log('โญ๏ธ Auto-detection disabled, skipping...');
|
|
45
|
+
return { skipped: true, reason: 'Auto-detection disabled' };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Step 4: Detect project languages and frameworks
|
|
49
|
+
console.log('๐ Detecting project languages and frameworks...');
|
|
50
|
+
const detectionResults = await this.detector.detectProject();
|
|
51
|
+
|
|
52
|
+
// Step 5: Check if we need to generate CLAUDE.md
|
|
53
|
+
const shouldGenerate = await this.shouldGenerateClaudeMd(detectionResults, config);
|
|
54
|
+
|
|
55
|
+
if (!shouldGenerate.generate) {
|
|
56
|
+
console.log(`โญ๏ธ ${shouldGenerate.reason}`);
|
|
57
|
+
return { skipped: true, reason: shouldGenerate.reason, detection: detectionResults };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Step 6: Generate CLAUDE.md
|
|
61
|
+
console.log('๐ Generating CLAUDE.md...');
|
|
62
|
+
const claudeContent = await this.generator.generateClaudeMd();
|
|
63
|
+
|
|
64
|
+
// Step 7: Save current detection results for future comparisons
|
|
65
|
+
await this.saveDetectionResults(detectionResults);
|
|
66
|
+
|
|
67
|
+
// Step 8: Update configuration with last generation info
|
|
68
|
+
await this.updateConfiguration({
|
|
69
|
+
...config,
|
|
70
|
+
lastGenerated: new Date().toISOString(),
|
|
71
|
+
lastDetection: detectionResults,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Step 9: Setup file watching if enabled
|
|
75
|
+
if (config.watchForChanges) {
|
|
76
|
+
await this.setupFileWatcher();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
console.log('โ
Integration system initialized successfully');
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
detection: detectionResults,
|
|
84
|
+
claudeGenerated: true,
|
|
85
|
+
contentLength: claudeContent.length,
|
|
86
|
+
};
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error(`โ Integration system initialization failed: ${error.message}`);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Update system when new technologies are detected
|
|
95
|
+
*/
|
|
96
|
+
async updateForNewTechnology() {
|
|
97
|
+
console.log('๐ Checking for new technologies...');
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
const currentDetection = await this.detector.detectProject();
|
|
101
|
+
const previousDetection = await this.loadPreviousDetection();
|
|
102
|
+
|
|
103
|
+
if (!previousDetection) {
|
|
104
|
+
console.log('โ ๏ธ No previous detection found, running full update...');
|
|
105
|
+
return await this.initialize();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const changes = this.compareDetections(previousDetection, currentDetection);
|
|
109
|
+
|
|
110
|
+
if (changes.hasChanges) {
|
|
111
|
+
console.log(`๐ Detected changes: ${changes.summary}`);
|
|
112
|
+
|
|
113
|
+
// Update CLAUDE.md with new technologies
|
|
114
|
+
for (const newTech of changes.newTechnologies) {
|
|
115
|
+
await this.generator.updateForNewTechnology(newTech.name, newTech.type);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Save updated detection results
|
|
119
|
+
await this.saveDetectionResults(currentDetection);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
changes: changes,
|
|
124
|
+
updated: true,
|
|
125
|
+
};
|
|
126
|
+
} else {
|
|
127
|
+
console.log('โจ No new technologies detected');
|
|
128
|
+
return {
|
|
129
|
+
success: true,
|
|
130
|
+
changes: changes,
|
|
131
|
+
updated: false,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error(`โ Update failed: ${error.message}`);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Handle project type change (e.g., adding React to existing Node.js project)
|
|
142
|
+
*/
|
|
143
|
+
async handleProjectTypeChange(newProjectType) {
|
|
144
|
+
console.log(`๐ Handling project type change to: ${newProjectType}`);
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
const config = await this.loadConfiguration();
|
|
148
|
+
|
|
149
|
+
// Update configuration
|
|
150
|
+
config.overrideProjectType = newProjectType;
|
|
151
|
+
config.lastManualUpdate = new Date().toISOString();
|
|
152
|
+
await this.updateConfiguration(config);
|
|
153
|
+
|
|
154
|
+
// Re-generate CLAUDE.md with new project type
|
|
155
|
+
const claudeContent = await this.generator.generateClaudeMd();
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
success: true,
|
|
159
|
+
newProjectType,
|
|
160
|
+
claudeUpdated: true,
|
|
161
|
+
contentLength: claudeContent.length,
|
|
162
|
+
};
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error(`โ Project type change failed: ${error.message}`);
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Interactive setup for user preferences
|
|
171
|
+
*/
|
|
172
|
+
async interactiveSetup() {
|
|
173
|
+
console.log('๐ฏ Starting interactive setup...');
|
|
174
|
+
|
|
175
|
+
const prompts = [
|
|
176
|
+
{
|
|
177
|
+
name: 'autoDetect',
|
|
178
|
+
message: 'Enable automatic language detection?',
|
|
179
|
+
type: 'confirm',
|
|
180
|
+
default: true,
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: 'autoGenerate',
|
|
184
|
+
message: 'Auto-generate CLAUDE.md when languages are detected?',
|
|
185
|
+
type: 'confirm',
|
|
186
|
+
default: true,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'backupExisting',
|
|
190
|
+
message: 'Create backups of existing CLAUDE.md files?',
|
|
191
|
+
type: 'confirm',
|
|
192
|
+
default: true,
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: 'watchForChanges',
|
|
196
|
+
message: 'Watch for file changes and update automatically?',
|
|
197
|
+
type: 'confirm',
|
|
198
|
+
default: false,
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
name: 'includeFrameworkSpecific',
|
|
202
|
+
message: 'Include framework-specific best practices?',
|
|
203
|
+
type: 'confirm',
|
|
204
|
+
default: true,
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: 'includeBestPractices',
|
|
208
|
+
message: 'Include general best practices sections?',
|
|
209
|
+
type: 'confirm',
|
|
210
|
+
default: true,
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: 'includeTestingPatterns',
|
|
214
|
+
message: 'Include testing patterns and examples?',
|
|
215
|
+
type: 'confirm',
|
|
216
|
+
default: true,
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
|
|
220
|
+
// For now, use defaults (in a real implementation, you'd use inquirer or similar)
|
|
221
|
+
const preferences = {
|
|
222
|
+
autoDetect: true,
|
|
223
|
+
autoGenerate: true,
|
|
224
|
+
backupExisting: true,
|
|
225
|
+
watchForChanges: false,
|
|
226
|
+
includeFrameworkSpecific: true,
|
|
227
|
+
includeBestPractices: true,
|
|
228
|
+
includeTestingPatterns: true,
|
|
229
|
+
setupDate: new Date().toISOString(),
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
await this.updateConfiguration(preferences);
|
|
233
|
+
|
|
234
|
+
console.log('โ
Interactive setup completed');
|
|
235
|
+
console.log('๐ Preferences saved to:', this.configPath);
|
|
236
|
+
|
|
237
|
+
return preferences;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Validate project configuration and detect issues
|
|
242
|
+
*/
|
|
243
|
+
async validateProject() {
|
|
244
|
+
console.log('๐ Validating project configuration...');
|
|
245
|
+
|
|
246
|
+
const issues = [];
|
|
247
|
+
const suggestions = [];
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
// Check for package.json or similar
|
|
251
|
+
const packageFiles = ['package.json', 'requirements.txt', 'pom.xml', 'Cargo.toml', 'go.mod'];
|
|
252
|
+
let hasPackageFile = false;
|
|
253
|
+
|
|
254
|
+
for (const file of packageFiles) {
|
|
255
|
+
try {
|
|
256
|
+
await fs.access(path.join(this.projectPath, file));
|
|
257
|
+
hasPackageFile = true;
|
|
258
|
+
break;
|
|
259
|
+
} catch {}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (!hasPackageFile) {
|
|
263
|
+
issues.push({
|
|
264
|
+
type: 'warning',
|
|
265
|
+
message: 'No package management file found',
|
|
266
|
+
suggestion: 'Consider initializing with npm init, pip, or appropriate package manager',
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Check for Git repository
|
|
271
|
+
try {
|
|
272
|
+
await fs.access(path.join(this.projectPath, '.git'));
|
|
273
|
+
} catch {
|
|
274
|
+
suggestions.push({
|
|
275
|
+
type: 'info',
|
|
276
|
+
message: 'No Git repository detected',
|
|
277
|
+
suggestion: 'Consider initializing with: git init',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Check for existing CLAUDE.md
|
|
282
|
+
try {
|
|
283
|
+
await fs.access(path.join(this.projectPath, 'CLAUDE.md'));
|
|
284
|
+
} catch {
|
|
285
|
+
suggestions.push({
|
|
286
|
+
type: 'info',
|
|
287
|
+
message: 'No CLAUDE.md found',
|
|
288
|
+
suggestion: 'Will be generated automatically if auto-generation is enabled',
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Check directory structure
|
|
293
|
+
const commonDirs = ['src', 'lib', 'app', 'tests', 'test'];
|
|
294
|
+
let hasSourceDir = false;
|
|
295
|
+
|
|
296
|
+
for (const dir of commonDirs) {
|
|
297
|
+
try {
|
|
298
|
+
const stat = await fs.stat(path.join(this.projectPath, dir));
|
|
299
|
+
if (stat.isDirectory()) {
|
|
300
|
+
hasSourceDir = true;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
} catch {}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!hasSourceDir) {
|
|
307
|
+
suggestions.push({
|
|
308
|
+
type: 'info',
|
|
309
|
+
message: 'No standard source directory found',
|
|
310
|
+
suggestion: 'Consider organizing code in src/ or app/ directory',
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const validation = {
|
|
315
|
+
valid: issues.length === 0,
|
|
316
|
+
issues,
|
|
317
|
+
suggestions,
|
|
318
|
+
checkedAt: new Date().toISOString(),
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
console.log(
|
|
322
|
+
`โ
Validation complete: ${issues.length} issues, ${suggestions.length} suggestions`,
|
|
323
|
+
);
|
|
324
|
+
return validation;
|
|
325
|
+
} catch (error) {
|
|
326
|
+
console.error(`โ Validation failed: ${error.message}`);
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Generate project report with recommendations
|
|
333
|
+
*/
|
|
334
|
+
async generateProjectReport() {
|
|
335
|
+
console.log('๐ Generating project report...');
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
const [detection, validation, config] = await Promise.all([
|
|
339
|
+
this.detector.detectProject(),
|
|
340
|
+
this.validateProject(),
|
|
341
|
+
this.loadConfiguration(),
|
|
342
|
+
]);
|
|
343
|
+
|
|
344
|
+
const report = {
|
|
345
|
+
project: {
|
|
346
|
+
path: this.projectPath,
|
|
347
|
+
name: path.basename(this.projectPath),
|
|
348
|
+
analyzedAt: new Date().toISOString(),
|
|
349
|
+
},
|
|
350
|
+
detection: {
|
|
351
|
+
...detection,
|
|
352
|
+
recommendations: detection.getRecommendations ? detection.getRecommendations() : {},
|
|
353
|
+
},
|
|
354
|
+
validation,
|
|
355
|
+
configuration: config,
|
|
356
|
+
suggestions: this.generateSuggestions(detection, validation),
|
|
357
|
+
nextSteps: this.generateNextSteps(detection, validation, config),
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
// Save report
|
|
361
|
+
const reportPath = path.join(this.preferencesPath, 'project-report.json');
|
|
362
|
+
await fs.writeFile(reportPath, JSON.stringify(report, null, 2));
|
|
363
|
+
|
|
364
|
+
console.log('โ
Project report generated');
|
|
365
|
+
console.log('๐ Report saved to:', reportPath);
|
|
366
|
+
|
|
367
|
+
return report;
|
|
368
|
+
} catch (error) {
|
|
369
|
+
console.error(`โ Report generation failed: ${error.message}`);
|
|
370
|
+
throw error;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Private methods
|
|
375
|
+
|
|
376
|
+
async ensureDirectoryStructure() {
|
|
377
|
+
const dirs = [
|
|
378
|
+
this.preferencesPath,
|
|
379
|
+
path.join(this.preferencesPath, 'language-configs'),
|
|
380
|
+
path.join(this.preferencesPath, 'backups'),
|
|
381
|
+
path.join(this.preferencesPath, 'reports'),
|
|
382
|
+
];
|
|
383
|
+
|
|
384
|
+
for (const dir of dirs) {
|
|
385
|
+
await fs.mkdir(dir, { recursive: true });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
async loadConfiguration() {
|
|
390
|
+
try {
|
|
391
|
+
const content = await fs.readFile(this.configPath, 'utf8');
|
|
392
|
+
return JSON.parse(content);
|
|
393
|
+
} catch (error) {
|
|
394
|
+
// Return default configuration
|
|
395
|
+
return {
|
|
396
|
+
autoDetect: true,
|
|
397
|
+
autoGenerate: true,
|
|
398
|
+
backupExisting: true,
|
|
399
|
+
watchForChanges: false,
|
|
400
|
+
includeFrameworkSpecific: true,
|
|
401
|
+
includeBestPractices: true,
|
|
402
|
+
includeTestingPatterns: true,
|
|
403
|
+
createdAt: new Date().toISOString(),
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
async updateConfiguration(config) {
|
|
409
|
+
await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
async shouldGenerateClaudeMd(detectionResults, config) {
|
|
413
|
+
if (!config.autoGenerate) {
|
|
414
|
+
return { generate: false, reason: 'Auto-generation disabled in config' };
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (detectionResults.confidence < 0.3) {
|
|
418
|
+
return { generate: false, reason: 'Detection confidence too low' };
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (Object.keys(detectionResults.languages).length === 0) {
|
|
422
|
+
return { generate: false, reason: 'No languages detected' };
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Check if CLAUDE.md exists and when it was last modified
|
|
426
|
+
try {
|
|
427
|
+
const claudeMdPath = path.join(this.projectPath, 'CLAUDE.md');
|
|
428
|
+
const stat = await fs.stat(claudeMdPath);
|
|
429
|
+
const lastModified = stat.mtime;
|
|
430
|
+
const daysSinceModified = (Date.now() - lastModified.getTime()) / (1000 * 60 * 60 * 24);
|
|
431
|
+
|
|
432
|
+
if (daysSinceModified < 1 && !config.forceRegenerate) {
|
|
433
|
+
return { generate: false, reason: 'CLAUDE.md was recently modified' };
|
|
434
|
+
}
|
|
435
|
+
} catch {
|
|
436
|
+
// File doesn't exist, we should generate it
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return { generate: true, reason: 'Conditions met for generation' };
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
async saveDetectionResults(results) {
|
|
443
|
+
const resultsPath = path.join(this.preferencesPath, 'last-detection.json');
|
|
444
|
+
await fs.writeFile(resultsPath, JSON.stringify(results, null, 2));
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
async loadPreviousDetection() {
|
|
448
|
+
try {
|
|
449
|
+
const resultsPath = path.join(this.preferencesPath, 'last-detection.json');
|
|
450
|
+
const content = await fs.readFile(resultsPath, 'utf8');
|
|
451
|
+
return JSON.parse(content);
|
|
452
|
+
} catch {
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
compareDetections(previous, current) {
|
|
458
|
+
const changes = {
|
|
459
|
+
hasChanges: false,
|
|
460
|
+
newLanguages: [],
|
|
461
|
+
newFrameworks: [],
|
|
462
|
+
newTechnologies: [],
|
|
463
|
+
removedLanguages: [],
|
|
464
|
+
removedFrameworks: [],
|
|
465
|
+
confidenceChanges: {},
|
|
466
|
+
summary: '',
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
// Compare languages
|
|
470
|
+
for (const [lang, confidence] of Object.entries(current.languages)) {
|
|
471
|
+
if (!previous.languages[lang]) {
|
|
472
|
+
changes.newLanguages.push({ name: lang, confidence });
|
|
473
|
+
changes.newTechnologies.push({ name: lang, type: 'language' });
|
|
474
|
+
changes.hasChanges = true;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Compare frameworks
|
|
479
|
+
for (const [framework, confidence] of Object.entries(current.frameworks)) {
|
|
480
|
+
if (!previous.frameworks[framework]) {
|
|
481
|
+
changes.newFrameworks.push({ name: framework, confidence });
|
|
482
|
+
changes.newTechnologies.push({ name: framework, type: 'framework' });
|
|
483
|
+
changes.hasChanges = true;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// Check for removed technologies
|
|
488
|
+
for (const lang of Object.keys(previous.languages)) {
|
|
489
|
+
if (!current.languages[lang]) {
|
|
490
|
+
changes.removedLanguages.push(lang);
|
|
491
|
+
changes.hasChanges = true;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
for (const framework of Object.keys(previous.frameworks)) {
|
|
496
|
+
if (!current.frameworks[framework]) {
|
|
497
|
+
changes.removedFrameworks.push(framework);
|
|
498
|
+
changes.hasChanges = true;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// Generate summary
|
|
503
|
+
const summaryParts = [];
|
|
504
|
+
if (changes.newLanguages.length)
|
|
505
|
+
summaryParts.push(`${changes.newLanguages.length} new languages`);
|
|
506
|
+
if (changes.newFrameworks.length)
|
|
507
|
+
summaryParts.push(`${changes.newFrameworks.length} new frameworks`);
|
|
508
|
+
if (changes.removedLanguages.length)
|
|
509
|
+
summaryParts.push(`${changes.removedLanguages.length} removed languages`);
|
|
510
|
+
if (changes.removedFrameworks.length)
|
|
511
|
+
summaryParts.push(`${changes.removedFrameworks.length} removed frameworks`);
|
|
512
|
+
|
|
513
|
+
changes.summary = summaryParts.join(', ') || 'No significant changes';
|
|
514
|
+
|
|
515
|
+
return changes;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
generateSuggestions(detection, validation) {
|
|
519
|
+
const suggestions = [];
|
|
520
|
+
|
|
521
|
+
// Language-specific suggestions
|
|
522
|
+
if (detection.languages.javascript && !detection.languages.typescript) {
|
|
523
|
+
suggestions.push({
|
|
524
|
+
type: 'enhancement',
|
|
525
|
+
message: 'Consider migrating to TypeScript for better type safety',
|
|
526
|
+
priority: 'medium',
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
if (detection.frameworks.react && !detection.frameworks.nextjs) {
|
|
531
|
+
suggestions.push({
|
|
532
|
+
type: 'enhancement',
|
|
533
|
+
message: 'Consider Next.js for better SEO and performance',
|
|
534
|
+
priority: 'low',
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// Testing suggestions
|
|
539
|
+
const hasTestFramework = Object.keys(detection.dependencies).some((dep) =>
|
|
540
|
+
['jest', 'pytest', 'mocha', 'jasmine', 'vitest'].includes(dep.toLowerCase()),
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
if (!hasTestFramework) {
|
|
544
|
+
suggestions.push({
|
|
545
|
+
type: 'quality',
|
|
546
|
+
message: 'No testing framework detected - consider adding automated tests',
|
|
547
|
+
priority: 'high',
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
return suggestions;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
generateNextSteps(detection, validation, config) {
|
|
555
|
+
const steps = [];
|
|
556
|
+
|
|
557
|
+
if (!config.setupCompleted) {
|
|
558
|
+
steps.push('Run interactive setup: npm run claude-flow:setup');
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
if (validation.issues.length > 0) {
|
|
562
|
+
steps.push('Address validation issues found in project');
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
if (detection.confidence < 0.7) {
|
|
566
|
+
steps.push('Review and verify detected languages/frameworks');
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
steps.push('Review generated CLAUDE.md file');
|
|
570
|
+
steps.push('Commit changes to version control');
|
|
571
|
+
|
|
572
|
+
return steps;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
async setupFileWatcher() {
|
|
576
|
+
// In a real implementation, this would set up file system watching
|
|
577
|
+
// using something like chokidar to watch for changes to package.json,
|
|
578
|
+
// new files, etc., and trigger re-detection
|
|
579
|
+
console.log('๐ File watching setup completed (placeholder)');
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* Clean up old backups and reports
|
|
584
|
+
*/
|
|
585
|
+
async cleanup(olderThanDays = 30) {
|
|
586
|
+
console.log(`๐งน Cleaning up files older than ${olderThanDays} days...`);
|
|
587
|
+
|
|
588
|
+
const backupsDir = path.join(this.preferencesPath, 'backups');
|
|
589
|
+
const reportsDir = path.join(this.preferencesPath, 'reports');
|
|
590
|
+
|
|
591
|
+
const cutoffDate = new Date();
|
|
592
|
+
cutoffDate.setDate(cutoffDate.getDate() - olderThanDays);
|
|
593
|
+
|
|
594
|
+
let cleanedCount = 0;
|
|
595
|
+
|
|
596
|
+
for (const dir of [backupsDir, reportsDir]) {
|
|
597
|
+
try {
|
|
598
|
+
const files = await fs.readdir(dir);
|
|
599
|
+
for (const file of files) {
|
|
600
|
+
const filePath = path.join(dir, file);
|
|
601
|
+
const stat = await fs.stat(filePath);
|
|
602
|
+
|
|
603
|
+
if (stat.mtime < cutoffDate) {
|
|
604
|
+
await fs.unlink(filePath);
|
|
605
|
+
cleanedCount++;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
} catch (error) {
|
|
609
|
+
// Directory might not exist, continue
|
|
610
|
+
continue;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
console.log(`โ
Cleanup complete: ${cleanedCount} files removed`);
|
|
615
|
+
return { cleanedCount, cutoffDate };
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
export default IntegrationSystem;
|