From 08c4c49bf8237a0515b9a32b2ac806afcf41da34 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 29 Dec 2025 01:30:57 +0000 Subject: [PATCH] feat(npm): Add Claude Code v2.0.55+ commands to npm CLI Added 3 new hooks commands to npm CLI: - lsp-diagnostic: Process LSP diagnostic events for learning - suggest-ultrathink: Recommend ultrathink mode for complex tasks - async-agent: Coordinate async sub-agent execution Security review completed: - No command injection vulnerabilities - Safe file path handling with path.join - Content length limits prevent memory issues - Minimal dependencies (commander + optional pg) Updated npm CLI to v0.1.27 with 29 hooks commands. --- README.md | 2 +- npm/package-lock.json | 796 +++++++++++++++++++++++++++++++--- npm/packages/cli/package.json | 2 +- npm/packages/cli/src/cli.ts | 200 ++++++++- 4 files changed, 943 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index deda7797..2743387f 100644 --- a/README.md +++ b/README.md @@ -583,7 +583,7 @@ The hooks integrate with Claude Code's event system: | Crate/Package | Description | Status | |---------------|-------------|--------| | [ruvector-cli hooks](./crates/ruvector-cli) | Rust CLI with 34 hooks commands | [![crates.io](https://img.shields.io/crates/v/ruvector-cli.svg)](https://crates.io/crates/ruvector-cli) | -| [@ruvector/cli hooks](./npm/packages/cli) | npm CLI with 26 hooks commands | [![npm](https://img.shields.io/npm/v/@ruvector/cli.svg)](https://www.npmjs.com/package/@ruvector/cli) | +| [@ruvector/cli hooks](./npm/packages/cli) | npm CLI with 29 hooks commands | [![npm](https://img.shields.io/npm/v/@ruvector/cli.svg)](https://www.npmjs.com/package/@ruvector/cli) | #### Quick Start diff --git a/npm/package-lock.json b/npm/package-lock.json index b3adc9f1..bea6a57c 100644 --- a/npm/package-lock.json +++ b/npm/package-lock.json @@ -3743,15 +3743,8 @@ "link": true }, "node_modules/@ruvector/core": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@ruvector/core/-/core-0.1.17.tgz", - "integrity": "sha512-N540Hb8M+ILSUfqzkeniu3JgFydY3SUHzPp8sfVH9H0+IcIF1O28nu0l5sa/rjnP15aTk6Z4dIwvCbEKJjLVMg==", - "engines": { - "node": ">= 18" - }, - "optionalDependencies": { - "@ruvector/attention": "^0.1.0" - } + "resolved": "packages/core", + "link": true }, "node_modules/@ruvector/gnn": { "version": "0.1.22", @@ -14342,17 +14335,14 @@ "resolved": "packages/ruvector", "link": true }, - "node_modules/ruvector-core": { - "resolved": "packages/core", - "link": true - }, "node_modules/ruvector-core-darwin-arm64": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/ruvector-core-darwin-arm64/-/ruvector-core-darwin-arm64-0.1.17.tgz", - "integrity": "sha512-AdUx4loFOoBDlKISVdFThXdnJWwpsQY3TtAGEoidzXTG2UXVVPJqZr03rhJyKsph7+9f2DQ53us7FRcEFg90+A==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/ruvector-core-darwin-arm64/-/ruvector-core-darwin-arm64-0.1.25.tgz", + "integrity": "sha512-5RmOAko4naiiL9TiVwfK2xH75qQk/FuknE3hcmKusZ0Z+xEEbF6NMLIQyZ6NfnhysQ4U8yfq8I8g9wPWz/Fbuw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -14362,12 +14352,13 @@ } }, "node_modules/ruvector-core-darwin-x64": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/ruvector-core-darwin-x64/-/ruvector-core-darwin-x64-0.1.17.tgz", - "integrity": "sha512-gzJoDlF4jY3VjezpQLs0Fa4H4k0BqHkpDAWEmZqwthoUoa9MrX4q3BYX8hhT0vdBYWziS14NYnebmedQHMIfqw==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/ruvector-core-darwin-x64/-/ruvector-core-darwin-x64-0.1.25.tgz", + "integrity": "sha512-Op5KdgVlyN4WA9yqs+mVFovGiaG1rroeCMe/1nHxViQ2w77ELFuc/lQm//XbJY6YnBEsG6n+oi9NFc8AlpM9qg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -14377,12 +14368,13 @@ } }, "node_modules/ruvector-core-linux-arm64-gnu": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/ruvector-core-linux-arm64-gnu/-/ruvector-core-linux-arm64-gnu-0.1.17.tgz", - "integrity": "sha512-mxZefj0HIR5ccnPbsAyS+1XIUo9IKXT1q6ykJLaUMLqZTO26RK28zEX7TCKBfRlXyzXdU8MTfLDW5iClZEfg2A==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/ruvector-core-linux-arm64-gnu/-/ruvector-core-linux-arm64-gnu-0.1.25.tgz", + "integrity": "sha512-WvQ2hk/LVY1R8ZAdkt4FwW0mLlef2Vtdw7o5yPi9eHUfjv7uMCaXEpJgUvZHitb+CQhr7cvP6XDGFOu4x26eXA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -14392,12 +14384,13 @@ } }, "node_modules/ruvector-core-linux-x64-gnu": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/ruvector-core-linux-x64-gnu/-/ruvector-core-linux-x64-gnu-0.1.17.tgz", - "integrity": "sha512-q2GCU4pwM7q+tMFvXYpGEBH+9Ms02azdvf29f4CgDsnI5Ufx4Pyu4hcEOeDcSV4zh5pbnOfPe/JhWbvUTJ80Gg==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/ruvector-core-linux-x64-gnu/-/ruvector-core-linux-x64-gnu-0.1.26.tgz", + "integrity": "sha512-hiGlJwANFBUctqnausPivOaGUKQKr4xFwCWKYqBMh1B1CphFSpy8wm+06A3Yv0mWSGYkKs0hfo+lQNJXltOHjw==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -14407,12 +14400,13 @@ } }, "node_modules/ruvector-core-win32-x64-msvc": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/ruvector-core-win32-x64-msvc/-/ruvector-core-win32-x64-msvc-0.1.17.tgz", - "integrity": "sha512-voWaYBuK0rwMzTrn/xBFOMV3drYrbBfTuFa+Ul4d7oT1HpiQtxVV9LFl3jTXE07T3AQfTsvM9aoMw0t82TqW1g==", + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/ruvector-core-win32-x64-msvc/-/ruvector-core-win32-x64-msvc-0.1.25.tgz", + "integrity": "sha512-Wm7M7Pcy/wfBisuRBwPlg0pbVzMXL9/aRfSc56/+hfauLSaI4nkiZ8MiqEbE/g1VM73BzDSm2+SxjM2omhuIyQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -14425,6 +14419,10 @@ "resolved": "packages/ruvector-extensions", "link": true }, + "node_modules/rvlite": { + "resolved": "packages/rvlite", + "link": true + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -17195,6 +17193,7 @@ } }, "packages/agentic-integration": { + "name": "@ruvector/agentic-integration", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -17246,6 +17245,7 @@ } }, "packages/agentic-synth": { + "name": "@ruvector/agentic-synth", "version": "0.1.6", "license": "MIT", "dependencies": { @@ -17295,6 +17295,7 @@ } }, "packages/agentic-synth-examples": { + "name": "@ruvector/agentic-synth-examples", "version": "0.1.0", "license": "MIT", "dependencies": { @@ -17557,6 +17558,7 @@ } }, "packages/burst-scaling": { + "name": "@ruvector/burst-scaling", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -17587,20 +17589,35 @@ }, "packages/cli": { "name": "@ruvector/cli", - "version": "0.1.0", + "version": "0.1.26", "license": "MIT", "dependencies": { - "@ruvector/core": "^0.1.0", - "chalk": "^4.1.2", - "commander": "^11.1.0" + "commander": "^12.0.0" }, "bin": { "ruvector": "dist/cli.js" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/pg": "^8.11.0", + "typescript": "^5.0.0" + }, + "optionalDependencies": { + "pg": "^8.11.0" + } + }, + "packages/cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" } }, "packages/core": { - "name": "ruvector-core", - "version": "0.1.17", + "name": "@ruvector/core", + "version": "0.1.28", "license": "MIT", "devDependencies": { "@napi-rs/cli": "^2.18.0" @@ -17609,14 +17626,15 @@ "node": ">=18.0.0" }, "optionalDependencies": { - "ruvector-core-darwin-arm64": "0.1.17", - "ruvector-core-darwin-x64": "0.1.17", - "ruvector-core-linux-arm64-gnu": "0.1.17", - "ruvector-core-linux-x64-gnu": "0.1.17", - "ruvector-core-win32-x64-msvc": "0.1.17" + "ruvector-core-darwin-arm64": "0.1.25", + "ruvector-core-darwin-x64": "0.1.25", + "ruvector-core-linux-arm64-gnu": "0.1.25", + "ruvector-core-linux-x64-gnu": "0.1.26", + "ruvector-core-win32-x64-msvc": "0.1.25" } }, "packages/graph-data-generator": { + "name": "@ruvector/graph-data-generator", "version": "0.1.0", "license": "MIT", "dependencies": { @@ -17885,7 +17903,7 @@ }, "packages/graph-node": { "name": "@ruvector/graph-node", - "version": "0.1.15", + "version": "0.1.25", "license": "MIT", "devDependencies": { "@napi-rs/cli": "^2.18.0" @@ -17903,7 +17921,7 @@ }, "packages/graph-wasm": { "name": "@ruvector/graph-wasm", - "version": "0.1.1", + "version": "0.1.25", "license": "MIT", "devDependencies": { "wasm-pack": "^0.12.1" @@ -17911,7 +17929,7 @@ }, "packages/node": { "name": "@ruvector/node", - "version": "0.1.15", + "version": "0.1.22", "license": "MIT", "dependencies": { "@ruvector/core": "^0.1.15", @@ -17926,6 +17944,7 @@ } }, "packages/postgres-cli": { + "name": "@ruvector/postgres-cli", "version": "0.2.6", "license": "MIT", "dependencies": { @@ -18137,7 +18156,7 @@ }, "packages/router": { "name": "@ruvector/router", - "version": "0.1.15", + "version": "0.1.25", "license": "MIT", "devDependencies": { "@napi-rs/cli": "^2.18.0" @@ -18146,16 +18165,16 @@ "node": ">=18.0.0" }, "optionalDependencies": { - "@ruvector/router-darwin-arm64": "0.1.15", + "@ruvector/router-darwin-arm64": "0.1.25", "@ruvector/router-darwin-x64": "0.1.15", - "@ruvector/router-linux-arm64-gnu": "0.1.15", - "@ruvector/router-linux-x64-gnu": "0.1.15", - "@ruvector/router-win32-x64-msvc": "0.1.15" + "@ruvector/router-linux-arm64-gnu": "0.1.25", + "@ruvector/router-linux-x64-gnu": "0.1.25", + "@ruvector/router-win32-x64-msvc": "0.1.25" } }, "packages/router-darwin-arm64": { "name": "@ruvector/router-darwin-arm64", - "version": "0.1.15", + "version": "0.1.25", "cpu": [ "arm64" ], @@ -18183,7 +18202,7 @@ }, "packages/router-linux-arm64-gnu": { "name": "@ruvector/router-linux-arm64-gnu", - "version": "0.1.15", + "version": "0.1.25", "cpu": [ "arm64" ], @@ -18197,7 +18216,7 @@ }, "packages/router-linux-x64-gnu": { "name": "@ruvector/router-linux-x64-gnu", - "version": "0.1.15", + "version": "0.1.25", "cpu": [ "x64" ], @@ -18211,7 +18230,7 @@ }, "packages/router-win32-x64-msvc": { "name": "@ruvector/router-win32-x64-msvc", - "version": "0.1.15", + "version": "0.1.25", "cpu": [ "x64" ], @@ -18224,11 +18243,11 @@ } }, "packages/ruvector": { - "version": "0.1.31", + "version": "0.1.35", "license": "MIT", "dependencies": { "@ruvector/attention": "^0.1.3", - "@ruvector/core": "^0.1.17", + "@ruvector/core": "^0.1.25", "@ruvector/gnn": "^0.1.22", "@ruvector/sona": "^0.1.4", "chalk": "^4.1.2", @@ -18279,6 +18298,7 @@ } }, "packages/ruvllm": { + "name": "@ruvector/ruvllm", "version": "0.2.2", "license": "MIT OR Apache-2.0", "dependencies": { @@ -18306,6 +18326,7 @@ } }, "packages/ruvllm-darwin-arm64": { + "name": "@ruvector/ruvllm-darwin-arm64", "version": "0.2.0", "cpu": [ "arm64" @@ -18319,6 +18340,7 @@ } }, "packages/ruvllm-darwin-x64": { + "name": "@ruvector/ruvllm-darwin-x64", "version": "0.2.0", "cpu": [ "x64" @@ -18332,6 +18354,7 @@ } }, "packages/ruvllm-linux-arm64-gnu": { + "name": "@ruvector/ruvllm-linux-arm64-gnu", "version": "0.2.0", "cpu": [ "arm64" @@ -18345,6 +18368,7 @@ } }, "packages/ruvllm-linux-x64-gnu": { + "name": "@ruvector/ruvllm-linux-x64-gnu", "version": "0.2.0", "cpu": [ "x64" @@ -18358,6 +18382,7 @@ } }, "packages/ruvllm-win32-x64-msvc": { + "name": "@ruvector/ruvllm-win32-x64-msvc", "version": "0.2.0", "cpu": [ "x64" @@ -18378,7 +18403,670 @@ "node": ">=18" } }, + "packages/rvlite": { + "version": "0.2.0", + "license": "MIT OR Apache-2.0", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.0.0", + "ora": "^8.0.0" + }, + "bin": { + "rvlite": "bin/cli.js" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "esbuild": "^0.20.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@anthropic-ai/sdk": ">=0.20.0" + }, + "peerDependenciesMeta": { + "@anthropic-ai/sdk": { + "optional": true + } + } + }, + "packages/rvlite/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "packages/rvlite/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "packages/rvlite/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/rvlite/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "packages/rvlite/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "packages/rvlite/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "packages/rvlite/node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/rvlite/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/rvlite/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "packages/sona": { + "name": "@ruvector/sona", "version": "0.1.4", "license": "MIT OR Apache-2.0", "devDependencies": { @@ -18502,7 +19190,7 @@ }, "packages/wasm": { "name": "@ruvector/wasm", - "version": "0.1.1", + "version": "0.1.22", "license": "MIT", "dependencies": { "@ruvector/core": "^0.1.0" diff --git a/npm/packages/cli/package.json b/npm/packages/cli/package.json index 20c2a738..b88cf637 100644 --- a/npm/packages/cli/package.json +++ b/npm/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/cli", - "version": "0.1.26", + "version": "0.1.27", "description": "Command-line interface for RuVector vector database with self-learning hooks", "main": "dist/cli.js", "types": "dist/cli.d.ts", diff --git a/npm/packages/cli/src/cli.ts b/npm/packages/cli/src/cli.ts index fad78bb8..00b7aee6 100644 --- a/npm/packages/cli/src/cli.ts +++ b/npm/packages/cli/src/cli.ts @@ -506,7 +506,7 @@ function generateClaudeHooksConfig(): object { program .name('ruvector') .description('RuVector CLI - High-performance vector database') - .version('0.1.25'); + .version('0.1.27'); const hooks = program.command('hooks').description('Self-learning intelligence hooks for Claude Code'); @@ -974,4 +974,202 @@ hooks.command('swarm-stats') }, null, 2)); }); +// ============================================================================ +// Claude Code v2.0.55+ Features +// ============================================================================ + +hooks.command('lsp-diagnostic') + .description('Process LSP diagnostic events (Claude Code 2.0.55+)') + .option('--file ', 'File with diagnostic') + .option('--severity ', 'Diagnostic severity (error, warning, info, hint)') + .option('--message ', 'Diagnostic message') + .action((opts: { file?: string; severity?: string; message?: string }) => { + const intel = new Intelligence(); + + // Read hook input from stdin if available + let stdinData: any = null; + try { + const inputPath = process.env.CLAUDE_HOOK_INPUT; + if (inputPath && fs.existsSync(inputPath)) { + stdinData = JSON.parse(fs.readFileSync(inputPath, 'utf-8')); + } + } catch { /* ignore */ } + + const file = opts.file || stdinData?.tool_input?.file || 'unknown'; + const severity = opts.severity || stdinData?.tool_input?.severity || 'info'; + const message = opts.message || stdinData?.tool_input?.message || ''; + + // Learn from LSP diagnostics + if (severity === 'error' || severity === 'warning') { + // Record error and get codes + const codes = intel.recordError(`lsp:${file}`, message); + const errorCode = codes[0] || `${severity}-unknown`; + + // Record trajectory for learning + const state = `lsp_${severity}_${path.extname(file).slice(1) || 'unknown'}`; + intel.learn(state, 'diagnostic', message.slice(0, 100), severity === 'error' ? -0.5 : -0.2); + intel.save(); + + // Output context for Claude + const fixInfo = intel.suggestFix(errorCode); + const learnedFixes = fixInfo?.fixes ?? []; + console.log(JSON.stringify({ + file, + severity, + error_code: errorCode, + learned_fixes: learnedFixes.slice(0, 3), + recommendation: learnedFixes.length > 0 ? 'Apply learned fix' : 'Investigate error pattern' + })); + } else { + console.log(JSON.stringify({ file, severity, message, action: 'logged' })); + } + }); + +hooks.command('suggest-ultrathink') + .description('Recommend ultrathink mode for complex tasks (Claude Code 2.0.55+)') + .argument('', 'Task description') + .option('--file ', 'File being worked on') + .action((task: string[], opts: { file?: string }) => { + const intel = new Intelligence(); + const taskStr = task.join(' ').toLowerCase(); + const file = opts.file; + + // Complexity patterns that suggest ultrathink mode + const complexityPatterns: Array<[string, number]> = [ + ['algorithm', 0.8], ['optimize', 0.7], ['refactor', 0.6], + ['debug', 0.7], ['performance', 0.7], ['concurrent', 0.8], + ['async', 0.6], ['architecture', 0.8], ['security', 0.7], + ['cryptograph', 0.9], ['distributed', 0.8], ['consensus', 0.9], + ['neural', 0.8], ['ml', 0.7], ['complex', 0.6], + ['migrate', 0.7], ['integration', 0.6], ['api design', 0.7], + ['database schema', 0.7], ['state machine', 0.8], ['parser', 0.8], + ['compiler', 0.9], ['memory management', 0.8], ['thread', 0.7], + ]; + + let complexityScore = 0; + const triggers: string[] = []; + + for (const [pattern, weight] of complexityPatterns) { + if (taskStr.includes(pattern)) { + complexityScore = Math.max(complexityScore, weight); + triggers.push(pattern); + } + } + + // Check file extension complexity + if (file) { + const ext = path.extname(file).slice(1); + const complexExts: Record = { + rs: 0.5, cpp: 0.5, c: 0.4, zig: 0.5, + asm: 0.7, wasm: 0.6, sql: 0.4 + }; + if (complexExts[ext]) { + complexityScore = Math.max(complexityScore, complexExts[ext]); + triggers.push(`${ext} file`); + } + } + + // Check learned patterns + const state = `ultrathink_${triggers[0] || 'general'}`; + const suggested = intel.suggest(state, ['enable', 'skip']); + + const recommendUltrathink = complexityScore >= 0.6; + + // Record trajectory for learning + intel.learn(state, recommendUltrathink ? 'enable' : 'skip', taskStr.slice(0, 100), 0); + + // Build output + const output: Record = { + task: task.join(' '), + complexity_score: complexityScore, + triggers, + recommend_ultrathink: recommendUltrathink, + learned_preference: suggested + }; + + if (recommendUltrathink) { + output.message = '🧠 Complex task detected - ultrathink mode recommended'; + output.reasoning_depth = complexityScore >= 0.8 ? 'deep' : 'moderate'; + } else { + output.message = 'Standard processing sufficient'; + } + + intel.save(); + console.log(JSON.stringify(output, null, 2)); + }); + +hooks.command('async-agent') + .description('Coordinate async sub-agent execution (Claude Code 2.0.55+)') + .option('--action ', 'Action: spawn, sync, complete', 'spawn') + .option('--agent-id ', 'Agent identifier') + .option('--task ', 'Task description (for spawn)') + .action((opts: { action: string; agentId?: string; task?: string }) => { + const intel = new Intelligence(); + const action = opts.action; + const agentId = opts.agentId || `async-${Date.now()}`; + const task = opts.task || ''; + + switch (action) { + case 'spawn': { + // Register async agent + intel.swarmRegister(agentId, 'async-subagent', ['parallel', 'autonomous']); + + // Record spawn event + const state = `async_spawn_${task.split(' ')[0] || 'general'}`; + intel.learn(state, 'spawn', task.slice(0, 100), 0.1); + + // Get learned patterns for similar tasks + const suggested = intel.suggest(state, ['coder', 'researcher', 'tester', 'reviewer']); + + intel.save(); + console.log(JSON.stringify({ + action: 'spawned', + agent_id: agentId, + task, + suggested_type: suggested.action, + status: 'running', + async: true + })); + break; + } + + case 'sync': { + // Check agent status and coordinate + const stats = intel.swarmStats(); + console.log(JSON.stringify({ + action: 'sync', + agent_id: agentId, + swarm_agents: stats.agents, + status: 'synchronized', + pending_results: 0 + })); + break; + } + + case 'complete': { + // Mark agent complete and record success + const state = `async_complete_${agentId}`; + intel.learn(state, 'complete', task.slice(0, 100), 1.0); + + // Update agent status + intel.swarmHeal(agentId); // Resets/removes the agent + + intel.save(); + console.log(JSON.stringify({ + action: 'completed', + agent_id: agentId, + status: 'success', + learning_recorded: true + })); + break; + } + + default: + console.log(JSON.stringify({ + error: `Unknown action: ${action}`, + valid_actions: ['spawn', 'sync', 'complete'] + })); + } + }); + program.parse();