@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
@@ -1,50 +0,0 @@
1
- import { mkdirSync, mkdtempSync, rmSync } from 'node:fs';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
- import { isTrusted, readTrustedDirs, trustDir } from './store.js';
6
- let home;
7
- let work;
8
- beforeEach(() => {
9
- home = mkdtempSync(join(tmpdir(), 'namzu-trust-'));
10
- work = mkdtempSync(join(tmpdir(), 'namzu-proj-'));
11
- mkdirSync(join(home, '.namzu'), { recursive: true });
12
- });
13
- afterEach(() => {
14
- rmSync(home, { recursive: true, force: true });
15
- rmSync(work, { recursive: true, force: true });
16
- });
17
- describe('trust store', () => {
18
- it('starts empty and untrusted', () => {
19
- expect(readTrustedDirs(home)).toEqual([]);
20
- expect(isTrusted(work, home)).toBe(false);
21
- });
22
- it('trusts a directory and persists it', () => {
23
- trustDir(work, home);
24
- expect(isTrusted(work, home)).toBe(true);
25
- expect(readTrustedDirs(home).length).toBe(1);
26
- });
27
- it('is idempotent', () => {
28
- trustDir(work, home);
29
- trustDir(work, home);
30
- expect(readTrustedDirs(home).length).toBe(1);
31
- });
32
- it('trusting a folder covers its subfolders (ancestor match)', () => {
33
- const sub = join(work, 'packages', 'cli');
34
- mkdirSync(sub, { recursive: true });
35
- trustDir(work, home);
36
- expect(isTrusted(sub, home)).toBe(true);
37
- });
38
- it('does not trust an unrelated sibling', () => {
39
- const other = mkdtempSync(join(tmpdir(), 'namzu-other-'));
40
- trustDir(work, home);
41
- expect(isTrusted(other, home)).toBe(false);
42
- rmSync(other, { recursive: true, force: true });
43
- });
44
- it('does not treat a path-prefix sibling as trusted', () => {
45
- // /tmp/proj must not match /tmp/proj-2 just by string prefix.
46
- trustDir(work, home);
47
- expect(isTrusted(`${work}-2`, home)).toBe(false);
48
- });
49
- });
50
- //# sourceMappingURL=store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/trust/store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../src/memory/store.test.ts"],"names":[],"mappings":""}
@@ -1,63 +0,0 @@
1
- import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
2
- import { mkdirSync } from 'node:fs';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
6
- import { appendMemory, composeMemoryPrompt, memoryFilePath, readMemory, userFilePath, } from './store.js';
7
- let home;
8
- beforeEach(() => {
9
- home = mkdtempSync(join(tmpdir(), 'namzu-mem-'));
10
- mkdirSync(join(home, '.namzu'), { recursive: true });
11
- });
12
- afterEach(() => {
13
- rmSync(home, { recursive: true, force: true });
14
- });
15
- describe('readMemory', () => {
16
- it('returns nulls when nothing is stored', () => {
17
- expect(readMemory(home)).toEqual({ user: null, memory: null });
18
- });
19
- it('reads USER.md and MEMORY.md and trims', () => {
20
- writeFileSync(userFilePath(home), ' I am Bahadir, a TS dev.\n');
21
- writeFileSync(memoryFilePath(home), '- prefers tabs\n');
22
- expect(readMemory(home)).toEqual({
23
- user: 'I am Bahadir, a TS dev.',
24
- memory: '- prefers tabs',
25
- });
26
- });
27
- it('treats whitespace-only files as empty', () => {
28
- writeFileSync(memoryFilePath(home), ' \n\n');
29
- expect(readMemory(home).memory).toBeNull();
30
- });
31
- });
32
- describe('composeMemoryPrompt', () => {
33
- it('returns null when there is nothing to inject', () => {
34
- expect(composeMemoryPrompt({ user: null, memory: null })).toBeNull();
35
- });
36
- it('includes only the sections that have content', () => {
37
- const onlyUser = composeMemoryPrompt({ user: 'role: dev', memory: null });
38
- expect(onlyUser).toContain('## About the user');
39
- expect(onlyUser).toContain('role: dev');
40
- expect(onlyUser).not.toContain('## Durable memory');
41
- const both = composeMemoryPrompt({ user: 'role: dev', memory: '- likes tabs' });
42
- expect(both).toContain('## About the user');
43
- expect(both).toContain('## Durable memory');
44
- expect(both).toContain('- likes tabs');
45
- });
46
- });
47
- describe('appendMemory', () => {
48
- it('appends a bullet, creating the file', () => {
49
- appendMemory('first fact', home);
50
- appendMemory('second fact', home);
51
- expect(readFileSync(memoryFilePath(home), 'utf8')).toBe('- first fact\n- second fact\n');
52
- });
53
- it('ignores empty input', () => {
54
- appendMemory(' ', home);
55
- expect(readMemory(home).memory).toBeNull();
56
- });
57
- it('round-trips into the injected prompt', () => {
58
- appendMemory('namzu is built on @namzu/sdk', home);
59
- const prompt = composeMemoryPrompt(readMemory(home));
60
- expect(prompt).toContain('namzu is built on @namzu/sdk');
61
- });
62
- });
63
- //# sourceMappingURL=store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../src/memory/store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=formatter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.test.d.ts","sourceRoot":"","sources":["../../src/output/formatter.test.ts"],"names":[],"mappings":""}
@@ -1,88 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
- import { createFormatter, isFormatName } from './index.js';
3
- describe('formatter factory', () => {
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
- it('isFormatName narrows known names', () => {
27
- expect(isFormatName('text')).toBe(true);
28
- expect(isFormatName('json')).toBe(true);
29
- expect(isFormatName('yaml')).toBe(true);
30
- expect(isFormatName('xml')).toBe(false);
31
- });
32
- it('json formatter emits parseable JSON to stdout', () => {
33
- const f = createFormatter('json', { quiet: false });
34
- f.print({ hello: 'world', n: 1 });
35
- const parsed = JSON.parse(stdout);
36
- expect(parsed.hello).toBe('world');
37
- expect(parsed.n).toBe(1);
38
- });
39
- it('yaml formatter emits yaml to stdout', () => {
40
- const f = createFormatter('yaml', { quiet: false });
41
- f.print({ hello: 'world' });
42
- expect(stdout).toContain('hello: world');
43
- });
44
- it('text formatter passes strings through verbatim', () => {
45
- const f = createFormatter('text', { quiet: false });
46
- f.print('hello');
47
- expect(stdout).toBe('hello\n');
48
- });
49
- it('info is suppressed in quiet mode for every format', () => {
50
- for (const name of ['text', 'json', 'yaml']) {
51
- stdout = '';
52
- stderr = '';
53
- const f = createFormatter(name, { quiet: true });
54
- f.info('this should not appear');
55
- expect(stderr).toBe('');
56
- }
57
- });
58
- it('errors are never suppressed by quiet mode', () => {
59
- for (const name of ['text', 'json', 'yaml']) {
60
- stdout = '';
61
- stderr = '';
62
- const f = createFormatter(name, { quiet: true });
63
- f.error({ message: 'boom' });
64
- expect(stderr).toContain('boom');
65
- }
66
- });
67
- it('json formatter does not crash on circular references', () => {
68
- const f = createFormatter('json', { quiet: false });
69
- const obj = { a: 1 };
70
- obj.self = obj;
71
- f.print(obj);
72
- expect(stdout).toContain('"a": 1');
73
- expect(stdout).toContain('[Circular]');
74
- });
75
- it('text formatter does not blow the stack on circular references', () => {
76
- const f = createFormatter('text', { quiet: false });
77
- const obj = { a: 1 };
78
- obj.self = obj;
79
- f.print(obj);
80
- expect(stdout).toContain('Circular');
81
- });
82
- it('json formatter serializes bigint via toString instead of throwing', () => {
83
- const f = createFormatter('json', { quiet: false });
84
- f.print({ big: 12345678901234567890n });
85
- expect(stdout).toContain('12345678901234567890');
86
- });
87
- });
88
- //# sourceMappingURL=formatter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.test.js","sourceRoot":"","sources":["../../src/output/formatter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=rendered-payload.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rendered-payload.test.d.ts","sourceRoot":"","sources":["../../src/output/rendered-payload.test.ts"],"names":[],"mappings":""}
@@ -1,61 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
- import { createFormatter } from './index.js';
3
- /**
4
- * A payload that brought its own rendering gets to use it.
5
- *
6
- * Without this a command has to choose between the structured payload the
7
- * `json` and `yaml` formats need and the human string `text` needs — so a
8
- * command that wants both passes the object, and the text format dumps a
9
- * nested object graph where a report was meant to be.
10
- *
11
- * `namzu eval` did exactly that in its default format, with the readable
12
- * version sitting unused one level down. No test caught it: the command's
13
- * own tests asserted on the payload, which was correct, and never on what
14
- * a person sees. It was found by running the built binary.
15
- */
16
- describe('a payload carrying its own text', () => {
17
- let stdout;
18
- let restore;
19
- beforeEach(() => {
20
- stdout = '';
21
- restore = process.stdout.write.bind(process.stdout);
22
- process.stdout.write = ((chunk) => {
23
- stdout += typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf8');
24
- return true;
25
- });
26
- });
27
- afterEach(() => {
28
- process.stdout.write = restore;
29
- });
30
- const payload = {
31
- suite: 'kernel',
32
- report: { name: 'kernel-smoke', passed: 1, failed: 0 },
33
- text: 'kernel-smoke: 1/1 passed (mean 1.00)',
34
- };
35
- it('renders the text, not the object graph, in text format', () => {
36
- createFormatter('text', { quiet: false }).print(payload);
37
- expect(stdout.trim()).toBe('kernel-smoke: 1/1 passed (mean 1.00)');
38
- // The tell that this regressed: the reader sees field names.
39
- expect(stdout).not.toContain('suite:');
40
- expect(stdout).not.toContain('report:');
41
- });
42
- it('still emits the whole payload as json', () => {
43
- // The structured half is what a CI job parses; collapsing to the
44
- // string would trade one broken format for another.
45
- createFormatter('json', { quiet: false }).print(payload);
46
- const parsed = JSON.parse(stdout);
47
- expect(parsed.report.passed).toBe(1);
48
- expect(parsed.suite).toBe('kernel');
49
- });
50
- it('leaves a payload without a text field alone', () => {
51
- createFormatter('text', { quiet: false }).print({ tools: ['read', 'edit'] });
52
- expect(stdout).toContain('read');
53
- });
54
- it('does not treat a non-string text field as rendering', () => {
55
- // A payload whose `text` is a number is data, not a rendering; using
56
- // it would hide every other field.
57
- createFormatter('text', { quiet: false }).print({ text: 42, other: 'kept' });
58
- expect(stdout).toContain('other');
59
- });
60
- });
61
- //# sourceMappingURL=rendered-payload.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rendered-payload.test.js","sourceRoot":"","sources":["../../src/output/rendered-payload.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * The mode, and its precedence against the config file.
3
- *
4
- * The rule being protected is one sentence: a mode governs only the calls no
5
- * rule decided, so it can never reopen what a rule closed. The tests that
6
- * matter are the ones that would catch a future change making
7
- * `--permission-mode auto` able to run something the operator wrote `deny` for.
8
- */
9
- export {};
10
- //# sourceMappingURL=mode.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode.test.d.ts","sourceRoot":"","sources":["../../../src/permissions/__tests__/mode.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,115 +0,0 @@
1
- /**
2
- * The mode, and its precedence against the config file.
3
- *
4
- * The rule being protected is one sentence: a mode governs only the calls no
5
- * rule decided, so it can never reopen what a rule closed. The tests that
6
- * matter are the ones that would catch a future change making
7
- * `--permission-mode auto` able to run something the operator wrote `deny` for.
8
- */
9
- import { VerificationGate, configureLogger, getRootLogger } from '@namzu/sdk';
10
- import { describe, expect, it } from 'vitest';
11
- import { makeResumeHandler } from '../../tui/agent.js';
12
- import { PERMISSION_MODES, isPermissionMode, resolvePermissionMode } from '../mode.js';
13
- import { compilePermissions } from '../rules.js';
14
- configureLogger({ level: 'silent' });
15
- describe('resolving the mode from flag, alias and terminal', () => {
16
- it('takes an explicit flag over everything else', () => {
17
- expect(resolvePermissionMode({ flag: 'strict', interactive: true })).toEqual({ mode: 'strict' });
18
- expect(resolvePermissionMode({ flag: 'prompt', skipPermissions: true, interactive: false })).toEqual({ mode: 'prompt' });
19
- });
20
- it('refuses a mode it does not know, and names the ones it does', () => {
21
- const result = resolvePermissionMode({ flag: 'yolo', interactive: false });
22
- expect('error' in result && result.error).toContain('prompt, auto, strict');
23
- });
24
- it('maps the bypass aliases to auto', () => {
25
- expect(resolvePermissionMode({ skipPermissions: true, interactive: true })).toEqual({
26
- mode: 'auto',
27
- });
28
- });
29
- it('asks when there is someone to ask, and does not when there is not', () => {
30
- // `prompt` without a terminal would silently become `auto` anyway;
31
- // resolving it as `auto` makes the resolved mode honest in a log.
32
- expect(resolvePermissionMode({ interactive: true })).toEqual({ mode: 'prompt' });
33
- expect(resolvePermissionMode({ interactive: false })).toEqual({ mode: 'auto' });
34
- });
35
- it('exposes exactly the modes it accepts', () => {
36
- expect(PERMISSION_MODES.every(isPermissionMode)).toBe(true);
37
- expect(isPermissionMode('trusted')).toBe(false);
38
- });
39
- });
40
- describe('a mode decides only what no rule decided', () => {
41
- function gate(config) {
42
- const { rules } = compilePermissions(config);
43
- return new VerificationGate({
44
- enabled: true,
45
- rules: [...rules],
46
- allowReadOnlyTools: false,
47
- denyDangerousPatterns: false,
48
- logDecisions: false,
49
- }, getRootLogger());
50
- }
51
- it('a denied call never reaches the mode at all', async () => {
52
- // THE precedence test. `deny` is settled by the gate, so no mode — not
53
- // even the one spelled --yolo — is ever consulted about it. If this ever
54
- // fails, a flag has become able to lift a prohibition someone wrote down.
55
- const decision = gate({ bash: 'deny' }).evaluate({
56
- toolName: 'bash',
57
- toolInput: { command: 'rm -rf /tmp/x' },
58
- toolDef: undefined,
59
- });
60
- expect(decision.decision).toBe('deny');
61
- });
62
- it('an allowed call never reaches the mode either', () => {
63
- const decision = gate({ bash: { 'git status*': 'allow' } }).evaluate({
64
- toolName: 'bash',
65
- toolInput: { command: 'git status' },
66
- toolDef: undefined,
67
- });
68
- expect(decision.decision).toBe('allow');
69
- });
70
- });
71
- describe('what each mode does with an undecided call', () => {
72
- const destructive = [
73
- { id: '1', name: 'write', input: { path: 'a.txt' }, isDestructive: true },
74
- ];
75
- it('auto approves it', async () => {
76
- const handler = makeResumeHandler({ all: false }, undefined, 'auto');
77
- const decision = await handler({ type: 'tool_review', toolCalls: destructive });
78
- expect(decision).toEqual({ action: 'approve_tools' });
79
- });
80
- it('strict refuses it, and says asking again will not help', async () => {
81
- // The mode that did not exist: an unattended run could only be `auto`, so
82
- // a CI job either trusted the agent with everything or could not use it.
83
- const handler = makeResumeHandler({ all: false }, undefined, 'strict');
84
- const decision = (await handler({
85
- type: 'tool_review',
86
- toolCalls: destructive,
87
- }));
88
- expect(decision.action).toBe('reject_tools');
89
- expect(decision.feedback).toContain('Asking again will not change it');
90
- });
91
- it('prompt asks the human, and honours the answer', async () => {
92
- let asked = false;
93
- const handler = makeResumeHandler({ all: false }, async () => {
94
- asked = true;
95
- return { kind: 'reject', feedback: 'not that one' };
96
- }, 'prompt');
97
- const decision = (await handler({
98
- type: 'tool_review',
99
- toolCalls: destructive,
100
- }));
101
- expect(asked).toBe(true);
102
- expect(decision.action).toBe('reject_tools');
103
- expect(decision.feedback).toBe('not that one');
104
- });
105
- it('read-only batches run under every mode, including strict', async () => {
106
- // `strict` refuses what needs asking, and a read never needed asking.
107
- // Refusing reads would make the mode unusable rather than strict.
108
- const readOnly = [{ id: '1', name: 'read', input: {}, isDestructive: false }];
109
- const handler = makeResumeHandler({ all: false }, undefined, 'strict');
110
- expect(await handler({ type: 'tool_review', toolCalls: readOnly })).toEqual({
111
- action: 'approve_tools',
112
- });
113
- });
114
- });
115
- //# sourceMappingURL=mode.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode.test.js","sourceRoot":"","sources":["../../../src/permissions/__tests__/mode.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * The rule compiler.
3
- *
4
- * The load-bearing case is the LAST one: a tool nobody wrote a rule for must
5
- * still be asked about. A declarative permission model that quietly widened the
6
- * default would be a security downgrade wearing a feature's clothes, and it
7
- * would look exactly like this change from the outside.
8
- */
9
- export {};
10
- //# sourceMappingURL=rules.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rules.test.d.ts","sourceRoot":"","sources":["../../../src/permissions/__tests__/rules.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}