@tjalve/cube-cli 0.1.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/errors/index.d.ts +28 -0
  4. package/dist/errors/index.d.ts.map +1 -0
  5. package/dist/errors/index.js +58 -0
  6. package/dist/errors/index.js.map +1 -0
  7. package/dist/fixtures/cli.d.ts +4 -0
  8. package/dist/fixtures/cli.d.ts.map +1 -0
  9. package/dist/fixtures/cli.js +195 -0
  10. package/dist/fixtures/cli.js.map +1 -0
  11. package/dist/fixtures/metadata.d.ts +347 -0
  12. package/dist/fixtures/metadata.d.ts.map +1 -0
  13. package/dist/fixtures/metadata.js +372 -0
  14. package/dist/fixtures/metadata.js.map +1 -0
  15. package/dist/help/index.d.ts +24 -0
  16. package/dist/help/index.d.ts.map +1 -0
  17. package/dist/help/index.js +254 -0
  18. package/dist/help/index.js.map +1 -0
  19. package/dist/index.d.ts +20 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +21 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/metadata/define.d.ts +11 -0
  24. package/dist/metadata/define.d.ts.map +1 -0
  25. package/dist/metadata/define.js +125 -0
  26. package/dist/metadata/define.js.map +1 -0
  27. package/dist/metadata/index.d.ts +3 -0
  28. package/dist/metadata/index.d.ts.map +1 -0
  29. package/dist/metadata/index.js +2 -0
  30. package/dist/metadata/index.js.map +1 -0
  31. package/dist/metadata/types.d.ts +109 -0
  32. package/dist/metadata/types.d.ts.map +1 -0
  33. package/dist/metadata/types.js +2 -0
  34. package/dist/metadata/types.js.map +1 -0
  35. package/dist/mutation/index.d.ts +55 -0
  36. package/dist/mutation/index.d.ts.map +1 -0
  37. package/dist/mutation/index.js +162 -0
  38. package/dist/mutation/index.js.map +1 -0
  39. package/dist/output/index.d.ts +32 -0
  40. package/dist/output/index.d.ts.map +1 -0
  41. package/dist/output/index.js +94 -0
  42. package/dist/output/index.js.map +1 -0
  43. package/dist/prompts/index.d.ts +37 -0
  44. package/dist/prompts/index.d.ts.map +1 -0
  45. package/dist/prompts/index.js +78 -0
  46. package/dist/prompts/index.js.map +1 -0
  47. package/dist/redaction/index.d.ts +10 -0
  48. package/dist/redaction/index.d.ts.map +1 -0
  49. package/dist/redaction/index.js +83 -0
  50. package/dist/redaction/index.js.map +1 -0
  51. package/dist/registry/index.d.ts +25 -0
  52. package/dist/registry/index.d.ts.map +1 -0
  53. package/dist/registry/index.js +286 -0
  54. package/dist/registry/index.js.map +1 -0
  55. package/dist/runtime/index.d.ts +69 -0
  56. package/dist/runtime/index.d.ts.map +1 -0
  57. package/dist/runtime/index.js +581 -0
  58. package/dist/runtime/index.js.map +1 -0
  59. package/dist/schema/index.d.ts +122 -0
  60. package/dist/schema/index.d.ts.map +1 -0
  61. package/dist/schema/index.js +208 -0
  62. package/dist/schema/index.js.map +1 -0
  63. package/dist/terminal/index.d.ts +31 -0
  64. package/dist/terminal/index.d.ts.map +1 -0
  65. package/dist/terminal/index.js +118 -0
  66. package/dist/terminal/index.js.map +1 -0
  67. package/dist/testing/index.d.ts +85 -0
  68. package/dist/testing/index.d.ts.map +1 -0
  69. package/dist/testing/index.js +293 -0
  70. package/dist/testing/index.js.map +1 -0
  71. package/package.json +107 -0
@@ -0,0 +1,32 @@
1
+ import { type CliErrorShape } from "../errors/index.js";
2
+ export type JsonFields = Readonly<Record<string, unknown>>;
3
+ export interface JsonSuccessEnvelope {
4
+ readonly ok: true;
5
+ readonly command: string;
6
+ readonly [key: string]: unknown;
7
+ }
8
+ export interface JsonErrorEnvelope {
9
+ readonly ok: false;
10
+ readonly command: string;
11
+ readonly error: {
12
+ readonly kind: string;
13
+ readonly operation: string;
14
+ readonly likelyCause: string;
15
+ readonly suggestedNextAction: string;
16
+ readonly category: string;
17
+ readonly exitCode: number;
18
+ };
19
+ }
20
+ export interface CommandResultShape {
21
+ readonly stdout?: string;
22
+ readonly stderr?: string;
23
+ readonly exitCode?: number;
24
+ }
25
+ export declare function createJsonSuccessEnvelope(command: string, fields?: JsonFields): JsonSuccessEnvelope;
26
+ export declare function createJsonErrorEnvelope(error: CliErrorShape): JsonErrorEnvelope;
27
+ export declare function renderJsonLine(value: unknown): string;
28
+ export declare function renderJsonSuccess(command: string, fields?: JsonFields): string;
29
+ export declare function renderJsonError(error: CliErrorShape): string;
30
+ export declare function createJsonSuccessResult(command: string, fields?: JsonFields, stderr?: string): CommandResultShape;
31
+ export declare function createHumanResult(stdout: string, stderr?: string, exitCode?: number): CommandResultShape;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/output/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,UAAe,GAAG,mBAAmB,CAOvG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAa/E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMrD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,UAAe,GAAG,MAAM,CAElF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,UAAe,EAAE,MAAM,SAAK,GAAG,kBAAkB,CAMjH;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAK,EAAE,QAAQ,SAAI,GAAG,kBAAkB,CAG/F"}
@@ -0,0 +1,94 @@
1
+ import {} from "../errors/index.js";
2
+ import { isSensitiveKey, redactStructuredValue, redactText, redactionPlaceholder } from "../redaction/index.js";
3
+ export function createJsonSuccessEnvelope(command, fields = {}) {
4
+ assertNoReservedFields(fields);
5
+ return Object.freeze({
6
+ ok: true,
7
+ command,
8
+ ...stableFields(fields)
9
+ });
10
+ }
11
+ export function createJsonErrorEnvelope(error) {
12
+ return Object.freeze({
13
+ ok: false,
14
+ command: error.command ?? "",
15
+ error: Object.freeze({
16
+ kind: error.kind,
17
+ operation: redactText(error.operation),
18
+ likelyCause: redactText(error.likelyCause),
19
+ suggestedNextAction: redactText(error.suggestedNextAction),
20
+ category: error.category,
21
+ exitCode: error.exitCode
22
+ })
23
+ });
24
+ }
25
+ export function renderJsonLine(value) {
26
+ const serialized = JSON.stringify(value);
27
+ if (serialized === undefined) {
28
+ throw new TypeError("JSON output value must be serializable as valid JSON.");
29
+ }
30
+ return `${serialized}\n`;
31
+ }
32
+ export function renderJsonSuccess(command, fields = {}) {
33
+ return renderJsonLine(createJsonSuccessEnvelope(command, fields));
34
+ }
35
+ export function renderJsonError(error) {
36
+ return renderJsonLine(createJsonErrorEnvelope(error));
37
+ }
38
+ export function createJsonSuccessResult(command, fields = {}, stderr = "") {
39
+ const result = {
40
+ exitCode: 0,
41
+ stdout: renderJsonSuccess(command, fields)
42
+ };
43
+ return stderr.length > 0 ? { ...result, stderr } : result;
44
+ }
45
+ export function createHumanResult(stdout, stderr = "", exitCode = 0) {
46
+ const result = { exitCode, stdout };
47
+ return stderr.length > 0 ? { ...result, stderr } : result;
48
+ }
49
+ function assertNoReservedFields(fields) {
50
+ for (const reserved of ["ok", "command"]) {
51
+ if (Object.hasOwn(fields, reserved)) {
52
+ throw new TypeError(`JSON result fields must not define reserved field "${reserved}".`);
53
+ }
54
+ }
55
+ }
56
+ function stableFields(fields) {
57
+ const result = {};
58
+ for (const key of Object.keys(fields).sort(compareText)) {
59
+ const value = fields[key];
60
+ if (value !== undefined) {
61
+ result[key] = stableValue(value, key);
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+ function stableValue(value, key) {
67
+ if (key && isSensitiveKey(key) && value !== undefined && value !== null) {
68
+ return redactionPlaceholder;
69
+ }
70
+ if (typeof value === "string") {
71
+ return redactText(value);
72
+ }
73
+ if (Array.isArray(value)) {
74
+ return value.map((item) => stableValue(item));
75
+ }
76
+ if (isRecord(value)) {
77
+ return stableFields(redactStructuredValue(value));
78
+ }
79
+ return value;
80
+ }
81
+ function isRecord(value) {
82
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
83
+ return false;
84
+ }
85
+ const prototype = Object.getPrototypeOf(value);
86
+ return prototype === Object.prototype || prototype === null;
87
+ }
88
+ function compareText(left, right) {
89
+ if (left === right) {
90
+ return 0;
91
+ }
92
+ return left < right ? -1 : 1;
93
+ }
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/output/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA6BhH,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,SAAqB,EAAE;IAChF,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,IAAI;QACR,OAAO;QACP,GAAG,YAAY,CAAC,MAAM,CAAC;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAoB;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YACtC,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;YAC1C,mBAAmB,EAAE,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC;YAC1D,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,GAAG,UAAU,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,SAAqB,EAAE;IACxE,OAAO,cAAc,CAAC,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,cAAc,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,SAAqB,EAAE,EAAE,MAAM,GAAG,EAAE;IAC3F,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC;KAC3C,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,CAAC;IACzE,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACpC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5D,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAkB;IAChD,KAAK,MAAM,QAAQ,IAAI,CAAC,IAAI,EAAE,SAAS,CAAU,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,SAAS,CAAC,sDAAsD,QAAQ,IAAI,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,GAAY;IAC/C,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACxE,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAY,CAAC;IAC1D,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { confirm, text } from "@clack/prompts";
2
+ import type { CommandMetadata } from "../metadata/index.js";
3
+ import { type TerminalCapabilities } from "../terminal/index.js";
4
+ export type PromptBlockReason = "ci" | "json" | "non-interactive" | "non-tty" | "tty-prompt-disabled";
5
+ export interface PromptGateOptions<Value> {
6
+ readonly command?: CommandMetadata | string;
7
+ readonly promptName?: string;
8
+ readonly terminal?: TerminalCapabilities;
9
+ readonly jsonMode?: boolean;
10
+ readonly nonInteractive?: boolean;
11
+ readonly value?: Value;
12
+ readonly defaultValue?: Value;
13
+ readonly defaults?: boolean;
14
+ readonly yes?: boolean;
15
+ }
16
+ export type PromptGateDecision = {
17
+ readonly allowed: true;
18
+ } | {
19
+ readonly allowed: false;
20
+ readonly reason: PromptBlockReason;
21
+ readonly message: string;
22
+ };
23
+ export type PromptRunner<Value> = () => Promise<Value | symbol> | Value | symbol;
24
+ export type ClackTextOptions = Parameters<typeof text>[0];
25
+ export type ClackConfirmOptions = Parameters<typeof confirm>[0];
26
+ export declare function evaluatePromptGate<Value>(options?: PromptGateOptions<Value>): PromptGateDecision;
27
+ export declare function resolvePromptValue<Value>(options: PromptGateOptions<Value> & {
28
+ readonly prompt: PromptRunner<Value>;
29
+ }): Promise<Value>;
30
+ export declare function promptText(options: PromptGateOptions<string> & {
31
+ readonly clack: ClackTextOptions;
32
+ }): Promise<string>;
33
+ export declare function promptConfirm(options: PromptGateOptions<boolean> & {
34
+ readonly clack: ClackConfirmOptions;
35
+ }): Promise<boolean>;
36
+ export declare function isPromptCancel(value: unknown): value is symbol;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAA8B,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7F,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,MAAM,GAAG,iBAAiB,GAAG,SAAS,GAAG,qBAAqB,CAAC;AAEtG,MAAM,WAAW,iBAAiB,CAAC,KAAK;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,MAAM,MAAM,YAAY,CAAC,KAAK,IAAI,MAAM,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;AACjF,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAE,iBAAiB,CAAC,KAAK,CAAM,GAAG,kBAAkB,CAkBpG;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAuB5I;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3H;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAKnI;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE9D"}
@@ -0,0 +1,78 @@
1
+ import { confirm, isCancel, text } from "@clack/prompts";
2
+ import { createCliError } from "../errors/index.js";
3
+ import { detectTerminalCapabilities } from "../terminal/index.js";
4
+ export function evaluatePromptGate(options = {}) {
5
+ const terminal = options.terminal ?? (options.jsonMode === undefined ? detectTerminalCapabilities() : detectTerminalCapabilities({ jsonMode: options.jsonMode }));
6
+ if (options.jsonMode === true || terminal.jsonMode) {
7
+ return blocked("json", "Prompts are disabled in JSON output mode.");
8
+ }
9
+ if (options.nonInteractive === true || options.defaults === true || options.yes === true) {
10
+ return blocked("non-interactive", "Prompts are disabled for explicit non-interactive flows.");
11
+ }
12
+ if (typeof options.command === "object" && options.command.interactions?.ttyPrompt === false) {
13
+ return blocked("tty-prompt-disabled", "Command metadata declares that TTY prompts are disabled.");
14
+ }
15
+ if (terminal.ci) {
16
+ return blocked("ci", "Prompts are disabled in CI environments.");
17
+ }
18
+ if (!terminal.stdinIsTTY || !terminal.stdoutIsTTY) {
19
+ return blocked("non-tty", "Prompts are disabled when stdin or stdout is not a TTY.");
20
+ }
21
+ return Object.freeze({ allowed: true });
22
+ }
23
+ export async function resolvePromptValue(options) {
24
+ if (options.value !== undefined) {
25
+ return options.value;
26
+ }
27
+ const gate = evaluatePromptGate(options);
28
+ if (!gate.allowed) {
29
+ if (options.defaultValue !== undefined) {
30
+ return options.defaultValue;
31
+ }
32
+ throw createPromptBlockedError(options, gate);
33
+ }
34
+ const value = await options.prompt();
35
+ if (isPromptCancel(value)) {
36
+ throw createCliError({
37
+ command: commandName(options.command),
38
+ kind: "prompt-cancelled",
39
+ operation: `prompt ${options.promptName ?? "value"}`,
40
+ likelyCause: "The interactive prompt was cancelled.",
41
+ suggestedNextAction: "Retry with a flag or config value instead of relying on an interactive prompt.",
42
+ category: "usage"
43
+ });
44
+ }
45
+ return value;
46
+ }
47
+ export async function promptText(options) {
48
+ return resolvePromptValue({
49
+ ...options,
50
+ prompt: () => text(options.clack)
51
+ });
52
+ }
53
+ export async function promptConfirm(options) {
54
+ return resolvePromptValue({
55
+ ...options,
56
+ prompt: () => confirm(options.clack)
57
+ });
58
+ }
59
+ export function isPromptCancel(value) {
60
+ return isCancel(value);
61
+ }
62
+ function createPromptBlockedError(options, gate) {
63
+ return createCliError({
64
+ command: commandName(options.command),
65
+ kind: "prompt-blocked",
66
+ operation: `prompt ${options.promptName ?? "value"}`,
67
+ likelyCause: gate.message,
68
+ suggestedNextAction: "Provide the value with flags or config, or rerun in an interactive terminal.",
69
+ category: "usage"
70
+ });
71
+ }
72
+ function blocked(reason, message) {
73
+ return Object.freeze({ allowed: false, reason, message });
74
+ }
75
+ function commandName(command) {
76
+ return typeof command === "string" ? command : command?.name ?? "<prompt>";
77
+ }
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const redactionPlaceholder = "[REDACTED]";
2
+ export interface RedactionOptions {
3
+ readonly placeholder?: string;
4
+ readonly sensitiveKeys?: readonly string[];
5
+ }
6
+ export type RedactedStructuredValue = Readonly<Record<string, unknown>>;
7
+ export declare function redactText(value: string, options?: RedactionOptions): string;
8
+ export declare function redactStructuredValue(value: Readonly<Record<string, unknown>>, options?: RedactionOptions): RedactedStructuredValue;
9
+ export declare function isSensitiveKey(key: string, sensitiveKeys?: readonly string[]): boolean;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/redaction/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AA0BxE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAKhF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,GAAE,gBAAqB,GAAG,uBAAuB,CAEvI;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,GAAE,SAAS,MAAM,EAAyB,GAAG,OAAO,CAG5G"}
@@ -0,0 +1,83 @@
1
+ export const redactionPlaceholder = "[REDACTED]";
2
+ const directTokenPatterns = Object.freeze([
3
+ /\b(sk-ant-api03-[A-Za-z0-9_-]{40,})\b/g,
4
+ /\b(sk-(?:proj-|svcacct-|admin-)?[A-Za-z0-9_-]{20,})\b/g,
5
+ /\b(gh[pousr]_[A-Za-z0-9_]{30,}|github_pat_[A-Za-z0-9_]{40,})\b/g,
6
+ /\b((?:AKIA|ASIA)[0-9A-Z]{16})\b/g,
7
+ /\b(eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,})\b/g
8
+ ]);
9
+ const bearerPattern = /\b(Bearer\s+)([A-Za-z0-9._-]{20,})\b/gi;
10
+ const assignmentPattern = /\b((?:[A-Za-z][A-Za-z0-9_-]*[_-])?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|secret|password|credential)\s*[:=]\s*["']?)([A-Za-z0-9_./+=-]{12,})(["']?)/gi;
11
+ const defaultSensitiveKeys = Object.freeze([
12
+ "apiKey",
13
+ "apikey",
14
+ "accessToken",
15
+ "refreshToken",
16
+ "authorization",
17
+ "credential",
18
+ "password",
19
+ "privateKey",
20
+ "secret",
21
+ "token"
22
+ ]);
23
+ export function redactText(value, options = {}) {
24
+ const placeholder = options.placeholder ?? redactionPlaceholder;
25
+ const directRedacted = directTokenPatterns.reduce((text, pattern) => text.replace(pattern, placeholder), value);
26
+ const bearerRedacted = directRedacted.replace(bearerPattern, (_match, prefix) => `${prefix}${placeholder}`);
27
+ return bearerRedacted.replace(assignmentPattern, (_match, prefix, _secret, suffix) => `${prefix}${placeholder}${suffix}`);
28
+ }
29
+ export function redactStructuredValue(value, options = {}) {
30
+ return redactRecord(value, options, new WeakMap());
31
+ }
32
+ export function isSensitiveKey(key, sensitiveKeys = defaultSensitiveKeys) {
33
+ const normalized = normalizeKey(key);
34
+ return sensitiveKeys.some((sensitiveKey) => normalizeKey(sensitiveKey) === normalized);
35
+ }
36
+ function redactValue(value, options, key, seen) {
37
+ if (key && isSensitiveKey(key, options.sensitiveKeys) && value !== undefined && value !== null) {
38
+ return options.placeholder ?? redactionPlaceholder;
39
+ }
40
+ if (typeof value === "string") {
41
+ return redactText(value, options);
42
+ }
43
+ if (Array.isArray(value)) {
44
+ const existing = seen.get(value);
45
+ if (existing) {
46
+ return existing;
47
+ }
48
+ const copy = [];
49
+ seen.set(value, copy);
50
+ for (const item of value) {
51
+ copy.push(redactValue(item, options, undefined, seen));
52
+ }
53
+ return Object.freeze(copy);
54
+ }
55
+ if (isRecord(value)) {
56
+ return redactRecord(value, options, seen);
57
+ }
58
+ return value;
59
+ }
60
+ function redactRecord(value, options, seen) {
61
+ const existing = seen.get(value);
62
+ if (existing && isRecord(existing)) {
63
+ return existing;
64
+ }
65
+ const copy = {};
66
+ seen.set(value, copy);
67
+ for (const entryKey of Object.keys(value)) {
68
+ const entryValue = value[entryKey];
69
+ copy[entryKey] = redactValue(entryValue, options, entryKey, seen);
70
+ }
71
+ return Object.freeze(copy);
72
+ }
73
+ function normalizeKey(key) {
74
+ return key.replace(/[^a-z0-9]/gi, "").toLowerCase();
75
+ }
76
+ function isRecord(value) {
77
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
78
+ return false;
79
+ }
80
+ const prototype = Object.getPrototypeOf(value);
81
+ return prototype === Object.prototype || prototype === null;
82
+ }
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/redaction/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { CommandMetadata, DefinitionMetadata, TopicMetadata } from "../metadata/index.js";
2
+ export interface CommandRegistry {
3
+ readonly topics: readonly TopicMetadata[];
4
+ readonly commands: readonly CommandMetadata[];
5
+ }
6
+ export interface CommandRegistryDefinitionGroups {
7
+ readonly topics?: readonly TopicMetadata[];
8
+ readonly commands?: readonly CommandMetadata[];
9
+ }
10
+ export type CommandRegistryInput = readonly DefinitionMetadata[] | CommandRegistryDefinitionGroups;
11
+ export interface CommandRegistryValidationIssue {
12
+ readonly path: string;
13
+ readonly message: string;
14
+ }
15
+ export declare class CommandRegistryValidationError extends TypeError {
16
+ readonly issues: readonly CommandRegistryValidationIssue[];
17
+ constructor(issues: readonly CommandRegistryValidationIssue[]);
18
+ }
19
+ export declare function createCommandRegistry(input: CommandRegistryInput): Readonly<CommandRegistry>;
20
+ export declare function validateCommandRegistry(registry: CommandRegistry): void;
21
+ export declare function findCommand(registry: CommandRegistry, nameOrAlias: string): CommandMetadata | undefined;
22
+ export declare function findTopic(registry: CommandRegistry, nameOrAlias: string): TopicMetadata | undefined;
23
+ export declare function listCommands(registry: CommandRegistry): readonly CommandMetadata[];
24
+ export declare function listTopics(registry: CommandRegistry): readonly TopicMetadata[];
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAElB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAK9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,oBAAoB,GAAG,SAAS,kBAAkB,EAAE,GAAG,+BAA+B,CAAC;AAEnG,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,8BAA+B,SAAQ,SAAS;IAC3D,QAAQ,CAAC,MAAM,EAAE,SAAS,8BAA8B,EAAE,CAAC;gBAE/C,MAAM,EAAE,SAAS,8BAA8B,EAAE;CAK9D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,QAAQ,CAAC,eAAe,CAAC,CAI5F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAevE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAIvG;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEnG;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,eAAe,EAAE,CAElF;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,aAAa,EAAE,CAE9E"}