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,584 +1,481 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Optimized Pair Programming Command
|
|
3
3
|
* Interactive pair programming with intelligent verification
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import { promisify } from 'util';
|
|
10
|
-
import readline from 'readline';
|
|
11
|
-
import { watch } from 'fs';
|
|
12
|
-
|
|
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";
|
|
13
9
|
const execAsync = promisify(exec);
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
this.rl = null;
|
|
31
|
-
this.lastVerificationTime = 0;
|
|
32
|
-
this.verificationCooldown = 60000; // 1 minute cooldown between auto-verifications
|
|
33
|
-
this.isVerifying = false; // Prevent concurrent verifications
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async start() {
|
|
37
|
-
await this.saveSession();
|
|
38
|
-
this.showWelcome();
|
|
39
|
-
|
|
40
|
-
if (this.verify) {
|
|
41
|
-
this.showVerificationSettings();
|
|
42
|
-
|
|
43
|
-
// Only run initial verification once
|
|
44
|
-
if (this.autoVerify) {
|
|
45
|
-
console.log('\nš Running initial verification...');
|
|
46
|
-
await this.runVerification();
|
|
47
|
-
}
|
|
10
|
+
let PairProgrammingSession = class PairProgrammingSession {
|
|
11
|
+
async start() {
|
|
12
|
+
await this.saveSession();
|
|
13
|
+
this.showWelcome();
|
|
14
|
+
if (this.verify) {
|
|
15
|
+
this.showVerificationSettings();
|
|
16
|
+
// Only run initial verification once
|
|
17
|
+
if (this.autoVerify) {
|
|
18
|
+
console.log('\nš Running initial verification...');
|
|
19
|
+
await this.runVerification();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (this.test) {
|
|
23
|
+
await this.setupTestWatcher();
|
|
24
|
+
}
|
|
25
|
+
await this.startInteractiveMode();
|
|
48
26
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
27
|
+
showWelcome() {
|
|
28
|
+
console.log('\nš Starting Pair Programming Session');
|
|
29
|
+
console.log('ā'.repeat(50));
|
|
30
|
+
console.log(`Session ID: ${this.sessionId}`);
|
|
31
|
+
console.log(`Mode: ${this.mode}`);
|
|
32
|
+
console.log(`Agent: ${this.agent}`);
|
|
33
|
+
console.log(`Verification: ${this.verify ? 'ā
Enabled' : 'ā Disabled'}`);
|
|
34
|
+
console.log(`Auto-Verify: ${this.autoVerify ? 'ā
Enabled' : 'ā Disabled'}`);
|
|
35
|
+
console.log(`Testing: ${this.test ? 'ā
Enabled' : 'ā Disabled'}`);
|
|
36
|
+
console.log('ā'.repeat(50));
|
|
37
|
+
// Show mode details
|
|
38
|
+
switch(this.mode){
|
|
39
|
+
case 'driver':
|
|
40
|
+
console.log('\nš¤ You are the DRIVER - Write code while AI assists');
|
|
41
|
+
console.log('š¤ AI is the NAVIGATOR - Providing guidance and suggestions');
|
|
42
|
+
break;
|
|
43
|
+
case 'navigator':
|
|
44
|
+
console.log('\nš¤ AI is the DRIVER - Writing code based on your guidance');
|
|
45
|
+
console.log('š¤ You are the NAVIGATOR - Providing high-level direction');
|
|
46
|
+
break;
|
|
47
|
+
case 'switch':
|
|
48
|
+
console.log('\nš SWITCH MODE - Roles alternate every 10 minutes');
|
|
49
|
+
console.log(`š¤ Current role: ${this.currentRole.toUpperCase()} (you)`);
|
|
50
|
+
console.log('š¤ AI role: ' + (this.currentRole === 'driver' ? 'NAVIGATOR' : 'DRIVER'));
|
|
51
|
+
this.startRoleTimer();
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
this.showCommands();
|
|
52
55
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
// Show mode details
|
|
69
|
-
switch (this.mode) {
|
|
70
|
-
case 'driver':
|
|
71
|
-
console.log('\nš¤ You are the DRIVER - Write code while AI assists');
|
|
72
|
-
console.log('š¤ AI is the NAVIGATOR - Providing guidance and suggestions');
|
|
73
|
-
break;
|
|
74
|
-
case 'navigator':
|
|
75
|
-
console.log('\nš¤ AI is the DRIVER - Writing code based on your guidance');
|
|
76
|
-
console.log('š¤ You are the NAVIGATOR - Providing high-level direction');
|
|
77
|
-
break;
|
|
78
|
-
case 'switch':
|
|
79
|
-
console.log('\nš SWITCH MODE - Roles alternate every 10 minutes');
|
|
80
|
-
console.log(`š¤ Current role: ${this.currentRole.toUpperCase()} (you)`);
|
|
81
|
-
console.log('š¤ AI role: ' + (this.currentRole === 'driver' ? 'NAVIGATOR' : 'DRIVER'));
|
|
82
|
-
this.startRoleTimer();
|
|
83
|
-
break;
|
|
56
|
+
showCommands() {
|
|
57
|
+
console.log('\nš Session Commands:');
|
|
58
|
+
console.log(' /help - Show available commands');
|
|
59
|
+
console.log(' /switch - Switch driver/navigator roles');
|
|
60
|
+
console.log(' /suggest - Get AI suggestions');
|
|
61
|
+
console.log(' /review - Request code review');
|
|
62
|
+
console.log(' /test - Run tests manually');
|
|
63
|
+
console.log(' /verify - Run verification check');
|
|
64
|
+
console.log(' /status - Show session status');
|
|
65
|
+
console.log(' /metrics - Show quality metrics');
|
|
66
|
+
console.log(' /auto - Toggle auto-verification');
|
|
67
|
+
console.log(' /watch - Toggle file watching');
|
|
68
|
+
console.log(' /commit - Commit with verification');
|
|
69
|
+
console.log(' /end - End session');
|
|
70
|
+
console.log(' /exit - Exit (same as /end)');
|
|
84
71
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
console.log(' /review - Request code review');
|
|
95
|
-
console.log(' /test - Run tests manually');
|
|
96
|
-
console.log(' /verify - Run verification check');
|
|
97
|
-
console.log(' /status - Show session status');
|
|
98
|
-
console.log(' /metrics - Show quality metrics');
|
|
99
|
-
console.log(' /auto - Toggle auto-verification');
|
|
100
|
-
console.log(' /watch - Toggle file watching');
|
|
101
|
-
console.log(' /commit - Commit with verification');
|
|
102
|
-
console.log(' /end - End session');
|
|
103
|
-
console.log(' /exit - Exit (same as /end)');
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
showVerificationSettings() {
|
|
107
|
-
console.log('\nā
Verification Settings:');
|
|
108
|
-
console.log(` ⢠Threshold: ${this.threshold}`);
|
|
109
|
-
console.log(` ⢠Auto-verify: ${this.autoVerify ? 'Enabled' : 'Disabled'}`);
|
|
110
|
-
console.log(` ⢠Manual verify: Always available via /verify`);
|
|
111
|
-
|
|
112
|
-
if (this.autoVerify) {
|
|
113
|
-
console.log(` ⢠Cooldown: ${this.verificationCooldown / 1000}s between checks`);
|
|
114
|
-
console.log(' ⢠Use /auto to toggle automatic verification');
|
|
72
|
+
showVerificationSettings() {
|
|
73
|
+
console.log('\nā
Verification Settings:');
|
|
74
|
+
console.log(` ⢠Threshold: ${this.threshold}`);
|
|
75
|
+
console.log(` ⢠Auto-verify: ${this.autoVerify ? 'Enabled' : 'Disabled'}`);
|
|
76
|
+
console.log(` ⢠Manual verify: Always available via /verify`);
|
|
77
|
+
if (this.autoVerify) {
|
|
78
|
+
console.log(` ⢠Cooldown: ${this.verificationCooldown / 1000}s between checks`);
|
|
79
|
+
console.log(' ⢠Use /auto to toggle automatic verification');
|
|
80
|
+
}
|
|
115
81
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
82
|
+
async runVerification() {
|
|
83
|
+
// Prevent concurrent verifications
|
|
84
|
+
if (this.isVerifying) {
|
|
85
|
+
console.log('ā³ Verification already in progress...');
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// Check cooldown for automatic verifications
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
if (this.autoVerify && now - this.lastVerificationTime < this.verificationCooldown) {
|
|
91
|
+
const remaining = Math.ceil((this.verificationCooldown - (now - this.lastVerificationTime)) / 1000);
|
|
92
|
+
console.log(`ā±ļø Verification cooldown: ${remaining}s remaining`);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
this.isVerifying = true;
|
|
96
|
+
this.lastVerificationTime = now;
|
|
97
|
+
console.log('\nš Running verification check...');
|
|
98
|
+
const checks = [
|
|
99
|
+
{
|
|
100
|
+
name: 'Type Check',
|
|
101
|
+
command: 'npm run typecheck 2>&1 || true',
|
|
102
|
+
weight: 0.4
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'Linting',
|
|
106
|
+
command: 'npm run lint 2>&1 || true',
|
|
107
|
+
weight: 0.3
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'Build',
|
|
111
|
+
command: 'npm run build 2>&1 || true',
|
|
112
|
+
weight: 0.3
|
|
113
|
+
}
|
|
114
|
+
];
|
|
115
|
+
let totalScore = 0;
|
|
116
|
+
let totalWeight = 0;
|
|
117
|
+
const results = [];
|
|
118
|
+
for (const check of checks){
|
|
119
|
+
try {
|
|
120
|
+
const { stdout, stderr } = await execAsync(check.command);
|
|
121
|
+
const output = stdout + stderr;
|
|
122
|
+
// More intelligent scoring based on actual output
|
|
123
|
+
let score = 1.0;
|
|
124
|
+
if (output.toLowerCase().includes('error')) {
|
|
125
|
+
const errorCount = (output.match(/error/gi) || []).length;
|
|
126
|
+
score = Math.max(0.2, 1.0 - errorCount * 0.1); // Deduct 0.1 per error, minimum 0.2
|
|
127
|
+
} else if (output.toLowerCase().includes('warning')) {
|
|
128
|
+
const warningCount = (output.match(/warning/gi) || []).length;
|
|
129
|
+
score = Math.max(0.7, 1.0 - warningCount * 0.05); // Deduct 0.05 per warning, minimum 0.7
|
|
130
|
+
}
|
|
131
|
+
totalScore += score * check.weight;
|
|
132
|
+
totalWeight += check.weight;
|
|
133
|
+
const icon = score >= 0.8 ? 'ā
' : score >= 0.5 ? 'ā ļø' : 'ā';
|
|
134
|
+
console.log(` ${icon} ${check.name}: ${score.toFixed(2)}`);
|
|
135
|
+
results.push({
|
|
136
|
+
name: check.name,
|
|
137
|
+
score,
|
|
138
|
+
output: output.slice(0, 200)
|
|
139
|
+
});
|
|
140
|
+
} catch (error) {
|
|
141
|
+
console.log(` ā ${check.name}: 0.00 (failed to run)`);
|
|
142
|
+
results.push({
|
|
143
|
+
name: check.name,
|
|
144
|
+
score: 0,
|
|
145
|
+
error: error.message
|
|
146
|
+
});
|
|
147
|
+
totalWeight += check.weight;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const averageScore = totalWeight > 0 ? totalScore / totalWeight : 0;
|
|
151
|
+
this.verificationScores.push({
|
|
152
|
+
score: averageScore,
|
|
153
|
+
timestamp: now,
|
|
154
|
+
results
|
|
155
|
+
});
|
|
156
|
+
console.log(`\nš Verification Score: ${averageScore.toFixed(2)}/${this.threshold}`);
|
|
157
|
+
if (averageScore < this.threshold) {
|
|
158
|
+
console.log('ā ļø Verification threshold not met');
|
|
159
|
+
// Only show detailed help if score is very low
|
|
160
|
+
if (averageScore < 0.5) {
|
|
161
|
+
console.log('\nš” Suggestions:');
|
|
162
|
+
console.log(' ⢠Run /test to check test failures');
|
|
163
|
+
console.log(' ⢠Check TypeScript errors with npm run typecheck');
|
|
164
|
+
console.log(' ⢠Fix linting issues with npm run lint --fix');
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
console.log('ā
Verification passed!');
|
|
168
|
+
}
|
|
169
|
+
this.isVerifying = false;
|
|
170
|
+
return averageScore;
|
|
123
171
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
(this.verificationCooldown - (now - this.lastVerificationTime)) / 1000,
|
|
130
|
-
);
|
|
131
|
-
console.log(`ā±ļø Verification cooldown: ${remaining}s remaining`);
|
|
132
|
-
return null;
|
|
172
|
+
async setupTestWatcher() {
|
|
173
|
+
console.log('\nš§Ŗ Test Configuration:');
|
|
174
|
+
console.log(' ⢠Manual testing via /test command');
|
|
175
|
+
console.log(' ⢠File watching available via /watch');
|
|
176
|
+
// Don't automatically run tests, wait for user command
|
|
133
177
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
let score = 1.0;
|
|
169
|
-
|
|
170
|
-
if (output.toLowerCase().includes('error')) {
|
|
171
|
-
const errorCount = (output.match(/error/gi) || []).length;
|
|
172
|
-
score = Math.max(0.2, 1.0 - errorCount * 0.1); // Deduct 0.1 per error, minimum 0.2
|
|
173
|
-
} else if (output.toLowerCase().includes('warning')) {
|
|
174
|
-
const warningCount = (output.match(/warning/gi) || []).length;
|
|
175
|
-
score = Math.max(0.7, 1.0 - warningCount * 0.05); // Deduct 0.05 per warning, minimum 0.7
|
|
178
|
+
async runTests() {
|
|
179
|
+
console.log('\nš§Ŗ Running tests...');
|
|
180
|
+
try {
|
|
181
|
+
const { stdout, stderr } = await execAsync('npm test 2>&1 || true');
|
|
182
|
+
const output = stdout + stderr;
|
|
183
|
+
const lines = output.split('\n');
|
|
184
|
+
// Parse test results more intelligently
|
|
185
|
+
const passLine = lines.find((l)=>l.includes('passed'));
|
|
186
|
+
const failLine = lines.find((l)=>l.includes('failed'));
|
|
187
|
+
const suitesLine = lines.find((l)=>l.includes('Test Suites:'));
|
|
188
|
+
let passed = false;
|
|
189
|
+
let summary = 'No test results found';
|
|
190
|
+
if (suitesLine) {
|
|
191
|
+
summary = suitesLine.trim();
|
|
192
|
+
passed = !suitesLine.includes('failed');
|
|
193
|
+
} else if (passLine || failLine) {
|
|
194
|
+
summary = (passLine || failLine).trim();
|
|
195
|
+
passed = !!passLine && !failLine;
|
|
196
|
+
}
|
|
197
|
+
console.log(` ${passed ? 'ā
' : 'ā'} ${summary}`);
|
|
198
|
+
// Extract coverage if available
|
|
199
|
+
const coverageLine = lines.find((l)=>l.includes('Coverage') || l.includes('Statements'));
|
|
200
|
+
if (coverageLine) {
|
|
201
|
+
console.log(` š ${coverageLine.trim()}`);
|
|
202
|
+
}
|
|
203
|
+
this.testResults.push({
|
|
204
|
+
timestamp: new Date(),
|
|
205
|
+
passed,
|
|
206
|
+
summary
|
|
207
|
+
});
|
|
208
|
+
return passed;
|
|
209
|
+
} catch (error) {
|
|
210
|
+
console.log(' ā Test execution failed:', error.message);
|
|
211
|
+
return false;
|
|
176
212
|
}
|
|
177
|
-
|
|
178
|
-
totalScore += score * check.weight;
|
|
179
|
-
totalWeight += check.weight;
|
|
180
|
-
|
|
181
|
-
const icon = score >= 0.8 ? 'ā
' : score >= 0.5 ? 'ā ļø' : 'ā';
|
|
182
|
-
console.log(` ${icon} ${check.name}: ${score.toFixed(2)}`);
|
|
183
|
-
|
|
184
|
-
results.push({ name: check.name, score, output: output.slice(0, 200) });
|
|
185
|
-
} catch (error) {
|
|
186
|
-
console.log(` ā ${check.name}: 0.00 (failed to run)`);
|
|
187
|
-
results.push({ name: check.name, score: 0, error: error.message });
|
|
188
|
-
totalWeight += check.weight;
|
|
189
|
-
}
|
|
190
213
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (averageScore < this.threshold) {
|
|
198
|
-
console.log('ā ļø Verification threshold not met');
|
|
199
|
-
|
|
200
|
-
// Only show detailed help if score is very low
|
|
201
|
-
if (averageScore < 0.5) {
|
|
202
|
-
console.log('\nš” Suggestions:');
|
|
203
|
-
console.log(' ⢠Run /test to check test failures');
|
|
204
|
-
console.log(' ⢠Check TypeScript errors with npm run typecheck');
|
|
205
|
-
console.log(' ⢠Fix linting issues with npm run lint --fix');
|
|
206
|
-
}
|
|
207
|
-
} else {
|
|
208
|
-
console.log('ā
Verification passed!');
|
|
214
|
+
startRoleTimer() {
|
|
215
|
+
if (this.mode !== 'switch') return;
|
|
216
|
+
this.roleTimer = setTimeout(()=>{
|
|
217
|
+
this.switchRoles();
|
|
218
|
+
this.startRoleTimer(); // Restart timer
|
|
219
|
+
}, 10 * 60 * 1000); // 10 minutes
|
|
209
220
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
console.log(' ⢠Manual testing via /test command');
|
|
218
|
-
console.log(' ⢠File watching available via /watch');
|
|
219
|
-
|
|
220
|
-
// Don't automatically run tests, wait for user command
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
async runTests() {
|
|
224
|
-
console.log('\nš§Ŗ Running tests...');
|
|
225
|
-
|
|
226
|
-
try {
|
|
227
|
-
const { stdout, stderr } = await execAsync('npm test 2>&1 || true');
|
|
228
|
-
const output = stdout + stderr;
|
|
229
|
-
const lines = output.split('\n');
|
|
230
|
-
|
|
231
|
-
// Parse test results more intelligently
|
|
232
|
-
const passLine = lines.find((l) => l.includes('passed'));
|
|
233
|
-
const failLine = lines.find((l) => l.includes('failed'));
|
|
234
|
-
const suitesLine = lines.find((l) => l.includes('Test Suites:'));
|
|
235
|
-
|
|
236
|
-
let passed = false;
|
|
237
|
-
let summary = 'No test results found';
|
|
238
|
-
|
|
239
|
-
if (suitesLine) {
|
|
240
|
-
summary = suitesLine.trim();
|
|
241
|
-
passed = !suitesLine.includes('failed');
|
|
242
|
-
} else if (passLine || failLine) {
|
|
243
|
-
summary = (passLine || failLine).trim();
|
|
244
|
-
passed = !!passLine && !failLine;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
console.log(` ${passed ? 'ā
' : 'ā'} ${summary}`);
|
|
248
|
-
|
|
249
|
-
// Extract coverage if available
|
|
250
|
-
const coverageLine = lines.find((l) => l.includes('Coverage') || l.includes('Statements'));
|
|
251
|
-
if (coverageLine) {
|
|
252
|
-
console.log(` š ${coverageLine.trim()}`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
this.testResults.push({
|
|
256
|
-
timestamp: new Date(),
|
|
257
|
-
passed,
|
|
258
|
-
summary,
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
return passed;
|
|
262
|
-
} catch (error) {
|
|
263
|
-
console.log(' ā Test execution failed:', error.message);
|
|
264
|
-
return false;
|
|
221
|
+
switchRoles() {
|
|
222
|
+
const oldRole = this.currentRole;
|
|
223
|
+
this.currentRole = this.currentRole === 'driver' ? 'navigator' : 'driver';
|
|
224
|
+
console.log('\nš Role Switch!');
|
|
225
|
+
console.log(` Previous role: ${oldRole.toUpperCase()}`);
|
|
226
|
+
console.log(` New role: ${this.currentRole.toUpperCase()}`);
|
|
227
|
+
console.log(' Take a moment to transition...\n');
|
|
265
228
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
this.
|
|
274
|
-
this.
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
break;
|
|
341
|
-
|
|
342
|
-
case '/test':
|
|
343
|
-
await this.runTests();
|
|
344
|
-
break;
|
|
345
|
-
|
|
346
|
-
case '/verify':
|
|
347
|
-
await this.runVerification();
|
|
348
|
-
break;
|
|
349
|
-
|
|
350
|
-
case '/status':
|
|
351
|
-
await this.showStatus();
|
|
352
|
-
break;
|
|
353
|
-
|
|
354
|
-
case '/metrics':
|
|
355
|
-
this.showMetrics();
|
|
356
|
-
break;
|
|
357
|
-
|
|
358
|
-
case '/auto':
|
|
359
|
-
this.autoVerify = !this.autoVerify;
|
|
360
|
-
console.log(`\nš Auto-verification ${this.autoVerify ? 'enabled' : 'disabled'}`);
|
|
361
|
-
if (this.autoVerify) {
|
|
362
|
-
console.log(` Cooldown: ${this.verificationCooldown / 1000}s between checks`);
|
|
229
|
+
async startInteractiveMode() {
|
|
230
|
+
this.rl = readline.createInterface({
|
|
231
|
+
input: process.stdin,
|
|
232
|
+
output: process.stdout,
|
|
233
|
+
prompt: '\nš» pair> '
|
|
234
|
+
});
|
|
235
|
+
console.log('\nš” Interactive mode active. Type /help for commands.\n');
|
|
236
|
+
this.rl.prompt();
|
|
237
|
+
this.rl.on('line', async (line)=>{
|
|
238
|
+
const input = line.trim();
|
|
239
|
+
if (input.startsWith('/')) {
|
|
240
|
+
await this.handleCommand(input);
|
|
241
|
+
} else if (input) {
|
|
242
|
+
// Handle regular input as code discussion
|
|
243
|
+
console.log('š¤ AI: Processing your input...');
|
|
244
|
+
// In a real implementation, this would send to AI
|
|
245
|
+
}
|
|
246
|
+
this.rl.prompt();
|
|
247
|
+
});
|
|
248
|
+
this.rl.on('close', ()=>{
|
|
249
|
+
this.end();
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
async handleCommand(command) {
|
|
253
|
+
const [cmd, ...args] = command.split(' ');
|
|
254
|
+
switch(cmd){
|
|
255
|
+
case '/help':
|
|
256
|
+
this.showCommands();
|
|
257
|
+
break;
|
|
258
|
+
case '/switch':
|
|
259
|
+
this.switchRoles();
|
|
260
|
+
break;
|
|
261
|
+
case '/suggest':
|
|
262
|
+
console.log('š¤ AI Suggestion: Consider using async/await for better readability');
|
|
263
|
+
console.log(' Also check error handling in promise chains');
|
|
264
|
+
break;
|
|
265
|
+
case '/review':
|
|
266
|
+
console.log('š Starting code review...');
|
|
267
|
+
await this.runVerification();
|
|
268
|
+
break;
|
|
269
|
+
case '/test':
|
|
270
|
+
await this.runTests();
|
|
271
|
+
break;
|
|
272
|
+
case '/verify':
|
|
273
|
+
await this.runVerification();
|
|
274
|
+
break;
|
|
275
|
+
case '/status':
|
|
276
|
+
await this.showStatus();
|
|
277
|
+
break;
|
|
278
|
+
case '/metrics':
|
|
279
|
+
this.showMetrics();
|
|
280
|
+
break;
|
|
281
|
+
case '/auto':
|
|
282
|
+
this.autoVerify = !this.autoVerify;
|
|
283
|
+
console.log(`\nš Auto-verification ${this.autoVerify ? 'enabled' : 'disabled'}`);
|
|
284
|
+
if (this.autoVerify) {
|
|
285
|
+
console.log(` Cooldown: ${this.verificationCooldown / 1000}s between checks`);
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
case '/watch':
|
|
289
|
+
console.log('š File watching not yet implemented');
|
|
290
|
+
console.log(' Use /verify or /test for manual checks');
|
|
291
|
+
break;
|
|
292
|
+
case '/commit':
|
|
293
|
+
await this.commitWithVerification();
|
|
294
|
+
break;
|
|
295
|
+
case '/end':
|
|
296
|
+
case '/exit':
|
|
297
|
+
await this.end();
|
|
298
|
+
process.exit(0);
|
|
299
|
+
break;
|
|
300
|
+
default:
|
|
301
|
+
console.log(`ā Unknown command: ${cmd}`);
|
|
302
|
+
console.log('š” Type /help for available commands');
|
|
363
303
|
}
|
|
364
|
-
break;
|
|
365
|
-
|
|
366
|
-
case '/watch':
|
|
367
|
-
console.log('š File watching not yet implemented');
|
|
368
|
-
console.log(' Use /verify or /test for manual checks');
|
|
369
|
-
break;
|
|
370
|
-
|
|
371
|
-
case '/commit':
|
|
372
|
-
await this.commitWithVerification();
|
|
373
|
-
break;
|
|
374
|
-
|
|
375
|
-
case '/end':
|
|
376
|
-
case '/exit':
|
|
377
|
-
await this.end();
|
|
378
|
-
process.exit(0);
|
|
379
|
-
break;
|
|
380
|
-
|
|
381
|
-
default:
|
|
382
|
-
console.log(`ā Unknown command: ${cmd}`);
|
|
383
|
-
console.log('š” Type /help for available commands');
|
|
384
304
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
);
|
|
305
|
+
async showStatus() {
|
|
306
|
+
const duration = Math.floor((Date.now() - this.startTime) / 1000 / 60);
|
|
307
|
+
console.log('\nš Session Status');
|
|
308
|
+
console.log('ā'.repeat(40));
|
|
309
|
+
console.log(`Session ID: ${this.sessionId}`);
|
|
310
|
+
console.log(`Duration: ${duration} minutes`);
|
|
311
|
+
console.log(`Current Role: ${this.currentRole.toUpperCase()}`);
|
|
312
|
+
console.log(`Mode: ${this.mode}`);
|
|
313
|
+
console.log(`Status: ${this.status}`);
|
|
314
|
+
console.log(`Auto-Verify: ${this.autoVerify ? 'Enabled' : 'Disabled'}`);
|
|
315
|
+
if (this.verify && this.verificationScores.length > 0) {
|
|
316
|
+
const recent = this.verificationScores[this.verificationScores.length - 1];
|
|
317
|
+
console.log(`Last Verification: ${recent.score.toFixed(2)} (${new Date(recent.timestamp).toLocaleTimeString()})`);
|
|
318
|
+
}
|
|
319
|
+
if (this.test && this.testResults.length > 0) {
|
|
320
|
+
const passed = this.testResults.filter((r)=>r.passed).length;
|
|
321
|
+
console.log(`Tests Passed: ${passed}/${this.testResults.length}`);
|
|
322
|
+
}
|
|
404
323
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
324
|
+
showMetrics() {
|
|
325
|
+
console.log('\nš Quality Metrics');
|
|
326
|
+
console.log('ā'.repeat(40));
|
|
327
|
+
if (this.verificationScores.length > 0) {
|
|
328
|
+
console.log('\nVerification History:');
|
|
329
|
+
this.verificationScores.slice(-5).forEach((item, i)=>{
|
|
330
|
+
const bar = 'ā'.repeat(Math.floor(item.score * 20));
|
|
331
|
+
const time = new Date(item.timestamp).toLocaleTimeString();
|
|
332
|
+
console.log(` ${i + 1}. ${bar} ${item.score.toFixed(2)} - ${time}`);
|
|
333
|
+
});
|
|
334
|
+
// Show average
|
|
335
|
+
const avg = this.verificationScores.reduce((sum, item)=>sum + item.score, 0) / this.verificationScores.length;
|
|
336
|
+
console.log(`\n Average: ${avg.toFixed(2)}`);
|
|
337
|
+
} else {
|
|
338
|
+
console.log('\n No verification history yet');
|
|
339
|
+
console.log(' Run /verify to check code quality');
|
|
340
|
+
}
|
|
341
|
+
if (this.testResults.length > 0) {
|
|
342
|
+
console.log('\nTest Results:');
|
|
343
|
+
this.testResults.slice(-5).forEach((result, i)=>{
|
|
344
|
+
console.log(` ${i + 1}. ${result.passed ? 'ā
' : 'ā'} ${new Date(result.timestamp).toLocaleTimeString()}`);
|
|
345
|
+
});
|
|
346
|
+
// Show success rate
|
|
347
|
+
const passed = this.testResults.filter((r)=>r.passed).length;
|
|
348
|
+
const rate = (passed / this.testResults.length * 100).toFixed(0);
|
|
349
|
+
console.log(`\n Success Rate: ${rate}%`);
|
|
350
|
+
} else {
|
|
351
|
+
console.log('\n No test history yet');
|
|
352
|
+
console.log(' Run /test to execute test suite');
|
|
353
|
+
}
|
|
409
354
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
console.log('\n No verification history yet');
|
|
431
|
-
console.log(' Run /verify to check code quality');
|
|
355
|
+
async commitWithVerification() {
|
|
356
|
+
console.log('\nš Pre-commit verification...');
|
|
357
|
+
const score = await this.runVerification();
|
|
358
|
+
if (score === null) {
|
|
359
|
+
console.log('ā³ Please wait for cooldown or use /verify manually');
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (score >= this.threshold) {
|
|
363
|
+
console.log('ā
Verification passed! Ready to commit.');
|
|
364
|
+
console.log('\nš” Next steps:');
|
|
365
|
+
console.log(' 1. Review changes: git diff');
|
|
366
|
+
console.log(' 2. Stage files: git add .');
|
|
367
|
+
console.log(' 3. Commit: git commit -m "your message"');
|
|
368
|
+
} else {
|
|
369
|
+
console.log('ā Verification failed!');
|
|
370
|
+
console.log('\nš” Fix issues before committing:');
|
|
371
|
+
console.log(' ⢠Run npm run typecheck to see TypeScript errors');
|
|
372
|
+
console.log(' ⢠Run npm run lint to check code style');
|
|
373
|
+
console.log(' ⢠Run npm run build to verify compilation');
|
|
374
|
+
}
|
|
432
375
|
}
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
376
|
+
async end() {
|
|
377
|
+
console.log('\nš Ending pair programming session...');
|
|
378
|
+
// Clear timers
|
|
379
|
+
if (this.roleTimer) clearTimeout(this.roleTimer);
|
|
380
|
+
if (this.rl) this.rl.close();
|
|
381
|
+
// Update session
|
|
382
|
+
this.status = 'completed';
|
|
383
|
+
await this.saveSession();
|
|
384
|
+
// Show summary
|
|
385
|
+
const duration = Math.floor((Date.now() - this.startTime) / 1000 / 60);
|
|
386
|
+
console.log('\n⨠Session Complete!');
|
|
387
|
+
console.log('ā'.repeat(40));
|
|
388
|
+
console.log(`Duration: ${duration} minutes`);
|
|
389
|
+
if (this.verificationScores.length > 0) {
|
|
390
|
+
const avg = this.verificationScores.reduce((sum, item)=>sum + item.score, 0) / this.verificationScores.length;
|
|
391
|
+
console.log(`Average Verification: ${avg.toFixed(2)}`);
|
|
392
|
+
console.log(`Total Checks: ${this.verificationScores.length}`);
|
|
393
|
+
}
|
|
394
|
+
if (this.testResults.length > 0) {
|
|
395
|
+
const passed = this.testResults.filter((r)=>r.passed).length;
|
|
396
|
+
console.log(`Test Success Rate: ${(passed / this.testResults.length * 100).toFixed(0)}%`);
|
|
397
|
+
console.log(`Total Test Runs: ${this.testResults.length}`);
|
|
398
|
+
}
|
|
399
|
+
console.log('\nš Thanks for pair programming!\n');
|
|
449
400
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
401
|
+
async saveSession() {
|
|
402
|
+
const sessionPath = '.claude-flow/sessions/pair';
|
|
403
|
+
await fs.mkdir(sessionPath, {
|
|
404
|
+
recursive: true
|
|
405
|
+
});
|
|
406
|
+
const sessionData = {
|
|
407
|
+
id: this.sessionId,
|
|
408
|
+
mode: this.mode,
|
|
409
|
+
agent: this.agent,
|
|
410
|
+
verify: this.verify,
|
|
411
|
+
autoVerify: this.autoVerify,
|
|
412
|
+
test: this.test,
|
|
413
|
+
threshold: this.threshold,
|
|
414
|
+
startTime: this.startTime.toISOString(),
|
|
415
|
+
status: this.status,
|
|
416
|
+
currentRole: this.currentRole,
|
|
417
|
+
verificationScores: this.verificationScores,
|
|
418
|
+
testResults: this.testResults
|
|
419
|
+
};
|
|
420
|
+
await fs.writeFile(path.join(sessionPath, `${this.sessionId}.json`), JSON.stringify(sessionData, null, 2));
|
|
460
421
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
422
|
+
constructor(options = {}){
|
|
423
|
+
this.sessionId = `pair_${Date.now()}`;
|
|
424
|
+
this.mode = options.mode || 'switch';
|
|
425
|
+
this.agent = options.agent || 'auto';
|
|
426
|
+
this.verify = options.verify || false;
|
|
427
|
+
this.test = options.test || false;
|
|
428
|
+
this.autoVerify = options.autoVerify || false; // New: control automatic verification
|
|
429
|
+
this.threshold = options.threshold || 0.95;
|
|
430
|
+
this.startTime = new Date();
|
|
431
|
+
this.status = 'active';
|
|
432
|
+
this.currentRole = 'driver';
|
|
433
|
+
this.verificationScores = [];
|
|
434
|
+
this.testResults = [];
|
|
435
|
+
this.fileWatchers = new Map();
|
|
436
|
+
this.rl = null;
|
|
437
|
+
this.lastVerificationTime = 0;
|
|
438
|
+
this.verificationCooldown = 60000; // 1 minute cooldown between auto-verifications
|
|
439
|
+
this.isVerifying = false; // Prevent concurrent verifications
|
|
474
440
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
console.log('
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
// Update session
|
|
485
|
-
this.status = 'completed';
|
|
486
|
-
await this.saveSession();
|
|
487
|
-
|
|
488
|
-
// Show summary
|
|
489
|
-
const duration = Math.floor((Date.now() - this.startTime) / 1000 / 60);
|
|
490
|
-
console.log('\n⨠Session Complete!');
|
|
491
|
-
console.log('ā'.repeat(40));
|
|
492
|
-
console.log(`Duration: ${duration} minutes`);
|
|
493
|
-
|
|
494
|
-
if (this.verificationScores.length > 0) {
|
|
495
|
-
const avg =
|
|
496
|
-
this.verificationScores.reduce((sum, item) => sum + item.score, 0) /
|
|
497
|
-
this.verificationScores.length;
|
|
498
|
-
console.log(`Average Verification: ${avg.toFixed(2)}`);
|
|
499
|
-
console.log(`Total Checks: ${this.verificationScores.length}`);
|
|
441
|
+
};
|
|
442
|
+
async function pairCommand(args = [], flags = {}) {
|
|
443
|
+
console.log('\nš„ Pair Programming Session');
|
|
444
|
+
console.log('ā'.repeat(50));
|
|
445
|
+
// Handle help flag
|
|
446
|
+
if (flags.help || args.includes('--help')) {
|
|
447
|
+
showHelp();
|
|
448
|
+
return;
|
|
500
449
|
}
|
|
501
|
-
|
|
502
|
-
if (
|
|
503
|
-
|
|
504
|
-
console.log(`Test Success Rate: ${((passed / this.testResults.length) * 100).toFixed(0)}%`);
|
|
505
|
-
console.log(`Total Test Runs: ${this.testResults.length}`);
|
|
450
|
+
// Handle background execution
|
|
451
|
+
if (flags.background || flags.bg) {
|
|
452
|
+
return startBackgroundSession(args, flags);
|
|
506
453
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
};
|
|
529
|
-
|
|
530
|
-
await fs.writeFile(
|
|
531
|
-
path.join(sessionPath, `${this.sessionId}.json`),
|
|
532
|
-
JSON.stringify(sessionData, null, 2),
|
|
533
|
-
);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
async function pairCommand(args = [], flags = {}) {
|
|
538
|
-
console.log('\nš„ Pair Programming Session');
|
|
539
|
-
console.log('ā'.repeat(50));
|
|
540
|
-
|
|
541
|
-
// Handle help flag
|
|
542
|
-
if (flags.help || args.includes('--help')) {
|
|
454
|
+
// Handle start flag
|
|
455
|
+
if (flags.start) {
|
|
456
|
+
const session = new PairProgrammingSession({
|
|
457
|
+
mode: flags.mode || 'switch',
|
|
458
|
+
agent: flags.agent || 'auto',
|
|
459
|
+
verify: flags.verify || false,
|
|
460
|
+
test: flags.test || false,
|
|
461
|
+
autoVerify: flags.auto || false,
|
|
462
|
+
threshold: parseFloat(flags.threshold) || 0.95
|
|
463
|
+
});
|
|
464
|
+
return await session.start();
|
|
465
|
+
}
|
|
466
|
+
// Handle status flag
|
|
467
|
+
if (flags.status) {
|
|
468
|
+
return showSessionStatus();
|
|
469
|
+
}
|
|
470
|
+
// Handle end flag
|
|
471
|
+
if (flags.end) {
|
|
472
|
+
return endSession(flags.sessionId || 'current');
|
|
473
|
+
}
|
|
474
|
+
// Default: show help
|
|
543
475
|
showHelp();
|
|
544
|
-
return;
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
// Handle background execution
|
|
548
|
-
if (flags.background || flags.bg) {
|
|
549
|
-
return startBackgroundSession(args, flags);
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
// Handle start flag
|
|
553
|
-
if (flags.start) {
|
|
554
|
-
const session = new PairProgrammingSession({
|
|
555
|
-
mode: flags.mode || 'switch',
|
|
556
|
-
agent: flags.agent || 'auto',
|
|
557
|
-
verify: flags.verify || false,
|
|
558
|
-
test: flags.test || false,
|
|
559
|
-
autoVerify: flags.auto || false, // New flag for automatic verification
|
|
560
|
-
threshold: parseFloat(flags.threshold) || 0.95,
|
|
561
|
-
});
|
|
562
|
-
|
|
563
|
-
return await session.start();
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
// Handle status flag
|
|
567
|
-
if (flags.status) {
|
|
568
|
-
return showSessionStatus();
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
// Handle end flag
|
|
572
|
-
if (flags.end) {
|
|
573
|
-
return endSession(flags.sessionId || 'current');
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
// Default: show help
|
|
577
|
-
showHelp();
|
|
578
476
|
}
|
|
579
|
-
|
|
580
477
|
function showHelp() {
|
|
581
|
-
|
|
478
|
+
console.log(`
|
|
582
479
|
š USAGE:
|
|
583
480
|
claude-flow-novice pair [options]
|
|
584
481
|
|
|
@@ -637,115 +534,90 @@ function showHelp() {
|
|
|
637
534
|
.claude/commands/pair/README.md
|
|
638
535
|
`);
|
|
639
536
|
}
|
|
640
|
-
|
|
641
537
|
async function startBackgroundSession(args, flags) {
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
child.unref();
|
|
659
|
-
|
|
660
|
-
const pid = child.pid;
|
|
661
|
-
console.log(`ā
Background session started (PID: ${pid})`);
|
|
662
|
-
console.log('\nš Monitor with: claude-flow-novice pair --status');
|
|
663
|
-
console.log('š Stop with: claude-flow-novice pair --end\n');
|
|
538
|
+
console.log('\nš Starting pair session in background...');
|
|
539
|
+
const child = spawn(process.argv[0], [
|
|
540
|
+
process.argv[1],
|
|
541
|
+
'pair',
|
|
542
|
+
'--start',
|
|
543
|
+
...args.filter((arg)=>arg !== '--background' && arg !== '--bg')
|
|
544
|
+
], {
|
|
545
|
+
detached: true,
|
|
546
|
+
stdio: 'ignore'
|
|
547
|
+
});
|
|
548
|
+
child.unref();
|
|
549
|
+
const pid = child.pid;
|
|
550
|
+
console.log(`ā
Background session started (PID: ${pid})`);
|
|
551
|
+
console.log('\nš Monitor with: claude-flow-novice pair --status');
|
|
552
|
+
console.log('š Stop with: claude-flow-novice pair --end\n');
|
|
664
553
|
}
|
|
665
|
-
|
|
666
554
|
async function showSessionStatus() {
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
console.log(
|
|
702
|
-
}
|
|
555
|
+
try {
|
|
556
|
+
const sessionPath = '.claude-flow/sessions/pair';
|
|
557
|
+
const files = await fs.readdir(sessionPath);
|
|
558
|
+
const sessions = [];
|
|
559
|
+
for (const file of files){
|
|
560
|
+
if (file.endsWith('.json')) {
|
|
561
|
+
const data = await fs.readFile(path.join(sessionPath, file), 'utf8');
|
|
562
|
+
sessions.push(JSON.parse(data));
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (sessions.length === 0) {
|
|
566
|
+
console.log('\nā No active pair programming sessions\n');
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
console.log('\nš Pair Programming Sessions:');
|
|
570
|
+
console.log('ā'.repeat(50));
|
|
571
|
+
for (const session of sessions.filter((s)=>s.status === 'active')){
|
|
572
|
+
const duration = Math.floor((Date.now() - new Date(session.startTime).getTime()) / 1000 / 60);
|
|
573
|
+
console.log(`\nš¹ Session: ${session.id}`);
|
|
574
|
+
console.log(` Mode: ${session.mode}`);
|
|
575
|
+
console.log(` Duration: ${duration} minutes`);
|
|
576
|
+
console.log(` Status: ${session.status}`);
|
|
577
|
+
console.log(` Verification: ${session.verify ? 'ā
' : 'ā'}`);
|
|
578
|
+
console.log(` Auto-Verify: ${session.autoVerify ? 'ā
' : 'ā'}`);
|
|
579
|
+
console.log(` Testing: ${session.test ? 'ā
' : 'ā'}`);
|
|
580
|
+
if (session.verificationScores && session.verificationScores.length > 0) {
|
|
581
|
+
const scores = session.verificationScores.map((s)=>s.score || s);
|
|
582
|
+
const avg = scores.reduce((a, b)=>a + b, 0) / scores.length;
|
|
583
|
+
console.log(` Avg Verification: ${avg.toFixed(2)}`);
|
|
584
|
+
console.log(` Total Checks: ${scores.length}`);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
console.log('ā'.repeat(50));
|
|
588
|
+
} catch (error) {
|
|
589
|
+
console.log('\nā No active pair programming sessions\n');
|
|
703
590
|
}
|
|
704
|
-
|
|
705
|
-
console.log('ā'.repeat(50));
|
|
706
|
-
} catch (error) {
|
|
707
|
-
console.log('\nā No active pair programming sessions\n');
|
|
708
|
-
}
|
|
709
591
|
}
|
|
710
|
-
|
|
711
592
|
async function endSession(sessionId) {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
593
|
+
console.log(`\nš Ending pair programming session: ${sessionId}`);
|
|
594
|
+
try {
|
|
595
|
+
const sessionPath = '.claude-flow/sessions/pair';
|
|
596
|
+
if (sessionId === 'current') {
|
|
597
|
+
// End most recent active session
|
|
598
|
+
const files = await fs.readdir(sessionPath);
|
|
599
|
+
for (const file of files.filter((f)=>f.endsWith('.json'))){
|
|
600
|
+
const data = await fs.readFile(path.join(sessionPath, file), 'utf8');
|
|
601
|
+
const session = JSON.parse(data);
|
|
602
|
+
if (session.status === 'active') {
|
|
603
|
+
sessionId = session.id;
|
|
604
|
+
break;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
726
607
|
}
|
|
727
|
-
|
|
608
|
+
const sessionFile = path.join(sessionPath, `${sessionId}.json`);
|
|
609
|
+
const data = await fs.readFile(sessionFile, 'utf8');
|
|
610
|
+
const session = JSON.parse(data);
|
|
611
|
+
session.status = 'completed';
|
|
612
|
+
session.endTime = new Date().toISOString();
|
|
613
|
+
await fs.writeFile(sessionFile, JSON.stringify(session, null, 2));
|
|
614
|
+
console.log('ā
Session ended successfully');
|
|
615
|
+
console.log(`\nš Session Summary:`);
|
|
616
|
+
console.log(` Duration: ${Math.floor((new Date(session.endTime) - new Date(session.startTime)) / 1000 / 60)} minutes`);
|
|
617
|
+
console.log(` Mode: ${session.mode}`);
|
|
618
|
+
console.log(` Agent: ${session.agent}\n`);
|
|
619
|
+
} catch (error) {
|
|
620
|
+
console.log('ā Failed to end session:', error.message);
|
|
728
621
|
}
|
|
729
|
-
|
|
730
|
-
const sessionFile = path.join(sessionPath, `${sessionId}.json`);
|
|
731
|
-
const data = await fs.readFile(sessionFile, 'utf8');
|
|
732
|
-
const session = JSON.parse(data);
|
|
733
|
-
|
|
734
|
-
session.status = 'completed';
|
|
735
|
-
session.endTime = new Date().toISOString();
|
|
736
|
-
|
|
737
|
-
await fs.writeFile(sessionFile, JSON.stringify(session, null, 2));
|
|
738
|
-
|
|
739
|
-
console.log('ā
Session ended successfully');
|
|
740
|
-
console.log(`\nš Session Summary:`);
|
|
741
|
-
console.log(
|
|
742
|
-
` Duration: ${Math.floor((new Date(session.endTime) - new Date(session.startTime)) / 1000 / 60)} minutes`,
|
|
743
|
-
);
|
|
744
|
-
console.log(` Mode: ${session.mode}`);
|
|
745
|
-
console.log(` Agent: ${session.agent}\n`);
|
|
746
|
-
} catch (error) {
|
|
747
|
-
console.log('ā Failed to end session:', error.message);
|
|
748
|
-
}
|
|
749
622
|
}
|
|
750
|
-
|
|
751
623
|
export default pairCommand;
|