@claude-flow/cli 3.47.1 → 3.49.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 (98) hide show
  1. package/.claude/helpers/auto-memory-hook.mjs +6 -2
  2. package/.claude/helpers/helpers.manifest.json +5 -5
  3. package/.claude/helpers/hook-handler.cjs +7 -4
  4. package/.claude/helpers/learning-service.mjs +4 -2
  5. package/.claude/helpers/{memory.js → memory.cjs} +1 -1
  6. package/.claude/helpers/metrics-db.mjs +4 -2
  7. package/.claude/helpers/{router.js → router.cjs} +1 -1
  8. package/.claude/helpers/{session.js → session.cjs} +1 -1
  9. package/README.md +1 -53
  10. package/bin/cli.js +4 -1
  11. package/catalog-manifest.json +4 -4
  12. package/dist/src/commands/analyze.js +2 -2
  13. package/dist/src/commands/config.js +5 -7
  14. package/dist/src/commands/doctor.d.ts +19 -1
  15. package/dist/src/commands/doctor.js +69 -8
  16. package/dist/src/commands/hooks.js +22 -9
  17. package/dist/src/commands/memory.js +119 -34
  18. package/dist/src/commands/metaharness.js +1 -0
  19. package/dist/src/commands/plugins.js +44 -7
  20. package/dist/src/commands/policy.js +5 -2
  21. package/dist/src/commands/security.js +113 -55
  22. package/dist/src/commands/session.js +132 -25
  23. package/dist/src/commands/swarm.js +11 -11
  24. package/dist/src/commands/task.js +5 -4
  25. package/dist/src/index.js +10 -1
  26. package/dist/src/init/executor.js +11 -5
  27. package/dist/src/init/helper-companions.d.ts +3 -0
  28. package/dist/src/init/helper-companions.js +34 -0
  29. package/dist/src/init/helper-integrity.d.ts +21 -0
  30. package/dist/src/init/helper-integrity.js +62 -0
  31. package/dist/src/init/helper-refresh.d.ts +18 -11
  32. package/dist/src/init/helper-refresh.js +56 -13
  33. package/dist/src/init/helpers-generator.js +14 -12
  34. package/dist/src/mcp-server.js +10 -3
  35. package/dist/src/mcp-tools/agentdb-tools.js +29 -62
  36. package/dist/src/mcp-tools/hooks-tools.d.ts +16 -7
  37. package/dist/src/mcp-tools/hooks-tools.js +226 -51
  38. package/dist/src/mcp-tools/memory-tools.d.ts +7 -0
  39. package/dist/src/mcp-tools/memory-tools.js +131 -40
  40. package/dist/src/mcp-tools/policy-enforcer.d.ts +8 -1
  41. package/dist/src/mcp-tools/policy-enforcer.js +80 -8
  42. package/dist/src/mcp-tools/session-tools.d.ts +15 -0
  43. package/dist/src/mcp-tools/session-tools.js +270 -58
  44. package/dist/src/memory/feedback-patterns.d.ts +13 -0
  45. package/dist/src/memory/feedback-patterns.js +14 -0
  46. package/dist/src/memory/live-memory-row.d.ts +3 -0
  47. package/dist/src/memory/live-memory-row.js +5 -0
  48. package/dist/src/memory/memory-bridge.d.ts +11 -20
  49. package/dist/src/memory/memory-bridge.js +348 -134
  50. package/dist/src/memory/memory-initializer.d.ts +9 -1
  51. package/dist/src/memory/memory-initializer.js +47 -34
  52. package/dist/src/plugins/manager.d.ts +37 -10
  53. package/dist/src/plugins/manager.js +106 -20
  54. package/dist/src/plugins/trust-policy.d.ts +61 -0
  55. package/dist/src/plugins/trust-policy.js +84 -0
  56. package/dist/src/ruvector/graph-analyzer.js +4 -1
  57. package/dist/src/services/config-file-manager.js +30 -8
  58. package/dist/src/services/memory-backup.d.ts +1 -1
  59. package/dist/src/services/memory-backup.js +67 -27
  60. package/dist/src/services/policy-runtime.d.ts +6 -0
  61. package/dist/src/services/policy-runtime.js +27 -2
  62. package/dist/src/services/worker-daemon.d.ts +2 -2
  63. package/dist/src/services/worker-daemon.js +23 -14
  64. package/node_modules/@claude-flow/codex/package.json +1 -1
  65. package/node_modules/@claude-flow/mcp/dist/tool-registry.d.ts.map +1 -1
  66. package/node_modules/@claude-flow/mcp/dist/tool-registry.js +11 -3
  67. package/node_modules/@claude-flow/mcp/dist/tool-registry.js.map +1 -1
  68. package/node_modules/@claude-flow/mcp/package.json +6 -3
  69. package/node_modules/@claude-flow/plugin-agent-federation/package.json +3 -3
  70. package/node_modules/@claude-flow/security/dist/policy/engine.d.ts +2 -6
  71. package/node_modules/@claude-flow/security/dist/policy/engine.d.ts.map +1 -1
  72. package/node_modules/@claude-flow/security/dist/policy/engine.js +35 -1
  73. package/node_modules/@claude-flow/security/dist/policy/engine.js.map +1 -1
  74. package/node_modules/@claude-flow/security/dist/policy/types.d.ts +18 -0
  75. package/node_modules/@claude-flow/security/dist/policy/types.d.ts.map +1 -1
  76. package/node_modules/@claude-flow/security/package.json +2 -3
  77. package/package.json +9 -9
  78. package/plugins/ruflo-metaharness/scripts/_cli-args.mjs +37 -0
  79. package/plugins/ruflo-metaharness/scripts/audit-list.mjs +8 -0
  80. package/plugins/ruflo-metaharness/scripts/audit-trend.mjs +12 -0
  81. package/plugins/ruflo-metaharness/scripts/bench-parse-mcp-scan.mjs +8 -0
  82. package/plugins/ruflo-metaharness/scripts/bench-recordpair-overhead.mjs +8 -0
  83. package/plugins/ruflo-metaharness/scripts/bench-similarity.mjs +8 -0
  84. package/plugins/ruflo-metaharness/scripts/bench.mjs +10 -0
  85. package/plugins/ruflo-metaharness/scripts/drift-from-history.mjs +13 -0
  86. package/plugins/ruflo-metaharness/scripts/evolve.mjs +27 -0
  87. package/plugins/ruflo-metaharness/scripts/genome.mjs +8 -0
  88. package/plugins/ruflo-metaharness/scripts/gepa.mjs +12 -0
  89. package/plugins/ruflo-metaharness/scripts/learn.mjs +13 -0
  90. package/plugins/ruflo-metaharness/scripts/mcp-scan.mjs +8 -0
  91. package/plugins/ruflo-metaharness/scripts/mint.mjs +11 -0
  92. package/plugins/ruflo-metaharness/scripts/oia-audit.mjs +9 -0
  93. package/plugins/ruflo-metaharness/scripts/router-parallel-analyze.mjs +8 -0
  94. package/plugins/ruflo-metaharness/scripts/score.mjs +8 -0
  95. package/plugins/ruflo-metaharness/scripts/security-bench.mjs +11 -0
  96. package/plugins/ruflo-metaharness/scripts/similarity.mjs +12 -0
  97. package/plugins/ruflo-metaharness/scripts/test-cli-help.mjs +72 -0
  98. package/plugins/ruflo-metaharness/scripts/threat-model.mjs +8 -0
@@ -24,6 +24,8 @@
24
24
  // 1 --alert-on-worst threshold exceeded
25
25
  // 2 config error or audit failure
26
26
 
27
+ import { guardCliArgs } from './_cli-args.mjs';
28
+
27
29
  import { runRufloCli } from './_invoke.mjs';
28
30
  // iter 63 — SEVERITY_RANK + rankSeverity consolidated to _harness.mjs
29
31
  // (was local in iter 62; now shared with audit-trend + mcp-scan).
@@ -38,6 +40,13 @@ const NS = process.env.OIA_AUDIT_NAMESPACE || 'metaharness-audit';
38
40
  // resolution per call, possible version skew, fails without registry access).
39
41
  // CLI_CORE=1 still opts into `npx @claude-flow/cli-core@alpha`.
40
42
 
43
+ guardCliArgs(import.meta.url, {
44
+ '--path': 'value',
45
+ '--dry-run': null,
46
+ '--alert-on-worst': 'value',
47
+ '--format': 'value',
48
+ }, "Runs and persists an audit by default. --dry-run skips the memory write; analysis tools still run.");
49
+
41
50
  const ARGS = (() => {
42
51
  const a = { path: '.', format: 'json', dryRun: false, alertWorst: null };
43
52
  for (let i = 2; i < process.argv.length; i++) {
@@ -33,8 +33,16 @@
33
33
  // 1 --strict requested AND at least one criterion failed (NOT promotable)
34
34
  // 2 config error or input file missing/malformed
35
35
 
36
+ import { guardCliArgs } from './_cli-args.mjs';
37
+
36
38
  import { readFileSync, existsSync } from 'node:fs';
37
39
 
40
+ guardCliArgs(import.meta.url, {
41
+ '--input': 'value',
42
+ '--format': 'value',
43
+ '--strict': null,
44
+ });
45
+
38
46
  const ARGS = (() => {
39
47
  const a = { input: '.swarm/router-parallel.jsonl', format: 'table', strict: false };
40
48
  for (let i = 2; i < process.argv.length; i++) {
@@ -16,8 +16,16 @@
16
16
  // 1 --alert-on-fit-below threshold breached
17
17
  // 2 config error or scoring failure
18
18
 
19
+ import { guardCliArgs } from './_cli-args.mjs';
20
+
19
21
  import { runMetaharness, emitDegradedJsonAndExit } from './_harness.mjs';
20
22
 
23
+ guardCliArgs(import.meta.url, {
24
+ '--path': 'value',
25
+ '--alert-on-fit-below': 'value',
26
+ '--format': 'value',
27
+ });
28
+
21
29
  const ARGS = (() => {
22
30
  const a = { path: '.', format: 'json', alertFitBelow: null };
23
31
  for (let i = 2; i < process.argv.length; i++) {
@@ -30,8 +30,19 @@
30
30
  // 1 --alert-on-fail and any acceptance gate failed
31
31
  // 2 config error or bench infrastructure failure
32
32
 
33
+ import { guardCliArgs } from './_cli-args.mjs';
34
+
33
35
  import { runDarwinAsync, emitDarwinDegradedJsonAndExit } from './_darwin.mjs';
34
36
 
37
+ guardCliArgs(import.meta.url, {
38
+ '--population': 'value',
39
+ '--cycles': 'value',
40
+ '--seed': 'value',
41
+ '--alert-on-fail': null,
42
+ '--format': 'value',
43
+ '--timeout-ms': 'value',
44
+ }, "Runs the security benchmark. This command has no plan-only mode.");
45
+
35
46
  const ARGS = (() => {
36
47
  const a = {
37
48
  population: 2,
@@ -23,6 +23,8 @@
23
23
  // a structured `{ degraded: true, reason: ... }` payload on stdout
24
24
  // - CI-gate ready: smoke step 17y locks this contract
25
25
 
26
+ import { guardCliArgs } from './_cli-args.mjs';
27
+
26
28
  import { readFileSync, existsSync } from 'node:fs';
27
29
  import { runRufloCli } from './_invoke.mjs';
28
30
  import { similarity } from './_similarity.mjs';
@@ -33,6 +35,16 @@ const NS = process.env.HARNESS_SIMILARITY_NAMESPACE || 'metaharness-audit';
33
35
  // resolution per call, possible version skew, fails without registry access).
34
36
  // CLI_CORE=1 still opts into `npx @claude-flow/cli-core@alpha`.
35
37
 
38
+ guardCliArgs(import.meta.url, {
39
+ '--a': 'value',
40
+ '--b': 'value',
41
+ '--a-key': 'value',
42
+ '--b-key': 'value',
43
+ '--per-dimension': null,
44
+ '--format': 'value',
45
+ '--alert-below': 'value',
46
+ });
47
+
36
48
  const ARGS = (() => {
37
49
  const a = {
38
50
  aFile: null, bFile: null,
@@ -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++) {