@namzu/cli 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.js +1 -1
- package/dist/commands/__tests__/eval.test.d.ts +2 -0
- package/dist/commands/__tests__/eval.test.d.ts.map +1 -0
- package/dist/commands/__tests__/eval.test.js +165 -0
- package/dist/commands/__tests__/eval.test.js.map +1 -0
- package/dist/commands/__tests__/passthrough-help.test.d.ts +2 -0
- package/dist/commands/__tests__/passthrough-help.test.d.ts.map +1 -0
- package/dist/commands/__tests__/passthrough-help.test.js +96 -0
- package/dist/commands/__tests__/passthrough-help.test.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +4 -4
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/eval.d.ts +54 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +187 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +14 -4
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/run-stream.d.ts.map +1 -1
- package/dist/commands/run-stream.js +20 -0
- package/dist/commands/run-stream.js.map +1 -1
- package/dist/commands/run.d.ts +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +14 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/tools.js +1 -1
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/types.d.ts +13 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/doctor/checks/sandbox.d.ts +11 -1
- package/dist/doctor/checks/sandbox.d.ts.map +1 -1
- package/dist/doctor/checks/sandbox.js +68 -34
- package/dist/doctor/checks/sandbox.js.map +1 -1
- package/dist/doctor/checks/sandbox.test.d.ts +2 -0
- package/dist/doctor/checks/sandbox.test.d.ts.map +1 -0
- package/dist/doctor/checks/sandbox.test.js +59 -0
- package/dist/doctor/checks/sandbox.test.js.map +1 -0
- package/dist/exit-codes.d.ts +7 -1
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +6 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/integrations/clawtool/binary.test.js +9 -1
- package/dist/integrations/clawtool/binary.test.js.map +1 -1
- package/dist/integrations/clawtool/dispatch.d.ts +2 -2
- package/dist/integrations/clawtool/dispatch.js +4 -4
- package/dist/integrations/clawtool/dispatch.js.map +1 -1
- package/dist/integrations/clawtool/mcp.d.ts.map +1 -1
- package/dist/integrations/clawtool/mcp.js +20 -2
- package/dist/integrations/clawtool/mcp.js.map +1 -1
- package/dist/integrations/clawtool/tooling.d.ts +8 -6
- package/dist/integrations/clawtool/tooling.d.ts.map +1 -1
- package/dist/integrations/clawtool/tooling.js +8 -6
- package/dist/integrations/clawtool/tooling.js.map +1 -1
- package/dist/integrations/clipboard/image.d.ts +0 -1
- package/dist/integrations/clipboard/image.d.ts.map +1 -1
- package/dist/integrations/clipboard/image.js +0 -1
- package/dist/integrations/clipboard/image.js.map +1 -1
- package/dist/integrations/providers/discover.d.ts +1 -1
- package/dist/integrations/providers/discover.js +9 -9
- package/dist/integrations/providers/discover.js.map +1 -1
- package/dist/integrations/providers/index.d.ts +2 -2
- package/dist/integrations/providers/index.d.ts.map +1 -1
- package/dist/integrations/providers/index.js +2 -2
- package/dist/integrations/providers/index.js.map +1 -1
- package/dist/integrations/providers/keychain.d.ts +17 -16
- package/dist/integrations/providers/keychain.d.ts.map +1 -1
- package/dist/integrations/providers/keychain.js +19 -19
- package/dist/integrations/providers/keychain.js.map +1 -1
- package/dist/integrations/providers/oauth.d.ts +7 -8
- package/dist/integrations/providers/oauth.d.ts.map +1 -1
- package/dist/integrations/providers/oauth.js +13 -11
- package/dist/integrations/providers/oauth.js.map +1 -1
- package/dist/integrations/providers/oauth.test.js +8 -8
- package/dist/integrations/providers/oauth.test.js.map +1 -1
- package/dist/integrations/providers/preferences.test.js +9 -1
- package/dist/integrations/providers/preferences.test.js.map +1 -1
- package/dist/integrations/providers/registry.d.ts +2 -3
- package/dist/integrations/providers/registry.d.ts.map +1 -1
- package/dist/integrations/providers/registry.js +3 -4
- package/dist/integrations/providers/registry.js.map +1 -1
- package/dist/integrations/providers/store.d.ts +1 -1
- package/dist/integrations/providers/store.js +1 -1
- package/dist/integrations/providers/store.test.js +9 -1
- package/dist/integrations/providers/store.test.js.map +1 -1
- package/dist/integrations/trust/store.d.ts +2 -2
- package/dist/integrations/trust/store.js +2 -2
- package/dist/memory/store.d.ts +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/output/rendered-payload.test.d.ts +2 -0
- package/dist/output/rendered-payload.test.d.ts.map +1 -0
- package/dist/output/rendered-payload.test.js +61 -0
- package/dist/output/rendered-payload.test.js.map +1 -0
- package/dist/output/text.js +14 -0
- package/dist/output/text.js.map +1 -1
- package/dist/tui/App.js +4 -2
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/Markdown.d.ts +2 -1
- package/dist/tui/Markdown.d.ts.map +1 -1
- package/dist/tui/Markdown.js +2 -1
- package/dist/tui/Markdown.js.map +1 -1
- package/dist/tui/Transcript.js +3 -2
- package/dist/tui/Transcript.js.map +1 -1
- package/dist/tui/TrustPrompt.d.ts +1 -1
- package/dist/tui/TrustPrompt.js +1 -1
- package/dist/tui/agent.d.ts +1 -1
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +46 -17
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/index.js +1 -1
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/mentions.d.ts +2 -2
- package/dist/tui/mentions.js +2 -2
- package/dist/tui/theme.d.ts +4 -3
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +4 -3
- package/dist/tui/theme.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* macOS Keychain reader for
|
|
2
|
+
* macOS Keychain reader for a co-installed agent CLI's OAuth credentials.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* under the generic-password service
|
|
6
|
-
*
|
|
4
|
+
* That CLI keeps its credentials in the macOS login Keychain rather than a
|
|
5
|
+
* flat file, under the generic-password service in {@link KEYCHAIN_SERVICE}
|
|
6
|
+
* below — the exact name is there, in one place, because it is the address
|
|
7
|
+
* of the data and an auditor has to be able to read it. The password value
|
|
8
|
+
* is a JSON envelope:
|
|
7
9
|
*
|
|
8
10
|
* { "claudeAiOauth": { "accessToken": "...", "refreshToken": "...",
|
|
9
11
|
* "expiresAt": ..., "scopes": [...] } }
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
* (`agent/anthropic_adapter.py:_read_claude_code_credentials_from_keychain`).
|
|
13
|
-
* Non-throwing — every failure (not-darwin, security not installed,
|
|
13
|
+
* * Non-throwing — every failure (not-darwin, security not installed,
|
|
14
14
|
* entry missing, payload malformed) returns `null` so discovery treats
|
|
15
15
|
* the source as "not available" rather than crashing.
|
|
16
16
|
*/
|
|
17
17
|
import { execFileSync } from 'node:child_process';
|
|
18
18
|
import { platform } from 'node:os';
|
|
19
|
-
|
|
20
|
-
export
|
|
19
|
+
/** The generic-password service this reads. The address, verbatim. */
|
|
20
|
+
export const KEYCHAIN_SERVICE = 'Claude Code-credentials';
|
|
21
|
+
export function readAgentKeychainCredential() {
|
|
21
22
|
if (platform() !== 'darwin')
|
|
22
23
|
return null;
|
|
23
24
|
let raw;
|
|
@@ -60,9 +61,9 @@ export function readClaudeCodeKeychainCredential() {
|
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Persist a refreshed OAuth credential back into the same Keychain entry so
|
|
63
|
-
* the new access token survives across launches and
|
|
64
|
-
*
|
|
65
|
-
* change) so any extra keys
|
|
64
|
+
* the new access token survives across launches and the other CLI stays in
|
|
65
|
+
* sync. The full envelope is re-read and merged (only the OAuth sub-fields
|
|
66
|
+
* change) so any extra keys it stores are preserved. Non-throwing:
|
|
66
67
|
* returns `false` (not-darwin, no entry, missing account, write denied) and
|
|
67
68
|
* the caller falls back to using the refreshed token only in memory.
|
|
68
69
|
*
|
|
@@ -70,7 +71,7 @@ export function readClaudeCodeKeychainCredential() {
|
|
|
70
71
|
* visible to `ps` — acceptable for a local dev CLI updating a credential that
|
|
71
72
|
* already lives on this machine.
|
|
72
73
|
*/
|
|
73
|
-
export function
|
|
74
|
+
export function writeAgentKeychainCredential(cred) {
|
|
74
75
|
if (platform() !== 'darwin')
|
|
75
76
|
return false;
|
|
76
77
|
// `add-generic-password -U` matches an existing item by service + account,
|
|
@@ -119,7 +120,7 @@ export function writeClaudeCodeKeychainCredential(cred) {
|
|
|
119
120
|
return false;
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
/** Read the account (`acct`) of the
|
|
123
|
+
/** Read the account (`acct`) of the Keychain entry, for updates. */
|
|
123
124
|
function readKeychainAccount() {
|
|
124
125
|
try {
|
|
125
126
|
const out = execFileSync('security', ['find-generic-password', '-s', KEYCHAIN_SERVICE], {
|
|
@@ -135,20 +136,19 @@ function readKeychainAccount() {
|
|
|
135
136
|
}
|
|
136
137
|
}
|
|
137
138
|
/**
|
|
138
|
-
* Detect whether a credential value is an
|
|
139
|
+
* Detect whether a credential value is an OAuth-style token
|
|
139
140
|
* (must be sent via `Authorization: Bearer`) vs a console API key (sent
|
|
140
|
-
* via `x-api-key`).
|
|
141
|
-
* positively identifies by prefix; defaults to API-key when unsure.
|
|
141
|
+
* via `x-api-key`). Positively identifies by prefix; defaults to API-key when unsure.
|
|
142
142
|
*/
|
|
143
143
|
export function isAnthropicOAuthToken(value) {
|
|
144
144
|
if (value.startsWith('sk-ant-api'))
|
|
145
145
|
return false; // console API key
|
|
146
146
|
if (value.startsWith('sk-ant-oat'))
|
|
147
|
-
return true; //
|
|
147
|
+
return true; // OAuth setup token
|
|
148
148
|
if (value.startsWith('eyJ'))
|
|
149
149
|
return true; // JWT
|
|
150
150
|
if (value.startsWith('cc-'))
|
|
151
|
-
return true; //
|
|
151
|
+
return true; // OAuth access token from the Keychain source
|
|
152
152
|
return false;
|
|
153
153
|
}
|
|
154
154
|
//# sourceMappingURL=keychain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/integrations/providers/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,MAAM,gBAAgB,GAAG,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/integrations/providers/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* OAuth token refresh for a discovered subscription credential.
|
|
3
3
|
*
|
|
4
4
|
* The access token discovered from the macOS Keychain (or a clawtool secret)
|
|
5
|
-
* is short-lived (~8h). When it lapses
|
|
6
|
-
* stream dies.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* surfacing as an authentication error.
|
|
5
|
+
* is short-lived (~8h). When it lapses the provider answers 401 and the
|
|
6
|
+
* agent stream dies. Refreshing proactively against the public OAuth token
|
|
7
|
+
* endpoint, using the long-lived refresh token, renews a stale token before
|
|
8
|
+
* the session starts instead of surfacing it as an authentication error.
|
|
10
9
|
*
|
|
11
10
|
* Non-throwing: any failure (no refresh token, network down, endpoint error)
|
|
12
11
|
* returns the existing token unchanged — at worst the caller hits the same
|
|
13
12
|
* 401 it would have hit anyway, never a crash.
|
|
14
13
|
*/
|
|
15
|
-
import { type
|
|
14
|
+
import { type AgentOAuthCredential } from './keychain.js';
|
|
16
15
|
export interface OAuthMetadata {
|
|
17
16
|
readonly refreshToken?: string;
|
|
18
17
|
readonly expiresAt?: number;
|
|
@@ -24,5 +23,5 @@ export interface OAuthMetadata {
|
|
|
24
23
|
*/
|
|
25
24
|
export declare function ensureFreshAnthropicToken(accessToken: string, oauth: OAuthMetadata): Promise<string>;
|
|
26
25
|
/** Exchange a refresh token for a new credential, or `null` on any failure. */
|
|
27
|
-
export declare function
|
|
26
|
+
export declare function refreshAgentOAuthToken(refreshToken: string): Promise<AgentOAuthCredential | null>;
|
|
28
27
|
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAgC,MAAM,eAAe,CAAA;AAYvF,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC9C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC3C,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA2BtC"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* OAuth token refresh for a discovered subscription credential.
|
|
3
3
|
*
|
|
4
4
|
* The access token discovered from the macOS Keychain (or a clawtool secret)
|
|
5
|
-
* is short-lived (~8h). When it lapses
|
|
6
|
-
* stream dies.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* surfacing as an authentication error.
|
|
5
|
+
* is short-lived (~8h). When it lapses the provider answers 401 and the
|
|
6
|
+
* agent stream dies. Refreshing proactively against the public OAuth token
|
|
7
|
+
* endpoint, using the long-lived refresh token, renews a stale token before
|
|
8
|
+
* the session starts instead of surfacing it as an authentication error.
|
|
10
9
|
*
|
|
11
10
|
* Non-throwing: any failure (no refresh token, network down, endpoint error)
|
|
12
11
|
* returns the existing token unchanged — at worst the caller hits the same
|
|
13
12
|
* 401 it would have hit anyway, never a crash.
|
|
14
13
|
*/
|
|
15
|
-
import {
|
|
16
|
-
/**
|
|
14
|
+
import { writeAgentKeychainCredential } from './keychain.js';
|
|
15
|
+
/**
|
|
16
|
+
* The public OAuth client id and token endpoint this credential was issued
|
|
17
|
+
* against. Addresses, verbatim — the refresh only succeeds against these.
|
|
18
|
+
*/
|
|
17
19
|
const CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
|
|
18
20
|
const TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';
|
|
19
21
|
/** Refresh a few seconds early so an about-to-expire token isn't used. */
|
|
@@ -29,14 +31,14 @@ export async function ensureFreshAnthropicToken(accessToken, oauth) {
|
|
|
29
31
|
return accessToken;
|
|
30
32
|
if (!oauth.refreshToken)
|
|
31
33
|
return accessToken;
|
|
32
|
-
const refreshed = await
|
|
34
|
+
const refreshed = await refreshAgentOAuthToken(oauth.refreshToken);
|
|
33
35
|
if (!refreshed)
|
|
34
36
|
return accessToken;
|
|
35
|
-
|
|
37
|
+
writeAgentKeychainCredential(refreshed);
|
|
36
38
|
return refreshed.accessToken;
|
|
37
39
|
}
|
|
38
40
|
/** Exchange a refresh token for a new credential, or `null` on any failure. */
|
|
39
|
-
export async function
|
|
41
|
+
export async function refreshAgentOAuthToken(refreshToken) {
|
|
40
42
|
try {
|
|
41
43
|
const res = await fetch(TOKEN_URL, {
|
|
42
44
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA6B,4BAA4B,EAAE,MAAM,eAAe,CAAA;AAEvF;;;GAGG;AACH,MAAM,SAAS,GAAG,sCAAsC,CAAA;AACxD,MAAM,SAAS,GAAG,8CAA8C,CAAA;AAEhE,0EAA0E;AAC1E,MAAM,cAAc,GAAG,MAAM,CAAA;AAO7B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,WAAmB,EACnB,KAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAA;IAC5F,IAAI,KAAK;QAAE,OAAO,WAAW,CAAA;IAC7B,IAAI,CAAC,KAAK,CAAC,YAAY;QAAE,OAAO,WAAW,CAAA;IAE3C,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,WAAW,CAAA;IAClC,4BAA4B,CAAC,SAAS,CAAC,CAAA;IACvC,OAAO,SAAS,CAAC,WAAW,CAAA;AAC7B,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,YAAoB;IAEpB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,UAAU,EAAE,eAAe;gBAC3B,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,SAAS;aACpB,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAI7B,CAAA;QACD,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACxF,OAAO;YACN,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,YAAY,EAAE,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;YACxF,SAAS,EACR,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS;SACvF,CAAA;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC"}
|
|
@@ -3,16 +3,16 @@ import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
|
3
3
|
// the real macOS Keychain (this suite can run on the developer's own machine).
|
|
4
4
|
vi.mock('./keychain.js', async (importOriginal) => {
|
|
5
5
|
const actual = await importOriginal();
|
|
6
|
-
return { ...actual,
|
|
6
|
+
return { ...actual, writeAgentKeychainCredential: vi.fn(() => false) };
|
|
7
7
|
});
|
|
8
|
-
import { ensureFreshAnthropicToken,
|
|
8
|
+
import { ensureFreshAnthropicToken, refreshAgentOAuthToken } from './oauth.js';
|
|
9
9
|
function mockFetch(impl) {
|
|
10
10
|
vi.stubGlobal('fetch', impl);
|
|
11
11
|
}
|
|
12
12
|
afterEach(() => {
|
|
13
13
|
vi.unstubAllGlobals();
|
|
14
14
|
});
|
|
15
|
-
describe('
|
|
15
|
+
describe('refreshAgentOAuthToken', () => {
|
|
16
16
|
it('exchanges the refresh token and maps the response', async () => {
|
|
17
17
|
mockFetch((async () => new Response(JSON.stringify({
|
|
18
18
|
access_token: 'cc-new-access',
|
|
@@ -20,30 +20,30 @@ describe('refreshClaudeCodeToken', () => {
|
|
|
20
20
|
expires_in: 3600,
|
|
21
21
|
}), { status: 200 })));
|
|
22
22
|
const before = Date.now();
|
|
23
|
-
const cred = await
|
|
23
|
+
const cred = await refreshAgentOAuthToken('rt-old');
|
|
24
24
|
expect(cred?.accessToken).toBe('cc-new-access');
|
|
25
25
|
expect(cred?.refreshToken).toBe('rt-new');
|
|
26
26
|
expect(cred?.expiresAt).toBeGreaterThanOrEqual(before + 3600 * 1000);
|
|
27
27
|
});
|
|
28
28
|
it('keeps the old refresh token when the response omits one', async () => {
|
|
29
29
|
mockFetch((async () => new Response(JSON.stringify({ access_token: 'cc-new' }), { status: 200 })));
|
|
30
|
-
const cred = await
|
|
30
|
+
const cred = await refreshAgentOAuthToken('rt-old');
|
|
31
31
|
expect(cred?.accessToken).toBe('cc-new');
|
|
32
32
|
expect(cred?.refreshToken).toBe('rt-old');
|
|
33
33
|
});
|
|
34
34
|
it('returns null on a non-2xx response', async () => {
|
|
35
35
|
mockFetch((async () => new Response('nope', { status: 401 })));
|
|
36
|
-
expect(await
|
|
36
|
+
expect(await refreshAgentOAuthToken('rt')).toBeNull();
|
|
37
37
|
});
|
|
38
38
|
it('returns null when fetch throws', async () => {
|
|
39
39
|
mockFetch((async () => {
|
|
40
40
|
throw new Error('network down');
|
|
41
41
|
}));
|
|
42
|
-
expect(await
|
|
42
|
+
expect(await refreshAgentOAuthToken('rt')).toBeNull();
|
|
43
43
|
});
|
|
44
44
|
it('returns null when the payload lacks an access token', async () => {
|
|
45
45
|
mockFetch((async () => new Response(JSON.stringify({ foo: 'bar' }), { status: 200 })));
|
|
46
|
-
expect(await
|
|
46
|
+
expect(await refreshAgentOAuthToken('rt')).toBeNull();
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
49
|
describe('ensureFreshAnthropicToken', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE5D,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACjD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAkC,CAAA;IACrE,OAAO,EAAE,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/oauth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,14 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { PreferencesError, preferencesPath, readPreferences, writePreferences, } from './preferences.js';
|
|
6
|
+
/**
|
|
7
|
+
* POSIX file modes do not exist on Windows: `chmod` is a no-op there and
|
|
8
|
+
* `fs.stat().mode` reports a fixed value, so these cases assert a
|
|
9
|
+
* permission the platform cannot enforce. Skipping keeps the suite
|
|
10
|
+
* meaningful on Windows instead of permanently red — the behavior itself
|
|
11
|
+
* is still covered on Linux and macOS, where it actually matters.
|
|
12
|
+
*/
|
|
13
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
6
14
|
function tmpHome() {
|
|
7
15
|
return mkdtempSync(join(tmpdir(), 'namzu-prefs-v2-'));
|
|
8
16
|
}
|
|
@@ -38,7 +46,7 @@ describe('readPreferences', () => {
|
|
|
38
46
|
});
|
|
39
47
|
});
|
|
40
48
|
describe('writePreferences', () => {
|
|
41
|
-
it('enforces mode 0600 on file and 0700 on dir', () => {
|
|
49
|
+
it.skipIf(IS_WINDOWS)('enforces mode 0600 on file and 0700 on dir', () => {
|
|
42
50
|
const home = tmpHome();
|
|
43
51
|
writePreferences({ version: 2, provider: 'openai' }, home);
|
|
44
52
|
const fileMode = statSync(preferencesPath(home)).mode & 0o777;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preferences.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"preferences.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/preferences.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Declarative LLM provider registry — the single source of truth that
|
|
3
3
|
* discovery, picker labeling, and runtime construction all derive from.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here; nothing else in this layer needs to change.
|
|
5
|
+
* Adding a provider means adding one entry here; nothing else in this
|
|
6
|
+
* layer needs to change.
|
|
8
7
|
*/
|
|
9
8
|
export type ProviderId = 'anthropic' | 'openai' | 'openrouter' | 'ollama' | 'lmstudio' | 'bedrock' | 'http';
|
|
10
9
|
/** SDK type passed to `ProviderRegistry.create({type, ...})`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GACnB,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,CAAA;AAET,iEAAiE;AACjE,MAAM,MAAM,eAAe,GAAG,UAAU,CAAA;AAExC,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,mEAAmE;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CAChC;AAED,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CA8DjF,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAQvC,CAAA"}
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
* Declarative LLM provider registry — the single source of truth that
|
|
3
3
|
* discovery, picker labeling, and runtime construction all derive from.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* here; nothing else in this layer needs to change.
|
|
5
|
+
* Adding a provider means adding one entry here; nothing else in this
|
|
6
|
+
* layer needs to change.
|
|
8
7
|
*/
|
|
9
8
|
export const PROVIDER_REGISTRY = Object.freeze({
|
|
10
9
|
anthropic: {
|
|
11
10
|
id: 'anthropic',
|
|
12
11
|
label: 'Anthropic (Claude)',
|
|
13
|
-
// Order
|
|
12
|
+
// Order: explicit anthropic key, then anthropic-token
|
|
14
13
|
// variant, then claude-code's OAuth env (often present when the user
|
|
15
14
|
// has claude-code installed).
|
|
16
15
|
envVars: ['ANTHROPIC_API_KEY', 'ANTHROPIC_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/integrations/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH,MAAM,CAAC,MAAM,iBAAiB,GAAwD,MAAM,CAAC,MAAM,CAClG;IACC,SAAS,EAAE;QACV,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,oBAAoB;QAC3B,sDAAsD;QACtD,qEAAqE;QACrE,8BAA8B;QAC9B,OAAO,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,yBAAyB,CAAC;QAC5E,YAAY,EAAE,iBAAiB;QAC/B,cAAc,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;KACpB;IACD,UAAU,EAAE;QACX,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,CAAC,oBAAoB,CAAC;QAC/B,cAAc,EAAE,8BAA8B;QAC9C,YAAY,EAAE,2BAA2B;QACzC,cAAc,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,gBAAgB;QACvB,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,wBAAwB;QACxC,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,UAAU;QACxB,cAAc,EAAE,KAAK;KACrB;IACD,QAAQ,EAAE;QACT,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,0BAA0B;QAC1C,QAAQ,EAAE,iCAAiC;QAC3C,YAAY,EAAE,MAAM;QACpB,cAAc,EAAE,KAAK;KACrB;IACD,OAAO,EAAE;QACR,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE,wCAAwC;QACxE,YAAY,EAAE,gCAAgC;QAC9C,cAAc,EAAE,IAAI;KACpB;IACD,IAAI,EAAE;QACL,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,iCAAiC;QACxC,oEAAoE;QACpE,kDAAkD;QAClD,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,IAAI;KACpB;CACD,CACD,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAA0B,MAAM,CAAC,MAAM,CAAC;IACpE,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;CACG,CAAC,CAAA"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Writes are atomic: temp file + rename. Mode 0600 enforced on every write.
|
|
6
6
|
* - `resolveApiKey(profile, env)` cascades `NAMZU_<NAME>_API_KEY` (per-
|
|
7
7
|
* profile override) → per-type vendor default (`OPENAI_API_KEY` etc.)
|
|
8
|
-
* → profile.apiKey on-disk → null.
|
|
8
|
+
* → profile.apiKey on-disk → null.
|
|
9
9
|
* - Uniqueness invariants enforced on write: no duplicate `name`; at most
|
|
10
10
|
* one profile with `default: true`.
|
|
11
11
|
*/
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Writes are atomic: temp file + rename. Mode 0600 enforced on every write.
|
|
6
6
|
* - `resolveApiKey(profile, env)` cascades `NAMZU_<NAME>_API_KEY` (per-
|
|
7
7
|
* profile override) → per-type vendor default (`OPENAI_API_KEY` etc.)
|
|
8
|
-
* → profile.apiKey on-disk → null.
|
|
8
|
+
* → profile.apiKey on-disk → null.
|
|
9
9
|
* - Uniqueness invariants enforced on write: no duplicate `name`; at most
|
|
10
10
|
* one profile with `default: true`.
|
|
11
11
|
*/
|
|
@@ -3,6 +3,14 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { ProvidersStoreError, assertInvariants, findDefault, providersPath, readProfiles, resolveApiKey, writeProfiles, } from './store.js';
|
|
6
|
+
/**
|
|
7
|
+
* POSIX file modes do not exist on Windows: `chmod` is a no-op there and
|
|
8
|
+
* `fs.stat().mode` reports a fixed value, so these cases assert a
|
|
9
|
+
* permission the platform cannot enforce. Skipping keeps the suite
|
|
10
|
+
* meaningful on Windows instead of permanently red — the behavior itself
|
|
11
|
+
* is still covered on Linux and macOS, where it actually matters.
|
|
12
|
+
*/
|
|
13
|
+
const IS_WINDOWS = process.platform === 'win32';
|
|
6
14
|
function tmpHome() {
|
|
7
15
|
return mkdtempSync(join(tmpdir(), 'namzu-providers-'));
|
|
8
16
|
}
|
|
@@ -41,7 +49,7 @@ describe('writeProfiles', () => {
|
|
|
41
49
|
writeProfiles([anthropic()], home);
|
|
42
50
|
expect(readProfiles(home)).toEqual([anthropic()]);
|
|
43
51
|
});
|
|
44
|
-
it('enforces mode 0600 on the file and 0700 on the directory', () => {
|
|
52
|
+
it.skipIf(IS_WINDOWS)('enforces mode 0600 on the file and 0700 on the directory', () => {
|
|
45
53
|
const home = tmpHome();
|
|
46
54
|
writeProfiles([anthropic()], home);
|
|
47
55
|
const fileStat = statSync(providersPath(home));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/store.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7C,OAAO,EACN,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,YAAY,CAAA;AAEnB,SAAS,OAAO;IACf,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,OAAkC,EAAE,EAAoB,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,iBAAiB;IACzB,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,CAAC,OAA+B,EAAE,EAAiB,EAAE,CAAC,CAAC;IACrE,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,oBAAoB;IAC5B,GAAG,IAAI;CACP,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,YAAY,CAAC,CAAA;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/B,aAAa,CACZ,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAC7C,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;QACtB,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/integrations/providers/store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trusted-folder store — `~/.namzu/trust.json`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Trust gate: before namzu reads, runs commands in, or edits files in a
|
|
5
|
+
* directory, the user must trust it. Trusted directories
|
|
6
6
|
* are remembered here so the prompt only appears once per folder. A folder
|
|
7
7
|
* counts as trusted if it — or any ancestor — has been trusted, so
|
|
8
8
|
* trusting a repo root covers its subfolders.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trusted-folder store — `~/.namzu/trust.json`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Trust gate: before namzu reads, runs commands in, or edits files in a
|
|
5
|
+
* directory, the user must trust it. Trusted directories
|
|
6
6
|
* are remembered here so the prompt only appears once per folder. A folder
|
|
7
7
|
* counts as trusted if it — or any ancestor — has been trusted, so
|
|
8
8
|
* trusting a repo root covers its subfolders.
|
package/dist/memory/store.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Persistent memory under `~/.namzu/`
|
|
2
|
+
* Persistent memory under `~/.namzu/` as flat markdown.
|
|
3
3
|
*
|
|
4
4
|
* - `USER.md` — durable facts about the user (role, preferences).
|
|
5
5
|
* - `MEMORY.md` — durable facts/decisions the agent should carry across
|
package/dist/memory/store.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Persistent memory under `~/.namzu/`
|
|
2
|
+
* Persistent memory under `~/.namzu/` as flat markdown.
|
|
3
3
|
*
|
|
4
4
|
* - `USER.md` — durable facts about the user (role, preferences).
|
|
5
5
|
* - `MEMORY.md` — durable facts/decisions the agent should carry across
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendered-payload.test.d.ts","sourceRoot":"","sources":["../../src/output/rendered-payload.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendered-payload.test.js","sourceRoot":"","sources":["../../src/output/rendered-payload.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;;;;;;;GAYG;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAChD,IAAI,MAAc,CAAA;IAClB,IAAI,OAAoC,CAAA;IAExC,UAAU,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,EAAE,CAAA;QACX,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAA0B,EAAW,EAAE;YAC/D,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjF,OAAO,IAAI,CAAA;QACZ,CAAC,CAAgC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG;QACf,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACtD,IAAI,EAAE,sCAAsC;KAC5C,CAAA;IAED,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,eAAe,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAExD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QAClE,6DAA6D;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAChD,iEAAiE;QACjE,oDAAoD;QACpD,eAAe,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAExD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAmB,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,eAAe,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,qEAAqE;QACrE,mCAAmC;QACnC,eAAe,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
package/dist/output/text.js
CHANGED
|
@@ -28,6 +28,20 @@ function renderText(data) {
|
|
|
28
28
|
if (typeof data === 'number' || typeof data === 'boolean' || typeof data === 'bigint') {
|
|
29
29
|
return String(data);
|
|
30
30
|
}
|
|
31
|
+
// A payload that brought its own rendering gets to use it.
|
|
32
|
+
//
|
|
33
|
+
// Without this a command has to choose: print the structured payload,
|
|
34
|
+
// which the `json` and `yaml` formats need, or print the human string,
|
|
35
|
+
// which text needs. Every command that wanted both ended up passing the
|
|
36
|
+
// object and letting `inspect` dump it — so `namzu eval` in its default
|
|
37
|
+
// format printed a nested object graph where a report was meant to be,
|
|
38
|
+
// with the readable version sitting unused in a `text` field one level
|
|
39
|
+
// down. Found by running the built binary, not by a test: the test
|
|
40
|
+
// asserted on the payload, which was correct, and never on what a
|
|
41
|
+
// person sees.
|
|
42
|
+
if (typeof data === 'object' && typeof data.text === 'string') {
|
|
43
|
+
return data.text;
|
|
44
|
+
}
|
|
31
45
|
// `depth: 6` is generous for CLI payloads while keeping pathological
|
|
32
46
|
// (deeply nested or self-referencing) graphs from exhausting stack/heap.
|
|
33
47
|
// `inspect` already marks already-seen objects as `[Circular]`.
|
package/dist/output/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/output/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,MAAM,OAAO,aAAa;IAGI;IAFpB,IAAI,GAAG,MAAe,CAAA;IAE/B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,IAAa;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAM;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,OAA+C;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,OAAO,IAAI,CAAC,CAAA;QACnD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACzD,CAAC;IACF,CAAC;CACD;AAED,SAAS,UAAU,CAAC,IAAa;IAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IACD,qEAAqE;IACrE,yEAAyE;IACzE,gEAAgE;IAChE,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;AAClE,CAAC"}
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/output/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,MAAM,OAAO,aAAa;IAGI;IAFpB,IAAI,GAAG,MAAe,CAAA;IAE/B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,KAAK,CAAC,IAAa;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAM;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,OAA+C;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,OAAO,IAAI,CAAC,CAAA;QACnD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACzD,CAAC;IACF,CAAC;CACD;AAED,SAAS,UAAU,CAAC,IAAa;IAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,2DAA2D;IAC3D,EAAE;IACF,sEAAsE;IACtE,uEAAuE;IACvE,wEAAwE;IACxE,wEAAwE;IACxE,uEAAuE;IACvE,uEAAuE;IACvE,mEAAmE;IACnE,kEAAkE;IAClE,eAAe;IACf,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvF,OAAQ,IAAyB,CAAC,IAAI,CAAA;IACvC,CAAC;IACD,qEAAqE;IACrE,yEAAyE;IACzE,gEAAgE;IAChE,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;AAClE,CAAC"}
|