ruvector 0.1.43 → 0.1.45

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.
Files changed (2) hide show
  1. package/bin/cli.js +191 -2
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -2267,7 +2267,14 @@ class Intelligence {
2267
2267
  // Hooks command group
2268
2268
  const hooksCmd = program.command('hooks').description('Self-learning intelligence hooks for Claude Code');
2269
2269
 
2270
- hooksCmd.command('init').description('Initialize hooks in current project').option('--force', 'Force overwrite').action((opts) => {
2270
+ hooksCmd.command('init')
2271
+ .description('Initialize hooks in current project')
2272
+ .option('--force', 'Force overwrite existing settings')
2273
+ .option('--minimal', 'Only basic hooks (no env, permissions, or advanced hooks)')
2274
+ .option('--no-claude-md', 'Skip CLAUDE.md creation')
2275
+ .option('--no-permissions', 'Skip permissions configuration')
2276
+ .option('--no-env', 'Skip environment variables')
2277
+ .action((opts) => {
2271
2278
  const settingsPath = path.join(process.cwd(), '.claude', 'settings.json');
2272
2279
  const settingsDir = path.dirname(settingsPath);
2273
2280
  if (!fs.existsSync(settingsDir)) fs.mkdirSync(settingsDir, { recursive: true });
@@ -2275,15 +2282,61 @@ hooksCmd.command('init').description('Initialize hooks in current project').opti
2275
2282
  if (fs.existsSync(settingsPath) && !opts.force) {
2276
2283
  try { settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')); } catch {}
2277
2284
  }
2285
+
2278
2286
  // Fix schema if present
2279
2287
  if (settings.$schema) {
2280
2288
  settings.$schema = 'https://json.schemastore.org/claude-code-settings.json';
2281
2289
  }
2290
+
2282
2291
  // Clean up invalid hook names
2283
2292
  if (settings.hooks) {
2284
2293
  if (settings.hooks.Start) { delete settings.hooks.Start; }
2285
2294
  if (settings.hooks.End) { delete settings.hooks.End; }
2286
2295
  }
2296
+
2297
+ // Environment variables for intelligence (unless --minimal or --no-env)
2298
+ if (!opts.minimal && opts.env !== false) {
2299
+ settings.env = settings.env || {};
2300
+ settings.env.RUVECTOR_INTELLIGENCE_ENABLED = settings.env.RUVECTOR_INTELLIGENCE_ENABLED || 'true';
2301
+ settings.env.RUVECTOR_LEARNING_RATE = settings.env.RUVECTOR_LEARNING_RATE || '0.1';
2302
+ settings.env.RUVECTOR_MEMORY_BACKEND = settings.env.RUVECTOR_MEMORY_BACKEND || 'rvlite';
2303
+ settings.env.INTELLIGENCE_MODE = settings.env.INTELLIGENCE_MODE || 'treatment';
2304
+ console.log(chalk.blue(' ✓ Environment variables configured'));
2305
+ }
2306
+
2307
+ // Permissions (unless --minimal or --no-permissions)
2308
+ if (!opts.minimal && opts.permissions !== false) {
2309
+ settings.permissions = settings.permissions || {};
2310
+ settings.permissions.allow = settings.permissions.allow || [
2311
+ 'Bash(npm run:*)',
2312
+ 'Bash(npm test:*)',
2313
+ 'Bash(npm install:*)',
2314
+ 'Bash(npx:*)',
2315
+ 'Bash(git status)',
2316
+ 'Bash(git diff:*)',
2317
+ 'Bash(git log:*)',
2318
+ 'Bash(git add:*)',
2319
+ 'Bash(git commit:*)',
2320
+ 'Bash(git push)',
2321
+ 'Bash(git branch:*)',
2322
+ 'Bash(git checkout:*)',
2323
+ 'Bash(ls:*)',
2324
+ 'Bash(pwd)',
2325
+ 'Bash(cat:*)',
2326
+ 'Bash(mkdir:*)',
2327
+ 'Bash(which:*)',
2328
+ 'Bash(node:*)',
2329
+ 'Bash(ruvector:*)'
2330
+ ];
2331
+ settings.permissions.deny = settings.permissions.deny || [
2332
+ 'Bash(rm -rf /)',
2333
+ 'Bash(sudo rm:*)',
2334
+ 'Bash(chmod 777:*)'
2335
+ ];
2336
+ console.log(chalk.blue(' ✓ Permissions configured'));
2337
+ }
2338
+
2339
+ // Core hooks (always included)
2287
2340
  settings.hooks = settings.hooks || {};
2288
2341
  settings.hooks.PreToolUse = [
2289
2342
  { matcher: 'Edit|Write|MultiEdit', hooks: [{ type: 'command', command: 'npx ruvector hooks pre-edit "$TOOL_INPUT_file_path"' }] },
@@ -2295,8 +2348,144 @@ hooksCmd.command('init').description('Initialize hooks in current project').opti
2295
2348
  ];
2296
2349
  settings.hooks.SessionStart = [{ hooks: [{ type: 'command', command: 'npx ruvector hooks session-start' }] }];
2297
2350
  settings.hooks.Stop = [{ hooks: [{ type: 'command', command: 'npx ruvector hooks session-end' }] }];
2351
+ console.log(chalk.blue(' ✓ Core hooks (PreToolUse, PostToolUse, SessionStart, Stop)'));
2352
+
2353
+ // Advanced hooks (unless --minimal)
2354
+ if (!opts.minimal) {
2355
+ // UserPromptSubmit - context suggestions on each prompt
2356
+ settings.hooks.UserPromptSubmit = [{
2357
+ hooks: [{
2358
+ type: 'command',
2359
+ timeout: 2000,
2360
+ command: 'npx ruvector hooks suggest-context'
2361
+ }]
2362
+ }];
2363
+
2364
+ // PreCompact - preserve important context before compaction
2365
+ settings.hooks.PreCompact = [
2366
+ {
2367
+ matcher: 'auto',
2368
+ hooks: [{
2369
+ type: 'command',
2370
+ timeout: 3000,
2371
+ command: 'npx ruvector hooks pre-compact --auto'
2372
+ }]
2373
+ },
2374
+ {
2375
+ matcher: 'manual',
2376
+ hooks: [{
2377
+ type: 'command',
2378
+ timeout: 3000,
2379
+ command: 'npx ruvector hooks pre-compact'
2380
+ }]
2381
+ }
2382
+ ];
2383
+
2384
+ // Notification - track all notifications for learning
2385
+ settings.hooks.Notification = [{
2386
+ matcher: '.*',
2387
+ hooks: [{
2388
+ type: 'command',
2389
+ timeout: 1000,
2390
+ command: 'npx ruvector hooks track-notification'
2391
+ }]
2392
+ }];
2393
+ console.log(chalk.blue(' ✓ Advanced hooks (UserPromptSubmit, PreCompact, Notification)'));
2394
+ }
2395
+
2298
2396
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
2299
- console.log(chalk.green('✅ Hooks initialized in .claude/settings.json'));
2397
+ console.log(chalk.green('\n✅ Hooks initialized in .claude/settings.json'));
2398
+
2399
+ // Create CLAUDE.md if it doesn't exist (or force)
2400
+ const claudeMdPath = path.join(process.cwd(), 'CLAUDE.md');
2401
+ if (opts.claudeMd !== false && (!fs.existsSync(claudeMdPath) || opts.force)) {
2402
+ const claudeMdContent = `# Claude Code Project Configuration
2403
+
2404
+ ## RuVector Self-Learning Intelligence
2405
+
2406
+ This project uses RuVector's self-learning intelligence hooks for enhanced AI-assisted development with Q-learning, vector memory, and automatic agent routing.
2407
+
2408
+ ### Active Hooks
2409
+
2410
+ | Hook | Trigger | Purpose |
2411
+ |------|---------|---------|
2412
+ | **PreToolUse** | Before Edit/Write/Bash | Agent routing, file analysis, command risk assessment |
2413
+ | **PostToolUse** | After Edit/Write/Bash | Q-learning update, pattern recording, outcome tracking |
2414
+ | **SessionStart** | Conversation begins | Load intelligence state, display learning stats |
2415
+ | **Stop** | Conversation ends | Save learning data, export metrics |
2416
+ | **UserPromptSubmit** | User sends message | Context suggestions, pattern recommendations |
2417
+ | **PreCompact** | Before context compaction | Preserve important context and memories |
2418
+ | **Notification** | Any notification | Track events for learning |
2419
+
2420
+ ### Environment Variables
2421
+
2422
+ | Variable | Default | Description |
2423
+ |----------|---------|-------------|
2424
+ | \`RUVECTOR_INTELLIGENCE_ENABLED\` | \`true\` | Enable/disable intelligence layer |
2425
+ | \`RUVECTOR_LEARNING_RATE\` | \`0.1\` | Q-learning rate (0.0-1.0) |
2426
+ | \`RUVECTOR_MEMORY_BACKEND\` | \`rvlite\` | Memory storage backend |
2427
+ | \`INTELLIGENCE_MODE\` | \`treatment\` | A/B testing mode (treatment/control) |
2428
+
2429
+ ### Commands
2430
+
2431
+ \`\`\`bash
2432
+ # Initialize hooks in a project
2433
+ npx ruvector hooks init
2434
+
2435
+ # View learning statistics
2436
+ npx ruvector hooks stats
2437
+
2438
+ # Route a task to best agent
2439
+ npx ruvector hooks route "implement feature X"
2440
+
2441
+ # Store context in vector memory
2442
+ npx ruvector hooks remember "important context" -t project
2443
+
2444
+ # Recall from memory (semantic search)
2445
+ npx ruvector hooks recall "context query"
2446
+
2447
+ # Manual session management
2448
+ npx ruvector hooks session-start
2449
+ npx ruvector hooks session-end
2450
+ \`\`\`
2451
+
2452
+ ### How It Works
2453
+
2454
+ 1. **Pre-edit hooks** analyze files and suggest the best agent based on learned patterns
2455
+ 2. **Post-edit hooks** record outcomes to improve future suggestions via Q-learning
2456
+ 3. **Memory hooks** store and retrieve context using vector embeddings (cosine similarity)
2457
+ 4. **Session hooks** manage learning state across conversations
2458
+ 5. **UserPromptSubmit** provides context suggestions on each message
2459
+ 6. **PreCompact** preserves critical context before conversation compaction
2460
+ 7. **Notification** tracks all events for continuous learning
2461
+
2462
+ ### Learning Data
2463
+
2464
+ Stored in \`.ruvector/intelligence.json\`:
2465
+ - **Q-table patterns**: State-action values for agent routing
2466
+ - **Vector memories**: Embeddings for semantic recall
2467
+ - **Trajectories**: Learning history for improvement tracking
2468
+ - **Error patterns**: Known issues and suggested fixes
2469
+
2470
+ ### Init Options
2471
+
2472
+ \`\`\`bash
2473
+ npx ruvector hooks init # Full configuration
2474
+ npx ruvector hooks init --minimal # Basic hooks only
2475
+ npx ruvector hooks init --no-env # Skip environment variables
2476
+ npx ruvector hooks init --no-permissions # Skip permissions
2477
+ npx ruvector hooks init --no-claude-md # Skip this file
2478
+ npx ruvector hooks init --force # Overwrite existing
2479
+ \`\`\`
2480
+
2481
+ ---
2482
+ *Powered by [RuVector](https://github.com/ruvnet/ruvector) self-learning intelligence*
2483
+ `;
2484
+ fs.writeFileSync(claudeMdPath, claudeMdContent);
2485
+ console.log(chalk.green('✅ CLAUDE.md created in project root'));
2486
+ } else if (fs.existsSync(claudeMdPath) && !opts.force) {
2487
+ console.log(chalk.yellow('ℹ️ CLAUDE.md already exists (use --force to overwrite)'));
2488
+ }
2300
2489
  });
2301
2490
 
2302
2491
  hooksCmd.command('stats').description('Show intelligence statistics').action(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ruvector",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "description": "High-performance vector database for Node.js with automatic native/WASM fallback",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",