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,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Metrics Structure Validation Script
|
|
5
|
+
* Validates the organized metrics directory structure and data integrity
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
const METRICS_BASE = '.claude-flow/metrics';
|
|
12
|
+
const REQUIRED_STRUCTURE = {
|
|
13
|
+
'performance': ['consolidated-performance.json', 'execution-history.json', 'agent-performance.json'],
|
|
14
|
+
'system': ['real-time-metrics.json'],
|
|
15
|
+
'benchmarks': [],
|
|
16
|
+
'historical': [],
|
|
17
|
+
'verification-archive': []
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function validateStructure() {
|
|
21
|
+
console.log('🔍 Validating metrics directory structure...\n');
|
|
22
|
+
|
|
23
|
+
let isValid = true;
|
|
24
|
+
|
|
25
|
+
// Check if config.json exists
|
|
26
|
+
const configPath = path.join(METRICS_BASE, 'config.json');
|
|
27
|
+
if (!fs.existsSync(configPath)) {
|
|
28
|
+
console.error('❌ Missing config.json in metrics directory');
|
|
29
|
+
isValid = false;
|
|
30
|
+
} else {
|
|
31
|
+
console.log('✅ Config file exists');
|
|
32
|
+
|
|
33
|
+
// Validate config structure
|
|
34
|
+
try {
|
|
35
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
36
|
+
if (config.version && config.structure) {
|
|
37
|
+
console.log('✅ Config structure is valid');
|
|
38
|
+
} else {
|
|
39
|
+
console.error('❌ Invalid config.json structure');
|
|
40
|
+
isValid = false;
|
|
41
|
+
}
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error('❌ Config.json is not valid JSON:', error.message);
|
|
44
|
+
isValid = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Check directory structure
|
|
49
|
+
for (const [dir, files] of Object.entries(REQUIRED_STRUCTURE)) {
|
|
50
|
+
const dirPath = path.join(METRICS_BASE, dir);
|
|
51
|
+
|
|
52
|
+
if (!fs.existsSync(dirPath)) {
|
|
53
|
+
console.error(`❌ Missing directory: ${dir}`);
|
|
54
|
+
isValid = false;
|
|
55
|
+
} else {
|
|
56
|
+
console.log(`✅ Directory exists: ${dir}`);
|
|
57
|
+
|
|
58
|
+
// Check required files
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const filePath = path.join(dirPath, file);
|
|
61
|
+
if (!fs.existsSync(filePath)) {
|
|
62
|
+
console.error(`❌ Missing required file: ${dir}/${file}`);
|
|
63
|
+
isValid = false;
|
|
64
|
+
} else {
|
|
65
|
+
console.log(` ✅ ${file}`);
|
|
66
|
+
|
|
67
|
+
// Validate JSON files
|
|
68
|
+
if (file.endsWith('.json')) {
|
|
69
|
+
try {
|
|
70
|
+
const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
71
|
+
if (content.metadata) {
|
|
72
|
+
console.log(` ✅ Valid JSON with metadata`);
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
console.error(` ❌ Invalid JSON in ${file}:`, error.message);
|
|
76
|
+
isValid = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Check for leftover legacy files
|
|
85
|
+
const metricsFiles = fs.readdirSync(METRICS_BASE);
|
|
86
|
+
const legacyFiles = metricsFiles.filter(file =>
|
|
87
|
+
file.endsWith('.json') &&
|
|
88
|
+
!['config.json'].includes(file)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
if (legacyFiles.length > 0) {
|
|
92
|
+
console.warn('⚠️ Legacy files still in root metrics directory:');
|
|
93
|
+
legacyFiles.forEach(file => console.warn(` - ${file}`));
|
|
94
|
+
console.log(' Consider moving these to historical/ directory');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
console.log('\n📊 Validation Summary:');
|
|
98
|
+
console.log(`Status: ${isValid ? '✅ PASSED' : '❌ FAILED'}`);
|
|
99
|
+
console.log(`Directories: ${Object.keys(REQUIRED_STRUCTURE).length}`);
|
|
100
|
+
console.log(`Required files: ${Object.values(REQUIRED_STRUCTURE).flat().length}`);
|
|
101
|
+
|
|
102
|
+
return isValid;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function testDataCollection() {
|
|
106
|
+
console.log('\n🧪 Testing data collection endpoints...\n');
|
|
107
|
+
|
|
108
|
+
const endpoints = [
|
|
109
|
+
'performance/consolidated-performance.json',
|
|
110
|
+
'system/real-time-metrics.json',
|
|
111
|
+
'../dashboard/data.json'
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
for (const endpoint of endpoints) {
|
|
115
|
+
const filePath = path.join(METRICS_BASE, endpoint);
|
|
116
|
+
if (fs.existsSync(filePath)) {
|
|
117
|
+
try {
|
|
118
|
+
const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
119
|
+
console.log(`✅ ${endpoint} - readable and valid JSON`);
|
|
120
|
+
|
|
121
|
+
// Check if data is recent (within last hour)
|
|
122
|
+
if (data.timestamp || data.metadata?.consolidated_at) {
|
|
123
|
+
console.log(` 📅 Contains timestamp data`);
|
|
124
|
+
}
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error(`❌ ${endpoint} - JSON parsing failed:`, error.message);
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
console.error(`❌ ${endpoint} - file not found`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Main execution
|
|
135
|
+
console.log('📋 Claude Flow Metrics Structure Validation\n');
|
|
136
|
+
console.log('=' * 50);
|
|
137
|
+
|
|
138
|
+
const structureValid = validateStructure();
|
|
139
|
+
testDataCollection();
|
|
140
|
+
|
|
141
|
+
console.log('\n' + '=' * 50);
|
|
142
|
+
console.log(`🎯 Overall Status: ${structureValid ? 'METRICS STRUCTURE VALID' : 'VALIDATION FAILED'}`);
|
|
143
|
+
|
|
144
|
+
process.exit(structureValid ? 0 : 1);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Verification script for Claude-Flow Novice MCP Server
|
|
5
|
+
* Tests ES module compatibility and tool functionality
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
console.log('🔍 Verifying Claude-Flow Novice MCP Server...\n');
|
|
9
|
+
|
|
10
|
+
async function main() {
|
|
11
|
+
try {
|
|
12
|
+
// Test 1: Import ES module
|
|
13
|
+
console.log('✅ Test 1: ES Module Import');
|
|
14
|
+
const { ClaudeFlowNoviceMCPServer } = await import('../dist/mcp/mcp-server-novice.js');
|
|
15
|
+
console.log(' → Server class imported successfully');
|
|
16
|
+
|
|
17
|
+
// Test 2: Initialize server
|
|
18
|
+
console.log('\n✅ Test 2: Server Initialization');
|
|
19
|
+
const server = new ClaudeFlowNoviceMCPServer();
|
|
20
|
+
console.log(` → Session ID: ${server.sessionId}`);
|
|
21
|
+
console.log(` → Version: ${server.version}`);
|
|
22
|
+
|
|
23
|
+
// Test 3: Verify tool count and categories
|
|
24
|
+
console.log('\n✅ Test 3: Tool Verification');
|
|
25
|
+
const tools = server.tools;
|
|
26
|
+
const toolNames = Object.keys(tools);
|
|
27
|
+
console.log(` → Total tools: ${toolNames.length}`);
|
|
28
|
+
|
|
29
|
+
const expectedCategories = {
|
|
30
|
+
'Swarm Coordination': ['swarm_init', 'agent_spawn', 'task_orchestrate', 'swarm_status', 'agent_list', 'coordination_sync', 'swarm_scale', 'swarm_destroy'],
|
|
31
|
+
'Memory Management': ['memory_usage', 'memory_search', 'memory_persist', 'memory_backup', 'memory_restore', 'memory_namespace', 'cache_manage', 'state_snapshot'],
|
|
32
|
+
'Agent Lifecycle': ['agent_metrics', 'task_status', 'task_results', 'performance_report', 'bottleneck_analyze', 'health_check'],
|
|
33
|
+
'Language & Framework': ['language_detect', 'framework_detect', 'dependency_analyze', 'config_validate', 'test_detect', 'build_detect', 'package_analyze', 'environment_setup'],
|
|
34
|
+
'System Tools': ['diagnostic_run', 'features_detect', 'usage_stats', 'config_manage', 'terminal_execute', 'log_analysis']
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
let totalVerified = 0;
|
|
38
|
+
for (const [category, expectedTools] of Object.entries(expectedCategories)) {
|
|
39
|
+
const found = expectedTools.filter(tool => toolNames.includes(tool));
|
|
40
|
+
console.log(` → ${category}: ${found.length}/${expectedTools.length} tools`);
|
|
41
|
+
totalVerified += found.length;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Test 4: Mock request handling
|
|
45
|
+
console.log('\n✅ Test 4: Request Handling');
|
|
46
|
+
const initResponse = server.handleInitialize({});
|
|
47
|
+
console.log(` → Protocol version: ${initResponse.protocolVersion}`);
|
|
48
|
+
console.log(` → Server name: ${initResponse.serverInfo.name}`);
|
|
49
|
+
|
|
50
|
+
const toolsListResponse = server.handleToolsList();
|
|
51
|
+
console.log(` → Tools list length: ${toolsListResponse.tools.length}`);
|
|
52
|
+
|
|
53
|
+
// Test 5: Sample tool call
|
|
54
|
+
console.log('\n✅ Test 5: Tool Call Simulation');
|
|
55
|
+
const toolCallResponse = await server.handleToolsCall({
|
|
56
|
+
name: 'swarm_init',
|
|
57
|
+
arguments: { topology: 'mesh', maxAgents: 4 }
|
|
58
|
+
});
|
|
59
|
+
const result = JSON.parse(toolCallResponse.content[0].text);
|
|
60
|
+
console.log(` → Tool: ${result.tool}`);
|
|
61
|
+
console.log(` → Success: ${result.success}`);
|
|
62
|
+
|
|
63
|
+
// Final summary
|
|
64
|
+
console.log('\n🎉 VERIFICATION COMPLETE');
|
|
65
|
+
console.log('='.repeat(50));
|
|
66
|
+
console.log(`✅ ES Module syntax: FIXED`);
|
|
67
|
+
console.log(`✅ Total tools: ${toolNames.length}/36`);
|
|
68
|
+
console.log(`✅ Tool categories: 5`);
|
|
69
|
+
console.log(`✅ MCP protocol: WORKING`);
|
|
70
|
+
console.log(`✅ Tool execution: WORKING`);
|
|
71
|
+
|
|
72
|
+
if (toolNames.length === 36 && totalVerified === 36) {
|
|
73
|
+
console.log('\n🚀 Server is ready for production use!');
|
|
74
|
+
process.exit(0);
|
|
75
|
+
} else {
|
|
76
|
+
console.log('\n❌ Tool count mismatch detected');
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
} catch (error) {
|
|
81
|
+
console.error('\n❌ VERIFICATION FAILED:', error.message);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
main();
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for agent command
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { jest } from '@jest/globals';
|
|
6
|
+
import { agentCommand } from '../agent.js';
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
|
|
12
|
+
jest.mock('fs-extra');
|
|
13
|
+
jest.mock('ora');
|
|
14
|
+
jest.mock('chalk', () => ({
|
|
15
|
+
default: {
|
|
16
|
+
blue: jest.fn((str) => str),
|
|
17
|
+
green: jest.fn((str) => str),
|
|
18
|
+
yellow: jest.fn((str) => str),
|
|
19
|
+
red: jest.fn((str) => str),
|
|
20
|
+
cyan: jest.fn((str) => str),
|
|
21
|
+
dim: jest.fn((str) => str),
|
|
22
|
+
bold: jest.fn((str) => str),
|
|
23
|
+
},
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
describe('Agent Command', () => {
|
|
27
|
+
let consoleLogSpy;
|
|
28
|
+
let consoleErrorSpy;
|
|
29
|
+
let mockSpinner;
|
|
30
|
+
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
|
|
33
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
|
|
34
|
+
|
|
35
|
+
mockSpinner = {
|
|
36
|
+
start: jest.fn().mockReturnThis(),
|
|
37
|
+
succeed: jest.fn().mockReturnThis(),
|
|
38
|
+
fail: jest.fn().mockReturnThis(),
|
|
39
|
+
info: jest.fn().mockReturnThis(),
|
|
40
|
+
text: '',
|
|
41
|
+
};
|
|
42
|
+
ora.mockReturnValue(mockSpinner);
|
|
43
|
+
|
|
44
|
+
jest.clearAllMocks();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
consoleLogSpy.mockRestore();
|
|
49
|
+
consoleErrorSpy.mockRestore();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('list subcommand', () => {
|
|
53
|
+
test('should list available agent types', async () => {
|
|
54
|
+
await agentCommand(['list'], {});
|
|
55
|
+
|
|
56
|
+
expect(consoleLogSpy).toHaveBeenCalled();
|
|
57
|
+
const output = consoleLogSpy.mock.calls.flat().join('\n');
|
|
58
|
+
|
|
59
|
+
expect(output).toContain('Available Agent Types');
|
|
60
|
+
expect(output).toContain('researcher');
|
|
61
|
+
expect(output).toContain('coder');
|
|
62
|
+
expect(output).toContain('analyst');
|
|
63
|
+
expect(output).toContain('architect');
|
|
64
|
+
expect(output).toContain('tester');
|
|
65
|
+
expect(output).toContain('coordinator');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe('spawn subcommand', () => {
|
|
70
|
+
test('should spawn an agent with type', async () => {
|
|
71
|
+
const swarmDir = path.join(process.cwd(), '.claude', 'swarm');
|
|
72
|
+
fs.pathExists.mockResolvedValue(true);
|
|
73
|
+
fs.readJson.mockResolvedValue({
|
|
74
|
+
id: 'swarm-123',
|
|
75
|
+
agents: [],
|
|
76
|
+
status: 'active',
|
|
77
|
+
});
|
|
78
|
+
fs.writeJson.mockResolvedValue(undefined);
|
|
79
|
+
|
|
80
|
+
await agentCommand(['spawn', 'researcher'], {});
|
|
81
|
+
|
|
82
|
+
expect(mockSpinner.start).toHaveBeenCalledWith('Spawning researcher agent...');
|
|
83
|
+
expect(mockSpinner.succeed).toHaveBeenCalled();
|
|
84
|
+
expect(fs.writeJson).toHaveBeenCalled();
|
|
85
|
+
|
|
86
|
+
const writeCall = fs.writeJson.mock.calls[0];
|
|
87
|
+
expect(writeCall[1].agents).toHaveLength(1);
|
|
88
|
+
expect(writeCall[1].agents[0].type).toBe('researcher');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('should spawn agent with custom name', async () => {
|
|
92
|
+
fs.pathExists.mockResolvedValue(true);
|
|
93
|
+
fs.readJson.mockResolvedValue({
|
|
94
|
+
id: 'swarm-123',
|
|
95
|
+
agents: [],
|
|
96
|
+
status: 'active',
|
|
97
|
+
});
|
|
98
|
+
fs.writeJson.mockResolvedValue(undefined);
|
|
99
|
+
|
|
100
|
+
await agentCommand(['spawn', 'coder'], { name: 'CustomCoder' });
|
|
101
|
+
|
|
102
|
+
const writeCall = fs.writeJson.mock.calls[0];
|
|
103
|
+
expect(writeCall[1].agents[0].name).toBe('CustomCoder');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('should error if swarm not initialized', async () => {
|
|
107
|
+
fs.pathExists.mockResolvedValue(false);
|
|
108
|
+
|
|
109
|
+
await agentCommand(['spawn', 'researcher'], {});
|
|
110
|
+
|
|
111
|
+
expect(mockSpinner.fail).toHaveBeenCalledWith(
|
|
112
|
+
expect.stringContaining('No active swarm found'),
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('should error for invalid agent type', async () => {
|
|
117
|
+
fs.pathExists.mockResolvedValue(true);
|
|
118
|
+
fs.readJson.mockResolvedValue({ agents: [] });
|
|
119
|
+
|
|
120
|
+
await agentCommand(['spawn', 'invalid-type'], {});
|
|
121
|
+
|
|
122
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid agent type'));
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe('status subcommand', () => {
|
|
127
|
+
test('should show agent status', async () => {
|
|
128
|
+
const mockSwarmData = {
|
|
129
|
+
id: 'swarm-123',
|
|
130
|
+
agents: [
|
|
131
|
+
{
|
|
132
|
+
id: 'agent-1',
|
|
133
|
+
name: 'Researcher',
|
|
134
|
+
type: 'researcher',
|
|
135
|
+
status: 'active',
|
|
136
|
+
created: new Date().toISOString(),
|
|
137
|
+
tasksCompleted: 5,
|
|
138
|
+
currentTask: 'Analyzing data',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'agent-2',
|
|
142
|
+
name: 'Coder',
|
|
143
|
+
type: 'coder',
|
|
144
|
+
status: 'idle',
|
|
145
|
+
created: new Date().toISOString(),
|
|
146
|
+
tasksCompleted: 3,
|
|
147
|
+
currentTask: null,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
fs.pathExists.mockResolvedValue(true);
|
|
153
|
+
fs.readJson.mockResolvedValue(mockSwarmData);
|
|
154
|
+
|
|
155
|
+
await agentCommand(['status'], {});
|
|
156
|
+
|
|
157
|
+
const output = consoleLogSpy.mock.calls.flat().join('\n');
|
|
158
|
+
expect(output).toContain('Active Agents');
|
|
159
|
+
expect(output).toContain('Researcher');
|
|
160
|
+
expect(output).toContain('active');
|
|
161
|
+
expect(output).toContain('Analyzing data');
|
|
162
|
+
expect(output).toContain('Coder');
|
|
163
|
+
expect(output).toContain('idle');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('should show specific agent status', async () => {
|
|
167
|
+
const mockSwarmData = {
|
|
168
|
+
agents: [
|
|
169
|
+
{
|
|
170
|
+
id: 'agent-1',
|
|
171
|
+
name: 'Researcher',
|
|
172
|
+
type: 'researcher',
|
|
173
|
+
status: 'active',
|
|
174
|
+
metrics: {
|
|
175
|
+
tasksCompleted: 10,
|
|
176
|
+
avgCompletionTime: 5000,
|
|
177
|
+
successRate: 0.95,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
fs.pathExists.mockResolvedValue(true);
|
|
184
|
+
fs.readJson.mockResolvedValue(mockSwarmData);
|
|
185
|
+
|
|
186
|
+
await agentCommand(['status', 'agent-1'], {});
|
|
187
|
+
|
|
188
|
+
const output = consoleLogSpy.mock.calls.flat().join('\n');
|
|
189
|
+
expect(output).toContain('Agent Details');
|
|
190
|
+
expect(output).toContain('Researcher');
|
|
191
|
+
expect(output).toContain('Tasks Completed: 10');
|
|
192
|
+
expect(output).toContain('Success Rate: 95%');
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('remove subcommand', () => {
|
|
197
|
+
test('should remove an agent', async () => {
|
|
198
|
+
const mockSwarmData = {
|
|
199
|
+
agents: [
|
|
200
|
+
{ id: 'agent-1', name: 'Researcher' },
|
|
201
|
+
{ id: 'agent-2', name: 'Coder' },
|
|
202
|
+
],
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
fs.pathExists.mockResolvedValue(true);
|
|
206
|
+
fs.readJson.mockResolvedValue(mockSwarmData);
|
|
207
|
+
fs.writeJson.mockResolvedValue(undefined);
|
|
208
|
+
|
|
209
|
+
await agentCommand(['remove', 'agent-1'], {});
|
|
210
|
+
|
|
211
|
+
expect(mockSpinner.succeed).toHaveBeenCalledWith(
|
|
212
|
+
expect.stringContaining('Agent agent-1 removed'),
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
const writeCall = fs.writeJson.mock.calls[0];
|
|
216
|
+
expect(writeCall[1].agents).toHaveLength(1);
|
|
217
|
+
expect(writeCall[1].agents[0].id).toBe('agent-2');
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test('should error if agent not found', async () => {
|
|
221
|
+
fs.pathExists.mockResolvedValue(true);
|
|
222
|
+
fs.readJson.mockResolvedValue({ agents: [] });
|
|
223
|
+
|
|
224
|
+
await agentCommand(['remove', 'nonexistent'], {});
|
|
225
|
+
|
|
226
|
+
expect(mockSpinner.fail).toHaveBeenCalledWith(
|
|
227
|
+
expect.stringContaining('Agent nonexistent not found'),
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('assign subcommand', () => {
|
|
233
|
+
test('should assign task to agent', async () => {
|
|
234
|
+
const mockSwarmData = {
|
|
235
|
+
agents: [{ id: 'agent-1', name: 'Researcher', currentTask: null }],
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
fs.pathExists.mockResolvedValue(true);
|
|
239
|
+
fs.readJson.mockResolvedValue(mockSwarmData);
|
|
240
|
+
fs.writeJson.mockResolvedValue(undefined);
|
|
241
|
+
|
|
242
|
+
await agentCommand(['assign', 'agent-1', 'Research new algorithms'], {});
|
|
243
|
+
|
|
244
|
+
expect(mockSpinner.succeed).toHaveBeenCalledWith(
|
|
245
|
+
expect.stringContaining('Task assigned to agent-1'),
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
const writeCall = fs.writeJson.mock.calls[0];
|
|
249
|
+
expect(writeCall[1].agents[0].currentTask).toBe('Research new algorithms');
|
|
250
|
+
expect(writeCall[1].agents[0].status).toBe('working');
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
describe('help subcommand', () => {
|
|
255
|
+
test('should show help when no arguments', async () => {
|
|
256
|
+
await agentCommand([], {});
|
|
257
|
+
|
|
258
|
+
const output = consoleLogSpy.mock.calls.flat().join('\n');
|
|
259
|
+
expect(output).toContain('Agent Management');
|
|
260
|
+
expect(output).toContain('USAGE:');
|
|
261
|
+
expect(output).toContain('agent <subcommand>');
|
|
262
|
+
expect(output).toContain('SUBCOMMANDS:');
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test('should show help for help subcommand', async () => {
|
|
266
|
+
await agentCommand(['help'], {});
|
|
267
|
+
|
|
268
|
+
const output = consoleLogSpy.mock.calls.flat().join('\n');
|
|
269
|
+
expect(output).toContain('Agent Management');
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
describe('error handling', () => {
|
|
274
|
+
test('should handle file read errors gracefully', async () => {
|
|
275
|
+
fs.pathExists.mockResolvedValue(true);
|
|
276
|
+
fs.readJson.mockRejectedValue(new Error('Permission denied'));
|
|
277
|
+
|
|
278
|
+
await agentCommand(['status'], {});
|
|
279
|
+
|
|
280
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Error:'));
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test('should handle invalid subcommands', async () => {
|
|
284
|
+
await agentCommand(['invalid-subcommand'], {});
|
|
285
|
+
|
|
286
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
|
287
|
+
expect.stringContaining('Unknown subcommand: invalid-subcommand'),
|
|
288
|
+
);
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|