@kodycodes/cli 1.18.0 → 1.19.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.
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Agent-facing structured errors for local testing (design 2026-10-13).
3
+ * Stable `code`, optional `where` / `fix`, and which `target` produced it.
4
+ */
5
+ export class StructuredCliError extends Error {
6
+ code;
7
+ target;
8
+ where;
9
+ fix;
10
+ details;
11
+ constructor(body) {
12
+ super(formatStructuredErrorMessage(body));
13
+ this.name = 'StructuredCliError';
14
+ this.code = body.code;
15
+ this.target = body.target;
16
+ this.where = body.where;
17
+ this.fix = body.fix;
18
+ this.details = body.details;
19
+ }
20
+ toJSON() {
21
+ return {
22
+ code: this.code,
23
+ message: stripStructuredPrefix(this.message),
24
+ ...(this.target !== undefined ? { target: this.target } : {}),
25
+ ...(this.where !== undefined ? { where: this.where } : {}),
26
+ ...(this.fix !== undefined ? { fix: this.fix } : {}),
27
+ ...(this.details !== undefined ? { details: this.details } : {}),
28
+ };
29
+ }
30
+ }
31
+ export function formatStructuredErrorMessage(body) {
32
+ const lines = [`[${body.code}] ${body.message}`];
33
+ if (body.target)
34
+ lines.push(`target: ${body.target}`);
35
+ if (body.where)
36
+ lines.push(`where: ${body.where}`);
37
+ if (body.fix)
38
+ lines.push(`fix: ${body.fix}`);
39
+ return lines.join('\n');
40
+ }
41
+ function stripStructuredPrefix(message) {
42
+ const match = /^\[([^\]]+)\]\s*/.exec(message);
43
+ if (!match)
44
+ return message;
45
+ return message.slice(match[0].length).split('\n')[0] ?? message;
46
+ }
47
+ export function notImplementedInMock(input) {
48
+ return new StructuredCliError({
49
+ code: 'not_implemented_in_mock',
50
+ message: `The CLI mock does not implement ${input.operation}.`,
51
+ target: 'mock',
52
+ fix: input.fix ??
53
+ `Use \`--target prod\` for this operation, or extend the mock. The mock refuses anything it does not implement rather than faking success.`,
54
+ details: { operation: input.operation },
55
+ });
56
+ }
57
+ //# sourceMappingURL=structured-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-error.js","sourceRoot":"","sources":["../src/structured-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared `--target prod|mock` for `dev`, `execute`, `invoke`, and `search`.
3
+ *
4
+ * Defaults (Kent-approved design 2026-10-13):
5
+ * - `kody dev` → `mock` (safe iteration; unpublished code never touches real secrets)
6
+ * - `execute` / `search` (and invoke via execute) → `prod` (preserve existing behavior)
7
+ *
8
+ * Override with `--target` or `KODY_TARGET`.
9
+ */
10
+ export declare const targetEnvVar = "KODY_TARGET";
11
+ export type KodyTarget = 'prod' | 'mock';
12
+ export type TargetAwareCommand = 'dev' | 'execute' | 'search';
13
+ /** Default target when neither flag nor env is set. */
14
+ export declare function defaultTargetFor(command: TargetAwareCommand): KodyTarget;
15
+ /**
16
+ * Resolve the active target. Precedence: `--target` flag → `KODY_TARGET` → command default.
17
+ */
18
+ export declare function resolveTarget(input: {
19
+ command: TargetAwareCommand;
20
+ flag?: string;
21
+ env?: NodeJS.ProcessEnv;
22
+ }): KodyTarget;
23
+ export declare function parseTargetFlag(value: string): KodyTarget;
24
+ /** True when this command accepts `--target` / `KODY_TARGET`. */
25
+ export declare function commandAcceptsTarget(command: string): command is TargetAwareCommand;
package/dist/target.js ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Shared `--target prod|mock` for `dev`, `execute`, `invoke`, and `search`.
3
+ *
4
+ * Defaults (Kent-approved design 2026-10-13):
5
+ * - `kody dev` → `mock` (safe iteration; unpublished code never touches real secrets)
6
+ * - `execute` / `search` (and invoke via execute) → `prod` (preserve existing behavior)
7
+ *
8
+ * Override with `--target` or `KODY_TARGET`.
9
+ */
10
+ export const targetEnvVar = 'KODY_TARGET';
11
+ /** Default target when neither flag nor env is set. */
12
+ export function defaultTargetFor(command) {
13
+ switch (command) {
14
+ case 'dev':
15
+ return 'mock';
16
+ case 'execute':
17
+ case 'search':
18
+ return 'prod';
19
+ default: {
20
+ const exhaustive = command;
21
+ throw new Error(`Unhandled command for target default: ${String(exhaustive)}`);
22
+ }
23
+ }
24
+ }
25
+ /**
26
+ * Resolve the active target. Precedence: `--target` flag → `KODY_TARGET` → command default.
27
+ */
28
+ export function resolveTarget(input) {
29
+ const raw = input.flag ?? input.env?.[targetEnvVar];
30
+ if (raw === undefined || raw === '') {
31
+ return defaultTargetFor(input.command);
32
+ }
33
+ return parseTargetFlag(raw);
34
+ }
35
+ export function parseTargetFlag(value) {
36
+ const normalized = value.trim().toLowerCase();
37
+ if (normalized === 'prod' || normalized === 'mock')
38
+ return normalized;
39
+ throw new Error(`\`--target\` must be \`prod\` or \`mock\` (got ${JSON.stringify(value)}). Example: \`kody execute --target mock --local --code '…'\`.`);
40
+ }
41
+ /** True when this command accepts `--target` / `KODY_TARGET`. */
42
+ export function commandAcceptsTarget(command) {
43
+ return command === 'dev' || command === 'execute' || command === 'search';
44
+ }
45
+ //# sourceMappingURL=target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAA;AAMzC,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC3D,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,KAAK;YACT,OAAO,MAAM,CAAA;QACd,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACZ,OAAO,MAAM,CAAA;QACd,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,UAAU,GAAU,OAAO,CAAA;YACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC/E,CAAC;IACF,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAI7B;IACA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAA;IACnD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACrC,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC7C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,UAAU,CAAA;IACrE,MAAM,IAAI,KAAK,CACd,kDAAkD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,gEAAgE,CACvI,CAAA;AACF,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,oBAAoB,CAAC,OAAe;IACnD,OAAO,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,CAAA;AAC1E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodycodes/cli",
3
- "version": "1.18.0",
3
+ "version": "1.19.0",
4
4
  "description": "Official Kody MCP client CLI: login, secure token storage, search, and execute.",
5
5
  "type": "module",
6
6
  "bin": {