@namzu/cli 1.0.1 → 2.1.1

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 (211) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +0 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/integrations/providers/index.d.ts +0 -3
  5. package/dist/integrations/providers/index.d.ts.map +1 -1
  6. package/dist/integrations/providers/index.js +0 -5
  7. package/dist/integrations/providers/index.js.map +1 -1
  8. package/dist/tui/App.d.ts.map +1 -1
  9. package/dist/tui/App.js +8 -0
  10. package/dist/tui/App.js.map +1 -1
  11. package/dist/tui/agent.d.ts +10 -0
  12. package/dist/tui/agent.d.ts.map +1 -1
  13. package/dist/tui/agent.js +10 -0
  14. package/dist/tui/agent.js.map +1 -1
  15. package/dist/tui/slashCommands.d.ts +46 -0
  16. package/dist/tui/slashCommands.d.ts.map +1 -1
  17. package/dist/tui/slashCommands.js +96 -0
  18. package/dist/tui/slashCommands.js.map +1 -1
  19. package/package.json +11 -6
  20. package/dist/__tests__/environment-reaches-the-turn.test.d.ts +0 -17
  21. package/dist/__tests__/environment-reaches-the-turn.test.d.ts.map +0 -1
  22. package/dist/__tests__/environment-reaches-the-turn.test.js +0 -128
  23. package/dist/__tests__/environment-reaches-the-turn.test.js.map +0 -1
  24. package/dist/__tests__/headless-trust-gate.test.d.ts +0 -23
  25. package/dist/__tests__/headless-trust-gate.test.d.ts.map +0 -1
  26. package/dist/__tests__/headless-trust-gate.test.js +0 -227
  27. package/dist/__tests__/headless-trust-gate.test.js.map +0 -1
  28. package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts +0 -17
  29. package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts.map +0 -1
  30. package/dist/__tests__/mcp-servers-reach-the-session.test.js +0 -171
  31. package/dist/__tests__/mcp-servers-reach-the-session.test.js.map +0 -1
  32. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts +0 -31
  33. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts.map +0 -1
  34. package/dist/__tests__/permission-rules-reach-the-turn.test.js +0 -132
  35. package/dist/__tests__/permission-rules-reach-the-turn.test.js.map +0 -1
  36. package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts +0 -24
  37. package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts.map +0 -1
  38. package/dist/__tests__/project-instructions-reach-the-turn.test.js +0 -153
  39. package/dist/__tests__/project-instructions-reach-the-turn.test.js.map +0 -1
  40. package/dist/cli.test.d.ts +0 -2
  41. package/dist/cli.test.d.ts.map +0 -1
  42. package/dist/cli.test.js +0 -100
  43. package/dist/cli.test.js.map +0 -1
  44. package/dist/commands/__tests__/eval.test.d.ts +0 -2
  45. package/dist/commands/__tests__/eval.test.d.ts.map +0 -1
  46. package/dist/commands/__tests__/eval.test.js +0 -165
  47. package/dist/commands/__tests__/eval.test.js.map +0 -1
  48. package/dist/commands/__tests__/passthrough-help.test.d.ts +0 -2
  49. package/dist/commands/__tests__/passthrough-help.test.d.ts.map +0 -1
  50. package/dist/commands/__tests__/passthrough-help.test.js +0 -96
  51. package/dist/commands/__tests__/passthrough-help.test.js.map +0 -1
  52. package/dist/commands/__tests__/resume.test.d.ts +0 -15
  53. package/dist/commands/__tests__/resume.test.d.ts.map +0 -1
  54. package/dist/commands/__tests__/resume.test.js +0 -116
  55. package/dist/commands/__tests__/resume.test.js.map +0 -1
  56. package/dist/commands/__tests__/run-exit-code.test.d.ts +0 -2
  57. package/dist/commands/__tests__/run-exit-code.test.d.ts.map +0 -1
  58. package/dist/commands/__tests__/run-exit-code.test.js +0 -100
  59. package/dist/commands/__tests__/run-exit-code.test.js.map +0 -1
  60. package/dist/commands/__tests__/run-flags.test.d.ts +0 -11
  61. package/dist/commands/__tests__/run-flags.test.d.ts.map +0 -1
  62. package/dist/commands/__tests__/run-flags.test.js +0 -238
  63. package/dist/commands/__tests__/run-flags.test.js.map +0 -1
  64. package/dist/commands/__tests__/run-stream-flags.test.d.ts +0 -2
  65. package/dist/commands/__tests__/run-stream-flags.test.d.ts.map +0 -1
  66. package/dist/commands/__tests__/run-stream-flags.test.js +0 -295
  67. package/dist/commands/__tests__/run-stream-flags.test.js.map +0 -1
  68. package/dist/commands/doctor.test.d.ts +0 -2
  69. package/dist/commands/doctor.test.d.ts.map +0 -1
  70. package/dist/commands/doctor.test.js +0 -82
  71. package/dist/commands/doctor.test.js.map +0 -1
  72. package/dist/commands/providers.d.ts +0 -17
  73. package/dist/commands/providers.d.ts.map +0 -1
  74. package/dist/commands/providers.js +0 -274
  75. package/dist/commands/providers.js.map +0 -1
  76. package/dist/config/load.test.d.ts +0 -2
  77. package/dist/config/load.test.d.ts.map +0 -1
  78. package/dist/config/load.test.js +0 -57
  79. package/dist/config/load.test.js.map +0 -1
  80. package/dist/context/__tests__/environment.test.d.ts +0 -10
  81. package/dist/context/__tests__/environment.test.d.ts.map +0 -1
  82. package/dist/context/__tests__/environment.test.js +0 -84
  83. package/dist/context/__tests__/environment.test.js.map +0 -1
  84. package/dist/context/__tests__/project.test.d.ts +0 -12
  85. package/dist/context/__tests__/project.test.d.ts.map +0 -1
  86. package/dist/context/__tests__/project.test.js +0 -201
  87. package/dist/context/__tests__/project.test.js.map +0 -1
  88. package/dist/doctor/checks/credentials.test.d.ts +0 -10
  89. package/dist/doctor/checks/credentials.test.d.ts.map +0 -1
  90. package/dist/doctor/checks/credentials.test.js +0 -47
  91. package/dist/doctor/checks/credentials.test.js.map +0 -1
  92. package/dist/doctor/checks/sandbox.test.d.ts +0 -2
  93. package/dist/doctor/checks/sandbox.test.d.ts.map +0 -1
  94. package/dist/doctor/checks/sandbox.test.js +0 -59
  95. package/dist/doctor/checks/sandbox.test.js.map +0 -1
  96. package/dist/doctor/registry.test.d.ts +0 -7
  97. package/dist/doctor/registry.test.d.ts.map +0 -1
  98. package/dist/doctor/registry.test.js +0 -379
  99. package/dist/doctor/registry.test.js.map +0 -1
  100. package/dist/integrations/mcp/__tests__/connect.test.d.ts +0 -11
  101. package/dist/integrations/mcp/__tests__/connect.test.d.ts.map +0 -1
  102. package/dist/integrations/mcp/__tests__/connect.test.js +0 -231
  103. package/dist/integrations/mcp/__tests__/connect.test.js.map +0 -1
  104. package/dist/integrations/providers/discover.test.d.ts +0 -2
  105. package/dist/integrations/providers/discover.test.d.ts.map +0 -1
  106. package/dist/integrations/providers/discover.test.js +0 -93
  107. package/dist/integrations/providers/discover.test.js.map +0 -1
  108. package/dist/integrations/providers/keychain.test.d.ts +0 -2
  109. package/dist/integrations/providers/keychain.test.d.ts.map +0 -1
  110. package/dist/integrations/providers/keychain.test.js +0 -21
  111. package/dist/integrations/providers/keychain.test.js.map +0 -1
  112. package/dist/integrations/providers/mask.d.ts +0 -7
  113. package/dist/integrations/providers/mask.d.ts.map +0 -1
  114. package/dist/integrations/providers/mask.js +0 -14
  115. package/dist/integrations/providers/mask.js.map +0 -1
  116. package/dist/integrations/providers/mask.test.d.ts +0 -2
  117. package/dist/integrations/providers/mask.test.d.ts.map +0 -1
  118. package/dist/integrations/providers/mask.test.js +0 -20
  119. package/dist/integrations/providers/mask.test.js.map +0 -1
  120. package/dist/integrations/providers/oauth.test.d.ts +0 -2
  121. package/dist/integrations/providers/oauth.test.d.ts.map +0 -1
  122. package/dist/integrations/providers/oauth.test.js +0 -86
  123. package/dist/integrations/providers/oauth.test.js.map +0 -1
  124. package/dist/integrations/providers/preferences.test.d.ts +0 -2
  125. package/dist/integrations/providers/preferences.test.d.ts.map +0 -1
  126. package/dist/integrations/providers/preferences.test.js +0 -76
  127. package/dist/integrations/providers/preferences.test.js.map +0 -1
  128. package/dist/integrations/providers/schema.d.ts +0 -73
  129. package/dist/integrations/providers/schema.d.ts.map +0 -1
  130. package/dist/integrations/providers/schema.js +0 -70
  131. package/dist/integrations/providers/schema.js.map +0 -1
  132. package/dist/integrations/providers/schema.test.d.ts +0 -2
  133. package/dist/integrations/providers/schema.test.d.ts.map +0 -1
  134. package/dist/integrations/providers/schema.test.js +0 -43
  135. package/dist/integrations/providers/schema.test.js.map +0 -1
  136. package/dist/integrations/providers/store.d.ts +0 -32
  137. package/dist/integrations/providers/store.d.ts.map +0 -1
  138. package/dist/integrations/providers/store.js +0 -133
  139. package/dist/integrations/providers/store.js.map +0 -1
  140. package/dist/integrations/providers/store.test.d.ts +0 -2
  141. package/dist/integrations/providers/store.test.d.ts.map +0 -1
  142. package/dist/integrations/providers/store.test.js +0 -135
  143. package/dist/integrations/providers/store.test.js.map +0 -1
  144. package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts +0 -21
  145. package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts.map +0 -1
  146. package/dist/integrations/sessions/__tests__/archived-workspace.test.js +0 -62
  147. package/dist/integrations/sessions/__tests__/archived-workspace.test.js.map +0 -1
  148. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts +0 -2
  149. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts.map +0 -1
  150. package/dist/integrations/subagents/__tests__/delegation-trace.test.js +0 -114
  151. package/dist/integrations/subagents/__tests__/delegation-trace.test.js.map +0 -1
  152. package/dist/integrations/trust/store.test.d.ts +0 -2
  153. package/dist/integrations/trust/store.test.d.ts.map +0 -1
  154. package/dist/integrations/trust/store.test.js +0 -50
  155. package/dist/integrations/trust/store.test.js.map +0 -1
  156. package/dist/memory/store.test.d.ts +0 -2
  157. package/dist/memory/store.test.d.ts.map +0 -1
  158. package/dist/memory/store.test.js +0 -63
  159. package/dist/memory/store.test.js.map +0 -1
  160. package/dist/output/formatter.test.d.ts +0 -2
  161. package/dist/output/formatter.test.d.ts.map +0 -1
  162. package/dist/output/formatter.test.js +0 -88
  163. package/dist/output/formatter.test.js.map +0 -1
  164. package/dist/output/rendered-payload.test.d.ts +0 -2
  165. package/dist/output/rendered-payload.test.d.ts.map +0 -1
  166. package/dist/output/rendered-payload.test.js +0 -61
  167. package/dist/output/rendered-payload.test.js.map +0 -1
  168. package/dist/permissions/__tests__/mode.test.d.ts +0 -10
  169. package/dist/permissions/__tests__/mode.test.d.ts.map +0 -1
  170. package/dist/permissions/__tests__/mode.test.js +0 -115
  171. package/dist/permissions/__tests__/mode.test.js.map +0 -1
  172. package/dist/permissions/__tests__/rules.test.d.ts +0 -10
  173. package/dist/permissions/__tests__/rules.test.d.ts.map +0 -1
  174. package/dist/permissions/__tests__/rules.test.js +0 -196
  175. package/dist/permissions/__tests__/rules.test.js.map +0 -1
  176. package/dist/skills/store.test.d.ts +0 -2
  177. package/dist/skills/store.test.d.ts.map +0 -1
  178. package/dist/skills/store.test.js +0 -80
  179. package/dist/skills/store.test.js.map +0 -1
  180. package/dist/tui/__tests__/context-gauge.test.d.ts +0 -2
  181. package/dist/tui/__tests__/context-gauge.test.d.ts.map +0 -1
  182. package/dist/tui/__tests__/context-gauge.test.js +0 -83
  183. package/dist/tui/__tests__/context-gauge.test.js.map +0 -1
  184. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts +0 -24
  185. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts.map +0 -1
  186. package/dist/tui/__tests__/deferred-tool-discovery.test.js +0 -111
  187. package/dist/tui/__tests__/deferred-tool-discovery.test.js.map +0 -1
  188. package/dist/tui/__tests__/to-agent-event.test.d.ts +0 -2
  189. package/dist/tui/__tests__/to-agent-event.test.d.ts.map +0 -1
  190. package/dist/tui/__tests__/to-agent-event.test.js +0 -230
  191. package/dist/tui/__tests__/to-agent-event.test.js.map +0 -1
  192. package/dist/tui/__tests__/working-directory.test.d.ts +0 -13
  193. package/dist/tui/__tests__/working-directory.test.d.ts.map +0 -1
  194. package/dist/tui/__tests__/working-directory.test.js +0 -109
  195. package/dist/tui/__tests__/working-directory.test.js.map +0 -1
  196. package/dist/tui/agent.test.d.ts +0 -2
  197. package/dist/tui/agent.test.d.ts.map +0 -1
  198. package/dist/tui/agent.test.js +0 -225
  199. package/dist/tui/agent.test.js.map +0 -1
  200. package/dist/tui/markdownParser.test.d.ts +0 -2
  201. package/dist/tui/markdownParser.test.d.ts.map +0 -1
  202. package/dist/tui/markdownParser.test.js +0 -90
  203. package/dist/tui/markdownParser.test.js.map +0 -1
  204. package/dist/tui/mentions.test.d.ts +0 -2
  205. package/dist/tui/mentions.test.d.ts.map +0 -1
  206. package/dist/tui/mentions.test.js +0 -35
  207. package/dist/tui/mentions.test.js.map +0 -1
  208. package/dist/tui/slashCommands.test.d.ts +0 -2
  209. package/dist/tui/slashCommands.test.d.ts.map +0 -1
  210. package/dist/tui/slashCommands.test.js +0 -114
  211. package/dist/tui/slashCommands.test.js.map +0 -1
package/dist/cli.test.js DELETED
@@ -1,100 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
- import { runCli } from './cli.js';
3
- describe('runCli', () => {
4
- let stdout;
5
- let stderr;
6
- let originalStdoutWrite;
7
- let originalStderrWrite;
8
- beforeEach(() => {
9
- stdout = '';
10
- stderr = '';
11
- originalStdoutWrite = process.stdout.write.bind(process.stdout);
12
- originalStderrWrite = process.stderr.write.bind(process.stderr);
13
- process.stdout.write = ((chunk) => {
14
- stdout += typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8');
15
- return true;
16
- });
17
- process.stderr.write = ((chunk) => {
18
- stderr += typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8');
19
- return true;
20
- });
21
- });
22
- afterEach(() => {
23
- process.stdout.write = originalStdoutWrite;
24
- process.stderr.write = originalStderrWrite;
25
- });
26
- const invoke = (args) => runCli({ argv: ['node', 'namzu', ...args] });
27
- it('--help returns 0 and lists every registered command', async () => {
28
- const code = await invoke(['--help']);
29
- expect(code).toBe(0);
30
- // Commander prints help to stdout.
31
- expect(stdout).toContain('namzu');
32
- expect(stdout).toContain('doctor');
33
- expect(stdout).toContain('providers');
34
- expect(stdout).toContain('skills');
35
- expect(stdout).toContain('serve');
36
- // `tools` was asserted here until the peer-daemon removal deleted the
37
- // command. The assertion kept passing, because "tools" also occurs in
38
- // the --dangerously-skip-permissions description ("Run tools without
39
- // asking…") — a substring match on whole help output cannot tell a
40
- // command from a word in a sentence. Anchored to the command column so
41
- // it means what it says.
42
- expect(stdout).not.toMatch(/^\s+tools\b/m);
43
- // `chat` was a misread of the product shape — the TUI IS the chat,
44
- // not a separate subcommand. `chat` must not appear in help.
45
- expect(stdout).not.toContain('chat');
46
- });
47
- it('no args without a TTY prints a fallback marker and exits 0 (tests run without a TTY)', async () => {
48
- const code = await invoke([]);
49
- expect(code).toBe(0);
50
- expect(stdout).toContain('TUI requires a terminal');
51
- expect(stdout).toContain('namzu --help');
52
- });
53
- it('--version returns 0 and prints a version string', async () => {
54
- const code = await invoke(['--version']);
55
- expect(code).toBe(0);
56
- expect(stdout).toMatch(/\d+\.\d+\.\d+/);
57
- });
58
- it('unknown command returns sysexits EX_USAGE (64)', async () => {
59
- const code = await invoke(['definitely-not-a-command']);
60
- expect(code).toBe(64);
61
- // Commander chooses between "unknown command" and "too many arguments"
62
- // depending on whether a default action is registered. Either wording
63
- // is acceptable — the contract is the sysexit code, not the message.
64
- expect(stderr).toMatch(/unknown command|too many arguments/);
65
- });
66
- it('stub commands print a structured marker and exit 0', async () => {
67
- const code = await invoke(['skills']);
68
- expect(code).toBe(0);
69
- expect(stdout).toContain('M5');
70
- expect(stdout).toContain('skills');
71
- });
72
- it('--format json renders stubs as JSON', async () => {
73
- const code = await invoke(['--format', 'json', 'skills']);
74
- expect(code).toBe(0);
75
- const parsed = JSON.parse(stdout);
76
- expect(parsed.stub).toBe(true);
77
- expect(parsed.milestone).toBe('M5');
78
- });
79
- it('--format yaml renders stubs as YAML', async () => {
80
- const code = await invoke(['--format', 'yaml', 'skills']);
81
- expect(code).toBe(0);
82
- expect(stdout).toContain('stub: true');
83
- expect(stdout).toContain('milestone: M5');
84
- });
85
- it('doctor command pass-through preserves --help routing to the doctor', async () => {
86
- // The legacy doctor --help text starts with "namzu doctor —" while the
87
- // shell help would start with "Usage: namzu". This distinguishes them.
88
- const code = await invoke(['doctor', '--help']);
89
- expect(code).toBe(0);
90
- expect(stdout).toContain('namzu doctor');
91
- expect(stdout).toContain('--per-check-timeout');
92
- });
93
- it('doctor command pass-through forwards unknown flags into doctor parser', async () => {
94
- const code = await invoke(['doctor', '--frobnicate']);
95
- // doctor's own parser surfaces 70 (EXIT_INTERNAL_ERROR) on unknown options.
96
- expect(code).toBe(64);
97
- expect(stderr).toContain('unknown option: --frobnicate');
98
- });
99
- });
100
- //# sourceMappingURL=cli.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=eval.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eval.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/eval.test.ts"],"names":[],"mappings":""}
@@ -1,165 +0,0 @@
1
- import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
- import { EVAL_EXIT, discoverSuites, evalCommand } from '../eval.js';
6
- /**
7
- * The eval surface was a library function and a string formatter: no
8
- * command, no CI step, and `formatReport` ending at `lines.join('\n')`
9
- * with no file write and no exit code. The harness exists to give a
10
- * behaviour change a regression signal, and that signal could not reach CI
11
- * without every consumer hand-writing the runner and the
12
- * report-to-exit-code mapping.
13
- */
14
- function makeCtx() {
15
- const printed = [];
16
- const errors = [];
17
- const infos = [];
18
- const ctx = {
19
- formatter: {
20
- name: 'text',
21
- print: (data) => printed.push(data),
22
- info: (message) => infos.push(message),
23
- error: (payload) => errors.push(payload.message),
24
- },
25
- config: {},
26
- };
27
- return { ctx, printed, errors, infos };
28
- }
29
- /** A suite module returning a report with the given counts. */
30
- const suiteSource = (opts = {}) => `
31
- export const tags = ${JSON.stringify(opts.tags ?? [])}
32
- export default async function () {
33
- return {
34
- name: 'suite',
35
- cases: [],
36
- mean: 1,
37
- passed: ${opts.passed ?? 1},
38
- failed: ${opts.failed ?? 0},
39
- inconclusive: ${opts.inconclusive ?? 0},
40
- byScorer: {},
41
- durationMs: 1,
42
- }
43
- }
44
- `;
45
- describe('discovering suites', () => {
46
- let dir;
47
- beforeEach(async () => {
48
- dir = await mkdtemp(join(tmpdir(), 'namzu-eval-'));
49
- });
50
- afterEach(async () => {
51
- await rm(dir, { recursive: true, force: true });
52
- });
53
- it('derives an id from the path, so two commits can be diffed', async () => {
54
- await mkdir(join(dir, 'tools'), { recursive: true });
55
- await writeFile(join(dir, 'tools', 'read.eval.js'), suiteSource(), 'utf-8');
56
- const [suite] = await discoverSuites(dir);
57
- // Posix-separated regardless of host, or the id changes per machine.
58
- expect(suite?.id).toBe('tools/read');
59
- });
60
- it('ignores files that are not suites', async () => {
61
- await writeFile(join(dir, 'helpers.js'), 'export default 1', 'utf-8');
62
- expect(await discoverSuites(dir)).toEqual([]);
63
- });
64
- it('does not walk into dependency or dot directories', async () => {
65
- await mkdir(join(dir, 'node_modules'), { recursive: true });
66
- await mkdir(join(dir, '.cache'), { recursive: true });
67
- await writeFile(join(dir, 'node_modules', 'a.eval.js'), suiteSource(), 'utf-8');
68
- await writeFile(join(dir, '.cache', 'b.eval.js'), suiteSource(), 'utf-8');
69
- expect(await discoverSuites(dir)).toEqual([]);
70
- });
71
- it('returns nothing for a directory that does not exist', async () => {
72
- expect(await discoverSuites(join(dir, 'missing'))).toEqual([]);
73
- });
74
- });
75
- describe('the exit code', () => {
76
- let dir;
77
- beforeEach(async () => {
78
- dir = await mkdtemp(join(tmpdir(), 'namzu-eval-'));
79
- });
80
- afterEach(async () => {
81
- await rm(dir, { recursive: true, force: true });
82
- });
83
- const run = async (args = []) => {
84
- const { ctx, printed, errors, infos } = makeCtx();
85
- const code = await evalCommand.handler({ ctx, rawArgs: ['--dir', dir, ...args] });
86
- return { code, printed, errors, infos };
87
- };
88
- it('is 0 when everything passed', async () => {
89
- await writeFile(join(dir, 'a.eval.js'), suiteSource(), 'utf-8');
90
- expect((await run()).code).toBe(EVAL_EXIT.ok);
91
- });
92
- it('is 1 on a failure — the regression signal', async () => {
93
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ failed: 1 }), 'utf-8');
94
- expect((await run()).code).toBe(EVAL_EXIT.failed);
95
- });
96
- it('is 2 on inconclusive, which is a broken harness rather than a regression', async () => {
97
- // Collapsing this into 1 sends somebody hunting a behaviour change
98
- // that never happened.
99
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ inconclusive: 1 }), 'utf-8');
100
- expect((await run()).code).toBe(EVAL_EXIT.inconclusive);
101
- });
102
- it('reports inconclusive even when something also failed', async () => {
103
- // A suite that could not judge says nothing about the cases it did
104
- // judge, so the failure count covers less evidence than it appears to.
105
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ failed: 1, inconclusive: 1 }), 'utf-8');
106
- expect((await run()).code).toBe(EVAL_EXIT.inconclusive);
107
- });
108
- it('is a usage error when no suite exists', async () => {
109
- // Not 0. A CI gate that finds nothing to run must not report green.
110
- const { code, errors } = await run();
111
- expect(code).toBe(EVAL_EXIT.usage);
112
- expect(errors[0]).toMatch(/No eval suites found/);
113
- });
114
- it('is a usage error when a suite does not export a runner', async () => {
115
- await writeFile(join(dir, 'a.eval.js'), 'export const tags = []', 'utf-8');
116
- const { code, errors } = await run();
117
- expect(code).toBe(EVAL_EXIT.usage);
118
- expect(errors[0]).toMatch(/must default-export a function/);
119
- });
120
- });
121
- describe('filtering and artifacts', () => {
122
- let dir;
123
- beforeEach(async () => {
124
- dir = await mkdtemp(join(tmpdir(), 'namzu-eval-'));
125
- });
126
- afterEach(async () => {
127
- await rm(dir, { recursive: true, force: true });
128
- });
129
- const run = async (args) => {
130
- const { ctx, printed, errors, infos } = makeCtx();
131
- const code = await evalCommand.handler({ ctx, rawArgs: ['--dir', dir, ...args] });
132
- return { code, printed, errors, infos };
133
- };
134
- it('runs only the suites carrying the tag', async () => {
135
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ tags: ['fast'] }), 'utf-8');
136
- await writeFile(join(dir, 'b.eval.js'), suiteSource({ tags: ['slow'], failed: 1 }), 'utf-8');
137
- const { code } = await run(['--tag', 'fast']);
138
- expect(code).toBe(EVAL_EXIT.ok);
139
- });
140
- it('says how many suites the filter skipped', async () => {
141
- // A filter that quietly matched nothing looks exactly like a green
142
- // run, which is the worst way for a CI gate to fail open.
143
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ tags: ['fast'] }), 'utf-8');
144
- await writeFile(join(dir, 'b.eval.js'), suiteSource({ tags: ['slow'] }), 'utf-8');
145
- const { infos } = await run(['--tag', 'fast']);
146
- expect(infos.some((m) => m.includes('1 suite(s) skipped'))).toBe(true);
147
- });
148
- it('is a usage error when the filter matches nothing at all', async () => {
149
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ tags: ['fast'] }), 'utf-8');
150
- const { code } = await run(['--tag', 'nope']);
151
- expect(code).toBe(EVAL_EXIT.usage);
152
- });
153
- it('writes the whole report, not a summary', async () => {
154
- const out = join(dir, 'artifacts', 'report.json');
155
- await writeFile(join(dir, 'a.eval.js'), suiteSource({ failed: 2 }), 'utf-8');
156
- await run(['--out', out]);
157
- const { readFile } = await import('node:fs/promises');
158
- const written = JSON.parse(await readFile(out, 'utf-8'));
159
- // Two commits' artifacts are meant to be diffable, and a summary
160
- // cannot say which scorer moved.
161
- expect(written.suites[0]?.suite).toBe('a');
162
- expect(written.suites[0]?.report.failed).toBe(2);
163
- });
164
- });
165
- //# sourceMappingURL=eval.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eval.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/eval.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=passthrough-help.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"passthrough-help.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/passthrough-help.test.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- import { Command } from 'commander';
2
- import { describe, expect, it } from 'vitest';
3
- import { registerCommand } from '../registry.js';
4
- /**
5
- * `passThrough` turns commander's `--help` off so a command can parse it
6
- * itself. A command that does not then receives `--help` as INPUT: for
7
- * `run` it became the prompt to send to a model, for `history` the session
8
- * to search. A user asking how to use something got a credential error or
9
- * an empty result list.
10
- *
11
- * Three commands did this. The check lives in the registry rather than in
12
- * each of them, because that is what stops the fourth from doing it too.
13
- */
14
- function harness(def) {
15
- const printed = [];
16
- let exitCode;
17
- const program = new Command().exitOverride().enablePositionalOptions();
18
- const ctx = {
19
- formatter: {
20
- name: 'text',
21
- print: (data) => printed.push(String(data.text ?? data)),
22
- info: () => { },
23
- error: () => { },
24
- },
25
- config: {},
26
- };
27
- registerCommand(program, def, {
28
- getContext: () => ctx,
29
- setExitCode: (code) => {
30
- exitCode = code;
31
- },
32
- });
33
- return { program, printed, exit: () => exitCode };
34
- }
35
- const ran = [];
36
- const withHelp = {
37
- name: 'demo',
38
- description: 'demo',
39
- passThrough: true,
40
- help: 'Usage: namzu demo <thing>',
41
- handler: async ({ rawArgs }) => {
42
- ran.push(rawArgs.join(' '));
43
- return 0;
44
- },
45
- };
46
- const withoutHelp = {
47
- name: 'owns-help',
48
- description: 'renders its own',
49
- passThrough: true,
50
- handler: async ({ rawArgs }) => {
51
- ran.push(rawArgs.join(' '));
52
- return 0;
53
- },
54
- };
55
- describe('--help on a passThrough command', () => {
56
- it('prints the help instead of running the handler', async () => {
57
- ran.length = 0;
58
- const h = harness(withHelp);
59
- await h.program.parseAsync(['demo', '--help'], { from: 'user' });
60
- expect(h.printed[0]).toContain('Usage: namzu demo');
61
- // The handler must not run: for `run` this was a model call with
62
- // `--help` as the prompt.
63
- expect(ran).toEqual([]);
64
- expect(h.exit()).toBe(0);
65
- });
66
- it('accepts the short form too', async () => {
67
- ran.length = 0;
68
- const h = harness(withHelp);
69
- await h.program.parseAsync(['demo', '-h'], { from: 'user' });
70
- expect(h.printed[0]).toContain('Usage:');
71
- expect(ran).toEqual([]);
72
- });
73
- it('answers even when other arguments came first', async () => {
74
- // `namzu run some prompt --help` still means "how do I use this".
75
- ran.length = 0;
76
- const h = harness(withHelp);
77
- await h.program.parseAsync(['demo', 'thing', '--help'], { from: 'user' });
78
- expect(ran).toEqual([]);
79
- });
80
- it('leaves a command that renders its own help alone', async () => {
81
- // Intercepting here would mean that command's real help never shows.
82
- ran.length = 0;
83
- const h = harness(withoutHelp);
84
- await h.program.parseAsync(['owns-help', '--help'], { from: 'user' });
85
- expect(h.printed).toEqual([]);
86
- expect(ran).toEqual(['--help']);
87
- });
88
- it('does not intercept an ordinary invocation', async () => {
89
- ran.length = 0;
90
- const h = harness(withHelp);
91
- await h.program.parseAsync(['demo', 'do', 'the', 'thing'], { from: 'user' });
92
- expect(ran).toEqual(['do the thing']);
93
- expect(h.printed).toEqual([]);
94
- });
95
- });
96
- //# sourceMappingURL=passthrough-help.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"passthrough-help.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/passthrough-help.test.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Resuming a conversation, and — mostly — refusing to.
3
- *
4
- * The rule under test: when the named conversation cannot be resumed, this
5
- * REFUSES and names the cause. It never falls back to a fresh session, and it
6
- * never resumes with a partial history.
7
- *
8
- * Both fallbacks would be invisible from outside. The user asked for a specific
9
- * conversation, would get something that looks like one, and would find out
10
- * several turns later having already acted on it. A half-context is the worse
11
- * of the two: it is not a degraded context, it is a different context that lies
12
- * about being complete.
13
- */
14
- export {};
15
- //# sourceMappingURL=resume.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resume.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/resume.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,116 +0,0 @@
1
- /**
2
- * Resuming a conversation, and — mostly — refusing to.
3
- *
4
- * The rule under test: when the named conversation cannot be resumed, this
5
- * REFUSES and names the cause. It never falls back to a fresh session, and it
6
- * never resumes with a partial history.
7
- *
8
- * Both fallbacks would be invisible from outside. The user asked for a specific
9
- * conversation, would get something that looks like one, and would find out
10
- * several turns later having already acted on it. A half-context is the worse
11
- * of the two: it is not a degraded context, it is a different context that lies
12
- * about being complete.
13
- */
14
- import { describe, expect, it, vi } from 'vitest';
15
- import { listRecent, loadConversation } from '../../integrations/sessions/store.js';
16
- import { resolveResume } from '../resume.js';
17
- vi.mock('../../integrations/sessions/store.js', () => ({
18
- listRecent: vi.fn(),
19
- loadConversation: vi.fn(),
20
- }));
21
- const sessions = {};
22
- const CWD = '/projects/foo';
23
- function recent(...ids) {
24
- vi.mocked(listRecent).mockResolvedValue(ids.map((id, i) => ({
25
- id: id,
26
- title: id,
27
- updatedAt: `2026-08-0${i + 1}T00:00:00Z`,
28
- count: 2,
29
- })));
30
- }
31
- describe('asking for nothing', () => {
32
- it('is a fresh run, not an error', async () => {
33
- const out = await resolveResume(sessions, { continueLast: false, sessionId: null }, CWD);
34
- expect(out.kind).toBe('fresh');
35
- });
36
- });
37
- describe('--continue', () => {
38
- it('takes the most recent conversation', async () => {
39
- recent('ses_new', 'ses_old');
40
- vi.mocked(loadConversation).mockResolvedValue([
41
- { role: 'user', content: 'hi', timestamp: 0 },
42
- ]);
43
- const out = await resolveResume(sessions, { continueLast: true, sessionId: null }, CWD);
44
- expect(out).toMatchObject({ kind: 'resumed', sessionId: 'ses_new' });
45
- });
46
- it('refuses with its OWN sentence when there is nothing here', async () => {
47
- // Not "cannot resume" — the cause is different and so is the fix. Someone
48
- // with no conversation here is usually standing in the wrong directory,
49
- // so the message has to point at --cwd rather than at a broken store.
50
- recent();
51
- const out = await resolveResume(sessions, { continueLast: true, sessionId: null }, CWD);
52
- expect(out.kind).toBe('error');
53
- expect(out).toMatchObject({ message: expect.stringContaining('no previous conversation') });
54
- expect(out).toMatchObject({ message: expect.stringContaining(CWD) });
55
- expect(out).toMatchObject({ message: expect.stringContaining('--cwd') });
56
- });
57
- });
58
- describe('--resume <id>', () => {
59
- it('takes the conversation it was given, not the most recent', async () => {
60
- recent('ses_new', 'ses_wanted');
61
- vi.mocked(loadConversation).mockResolvedValue([
62
- { role: 'user', content: 'hi', timestamp: 0 },
63
- ]);
64
- const out = await resolveResume(sessions, { continueLast: false, sessionId: 'ses_wanted' }, CWD);
65
- expect(out).toMatchObject({ kind: 'resumed', sessionId: 'ses_wanted' });
66
- });
67
- it('refuses an id that is not here, and says how many are', async () => {
68
- // THE case. Starting fresh would hand back something indistinguishable
69
- // from what was asked for.
70
- recent('ses_a', 'ses_b');
71
- const out = await resolveResume(sessions, { continueLast: false, sessionId: 'ses_gone' }, CWD);
72
- expect(out.kind).toBe('error');
73
- expect(out).toMatchObject({ message: expect.stringContaining('ses_gone') });
74
- expect(out).toMatchObject({ message: expect.stringContaining('2 others') });
75
- });
76
- it('points at --cwd when the directory has nothing at all', async () => {
77
- recent();
78
- const out = await resolveResume(sessions, { continueLast: false, sessionId: 'ses_gone' }, CWD);
79
- expect(out).toMatchObject({ message: expect.stringContaining('--cwd') });
80
- });
81
- it('refuses rather than resuming with a partial history', async () => {
82
- // The half-context case. Carrying on with an empty transcript would look
83
- // exactly like a resumed session to the user and to the model.
84
- recent('ses_a');
85
- vi.mocked(loadConversation).mockRejectedValue(new Error('transcript is corrupt'));
86
- const out = await resolveResume(sessions, { continueLast: false, sessionId: 'ses_a' }, CWD);
87
- expect(out.kind).toBe('error');
88
- expect(out).toMatchObject({ message: expect.stringContaining('transcript is corrupt') });
89
- });
90
- it('refuses an empty transcript rather than calling it resumed', async () => {
91
- recent('ses_a');
92
- vi.mocked(loadConversation).mockResolvedValue([]);
93
- const out = await resolveResume(sessions, { continueLast: false, sessionId: 'ses_a' }, CWD);
94
- expect(out.kind).toBe('error');
95
- expect(out).toMatchObject({ message: expect.stringContaining('no messages') });
96
- });
97
- });
98
- describe('the two flags together', () => {
99
- it('refuses, because they name different conversations', async () => {
100
- const out = await resolveResume(sessions, { continueLast: true, sessionId: 'ses_a' }, CWD);
101
- expect(out.kind).toBe('error');
102
- expect(out).toMatchObject({ message: expect.stringContaining('Pass one') });
103
- });
104
- });
105
- describe('no store at all', () => {
106
- it('refuses instead of quietly starting fresh', async () => {
107
- const out = await resolveResume(null, { continueLast: true, sessionId: null }, CWD);
108
- expect(out.kind).toBe('error');
109
- expect(out).toMatchObject({ message: expect.stringContaining('nothing to resume') });
110
- });
111
- it('still runs fresh when nothing was asked for', async () => {
112
- const out = await resolveResume(null, { continueLast: false, sessionId: null }, CWD);
113
- expect(out.kind).toBe('fresh');
114
- });
115
- });
116
- //# sourceMappingURL=resume.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resume.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/resume.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=run-exit-code.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-exit-code.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/run-exit-code.test.ts"],"names":[],"mappings":""}