@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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -2
- package/dist/cli.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +0 -3
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +0 -5
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +8 -0
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/agent.d.ts +10 -0
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +10 -0
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/slashCommands.d.ts +46 -0
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +96 -0
- package/dist/tui/slashCommands.js.map +1 -1
- package/package.json +11 -6
- package/dist/__tests__/environment-reaches-the-turn.test.d.ts +0 -17
- package/dist/__tests__/environment-reaches-the-turn.test.d.ts.map +0 -1
- package/dist/__tests__/environment-reaches-the-turn.test.js +0 -128
- package/dist/__tests__/environment-reaches-the-turn.test.js.map +0 -1
- package/dist/__tests__/headless-trust-gate.test.d.ts +0 -23
- package/dist/__tests__/headless-trust-gate.test.d.ts.map +0 -1
- package/dist/__tests__/headless-trust-gate.test.js +0 -227
- package/dist/__tests__/headless-trust-gate.test.js.map +0 -1
- package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts +0 -17
- package/dist/__tests__/mcp-servers-reach-the-session.test.d.ts.map +0 -1
- package/dist/__tests__/mcp-servers-reach-the-session.test.js +0 -171
- package/dist/__tests__/mcp-servers-reach-the-session.test.js.map +0 -1
- package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts +0 -31
- package/dist/__tests__/permission-rules-reach-the-turn.test.d.ts.map +0 -1
- package/dist/__tests__/permission-rules-reach-the-turn.test.js +0 -132
- package/dist/__tests__/permission-rules-reach-the-turn.test.js.map +0 -1
- package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts +0 -24
- package/dist/__tests__/project-instructions-reach-the-turn.test.d.ts.map +0 -1
- package/dist/__tests__/project-instructions-reach-the-turn.test.js +0 -153
- package/dist/__tests__/project-instructions-reach-the-turn.test.js.map +0 -1
- package/dist/cli.test.d.ts +0 -2
- package/dist/cli.test.d.ts.map +0 -1
- package/dist/cli.test.js +0 -100
- package/dist/cli.test.js.map +0 -1
- package/dist/commands/__tests__/eval.test.d.ts +0 -2
- package/dist/commands/__tests__/eval.test.d.ts.map +0 -1
- package/dist/commands/__tests__/eval.test.js +0 -165
- package/dist/commands/__tests__/eval.test.js.map +0 -1
- package/dist/commands/__tests__/passthrough-help.test.d.ts +0 -2
- package/dist/commands/__tests__/passthrough-help.test.d.ts.map +0 -1
- package/dist/commands/__tests__/passthrough-help.test.js +0 -96
- package/dist/commands/__tests__/passthrough-help.test.js.map +0 -1
- package/dist/commands/__tests__/resume.test.d.ts +0 -15
- package/dist/commands/__tests__/resume.test.d.ts.map +0 -1
- package/dist/commands/__tests__/resume.test.js +0 -116
- package/dist/commands/__tests__/resume.test.js.map +0 -1
- package/dist/commands/__tests__/run-exit-code.test.d.ts +0 -2
- package/dist/commands/__tests__/run-exit-code.test.d.ts.map +0 -1
- package/dist/commands/__tests__/run-exit-code.test.js +0 -100
- package/dist/commands/__tests__/run-exit-code.test.js.map +0 -1
- package/dist/commands/__tests__/run-flags.test.d.ts +0 -11
- package/dist/commands/__tests__/run-flags.test.d.ts.map +0 -1
- package/dist/commands/__tests__/run-flags.test.js +0 -238
- package/dist/commands/__tests__/run-flags.test.js.map +0 -1
- package/dist/commands/__tests__/run-stream-flags.test.d.ts +0 -2
- package/dist/commands/__tests__/run-stream-flags.test.d.ts.map +0 -1
- package/dist/commands/__tests__/run-stream-flags.test.js +0 -295
- package/dist/commands/__tests__/run-stream-flags.test.js.map +0 -1
- package/dist/commands/doctor.test.d.ts +0 -2
- package/dist/commands/doctor.test.d.ts.map +0 -1
- package/dist/commands/doctor.test.js +0 -82
- package/dist/commands/doctor.test.js.map +0 -1
- package/dist/commands/providers.d.ts +0 -17
- package/dist/commands/providers.d.ts.map +0 -1
- package/dist/commands/providers.js +0 -274
- package/dist/commands/providers.js.map +0 -1
- package/dist/config/load.test.d.ts +0 -2
- package/dist/config/load.test.d.ts.map +0 -1
- package/dist/config/load.test.js +0 -57
- package/dist/config/load.test.js.map +0 -1
- package/dist/context/__tests__/environment.test.d.ts +0 -10
- package/dist/context/__tests__/environment.test.d.ts.map +0 -1
- package/dist/context/__tests__/environment.test.js +0 -84
- package/dist/context/__tests__/environment.test.js.map +0 -1
- package/dist/context/__tests__/project.test.d.ts +0 -12
- package/dist/context/__tests__/project.test.d.ts.map +0 -1
- package/dist/context/__tests__/project.test.js +0 -201
- package/dist/context/__tests__/project.test.js.map +0 -1
- package/dist/doctor/checks/credentials.test.d.ts +0 -10
- package/dist/doctor/checks/credentials.test.d.ts.map +0 -1
- package/dist/doctor/checks/credentials.test.js +0 -47
- package/dist/doctor/checks/credentials.test.js.map +0 -1
- package/dist/doctor/checks/sandbox.test.d.ts +0 -2
- package/dist/doctor/checks/sandbox.test.d.ts.map +0 -1
- package/dist/doctor/checks/sandbox.test.js +0 -59
- package/dist/doctor/checks/sandbox.test.js.map +0 -1
- package/dist/doctor/registry.test.d.ts +0 -7
- package/dist/doctor/registry.test.d.ts.map +0 -1
- package/dist/doctor/registry.test.js +0 -379
- package/dist/doctor/registry.test.js.map +0 -1
- package/dist/integrations/mcp/__tests__/connect.test.d.ts +0 -11
- package/dist/integrations/mcp/__tests__/connect.test.d.ts.map +0 -1
- package/dist/integrations/mcp/__tests__/connect.test.js +0 -231
- package/dist/integrations/mcp/__tests__/connect.test.js.map +0 -1
- package/dist/integrations/providers/discover.test.d.ts +0 -2
- package/dist/integrations/providers/discover.test.d.ts.map +0 -1
- package/dist/integrations/providers/discover.test.js +0 -93
- package/dist/integrations/providers/discover.test.js.map +0 -1
- package/dist/integrations/providers/keychain.test.d.ts +0 -2
- package/dist/integrations/providers/keychain.test.d.ts.map +0 -1
- package/dist/integrations/providers/keychain.test.js +0 -21
- package/dist/integrations/providers/keychain.test.js.map +0 -1
- package/dist/integrations/providers/mask.d.ts +0 -7
- package/dist/integrations/providers/mask.d.ts.map +0 -1
- package/dist/integrations/providers/mask.js +0 -14
- package/dist/integrations/providers/mask.js.map +0 -1
- package/dist/integrations/providers/mask.test.d.ts +0 -2
- package/dist/integrations/providers/mask.test.d.ts.map +0 -1
- package/dist/integrations/providers/mask.test.js +0 -20
- package/dist/integrations/providers/mask.test.js.map +0 -1
- package/dist/integrations/providers/oauth.test.d.ts +0 -2
- package/dist/integrations/providers/oauth.test.d.ts.map +0 -1
- package/dist/integrations/providers/oauth.test.js +0 -86
- package/dist/integrations/providers/oauth.test.js.map +0 -1
- package/dist/integrations/providers/preferences.test.d.ts +0 -2
- package/dist/integrations/providers/preferences.test.d.ts.map +0 -1
- package/dist/integrations/providers/preferences.test.js +0 -76
- package/dist/integrations/providers/preferences.test.js.map +0 -1
- package/dist/integrations/providers/schema.d.ts +0 -73
- package/dist/integrations/providers/schema.d.ts.map +0 -1
- package/dist/integrations/providers/schema.js +0 -70
- package/dist/integrations/providers/schema.js.map +0 -1
- package/dist/integrations/providers/schema.test.d.ts +0 -2
- package/dist/integrations/providers/schema.test.d.ts.map +0 -1
- package/dist/integrations/providers/schema.test.js +0 -43
- package/dist/integrations/providers/schema.test.js.map +0 -1
- package/dist/integrations/providers/store.d.ts +0 -32
- package/dist/integrations/providers/store.d.ts.map +0 -1
- package/dist/integrations/providers/store.js +0 -133
- package/dist/integrations/providers/store.js.map +0 -1
- package/dist/integrations/providers/store.test.d.ts +0 -2
- package/dist/integrations/providers/store.test.d.ts.map +0 -1
- package/dist/integrations/providers/store.test.js +0 -135
- package/dist/integrations/providers/store.test.js.map +0 -1
- package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts +0 -21
- package/dist/integrations/sessions/__tests__/archived-workspace.test.d.ts.map +0 -1
- package/dist/integrations/sessions/__tests__/archived-workspace.test.js +0 -62
- package/dist/integrations/sessions/__tests__/archived-workspace.test.js.map +0 -1
- package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts +0 -2
- package/dist/integrations/subagents/__tests__/delegation-trace.test.d.ts.map +0 -1
- package/dist/integrations/subagents/__tests__/delegation-trace.test.js +0 -114
- package/dist/integrations/subagents/__tests__/delegation-trace.test.js.map +0 -1
- package/dist/integrations/trust/store.test.d.ts +0 -2
- package/dist/integrations/trust/store.test.d.ts.map +0 -1
- package/dist/integrations/trust/store.test.js +0 -50
- package/dist/integrations/trust/store.test.js.map +0 -1
- package/dist/memory/store.test.d.ts +0 -2
- package/dist/memory/store.test.d.ts.map +0 -1
- package/dist/memory/store.test.js +0 -63
- package/dist/memory/store.test.js.map +0 -1
- package/dist/output/formatter.test.d.ts +0 -2
- package/dist/output/formatter.test.d.ts.map +0 -1
- package/dist/output/formatter.test.js +0 -88
- package/dist/output/formatter.test.js.map +0 -1
- package/dist/output/rendered-payload.test.d.ts +0 -2
- package/dist/output/rendered-payload.test.d.ts.map +0 -1
- package/dist/output/rendered-payload.test.js +0 -61
- package/dist/output/rendered-payload.test.js.map +0 -1
- package/dist/permissions/__tests__/mode.test.d.ts +0 -10
- package/dist/permissions/__tests__/mode.test.d.ts.map +0 -1
- package/dist/permissions/__tests__/mode.test.js +0 -115
- package/dist/permissions/__tests__/mode.test.js.map +0 -1
- package/dist/permissions/__tests__/rules.test.d.ts +0 -10
- package/dist/permissions/__tests__/rules.test.d.ts.map +0 -1
- package/dist/permissions/__tests__/rules.test.js +0 -196
- package/dist/permissions/__tests__/rules.test.js.map +0 -1
- package/dist/skills/store.test.d.ts +0 -2
- package/dist/skills/store.test.d.ts.map +0 -1
- package/dist/skills/store.test.js +0 -80
- package/dist/skills/store.test.js.map +0 -1
- package/dist/tui/__tests__/context-gauge.test.d.ts +0 -2
- package/dist/tui/__tests__/context-gauge.test.d.ts.map +0 -1
- package/dist/tui/__tests__/context-gauge.test.js +0 -83
- package/dist/tui/__tests__/context-gauge.test.js.map +0 -1
- package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts +0 -24
- package/dist/tui/__tests__/deferred-tool-discovery.test.d.ts.map +0 -1
- package/dist/tui/__tests__/deferred-tool-discovery.test.js +0 -111
- package/dist/tui/__tests__/deferred-tool-discovery.test.js.map +0 -1
- package/dist/tui/__tests__/to-agent-event.test.d.ts +0 -2
- package/dist/tui/__tests__/to-agent-event.test.d.ts.map +0 -1
- package/dist/tui/__tests__/to-agent-event.test.js +0 -230
- package/dist/tui/__tests__/to-agent-event.test.js.map +0 -1
- package/dist/tui/__tests__/working-directory.test.d.ts +0 -13
- package/dist/tui/__tests__/working-directory.test.d.ts.map +0 -1
- package/dist/tui/__tests__/working-directory.test.js +0 -109
- package/dist/tui/__tests__/working-directory.test.js.map +0 -1
- package/dist/tui/agent.test.d.ts +0 -2
- package/dist/tui/agent.test.d.ts.map +0 -1
- package/dist/tui/agent.test.js +0 -225
- package/dist/tui/agent.test.js.map +0 -1
- package/dist/tui/markdownParser.test.d.ts +0 -2
- package/dist/tui/markdownParser.test.d.ts.map +0 -1
- package/dist/tui/markdownParser.test.js +0 -90
- package/dist/tui/markdownParser.test.js.map +0 -1
- package/dist/tui/mentions.test.d.ts +0 -2
- package/dist/tui/mentions.test.d.ts.map +0 -1
- package/dist/tui/mentions.test.js +0 -35
- package/dist/tui/mentions.test.js.map +0 -1
- package/dist/tui/slashCommands.test.d.ts +0 -2
- package/dist/tui/slashCommands.test.d.ts.map +0 -1
- package/dist/tui/slashCommands.test.js +0 -114
- 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 +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 +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 +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"}
|