claude-flow-novice 2.0.3 ā 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -1,468 +1,381 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pair Programming Command
|
|
3
3
|
* Interactive pair programming with AI assistance and real-time verification
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import { promisify } from 'util';
|
|
10
|
-
import readline from 'readline';
|
|
11
|
-
|
|
4
|
+
*/ import fs from "node:fs/promises";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { spawn, exec } from "child_process";
|
|
7
|
+
import { promisify } from "util";
|
|
8
|
+
import readline from "readline";
|
|
12
9
|
const execAsync = promisify(exec);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.currentRole = 'driver';
|
|
25
|
-
this.verificationScores = [];
|
|
26
|
-
this.testResults = [];
|
|
27
|
-
this.fileWatchers = new Map();
|
|
28
|
-
this.rl = null;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async start() {
|
|
32
|
-
await this.saveSession();
|
|
33
|
-
this.showWelcome();
|
|
34
|
-
|
|
35
|
-
if (this.verify) {
|
|
36
|
-
await this.startVerification();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (this.test) {
|
|
40
|
-
await this.startTestWatcher();
|
|
10
|
+
let PairProgrammingSession = class PairProgrammingSession {
|
|
11
|
+
async start() {
|
|
12
|
+
await this.saveSession();
|
|
13
|
+
this.showWelcome();
|
|
14
|
+
if (this.verify) {
|
|
15
|
+
await this.startVerification();
|
|
16
|
+
}
|
|
17
|
+
if (this.test) {
|
|
18
|
+
await this.startTestWatcher();
|
|
19
|
+
}
|
|
20
|
+
await this.startInteractiveMode();
|
|
41
21
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
console.log('š¤ AI role: ' + (this.currentRole === 'driver' ? 'NAVIGATOR' : 'DRIVER'));
|
|
70
|
-
this.startRoleTimer();
|
|
71
|
-
break;
|
|
22
|
+
showWelcome() {
|
|
23
|
+
console.log('\nš Starting Pair Programming Session');
|
|
24
|
+
console.log('ā'.repeat(50));
|
|
25
|
+
console.log(`Session ID: ${this.sessionId}`);
|
|
26
|
+
console.log(`Mode: ${this.mode}`);
|
|
27
|
+
console.log(`Agent: ${this.agent}`);
|
|
28
|
+
console.log(`Verification: ${this.verify ? 'ā
Enabled' : 'ā Disabled'}`);
|
|
29
|
+
console.log(`Testing: ${this.test ? 'ā
Enabled' : 'ā Disabled'}`);
|
|
30
|
+
console.log('ā'.repeat(50));
|
|
31
|
+
// Show mode details
|
|
32
|
+
switch(this.mode){
|
|
33
|
+
case 'driver':
|
|
34
|
+
console.log('\nš¤ You are the DRIVER - Write code while AI assists');
|
|
35
|
+
console.log('š¤ AI is the NAVIGATOR - Providing guidance and suggestions');
|
|
36
|
+
break;
|
|
37
|
+
case 'navigator':
|
|
38
|
+
console.log('\nš¤ AI is the DRIVER - Writing code based on your guidance');
|
|
39
|
+
console.log('š¤ You are the NAVIGATOR - Providing high-level direction');
|
|
40
|
+
break;
|
|
41
|
+
case 'switch':
|
|
42
|
+
console.log('\nš SWITCH MODE - Roles alternate every 10 minutes');
|
|
43
|
+
console.log(`š¤ Current role: ${this.currentRole.toUpperCase()} (you)`);
|
|
44
|
+
console.log('š¤ AI role: ' + (this.currentRole === 'driver' ? 'NAVIGATOR' : 'DRIVER'));
|
|
45
|
+
this.startRoleTimer();
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
this.showCommands();
|
|
72
49
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.log(' /metrics - Show quality metrics');
|
|
87
|
-
console.log(' /commit - Commit with verification');
|
|
88
|
-
console.log(' /end - End session');
|
|
89
|
-
console.log(' /exit - Exit (same as /end)');
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
async startVerification() {
|
|
93
|
-
console.log('\nā
Verification System Active');
|
|
94
|
-
console.log(` ⢠Threshold: ${this.threshold}`);
|
|
95
|
-
console.log(' ⢠Real-time validation enabled');
|
|
96
|
-
console.log(' ⢠Auto-rollback on failures');
|
|
97
|
-
|
|
98
|
-
// Start verification loop
|
|
99
|
-
this.verificationInterval = setInterval(async () => {
|
|
100
|
-
await this.runVerification();
|
|
101
|
-
}, 30000); // Run every 30 seconds
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async runVerification() {
|
|
105
|
-
console.log('\nš Running verification check...');
|
|
106
|
-
|
|
107
|
-
const checks = [
|
|
108
|
-
{ name: 'Type Check', command: 'npm run typecheck 2>&1 || true' },
|
|
109
|
-
{ name: 'Linting', command: 'npm run lint 2>&1 || true' },
|
|
110
|
-
{ name: 'Build', command: 'npm run build 2>&1 || true' },
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
let totalScore = 0;
|
|
114
|
-
let passedChecks = 0;
|
|
115
|
-
|
|
116
|
-
for (const check of checks) {
|
|
117
|
-
try {
|
|
118
|
-
const { stdout } = await execAsync(check.command);
|
|
119
|
-
const passed = !stdout.toLowerCase().includes('error');
|
|
120
|
-
const score = passed ? 1.0 : 0.5;
|
|
121
|
-
|
|
122
|
-
totalScore += score;
|
|
123
|
-
if (passed) passedChecks++;
|
|
124
|
-
|
|
125
|
-
console.log(` ${passed ? 'ā
' : 'ā ļø'} ${check.name}: ${score.toFixed(2)}`);
|
|
126
|
-
} catch (error) {
|
|
127
|
-
console.log(` ā ${check.name}: 0.00 (failed)`);
|
|
128
|
-
}
|
|
50
|
+
showCommands() {
|
|
51
|
+
console.log('\nš Session Commands:');
|
|
52
|
+
console.log(' /help - Show available commands');
|
|
53
|
+
console.log(' /switch - Switch driver/navigator roles');
|
|
54
|
+
console.log(' /suggest - Get AI suggestions');
|
|
55
|
+
console.log(' /review - Request code review');
|
|
56
|
+
console.log(' /test - Run tests manually');
|
|
57
|
+
console.log(' /verify - Run verification check');
|
|
58
|
+
console.log(' /status - Show session status');
|
|
59
|
+
console.log(' /metrics - Show quality metrics');
|
|
60
|
+
console.log(' /commit - Commit with verification');
|
|
61
|
+
console.log(' /end - End session');
|
|
62
|
+
console.log(' /exit - Exit (same as /end)');
|
|
129
63
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
console.log('š Consider reverting recent changes');
|
|
140
|
-
}
|
|
141
|
-
} else {
|
|
142
|
-
console.log('ā
Verification passed!');
|
|
64
|
+
async startVerification() {
|
|
65
|
+
console.log('\nā
Verification System Active');
|
|
66
|
+
console.log(` ⢠Threshold: ${this.threshold}`);
|
|
67
|
+
console.log(' ⢠Real-time validation enabled');
|
|
68
|
+
console.log(' ⢠Auto-rollback on failures');
|
|
69
|
+
// Start verification loop
|
|
70
|
+
this.verificationInterval = setInterval(async ()=>{
|
|
71
|
+
await this.runVerification();
|
|
72
|
+
}, 30000); // Run every 30 seconds
|
|
143
73
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
if (summaryLine) {
|
|
176
|
-
console.log(` ${summaryLine.trim()}`);
|
|
177
|
-
|
|
178
|
-
// Extract coverage if available
|
|
179
|
-
const coverageLine = lines.find((l) => l.includes('Coverage'));
|
|
180
|
-
if (coverageLine) {
|
|
181
|
-
console.log(` ${coverageLine.trim()}`);
|
|
74
|
+
async runVerification() {
|
|
75
|
+
console.log('\nš Running verification check...');
|
|
76
|
+
const checks = [
|
|
77
|
+
{
|
|
78
|
+
name: 'Type Check',
|
|
79
|
+
command: 'npm run typecheck 2>&1 || true'
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'Linting',
|
|
83
|
+
command: 'npm run lint 2>&1 || true'
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'Build',
|
|
87
|
+
command: 'npm run build 2>&1 || true'
|
|
88
|
+
}
|
|
89
|
+
];
|
|
90
|
+
let totalScore = 0;
|
|
91
|
+
let passedChecks = 0;
|
|
92
|
+
for (const check of checks){
|
|
93
|
+
try {
|
|
94
|
+
const { stdout } = await execAsync(check.command);
|
|
95
|
+
const passed = !stdout.toLowerCase().includes('error');
|
|
96
|
+
const score = passed ? 1.0 : 0.5;
|
|
97
|
+
totalScore += score;
|
|
98
|
+
if (passed) passedChecks++;
|
|
99
|
+
console.log(` ${passed ? 'ā
' : 'ā ļø'} ${check.name}: ${score.toFixed(2)}`);
|
|
100
|
+
} catch (error) {
|
|
101
|
+
console.log(` ā ${check.name}: 0.00 (failed)`);
|
|
102
|
+
}
|
|
182
103
|
}
|
|
183
|
-
|
|
184
|
-
this.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
} catch (error) {
|
|
196
|
-
console.log(' ā Test execution failed:', error.message);
|
|
197
|
-
return false;
|
|
104
|
+
const averageScore = totalScore / checks.length;
|
|
105
|
+
this.verificationScores.push(averageScore);
|
|
106
|
+
console.log(`\nš Verification Score: ${averageScore.toFixed(2)}/${this.threshold}`);
|
|
107
|
+
if (averageScore < this.threshold) {
|
|
108
|
+
console.log('ā ļø Verification threshold not met!');
|
|
109
|
+
if (this.verify && averageScore < 0.7) {
|
|
110
|
+
console.log('š Consider reverting recent changes');
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
console.log('ā
Verification passed!');
|
|
114
|
+
}
|
|
115
|
+
return averageScore;
|
|
198
116
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
this.roleTimer = setTimeout(
|
|
205
|
-
() => {
|
|
206
|
-
this.switchRoles();
|
|
207
|
-
this.startRoleTimer(); // Restart timer
|
|
208
|
-
},
|
|
209
|
-
10 * 60 * 1000,
|
|
210
|
-
); // 10 minutes
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
switchRoles() {
|
|
214
|
-
const oldRole = this.currentRole;
|
|
215
|
-
this.currentRole = this.currentRole === 'driver' ? 'navigator' : 'driver';
|
|
216
|
-
|
|
217
|
-
console.log('\nš Role Switch!');
|
|
218
|
-
console.log(` Previous role: ${oldRole.toUpperCase()}`);
|
|
219
|
-
console.log(` New role: ${this.currentRole.toUpperCase()}`);
|
|
220
|
-
console.log(' Take a moment to transition...\n');
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
async startInteractiveMode() {
|
|
224
|
-
this.rl = readline.createInterface({
|
|
225
|
-
input: process.stdin,
|
|
226
|
-
output: process.stdout,
|
|
227
|
-
prompt: '\nš» pair> ',
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
console.log('\nš” Interactive mode active. Type /help for commands.\n');
|
|
231
|
-
|
|
232
|
-
this.rl.prompt();
|
|
233
|
-
|
|
234
|
-
this.rl.on('line', async (line) => {
|
|
235
|
-
const input = line.trim();
|
|
236
|
-
|
|
237
|
-
if (input.startsWith('/')) {
|
|
238
|
-
await this.handleCommand(input);
|
|
239
|
-
} else if (input) {
|
|
240
|
-
// Handle regular input as code discussion
|
|
241
|
-
console.log('š¤ AI: Processing your input...');
|
|
242
|
-
// In a real implementation, this would send to AI
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
this.rl.prompt();
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
this.rl.on('close', () => {
|
|
249
|
-
this.end();
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
async handleCommand(command) {
|
|
254
|
-
const [cmd, ...args] = command.split(' ');
|
|
255
|
-
|
|
256
|
-
switch (cmd) {
|
|
257
|
-
case '/help':
|
|
258
|
-
this.showCommands();
|
|
259
|
-
break;
|
|
260
|
-
|
|
261
|
-
case '/switch':
|
|
262
|
-
this.switchRoles();
|
|
263
|
-
break;
|
|
264
|
-
|
|
265
|
-
case '/suggest':
|
|
266
|
-
console.log('š¤ AI Suggestion: Consider using async/await for better readability');
|
|
267
|
-
break;
|
|
268
|
-
|
|
269
|
-
case '/review':
|
|
270
|
-
console.log('š Starting code review...');
|
|
271
|
-
await this.runVerification();
|
|
272
|
-
break;
|
|
273
|
-
|
|
274
|
-
case '/test':
|
|
117
|
+
async startTestWatcher() {
|
|
118
|
+
console.log('\nš§Ŗ Test Watcher Active');
|
|
119
|
+
console.log(' ⢠Tests run on file changes');
|
|
120
|
+
console.log(' ⢠Coverage tracking enabled');
|
|
121
|
+
// Run initial test
|
|
275
122
|
await this.runTests();
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
case '/status':
|
|
283
|
-
await this.showStatus();
|
|
284
|
-
break;
|
|
285
|
-
|
|
286
|
-
case '/metrics':
|
|
287
|
-
this.showMetrics();
|
|
288
|
-
break;
|
|
289
|
-
|
|
290
|
-
case '/commit':
|
|
291
|
-
await this.commitWithVerification();
|
|
292
|
-
break;
|
|
293
|
-
|
|
294
|
-
case '/end':
|
|
295
|
-
case '/exit':
|
|
296
|
-
await this.end();
|
|
297
|
-
process.exit(0);
|
|
298
|
-
break;
|
|
299
|
-
|
|
300
|
-
default:
|
|
301
|
-
console.log(`ā Unknown command: ${cmd}`);
|
|
302
|
-
console.log('š” Type /help for available commands');
|
|
123
|
+
// Watch for file changes (simplified version)
|
|
124
|
+
this.testInterval = setInterval(async ()=>{
|
|
125
|
+
// In a real implementation, this would watch actual file changes
|
|
126
|
+
// For now, we'll just run tests periodically during the session
|
|
127
|
+
}, 60000); // Check every minute
|
|
303
128
|
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
129
|
+
async runTests() {
|
|
130
|
+
console.log('\nš§Ŗ Running tests...');
|
|
131
|
+
try {
|
|
132
|
+
const { stdout } = await execAsync('npm test 2>&1 || true');
|
|
133
|
+
const lines = stdout.split('\n');
|
|
134
|
+
// Parse test results
|
|
135
|
+
const summaryLine = lines.find((l)=>l.includes('Tests:') || l.includes('PASS') || l.includes('FAIL'));
|
|
136
|
+
if (summaryLine) {
|
|
137
|
+
console.log(` ${summaryLine.trim()}`);
|
|
138
|
+
// Extract coverage if available
|
|
139
|
+
const coverageLine = lines.find((l)=>l.includes('Coverage'));
|
|
140
|
+
if (coverageLine) {
|
|
141
|
+
console.log(` ${coverageLine.trim()}`);
|
|
142
|
+
}
|
|
143
|
+
this.testResults.push({
|
|
144
|
+
timestamp: new Date(),
|
|
145
|
+
passed: stdout.includes('PASS'),
|
|
146
|
+
summary: summaryLine
|
|
147
|
+
});
|
|
148
|
+
return stdout.includes('PASS');
|
|
149
|
+
} else {
|
|
150
|
+
console.log(' ā ļø No test results found');
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
} catch (error) {
|
|
154
|
+
console.log(' ā Test execution failed:', error.message);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
321
157
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
158
|
+
startRoleTimer() {
|
|
159
|
+
if (this.mode !== 'switch') return;
|
|
160
|
+
this.roleTimer = setTimeout(()=>{
|
|
161
|
+
this.switchRoles();
|
|
162
|
+
this.startRoleTimer(); // Restart timer
|
|
163
|
+
}, 10 * 60 * 1000); // 10 minutes
|
|
326
164
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
console.log('\nVerification History:');
|
|
335
|
-
this.verificationScores.slice(-5).forEach((score, i) => {
|
|
336
|
-
const bar = 'ā'.repeat(Math.floor(score * 20));
|
|
337
|
-
console.log(` ${i + 1}. ${bar} ${score.toFixed(2)}`);
|
|
338
|
-
});
|
|
165
|
+
switchRoles() {
|
|
166
|
+
const oldRole = this.currentRole;
|
|
167
|
+
this.currentRole = this.currentRole === 'driver' ? 'navigator' : 'driver';
|
|
168
|
+
console.log('\nš Role Switch!');
|
|
169
|
+
console.log(` Previous role: ${oldRole.toUpperCase()}`);
|
|
170
|
+
console.log(` New role: ${this.currentRole.toUpperCase()}`);
|
|
171
|
+
console.log(' Take a moment to transition...\n');
|
|
339
172
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
);
|
|
347
|
-
|
|
173
|
+
async startInteractiveMode() {
|
|
174
|
+
this.rl = readline.createInterface({
|
|
175
|
+
input: process.stdin,
|
|
176
|
+
output: process.stdout,
|
|
177
|
+
prompt: '\nš» pair> '
|
|
178
|
+
});
|
|
179
|
+
console.log('\nš” Interactive mode active. Type /help for commands.\n');
|
|
180
|
+
this.rl.prompt();
|
|
181
|
+
this.rl.on('line', async (line)=>{
|
|
182
|
+
const input = line.trim();
|
|
183
|
+
if (input.startsWith('/')) {
|
|
184
|
+
await this.handleCommand(input);
|
|
185
|
+
} else if (input) {
|
|
186
|
+
// Handle regular input as code discussion
|
|
187
|
+
console.log('š¤ AI: Processing your input...');
|
|
188
|
+
// In a real implementation, this would send to AI
|
|
189
|
+
}
|
|
190
|
+
this.rl.prompt();
|
|
191
|
+
});
|
|
192
|
+
this.rl.on('close', ()=>{
|
|
193
|
+
this.end();
|
|
194
|
+
});
|
|
348
195
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
196
|
+
async handleCommand(command) {
|
|
197
|
+
const [cmd, ...args] = command.split(' ');
|
|
198
|
+
switch(cmd){
|
|
199
|
+
case '/help':
|
|
200
|
+
this.showCommands();
|
|
201
|
+
break;
|
|
202
|
+
case '/switch':
|
|
203
|
+
this.switchRoles();
|
|
204
|
+
break;
|
|
205
|
+
case '/suggest':
|
|
206
|
+
console.log('š¤ AI Suggestion: Consider using async/await for better readability');
|
|
207
|
+
break;
|
|
208
|
+
case '/review':
|
|
209
|
+
console.log('š Starting code review...');
|
|
210
|
+
await this.runVerification();
|
|
211
|
+
break;
|
|
212
|
+
case '/test':
|
|
213
|
+
await this.runTests();
|
|
214
|
+
break;
|
|
215
|
+
case '/verify':
|
|
216
|
+
await this.runVerification();
|
|
217
|
+
break;
|
|
218
|
+
case '/status':
|
|
219
|
+
await this.showStatus();
|
|
220
|
+
break;
|
|
221
|
+
case '/metrics':
|
|
222
|
+
this.showMetrics();
|
|
223
|
+
break;
|
|
224
|
+
case '/commit':
|
|
225
|
+
await this.commitWithVerification();
|
|
226
|
+
break;
|
|
227
|
+
case '/end':
|
|
228
|
+
case '/exit':
|
|
229
|
+
await this.end();
|
|
230
|
+
process.exit(0);
|
|
231
|
+
break;
|
|
232
|
+
default:
|
|
233
|
+
console.log(`ā Unknown command: ${cmd}`);
|
|
234
|
+
console.log('š” Type /help for available commands');
|
|
235
|
+
}
|
|
361
236
|
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
console.log('\n⨠Session Complete!');
|
|
380
|
-
console.log('ā'.repeat(40));
|
|
381
|
-
console.log(`Duration: ${duration} minutes`);
|
|
382
|
-
|
|
383
|
-
if (this.verificationScores.length > 0) {
|
|
384
|
-
const avgScore =
|
|
385
|
-
this.verificationScores.reduce((a, b) => a + b, 0) / this.verificationScores.length;
|
|
386
|
-
console.log(`Average Verification: ${avgScore.toFixed(2)}`);
|
|
237
|
+
async showStatus() {
|
|
238
|
+
const duration = Math.floor((Date.now() - this.startTime) / 1000 / 60);
|
|
239
|
+
console.log('\nš Session Status');
|
|
240
|
+
console.log('ā'.repeat(40));
|
|
241
|
+
console.log(`Session ID: ${this.sessionId}`);
|
|
242
|
+
console.log(`Duration: ${duration} minutes`);
|
|
243
|
+
console.log(`Current Role: ${this.currentRole.toUpperCase()}`);
|
|
244
|
+
console.log(`Mode: ${this.mode}`);
|
|
245
|
+
console.log(`Status: ${this.status}`);
|
|
246
|
+
if (this.verify && this.verificationScores.length > 0) {
|
|
247
|
+
const avgScore = this.verificationScores.reduce((a, b)=>a + b, 0) / this.verificationScores.length;
|
|
248
|
+
console.log(`Average Verification: ${avgScore.toFixed(2)}`);
|
|
249
|
+
}
|
|
250
|
+
if (this.test && this.testResults.length > 0) {
|
|
251
|
+
const passed = this.testResults.filter((r)=>r.passed).length;
|
|
252
|
+
console.log(`Tests Passed: ${passed}/${this.testResults.length}`);
|
|
253
|
+
}
|
|
387
254
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
255
|
+
showMetrics() {
|
|
256
|
+
console.log('\nš Quality Metrics');
|
|
257
|
+
console.log('ā'.repeat(40));
|
|
258
|
+
if (this.verificationScores.length > 0) {
|
|
259
|
+
console.log('\nVerification History:');
|
|
260
|
+
this.verificationScores.slice(-5).forEach((score, i)=>{
|
|
261
|
+
const bar = 'ā'.repeat(Math.floor(score * 20));
|
|
262
|
+
console.log(` ${i + 1}. ${bar} ${score.toFixed(2)}`);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
if (this.testResults.length > 0) {
|
|
266
|
+
console.log('\nTest Results:');
|
|
267
|
+
this.testResults.slice(-5).forEach((result, i)=>{
|
|
268
|
+
console.log(` ${i + 1}. ${result.passed ? 'ā
' : 'ā'} ${new Date(result.timestamp).toLocaleTimeString()}`);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
392
271
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
}
|
|
421
|
-
|
|
272
|
+
async commitWithVerification() {
|
|
273
|
+
console.log('\nš Pre-commit verification...');
|
|
274
|
+
const score = await this.runVerification();
|
|
275
|
+
if (score >= this.threshold) {
|
|
276
|
+
console.log('ā
Verification passed! Ready to commit.');
|
|
277
|
+
console.log('š” Run: git commit -m "your message"');
|
|
278
|
+
} else {
|
|
279
|
+
console.log('ā Verification failed! Please fix issues before committing.');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async end() {
|
|
283
|
+
console.log('\nš Ending pair programming session...');
|
|
284
|
+
// Clear intervals
|
|
285
|
+
if (this.verificationInterval) clearInterval(this.verificationInterval);
|
|
286
|
+
if (this.testInterval) clearInterval(this.testInterval);
|
|
287
|
+
if (this.roleTimer) clearTimeout(this.roleTimer);
|
|
288
|
+
if (this.rl) this.rl.close();
|
|
289
|
+
// Update session
|
|
290
|
+
this.status = 'completed';
|
|
291
|
+
await this.saveSession();
|
|
292
|
+
// Show summary
|
|
293
|
+
const duration = Math.floor((Date.now() - this.startTime) / 1000 / 60);
|
|
294
|
+
console.log('\n⨠Session Complete!');
|
|
295
|
+
console.log('ā'.repeat(40));
|
|
296
|
+
console.log(`Duration: ${duration} minutes`);
|
|
297
|
+
if (this.verificationScores.length > 0) {
|
|
298
|
+
const avgScore = this.verificationScores.reduce((a, b)=>a + b, 0) / this.verificationScores.length;
|
|
299
|
+
console.log(`Average Verification: ${avgScore.toFixed(2)}`);
|
|
300
|
+
}
|
|
301
|
+
if (this.testResults.length > 0) {
|
|
302
|
+
const passed = this.testResults.filter((r)=>r.passed).length;
|
|
303
|
+
console.log(`Test Success Rate: ${(passed / this.testResults.length * 100).toFixed(0)}%`);
|
|
304
|
+
}
|
|
305
|
+
console.log('\nš Thanks for pair programming!\n');
|
|
306
|
+
}
|
|
307
|
+
async saveSession() {
|
|
308
|
+
const sessionPath = '.claude-flow/sessions/pair';
|
|
309
|
+
await fs.mkdir(sessionPath, {
|
|
310
|
+
recursive: true
|
|
311
|
+
});
|
|
312
|
+
const sessionData = {
|
|
313
|
+
id: this.sessionId,
|
|
314
|
+
mode: this.mode,
|
|
315
|
+
agent: this.agent,
|
|
316
|
+
verify: this.verify,
|
|
317
|
+
test: this.test,
|
|
318
|
+
threshold: this.threshold,
|
|
319
|
+
startTime: this.startTime.toISOString(),
|
|
320
|
+
status: this.status,
|
|
321
|
+
currentRole: this.currentRole,
|
|
322
|
+
verificationScores: this.verificationScores,
|
|
323
|
+
testResults: this.testResults
|
|
324
|
+
};
|
|
325
|
+
await fs.writeFile(path.join(sessionPath, `${this.sessionId}.json`), JSON.stringify(sessionData, null, 2));
|
|
326
|
+
}
|
|
327
|
+
constructor(options = {}){
|
|
328
|
+
this.sessionId = `pair_${Date.now()}`;
|
|
329
|
+
this.mode = options.mode || 'switch';
|
|
330
|
+
this.agent = options.agent || 'auto';
|
|
331
|
+
this.verify = options.verify || false;
|
|
332
|
+
this.test = options.test || false;
|
|
333
|
+
this.threshold = options.threshold || 0.95;
|
|
334
|
+
this.startTime = new Date();
|
|
335
|
+
this.status = 'active';
|
|
336
|
+
this.currentRole = 'driver';
|
|
337
|
+
this.verificationScores = [];
|
|
338
|
+
this.testResults = [];
|
|
339
|
+
this.fileWatchers = new Map();
|
|
340
|
+
this.rl = null;
|
|
341
|
+
}
|
|
342
|
+
};
|
|
422
343
|
async function pairCommand(args = [], flags = {}) {
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
344
|
+
console.log('\nš„ Pair Programming Session');
|
|
345
|
+
console.log('ā'.repeat(50));
|
|
346
|
+
// Handle help flag
|
|
347
|
+
if (flags.help || args.includes('--help')) {
|
|
348
|
+
showHelp();
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
// Handle background execution
|
|
352
|
+
if (flags.background || flags.bg) {
|
|
353
|
+
return startBackgroundSession(args, flags);
|
|
354
|
+
}
|
|
355
|
+
// Handle start flag
|
|
356
|
+
if (flags.start) {
|
|
357
|
+
const session = new PairProgrammingSession({
|
|
358
|
+
mode: flags.mode || 'switch',
|
|
359
|
+
agent: flags.agent || 'auto',
|
|
360
|
+
verify: flags.verify || false,
|
|
361
|
+
test: flags.test || false,
|
|
362
|
+
threshold: parseFloat(flags.threshold) || 0.95
|
|
363
|
+
});
|
|
364
|
+
return await session.start();
|
|
365
|
+
}
|
|
366
|
+
// Handle status flag
|
|
367
|
+
if (flags.status) {
|
|
368
|
+
return showSessionStatus();
|
|
369
|
+
}
|
|
370
|
+
// Handle end flag
|
|
371
|
+
if (flags.end) {
|
|
372
|
+
return endSession(flags.sessionId || 'current');
|
|
373
|
+
}
|
|
374
|
+
// Default: show help
|
|
428
375
|
showHelp();
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// Handle background execution
|
|
433
|
-
if (flags.background || flags.bg) {
|
|
434
|
-
return startBackgroundSession(args, flags);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// Handle start flag
|
|
438
|
-
if (flags.start) {
|
|
439
|
-
const session = new PairProgrammingSession({
|
|
440
|
-
mode: flags.mode || 'switch',
|
|
441
|
-
agent: flags.agent || 'auto',
|
|
442
|
-
verify: flags.verify || false,
|
|
443
|
-
test: flags.test || false,
|
|
444
|
-
threshold: parseFloat(flags.threshold) || 0.95,
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
return await session.start();
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
// Handle status flag
|
|
451
|
-
if (flags.status) {
|
|
452
|
-
return showSessionStatus();
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// Handle end flag
|
|
456
|
-
if (flags.end) {
|
|
457
|
-
return endSession(flags.sessionId || 'current');
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// Default: show help
|
|
461
|
-
showHelp();
|
|
462
376
|
}
|
|
463
|
-
|
|
464
377
|
function showHelp() {
|
|
465
|
-
|
|
378
|
+
console.log(`
|
|
466
379
|
š USAGE:
|
|
467
380
|
claude-flow-novice pair [options]
|
|
468
381
|
|
|
@@ -510,114 +423,88 @@ function showHelp() {
|
|
|
510
423
|
.claude/commands/pair/README.md
|
|
511
424
|
`);
|
|
512
425
|
}
|
|
513
|
-
|
|
514
426
|
async function startBackgroundSession(args, flags) {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
child.unref();
|
|
532
|
-
|
|
533
|
-
const pid = child.pid;
|
|
534
|
-
console.log(`ā
Background session started (PID: ${pid})`);
|
|
535
|
-
console.log('\nš Monitor with: claude-flow-novice pair --status');
|
|
536
|
-
console.log('š Stop with: claude-flow-novice pair --end\n');
|
|
427
|
+
console.log('\nš Starting pair session in background...');
|
|
428
|
+
const child = spawn(process.argv[0], [
|
|
429
|
+
process.argv[1],
|
|
430
|
+
'pair',
|
|
431
|
+
'--start',
|
|
432
|
+
...args.filter((arg)=>arg !== '--background' && arg !== '--bg')
|
|
433
|
+
], {
|
|
434
|
+
detached: true,
|
|
435
|
+
stdio: 'ignore'
|
|
436
|
+
});
|
|
437
|
+
child.unref();
|
|
438
|
+
const pid = child.pid;
|
|
439
|
+
console.log(`ā
Background session started (PID: ${pid})`);
|
|
440
|
+
console.log('\nš Monitor with: claude-flow-novice pair --status');
|
|
441
|
+
console.log('š Stop with: claude-flow-novice pair --end\n');
|
|
537
442
|
}
|
|
538
|
-
|
|
539
443
|
async function showSessionStatus() {
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
console.log(` Avg Verification: ${avgScore.toFixed(2)}`);
|
|
574
|
-
}
|
|
444
|
+
try {
|
|
445
|
+
const sessionPath = '.claude-flow/sessions/pair';
|
|
446
|
+
const files = await fs.readdir(sessionPath);
|
|
447
|
+
const sessions = [];
|
|
448
|
+
for (const file of files){
|
|
449
|
+
if (file.endsWith('.json')) {
|
|
450
|
+
const data = await fs.readFile(path.join(sessionPath, file), 'utf8');
|
|
451
|
+
sessions.push(JSON.parse(data));
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (sessions.length === 0) {
|
|
455
|
+
console.log('\nā No active pair programming sessions\n');
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
console.log('\nš Pair Programming Sessions:');
|
|
459
|
+
console.log('ā'.repeat(50));
|
|
460
|
+
for (const session of sessions.filter((s)=>s.status === 'active')){
|
|
461
|
+
const duration = Math.floor((Date.now() - new Date(session.startTime).getTime()) / 1000 / 60);
|
|
462
|
+
console.log(`\nš¹ Session: ${session.id}`);
|
|
463
|
+
console.log(` Mode: ${session.mode}`);
|
|
464
|
+
console.log(` Agent: ${session.agent}`);
|
|
465
|
+
console.log(` Duration: ${duration} minutes`);
|
|
466
|
+
console.log(` Status: ${session.status}`);
|
|
467
|
+
console.log(` Verification: ${session.verify ? 'ā
' : 'ā'}`);
|
|
468
|
+
console.log(` Testing: ${session.test ? 'ā
' : 'ā'}`);
|
|
469
|
+
if (session.verificationScores && session.verificationScores.length > 0) {
|
|
470
|
+
const avgScore = session.verificationScores.reduce((a, b)=>a + b, 0) / session.verificationScores.length;
|
|
471
|
+
console.log(` Avg Verification: ${avgScore.toFixed(2)}`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
console.log('ā'.repeat(50));
|
|
475
|
+
} catch (error) {
|
|
476
|
+
console.log('\nā No active pair programming sessions\n');
|
|
575
477
|
}
|
|
576
|
-
|
|
577
|
-
console.log('ā'.repeat(50));
|
|
578
|
-
} catch (error) {
|
|
579
|
-
console.log('\nā No active pair programming sessions\n');
|
|
580
|
-
}
|
|
581
478
|
}
|
|
582
|
-
|
|
583
479
|
async function endSession(sessionId) {
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
480
|
+
console.log(`\nš Ending pair programming session: ${sessionId}`);
|
|
481
|
+
try {
|
|
482
|
+
const sessionPath = '.claude-flow/sessions/pair';
|
|
483
|
+
if (sessionId === 'current') {
|
|
484
|
+
// End most recent active session
|
|
485
|
+
const files = await fs.readdir(sessionPath);
|
|
486
|
+
for (const file of files.filter((f)=>f.endsWith('.json'))){
|
|
487
|
+
const data = await fs.readFile(path.join(sessionPath, file), 'utf8');
|
|
488
|
+
const session = JSON.parse(data);
|
|
489
|
+
if (session.status === 'active') {
|
|
490
|
+
sessionId = session.id;
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
598
494
|
}
|
|
599
|
-
|
|
495
|
+
const sessionFile = path.join(sessionPath, `${sessionId}.json`);
|
|
496
|
+
const data = await fs.readFile(sessionFile, 'utf8');
|
|
497
|
+
const session = JSON.parse(data);
|
|
498
|
+
session.status = 'completed';
|
|
499
|
+
session.endTime = new Date().toISOString();
|
|
500
|
+
await fs.writeFile(sessionFile, JSON.stringify(session, null, 2));
|
|
501
|
+
console.log('ā
Session ended successfully');
|
|
502
|
+
console.log(`\nš Session Summary:`);
|
|
503
|
+
console.log(` Duration: ${Math.floor((new Date(session.endTime) - new Date(session.startTime)) / 1000 / 60)} minutes`);
|
|
504
|
+
console.log(` Mode: ${session.mode}`);
|
|
505
|
+
console.log(` Agent: ${session.agent}\n`);
|
|
506
|
+
} catch (error) {
|
|
507
|
+
console.log('ā Failed to end session:', error.message);
|
|
600
508
|
}
|
|
601
|
-
|
|
602
|
-
const sessionFile = path.join(sessionPath, `${sessionId}.json`);
|
|
603
|
-
const data = await fs.readFile(sessionFile, 'utf8');
|
|
604
|
-
const session = JSON.parse(data);
|
|
605
|
-
|
|
606
|
-
session.status = 'completed';
|
|
607
|
-
session.endTime = new Date().toISOString();
|
|
608
|
-
|
|
609
|
-
await fs.writeFile(sessionFile, JSON.stringify(session, null, 2));
|
|
610
|
-
|
|
611
|
-
console.log('ā
Session ended successfully');
|
|
612
|
-
console.log(`\nš Session Summary:`);
|
|
613
|
-
console.log(
|
|
614
|
-
` Duration: ${Math.floor((new Date(session.endTime) - new Date(session.startTime)) / 1000 / 60)} minutes`,
|
|
615
|
-
);
|
|
616
|
-
console.log(` Mode: ${session.mode}`);
|
|
617
|
-
console.log(` Agent: ${session.agent}\n`);
|
|
618
|
-
} catch (error) {
|
|
619
|
-
console.log('ā Failed to end session:', error.message);
|
|
620
|
-
}
|
|
621
509
|
}
|
|
622
|
-
|
|
623
510
|
export default pairCommand;
|