@namzu/cli 2.0.0 → 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 (176) hide show
  1. package/dist/tui/App.d.ts.map +1 -1
  2. package/dist/tui/App.js +8 -0
  3. package/dist/tui/App.js.map +1 -1
  4. package/dist/tui/agent.d.ts +10 -0
  5. package/dist/tui/agent.d.ts.map +1 -1
  6. package/dist/tui/agent.js +10 -0
  7. package/dist/tui/agent.js.map +1 -1
  8. package/dist/tui/slashCommands.d.ts +46 -0
  9. package/dist/tui/slashCommands.d.ts.map +1 -1
  10. package/dist/tui/slashCommands.js +96 -0
  11. package/dist/tui/slashCommands.js.map +1 -1
  12. package/package.json +11 -6
  13. package/dist/__tests__/environment-reaches-the-turn.test.d.ts +0 -17
  14. package/dist/__tests__/environment-reaches-the-turn.test.d.ts.map +0 -1
  15. package/dist/__tests__/environment-reaches-the-turn.test.js +0 -128
  16. package/dist/__tests__/environment-reaches-the-turn.test.js.map +0 -1
  17. package/dist/__tests__/headless-trust-gate.test.d.ts +0 -23
  18. package/dist/__tests__/headless-trust-gate.test.d.ts.map +0 -1
  19. package/dist/__tests__/headless-trust-gate.test.js +0 -227
  20. package/dist/__tests__/headless-trust-gate.test.js.map +0 -1
  21. package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts +0 -17
  22. package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts.map +0 -1
  23. package/dist/__tests__/mcp-servers-reach-the-session.test.js +0 -171
  24. package/dist/__tests__/mcp-servers-reach-the-session.test.js.map +0 -1
  25. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts +0 -31
  26. package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts.map +0 -1
  27. package/dist/__tests__/permission-rules-reach-the-turn.test.js +0 -132
  28. package/dist/__tests__/permission-rules-reach-the-turn.test.js.map +0 -1
  29. package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts +0 -24
  30. package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts.map +0 -1
  31. package/dist/__tests__/project-instructions-reach-the-turn.test.js +0 -153
  32. package/dist/__tests__/project-instructions-reach-the-turn.test.js.map +0 -1
  33. package/dist/cli.test.d.ts +0 -2
  34. package/dist/cli.test.d.ts.map +0 -1
  35. package/dist/cli.test.js +0 -108
  36. package/dist/cli.test.js.map +0 -1
  37. package/dist/commands/__tests__/eval.test.d.ts +0 -2
  38. package/dist/commands/__tests__/eval.test.d.ts.map +0 -1
  39. package/dist/commands/__tests__/eval.test.js +0 -165
  40. package/dist/commands/__tests__/eval.test.js.map +0 -1
  41. package/dist/commands/__tests__/passthrough-help.test.d.ts +0 -2
  42. package/dist/commands/__tests__/passthrough-help.test.d.ts.map +0 -1
  43. package/dist/commands/__tests__/passthrough-help.test.js +0 -96
  44. package/dist/commands/__tests__/passthrough-help.test.js.map +0 -1
  45. package/dist/commands/__tests__/resume.test.d.ts +0 -15
  46. package/dist/commands/__tests__/resume.test.d.ts.map +0 -1
  47. package/dist/commands/__tests__/resume.test.js +0 -116
  48. package/dist/commands/__tests__/resume.test.js.map +0 -1
  49. package/dist/commands/__tests__/run-exit-code.test.d.ts +0 -2
  50. package/dist/commands/__tests__/run-exit-code.test.d.ts.map +0 -1
  51. package/dist/commands/__tests__/run-exit-code.test.js +0 -100
  52. package/dist/commands/__tests__/run-exit-code.test.js.map +0 -1
  53. package/dist/commands/__tests__/run-flags.test.d.ts +0 -11
  54. package/dist/commands/__tests__/run-flags.test.d.ts.map +0 -1
  55. package/dist/commands/__tests__/run-flags.test.js +0 -238
  56. package/dist/commands/__tests__/run-flags.test.js.map +0 -1
  57. package/dist/commands/__tests__/run-stream-flags.test.d.ts +0 -2
  58. package/dist/commands/__tests__/run-stream-flags.test.d.ts.map +0 -1
  59. package/dist/commands/__tests__/run-stream-flags.test.js +0 -295
  60. package/dist/commands/__tests__/run-stream-flags.test.js.map +0 -1
  61. package/dist/commands/doctor.test.d.ts +0 -2
  62. package/dist/commands/doctor.test.d.ts.map +0 -1
  63. package/dist/commands/doctor.test.js +0 -82
  64. package/dist/commands/doctor.test.js.map +0 -1
  65. package/dist/config/load.test.d.ts +0 -2
  66. package/dist/config/load.test.d.ts.map +0 -1
  67. package/dist/config/load.test.js +0 -57
  68. package/dist/config/load.test.js.map +0 -1
  69. package/dist/context/__tests__/environment.test.d.ts +0 -10
  70. package/dist/context/__tests__/environment.test.d.ts.map +0 -1
  71. package/dist/context/__tests__/environment.test.js +0 -84
  72. package/dist/context/__tests__/environment.test.js.map +0 -1
  73. package/dist/context/__tests__/project.test.d.ts +0 -12
  74. package/dist/context/__tests__/project.test.d.ts.map +0 -1
  75. package/dist/context/__tests__/project.test.js +0 -201
  76. package/dist/context/__tests__/project.test.js.map +0 -1
  77. package/dist/doctor/checks/credentials.test.d.ts +0 -10
  78. package/dist/doctor/checks/credentials.test.d.ts.map +0 -1
  79. package/dist/doctor/checks/credentials.test.js +0 -47
  80. package/dist/doctor/checks/credentials.test.js.map +0 -1
  81. package/dist/doctor/checks/sandbox.test.d.ts +0 -2
  82. package/dist/doctor/checks/sandbox.test.d.ts.map +0 -1
  83. package/dist/doctor/checks/sandbox.test.js +0 -59
  84. package/dist/doctor/checks/sandbox.test.js.map +0 -1
  85. package/dist/doctor/registry.test.d.ts +0 -7
  86. package/dist/doctor/registry.test.d.ts.map +0 -1
  87. package/dist/doctor/registry.test.js +0 -379
  88. package/dist/doctor/registry.test.js.map +0 -1
  89. package/dist/integrations/mcp/__tests__/connect.test.d.ts +0 -11
  90. package/dist/integrations/mcp/__tests__/connect.test.d.ts.map +0 -1
  91. package/dist/integrations/mcp/__tests__/connect.test.js +0 -231
  92. package/dist/integrations/mcp/__tests__/connect.test.js.map +0 -1
  93. package/dist/integrations/providers/discover.test.d.ts +0 -2
  94. package/dist/integrations/providers/discover.test.d.ts.map +0 -1
  95. package/dist/integrations/providers/discover.test.js +0 -93
  96. package/dist/integrations/providers/discover.test.js.map +0 -1
  97. package/dist/integrations/providers/keychain.test.d.ts +0 -2
  98. package/dist/integrations/providers/keychain.test.d.ts.map +0 -1
  99. package/dist/integrations/providers/keychain.test.js +0 -21
  100. package/dist/integrations/providers/keychain.test.js.map +0 -1
  101. package/dist/integrations/providers/oauth.test.d.ts +0 -2
  102. package/dist/integrations/providers/oauth.test.d.ts.map +0 -1
  103. package/dist/integrations/providers/oauth.test.js +0 -86
  104. package/dist/integrations/providers/oauth.test.js.map +0 -1
  105. package/dist/integrations/providers/preferences.test.d.ts +0 -2
  106. package/dist/integrations/providers/preferences.test.d.ts.map +0 -1
  107. package/dist/integrations/providers/preferences.test.js +0 -76
  108. package/dist/integrations/providers/preferences.test.js.map +0 -1
  109. package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts +0 -21
  110. package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts.map +0 -1
  111. package/dist/integrations/sessions/__tests__/archived-workspace.test.js +0 -62
  112. package/dist/integrations/sessions/__tests__/archived-workspace.test.js.map +0 -1
  113. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts +0 -2
  114. package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts.map +0 -1
  115. package/dist/integrations/subagents/__tests__/delegation-trace.test.js +0 -114
  116. package/dist/integrations/subagents/__tests__/delegation-trace.test.js.map +0 -1
  117. package/dist/integrations/trust/store.test.d.ts +0 -2
  118. package/dist/integrations/trust/store.test.d.ts.map +0 -1
  119. package/dist/integrations/trust/store.test.js +0 -50
  120. package/dist/integrations/trust/store.test.js.map +0 -1
  121. package/dist/memory/store.test.d.ts +0 -2
  122. package/dist/memory/store.test.d.ts.map +0 -1
  123. package/dist/memory/store.test.js +0 -63
  124. package/dist/memory/store.test.js.map +0 -1
  125. package/dist/output/formatter.test.d.ts +0 -2
  126. package/dist/output/formatter.test.d.ts.map +0 -1
  127. package/dist/output/formatter.test.js +0 -88
  128. package/dist/output/formatter.test.js.map +0 -1
  129. package/dist/output/rendered-payload.test.d.ts +0 -2
  130. package/dist/output/rendered-payload.test.d.ts.map +0 -1
  131. package/dist/output/rendered-payload.test.js +0 -61
  132. package/dist/output/rendered-payload.test.js.map +0 -1
  133. package/dist/permissions/__tests__/mode.test.d.ts +0 -10
  134. package/dist/permissions/__tests__/mode.test.d.ts.map +0 -1
  135. package/dist/permissions/__tests__/mode.test.js +0 -115
  136. package/dist/permissions/__tests__/mode.test.js.map +0 -1
  137. package/dist/permissions/__tests__/rules.test.d.ts +0 -10
  138. package/dist/permissions/__tests__/rules.test.d.ts.map +0 -1
  139. package/dist/permissions/__tests__/rules.test.js +0 -196
  140. package/dist/permissions/__tests__/rules.test.js.map +0 -1
  141. package/dist/skills/store.test.d.ts +0 -2
  142. package/dist/skills/store.test.d.ts.map +0 -1
  143. package/dist/skills/store.test.js +0 -80
  144. package/dist/skills/store.test.js.map +0 -1
  145. package/dist/tui/__tests__/context-gauge.test.d.ts +0 -2
  146. package/dist/tui/__tests__/context-gauge.test.d.ts.map +0 -1
  147. package/dist/tui/__tests__/context-gauge.test.js +0 -83
  148. package/dist/tui/__tests__/context-gauge.test.js.map +0 -1
  149. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts +0 -24
  150. package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts.map +0 -1
  151. package/dist/tui/__tests__/deferred-tool-discovery.test.js +0 -111
  152. package/dist/tui/__tests__/deferred-tool-discovery.test.js.map +0 -1
  153. package/dist/tui/__tests__/to-agent-event.test.d.ts +0 -2
  154. package/dist/tui/__tests__/to-agent-event.test.d.ts.map +0 -1
  155. package/dist/tui/__tests__/to-agent-event.test.js +0 -230
  156. package/dist/tui/__tests__/to-agent-event.test.js.map +0 -1
  157. package/dist/tui/__tests__/working-directory.test.d.ts +0 -13
  158. package/dist/tui/__tests__/working-directory.test.d.ts.map +0 -1
  159. package/dist/tui/__tests__/working-directory.test.js +0 -109
  160. package/dist/tui/__tests__/working-directory.test.js.map +0 -1
  161. package/dist/tui/agent.test.d.ts +0 -2
  162. package/dist/tui/agent.test.d.ts.map +0 -1
  163. package/dist/tui/agent.test.js +0 -225
  164. package/dist/tui/agent.test.js.map +0 -1
  165. package/dist/tui/markdownParser.test.d.ts +0 -2
  166. package/dist/tui/markdownParser.test.d.ts.map +0 -1
  167. package/dist/tui/markdownParser.test.js +0 -90
  168. package/dist/tui/markdownParser.test.js.map +0 -1
  169. package/dist/tui/mentions.test.d.ts +0 -2
  170. package/dist/tui/mentions.test.d.ts.map +0 -1
  171. package/dist/tui/mentions.test.js +0 -35
  172. package/dist/tui/mentions.test.js.map +0 -1
  173. package/dist/tui/slashCommands.test.d.ts +0 -2
  174. package/dist/tui/slashCommands.test.d.ts.map +0 -1
  175. package/dist/tui/slashCommands.test.js +0 -114
  176. package/dist/tui/slashCommands.test.js.map +0 -1
@@ -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":""}
@@ -1,100 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { runCommand } from '../run.js';
3
- /**
4
- * `namzu run` exited 0 for six ways of not finishing.
5
- *
6
- * `run_failed` is emitted only from the kernel's throw path, so a run stopped
7
- * by its token budget, its timeout, its iteration cap, a cancellation, or a
8
- * guardrail arrived as `run_completed` — which this command mapped to "print
9
- * the text and return 0". The sharp case is the output guardrail: an answer
10
- * that was REFUSED exited 0 with empty text, so `namzu run … > out.txt &&
11
- * deploy` went ahead on the empty file.
12
- */
13
- const sessionStub = {
14
- hasProvider: true,
15
- providerSummary: 'mock',
16
- modelSummary: 'mock-model',
17
- // A real session always carries this, empty or not. A stub that omits a
18
- // field production always sets is a fixture that tests a system which does
19
- // not ship.
20
- instructionFiles: [],
21
- skippedInstructionFiles: [],
22
- mcpConnected: [],
23
- mcpFailed: [],
24
- close: async () => { },
25
- send: undefined,
26
- };
27
- // These tests are about exit codes for a run that STARTED. Standing in a
28
- // trusted folder is the ordinary production state and is what they need; the
29
- // gate that refuses an untrusted one is tested in
30
- // `__tests__/headless-trust-gate.test.ts`.
31
- vi.mock('../../integrations/trust/store.js', () => ({
32
- isTrusted: () => true,
33
- trustDir: () => { },
34
- }));
35
- vi.mock('../../tui/agent.js', () => ({
36
- probeAgentSession: vi.fn(async () => ({
37
- preferences: { version: 2, provider: 'mock', subagents: { active: [] } },
38
- detected: [],
39
- })),
40
- createAgentSession: vi.fn(async () => sessionStub),
41
- }));
42
- function contextCapturing() {
43
- const printed = [];
44
- const errors = [];
45
- const ctx = {
46
- formatter: {
47
- name: 'text',
48
- print: (d) => printed.push(String(d?.text ?? d)),
49
- info: () => { },
50
- error: (e) => errors.push(String(e?.message ?? e)),
51
- },
52
- config: {},
53
- };
54
- return { ctx, printed, errors };
55
- }
56
- function streaming(events) {
57
- sessionStub.send = () => (async function* () {
58
- for (const e of events)
59
- yield e;
60
- })();
61
- }
62
- async function runWith(events) {
63
- streaming(events);
64
- const { ctx, printed, errors } = contextCapturing();
65
- const code = (await runCommand.handler({ rawArgs: ['hello'], ctx }));
66
- return { code, printed, errors };
67
- }
68
- describe('namzu run exit code reflects whether the run finished', () => {
69
- it('exits 0 when the model answered', async () => {
70
- const { code, printed } = await runWith([
71
- { kind: 'delta', text: 'the answer' },
72
- { kind: 'done', stopReason: 'end_turn' },
73
- ]);
74
- expect(code).toBe(0);
75
- expect(printed.join('')).toContain('the answer');
76
- });
77
- it('exits 1 when an output guardrail refused the answer', async () => {
78
- // The empty-output case. Exiting 0 here told a shell script the run had
79
- // succeeded and handed it nothing.
80
- const { code, errors } = await runWith([{ kind: 'done', stopReason: 'output_guardrail' }]);
81
- expect(code).toBe(1);
82
- expect(errors.join('')).toContain('output_guardrail');
83
- });
84
- it('exits 1 but still prints what it got when the iteration cap cut it short', async () => {
85
- // Partial output is real output — a caller who piped it wants what
86
- // there is. What they also need is for `$?` to say it is partial.
87
- const { code, printed, errors } = await runWith([
88
- { kind: 'delta', text: 'half an ans' },
89
- { kind: 'done', stopReason: 'max_iterations' },
90
- ]);
91
- expect(code).toBe(1);
92
- expect(printed.join('')).toContain('half an ans');
93
- expect(errors.join('')).toContain('partial');
94
- });
95
- it('still exits 1 on an explicit error event', async () => {
96
- const { code } = await runWith([{ kind: 'error', message: 'provider exploded' }]);
97
- expect(code).toBe(1);
98
- });
99
- });
100
- //# sourceMappingURL=run-exit-code.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-exit-code.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/run-exit-code.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * `namzu run` accepts what `namzu run-stream` accepts.
3
- *
4
- * The two are the same headless one-shot and differ only in how they print, so
5
- * an option one takes and the other reads aloud to the model is a defect, not a
6
- * design. `run` joined every argument into the prompt, which is the exact shape
7
- * already fixed once in the streaming sibling — `--cwd` was documented there,
8
- * unparsed, and silently ran in the process's own directory.
9
- */
10
- export {};
11
- //# sourceMappingURL=run-flags.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-flags.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/run-flags.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}