@claude-flow/cli 3.47.1 → 3.48.0

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 (66) hide show
  1. package/.claude/helpers/auto-memory-hook.mjs +6 -2
  2. package/.claude/helpers/helpers.manifest.json +3 -3
  3. package/.claude/helpers/learning-service.mjs +4 -2
  4. package/.claude/helpers/metrics-db.mjs +4 -2
  5. package/bin/cli.js +4 -1
  6. package/catalog-manifest.json +2 -2
  7. package/dist/src/commands/analyze.js +2 -2
  8. package/dist/src/commands/config.js +5 -7
  9. package/dist/src/commands/hooks.js +15 -5
  10. package/dist/src/commands/memory.js +89 -27
  11. package/dist/src/commands/metaharness.js +1 -0
  12. package/dist/src/commands/security.js +113 -55
  13. package/dist/src/commands/session.js +6 -6
  14. package/dist/src/commands/task.js +5 -4
  15. package/dist/src/init/helpers-generator.js +4 -2
  16. package/dist/src/mcp-server.js +10 -3
  17. package/dist/src/mcp-tools/agentdb-tools.js +29 -62
  18. package/dist/src/mcp-tools/hooks-tools.d.ts +0 -4
  19. package/dist/src/mcp-tools/hooks-tools.js +139 -37
  20. package/dist/src/mcp-tools/memory-tools.js +89 -35
  21. package/dist/src/mcp-tools/policy-enforcer.d.ts +8 -1
  22. package/dist/src/mcp-tools/policy-enforcer.js +80 -8
  23. package/dist/src/mcp-tools/session-tools.js +34 -8
  24. package/dist/src/memory/feedback-patterns.d.ts +13 -0
  25. package/dist/src/memory/feedback-patterns.js +14 -0
  26. package/dist/src/memory/live-memory-row.d.ts +3 -0
  27. package/dist/src/memory/live-memory-row.js +5 -0
  28. package/dist/src/memory/memory-bridge.d.ts +11 -20
  29. package/dist/src/memory/memory-bridge.js +348 -134
  30. package/dist/src/memory/memory-initializer.d.ts +9 -1
  31. package/dist/src/memory/memory-initializer.js +41 -31
  32. package/dist/src/ruvector/graph-analyzer.js +4 -1
  33. package/dist/src/services/config-file-manager.js +30 -8
  34. package/dist/src/services/memory-backup.d.ts +1 -1
  35. package/dist/src/services/memory-backup.js +67 -27
  36. package/dist/src/services/worker-daemon.d.ts +2 -2
  37. package/dist/src/services/worker-daemon.js +23 -14
  38. package/node_modules/@claude-flow/codex/package.json +1 -1
  39. package/node_modules/@claude-flow/mcp/dist/tool-registry.d.ts.map +1 -1
  40. package/node_modules/@claude-flow/mcp/dist/tool-registry.js +11 -3
  41. package/node_modules/@claude-flow/mcp/dist/tool-registry.js.map +1 -1
  42. package/node_modules/@claude-flow/mcp/package.json +6 -3
  43. package/node_modules/@claude-flow/plugin-agent-federation/package.json +3 -3
  44. package/node_modules/@claude-flow/security/package.json +2 -3
  45. package/package.json +9 -9
  46. package/plugins/ruflo-metaharness/scripts/_cli-args.mjs +37 -0
  47. package/plugins/ruflo-metaharness/scripts/audit-list.mjs +8 -0
  48. package/plugins/ruflo-metaharness/scripts/audit-trend.mjs +12 -0
  49. package/plugins/ruflo-metaharness/scripts/bench-parse-mcp-scan.mjs +8 -0
  50. package/plugins/ruflo-metaharness/scripts/bench-recordpair-overhead.mjs +8 -0
  51. package/plugins/ruflo-metaharness/scripts/bench-similarity.mjs +8 -0
  52. package/plugins/ruflo-metaharness/scripts/bench.mjs +10 -0
  53. package/plugins/ruflo-metaharness/scripts/drift-from-history.mjs +13 -0
  54. package/plugins/ruflo-metaharness/scripts/evolve.mjs +27 -0
  55. package/plugins/ruflo-metaharness/scripts/genome.mjs +8 -0
  56. package/plugins/ruflo-metaharness/scripts/gepa.mjs +12 -0
  57. package/plugins/ruflo-metaharness/scripts/learn.mjs +13 -0
  58. package/plugins/ruflo-metaharness/scripts/mcp-scan.mjs +8 -0
  59. package/plugins/ruflo-metaharness/scripts/mint.mjs +11 -0
  60. package/plugins/ruflo-metaharness/scripts/oia-audit.mjs +9 -0
  61. package/plugins/ruflo-metaharness/scripts/router-parallel-analyze.mjs +8 -0
  62. package/plugins/ruflo-metaharness/scripts/score.mjs +8 -0
  63. package/plugins/ruflo-metaharness/scripts/security-bench.mjs +11 -0
  64. package/plugins/ruflo-metaharness/scripts/similarity.mjs +12 -0
  65. package/plugins/ruflo-metaharness/scripts/test-cli-help.mjs +72 -0
  66. package/plugins/ruflo-metaharness/scripts/threat-model.mjs +8 -0
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ // Hermetic CLI entry-point checks: no optional tools, network, or real memory writes.
3
+ import { test, before, after } from 'node:test';
4
+ import assert from 'node:assert/strict';
5
+ import { spawnSync } from 'node:child_process';
6
+ import { cpSync, mkdtempSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync, existsSync } from 'node:fs';
7
+ import { tmpdir } from 'node:os';
8
+ import { dirname, join } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+
11
+ const scripts = ['audit-list', 'audit-trend', 'bench', 'bench-parse-mcp-scan', 'bench-recordpair-overhead',
12
+ 'bench-similarity', 'drift-from-history', 'evolve', 'genome', 'gepa', 'learn', 'mcp-scan', 'mint',
13
+ 'oia-audit', 'router-parallel-analyze', 'score', 'security-bench', 'similarity', 'threat-model'];
14
+ let root;
15
+ let entryDir;
16
+ let cwd;
17
+ let guard;
18
+ before(() => {
19
+ root = mkdtempSync(join(tmpdir(), 'metaharness-help-'));
20
+ entryDir = join(root, 'scripts');
21
+ cwd = join(root, 'workspace');
22
+ mkdirSync(cwd);
23
+ cpSync(dirname(fileURLToPath(import.meta.url)), entryDir, { recursive: true });
24
+ guard = join(root, 'guard.cjs');
25
+ writeFileSync(guard, `
26
+ const cp = require('node:child_process');
27
+ const fs = require('node:fs');
28
+ const append = fs.appendFileSync;
29
+ const blocked = name => (...args) => {
30
+ append(process.env.ATTEMPT_LOG, name + '\\n');
31
+ throw new Error('test blocked side effect: ' + name);
32
+ };
33
+ for (const name of ['spawn', 'spawnSync', 'exec', 'execSync', 'execFile', 'execFileSync', 'fork']) cp[name] = blocked(name);
34
+ for (const name of ['writeFileSync', 'appendFileSync', 'mkdirSync', 'mkdtempSync', 'renameSync', 'unlinkSync', 'rmSync']) fs[name] = blocked(name);
35
+ require('node:module').syncBuiltinESMExports();
36
+ `);
37
+ });
38
+ after(() => rmSync(root, { recursive: true, force: true }));
39
+
40
+ function invoke(script, args) {
41
+ const log = join(root, 'attempts');
42
+ rmSync(log, { force: true });
43
+ const result = spawnSync(process.execPath, ['--require', guard, join(entryDir, script + '.mjs'), ...args], {
44
+ cwd, encoding: 'utf8', timeout: 3000,
45
+ env: { ...process.env, HOME: root, USERPROFILE: root, ATTEMPT_LOG: log, NODE_OPTIONS: '' },
46
+ });
47
+ return { ...result, attempts: existsSync(log) ? readFileSync(log, 'utf8') : '' };
48
+ }
49
+
50
+ for (const script of scripts) {
51
+ for (const flag of ['--help', '-h']) {
52
+ test(`${script} ${flag} prints help before any side effects`, () => {
53
+ const result = invoke(script, [flag]);
54
+ assert.equal(result.status, 0, result.stderr);
55
+ assert.match(result.stdout, /Usage:/);
56
+ assert.equal(result.attempts, '', 'no subprocess or write may be attempted');
57
+ assert.deepEqual(readdirSync(cwd), []);
58
+ });
59
+ }
60
+ test(`${script} rejects an unknown flag without running`, () => {
61
+ const result = invoke(script, ['--definitely-unknown']);
62
+ assert.equal(result.status, 2, result.stderr);
63
+ assert.match(result.stderr, /Unknown argument/);
64
+ assert.equal(result.attempts, '');
65
+ });
66
+ }
67
+ for (const args of [['--path'], ['--path', '--dry-run']]) test(`missing option value ${args.join(' ')} does not run`, () => {
68
+ const result = invoke('oia-audit', args);
69
+ assert.equal(result.status, 2);
70
+ assert.match(result.stderr, /requires a value/);
71
+ assert.equal(result.attempts, '');
72
+ });
@@ -4,10 +4,18 @@
4
4
  // USAGE
5
5
  // node scripts/threat-model.mjs --path . --fail-on high --format json
6
6
 
7
+ import { guardCliArgs } from './_cli-args.mjs';
8
+
7
9
  import { runHarness, emitDegradedJsonAndExit } from './_harness.mjs';
8
10
 
9
11
  const SEVERITY_RANK = { clean: 0, low: 1, medium: 2, high: 3 };
10
12
 
13
+ guardCliArgs(import.meta.url, {
14
+ '--path': 'value',
15
+ '--fail-on': 'value',
16
+ '--format': 'value',
17
+ });
18
+
11
19
  const ARGS = (() => {
12
20
  const a = { path: '.', format: 'json', failOn: 'high' };
13
21
  for (let i = 2; i < process.argv.length; i++) {