@duyquangnvx/agent-cli 0.3.0 → 0.5.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 (122) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/dist/agent-cli.d.ts +2 -2
  3. package/dist/agent-cli.js +1 -1
  4. package/dist/agent-cli.js.map +1 -1
  5. package/dist/agent.d.ts +5 -3
  6. package/dist/agent.js +31 -10
  7. package/dist/agent.js.map +1 -1
  8. package/dist/built-ins.d.ts +6 -1
  9. package/dist/built-ins.js +3 -3
  10. package/dist/built-ins.js.map +1 -1
  11. package/dist/command-spec.d.ts +5 -0
  12. package/dist/command-spec.js +14 -3
  13. package/dist/command-spec.js.map +1 -1
  14. package/dist/confirm.js +6 -2
  15. package/dist/confirm.js.map +1 -1
  16. package/dist/context.d.ts +102 -0
  17. package/dist/context.js +2 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/cost.js +2 -2
  20. package/dist/cost.js.map +1 -1
  21. package/dist/define.d.ts +42 -75
  22. package/dist/define.js +6 -1
  23. package/dist/define.js.map +1 -1
  24. package/dist/doctor-rows.d.ts +2 -1
  25. package/dist/doctor-rows.js +18 -10
  26. package/dist/doctor-rows.js.map +1 -1
  27. package/dist/doctor.d.ts +2 -1
  28. package/dist/doctor.js +29 -18
  29. package/dist/doctor.js.map +1 -1
  30. package/dist/errno.d.ts +11 -4
  31. package/dist/errno.js +34 -7
  32. package/dist/errno.js.map +1 -1
  33. package/dist/errors.d.ts +2 -1
  34. package/dist/errors.js +4 -0
  35. package/dist/errors.js.map +1 -1
  36. package/dist/execute.d.ts +9 -4
  37. package/dist/execute.js +10 -3
  38. package/dist/execute.js.map +1 -1
  39. package/dist/exit-classes.js +5 -1
  40. package/dist/exit-classes.js.map +1 -1
  41. package/dist/files.d.ts +42 -3
  42. package/dist/files.js +132 -10
  43. package/dist/files.js.map +1 -1
  44. package/dist/flags.d.ts +5 -1
  45. package/dist/flags.js +17 -2
  46. package/dist/flags.js.map +1 -1
  47. package/dist/help-json.d.ts +1 -1
  48. package/dist/help-json.js +4 -1
  49. package/dist/help-json.js.map +1 -1
  50. package/dist/help.d.ts +1 -1
  51. package/dist/help.js +11 -7
  52. package/dist/help.js.map +1 -1
  53. package/dist/index.d.ts +8 -2
  54. package/dist/index.js +4 -0
  55. package/dist/index.js.map +1 -1
  56. package/dist/input.d.ts +10 -0
  57. package/dist/input.js +54 -3
  58. package/dist/input.js.map +1 -1
  59. package/dist/interrupts.d.ts +3 -1
  60. package/dist/interrupts.js +4 -3
  61. package/dist/interrupts.js.map +1 -1
  62. package/dist/invocation.d.ts +10 -5
  63. package/dist/invocation.js +24 -11
  64. package/dist/invocation.js.map +1 -1
  65. package/dist/list.js +5 -2
  66. package/dist/list.js.map +1 -1
  67. package/dist/npm.d.ts +5 -2
  68. package/dist/npm.js +23 -31
  69. package/dist/npm.js.map +1 -1
  70. package/dist/operator.d.ts +5 -0
  71. package/dist/operator.js +15 -0
  72. package/dist/operator.js.map +1 -0
  73. package/dist/output.d.ts +4 -1
  74. package/dist/output.js +4 -0
  75. package/dist/output.js.map +1 -1
  76. package/dist/outputs.d.ts +24 -1
  77. package/dist/outputs.js +58 -2
  78. package/dist/outputs.js.map +1 -1
  79. package/dist/parse-input.d.ts +11 -2
  80. package/dist/parse-input.js +92 -19
  81. package/dist/parse-input.js.map +1 -1
  82. package/dist/planned.d.ts +6 -0
  83. package/dist/planned.js +5 -0
  84. package/dist/planned.js.map +1 -0
  85. package/dist/project.d.ts +1 -1
  86. package/dist/route.d.ts +1 -1
  87. package/dist/route.js +2 -1
  88. package/dist/route.js.map +1 -1
  89. package/dist/run-cli.d.ts +16 -2
  90. package/dist/run-cli.js +116 -58
  91. package/dist/run-cli.js.map +1 -1
  92. package/dist/run-process.js +3 -2
  93. package/dist/run-process.js.map +1 -1
  94. package/dist/secrets.d.ts +9 -2
  95. package/dist/secrets.js +7 -5
  96. package/dist/secrets.js.map +1 -1
  97. package/dist/skill-source.d.ts +4 -0
  98. package/dist/skill-source.js +42 -0
  99. package/dist/skill-source.js.map +1 -0
  100. package/dist/skills.d.ts +2 -1
  101. package/dist/skills.js +4 -0
  102. package/dist/skills.js.map +1 -1
  103. package/dist/spawn.d.ts +22 -5
  104. package/dist/spawn.js +126 -29
  105. package/dist/spawn.js.map +1 -1
  106. package/dist/spill.d.ts +4 -3
  107. package/dist/spill.js +1 -2
  108. package/dist/spill.js.map +1 -1
  109. package/dist/stdin.d.ts +13 -0
  110. package/dist/stdin.js +55 -0
  111. package/dist/stdin.js.map +1 -0
  112. package/dist/style.d.ts +1 -1
  113. package/dist/tokenize.d.ts +3 -0
  114. package/dist/tokenize.js +5 -4
  115. package/dist/tokenize.js.map +1 -1
  116. package/dist/tools.d.ts +6 -3
  117. package/dist/tools.js +18 -11
  118. package/dist/tools.js.map +1 -1
  119. package/dist/update.d.ts +2 -1
  120. package/dist/update.js +3 -3
  121. package/dist/update.js.map +1 -1
  122. package/package.json +1 -1
@@ -3,11 +3,12 @@ import { UsageError } from "./errors.js";
3
3
  import { CONFIRM_FLAG, DRY_RUN_FLAG, FORCE_FLAG, HELP_FLAG, VERSION_FLAG, YES_FLAG, } from "./flags.js";
4
4
  import { commandLineRenaming } from "./invocation.js";
5
5
  import { PAGE_INPUT, selectedFields } from "./list.js";
6
+ import { STDIN_OPERAND } from "./stdin.js";
6
7
  import { closestFlag } from "./suggest.js";
7
8
  import { tokenize } from "./tokenize.js";
8
9
  import { INVALID_INPUT, invalidInputError, unknownOptionError } from "./usage.js";
9
10
  const NO_INPUT = z.object({});
10
- function knownFlags(spec) {
11
+ export function knownFlags(spec) {
11
12
  return [
12
13
  ...spec.options.map((field) => ({
13
14
  flag: field.label,
@@ -25,8 +26,12 @@ function unknownOptionsOf(words, candidates) {
25
26
  return { flag, suggestion: closestFlag(flag, candidates) };
26
27
  });
27
28
  }
28
- // A `--no-` switch turns its option off.
29
- function optionValue(field, raw) {
29
+ // A `--no-` switch turns its option off; a repeated scalar flag keeps its last value.
30
+ function optionValue(field, all) {
31
+ if (field.variadic) {
32
+ return variadicValue(field, (all ?? []).filter((value) => value !== true));
33
+ }
34
+ const raw = all?.[all.length - 1];
30
35
  return field.type === "boolean" && raw === true && field.label === `--no-${field.name}`
31
36
  ? false
32
37
  : raw;
@@ -34,19 +39,26 @@ function optionValue(field, raw) {
34
39
  // Strings that read as numbers are converted so authors can write `z.number()`; anything else
35
40
  // stays a string for Zod to reject with the caller's own value.
36
41
  function converted(field, raw) {
42
+ if (Array.isArray(raw)) {
43
+ return raw.map((element) => converted(field, element));
44
+ }
37
45
  if (field.type !== "number" || typeof raw !== "string" || raw.trim() === "") {
38
46
  return raw;
39
47
  }
40
48
  const number = Number(raw);
41
49
  return Number.isNaN(number) ? raw : number;
42
50
  }
51
+ // No values for an optional array leave it out, so its default applies.
52
+ function variadicValue(field, values) {
53
+ return values.length === 0 && !field.required ? undefined : values;
54
+ }
43
55
  function parse(schema, values) {
44
56
  const input = Object.fromEntries([...values]
45
57
  .filter(([, raw]) => raw !== undefined)
46
58
  .map(([field, raw]) => [field.key, converted(field, raw)]));
47
59
  return schema.safeParse(input);
48
60
  }
49
- function issueLines(result, values, howToPass, reported) {
61
+ function issueLines(result, values, { howToPass, arrayIssueLine, reported = [], fromStdin }) {
50
62
  if (result.success) {
51
63
  return [];
52
64
  }
@@ -59,11 +71,37 @@ function issueLines(result, values, howToPass, reported) {
59
71
  return [];
60
72
  }
61
73
  const raw = values.get(field);
62
- return raw === undefined
63
- ? [` ${field.label}: required, ${howToPass(field)}`]
74
+ if (raw === undefined) {
75
+ return [` ${field.label}: required, ${howToPass(field)}`];
76
+ }
77
+ // Text from stdin may be long, so it is named by where it came from instead of quoted.
78
+ if (field === fromStdin) {
79
+ return [` ${field.label} from stdin: ${issue.message}`];
80
+ }
81
+ return Array.isArray(raw)
82
+ ? [arrayIssueLine(field, raw, issue)]
64
83
  : [` ${field.label} ${JSON.stringify(raw)}: ${issue.message}`];
65
84
  });
66
85
  }
86
+ function flagValuesIssueLine(field, raw, issue) {
87
+ const [, element] = issue.path;
88
+ if (typeof element === "number") {
89
+ return ` ${field.label} ${JSON.stringify(raw[element])}: ${issue.message}`;
90
+ }
91
+ return raw.length === 0
92
+ ? ` ${field.label}: ${issue.message}, pass ${field.usage}`
93
+ : ` ${field.label} ${JSON.stringify(raw)}: ${issue.message}`;
94
+ }
95
+ // `first` is the 1-based position of the field's first operand on the command line.
96
+ function operandsIssueLine(field, raw, issue, first) {
97
+ const [, element] = issue.path;
98
+ if (typeof element === "number") {
99
+ return ` ${field.label} ${JSON.stringify(raw[element])} (argument ${first + element}): ${issue.message}`;
100
+ }
101
+ return raw.length === 0
102
+ ? ` ${field.label}: ${issue.message}, pass them as arguments from ${first}`
103
+ : ` ${field.label} ${JSON.stringify(raw)}: ${issue.message}`;
104
+ }
67
105
  function unknownLine({ flag, suggestion }) {
68
106
  return ` unknown option '${flag}'${suggestion === undefined ? "" : ` (did you mean ${suggestion}?)`}`;
69
107
  }
@@ -82,21 +120,50 @@ function invalidInput(commandLine, invocation, unknown, otherLines) {
82
120
  : `run \`${commandLine} --help\` to see the expected input`,
83
121
  });
84
122
  }
85
- function parseInput(spec, words, invocation) {
123
+ async function stdinTextOf(spec, operands, read) {
124
+ const index = spec.args.findIndex((field) => field.stdin);
125
+ const field = spec.args[index];
126
+ if (field === undefined || operands[index]?.value !== STDIN_OPERAND)
127
+ return undefined;
128
+ return { field, text: await read(field) };
129
+ }
130
+ async function parseInput(spec, words, invocation, readStdin) {
86
131
  const { command, args: argFields, options: optionFields } = spec;
87
132
  const pageFields = spec.list?.pageFields ?? [];
88
133
  const known = knownFlags(spec);
89
- const { operands, unknownOptions, values } = tokenize(words, known);
134
+ const { operands, unknownOptions, values, occurrences } = tokenize(words, known);
135
+ const stdin = await stdinTextOf(spec, operands, readStdin);
90
136
  if (values.get(CONFIRM_FLAG.flag) === true) {
91
137
  throw invalidInputError(spec.commandLine, `option '${CONFIRM_FLAG.usage}' argument missing`);
92
138
  }
93
139
  // A value option given without a value is collected as `true`.
94
- const missing = [...optionFields, ...pageFields].filter((field) => field.type !== "boolean" && values.get(field.label) === true);
95
- const argValues = new Map(argFields.map((field, index) => [field, operands[index]?.value]));
140
+ const missing = [...optionFields, ...pageFields].filter((field) => field.type !== "boolean" &&
141
+ (field.variadic
142
+ ? occurrences.get(field.label)?.includes(true)
143
+ : values.get(field.label) === true));
144
+ const argValue = (field, index) => {
145
+ if (field === stdin?.field)
146
+ return stdin.text;
147
+ if (!field.variadic)
148
+ return operands[index]?.value;
149
+ return variadicValue(field, operands
150
+ .slice(index)
151
+ .filter((operand) => !operand.afterUnknownOption)
152
+ .map((operand) => operand.value));
153
+ };
154
+ const argValues = new Map(argFields.map((field, index) => [field, argValue(field, index)]));
155
+ const extraOperands = argFields.some((field) => field.variadic)
156
+ ? []
157
+ : operands.slice(argFields.length);
96
158
  const valuesOf = (fields) => new Map(fields.map((field) => [
97
159
  field,
98
- missing.includes(field) ? undefined : optionValue(field, values.get(field.label)),
160
+ missing.includes(field) ? undefined : optionValue(field, occurrences.get(field.label)),
99
161
  ]));
162
+ const flagWording = {
163
+ howToPass: (field) => `pass ${field.usage}`,
164
+ arrayIssueLine: flagValuesIssueLine,
165
+ reported: missing,
166
+ };
100
167
  const optionValues = valuesOf(optionFields);
101
168
  const pageValues = valuesOf(pageFields);
102
169
  const args = parse(command.args ?? NO_INPUT, argValues);
@@ -105,14 +172,17 @@ function parseInput(spec, words, invocation) {
105
172
  const unknown = unknownOptionsOf(unknownOptions, candidateFlags(known));
106
173
  const otherLines = [
107
174
  ...missing.map((field) => ` ${field.label}: missing value, pass ${field.usage}`),
108
- ...operands
109
- .slice(argFields.length)
175
+ ...extraOperands
110
176
  // A word right after an unknown flag may be its value, so it isn't an extra arg.
111
177
  .filter((operand) => !operand.afterUnknownOption)
112
178
  .map((operand) => ` unexpected argument ${JSON.stringify(operand.value)}`),
113
- ...issueLines(args, argValues, (field) => `pass it as argument ${argFields.indexOf(field) + 1}`, []),
114
- ...issueLines(options, optionValues, (field) => `pass ${field.usage}`, missing),
115
- ...issueLines(page, pageValues, (field) => `pass ${field.usage}`, missing),
179
+ ...issueLines(args, argValues, {
180
+ howToPass: (field) => `pass it as argument ${argFields.indexOf(field) + 1}`,
181
+ arrayIssueLine: (field, raw, issue) => operandsIssueLine(field, raw, issue, argFields.indexOf(field) + 1),
182
+ fromStdin: stdin?.field,
183
+ }),
184
+ ...issueLines(options, optionValues, flagWording),
185
+ ...issueLines(page, pageValues, flagWording),
116
186
  ];
117
187
  if (unknown.length === 0 &&
118
188
  otherLines.length === 0 &&
@@ -127,9 +197,12 @@ function parseInput(spec, words, invocation) {
127
197
  }
128
198
  throw invalidInput(spec.commandLine, invocation, unknown, otherLines);
129
199
  }
130
- /** The validated input and Standard flag values of the routed Command, or one usage error. */
131
- export function parseCommand({ spec, words, json }, invocation) {
132
- const { input, page, values } = parseInput(spec, words, invocation);
200
+ /**
201
+ * The validated input and Standard flag values of the routed Command, or one usage error; the arg
202
+ * given `-` takes its text from `readStdin`.
203
+ */
204
+ export async function parseCommand({ spec, words, json }, invocation, readStdin) {
205
+ const { input, page, values } = await parseInput(spec, words, invocation, readStdin);
133
206
  const confirm = values.get(CONFIRM_FLAG.flag);
134
207
  return {
135
208
  input,
@@ -1 +1 @@
1
- {"version":3,"file":"parse-input.js","sourceRoot":"","sources":["../src/parse-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse-input.js","sourceRoot":"","sources":["../src/parse-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from "./define.js";
2
+ export type PlannedCommand = Extract<Command, {
3
+ readonly effect: "write" | "destructive";
4
+ }>;
5
+ /** Whether `command` changes something through a Plan: a write or destructive Command. */
6
+ export declare function hasPlan(command: Command): command is PlannedCommand;
@@ -0,0 +1,5 @@
1
+ /** Whether `command` changes something through a Plan: a write or destructive Command. */
2
+ export function hasPlan(command) {
3
+ return command.effect === "write" || command.effect === "destructive";
4
+ }
5
+ //# sourceMappingURL=planned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planned.js","sourceRoot":"","sources":["../src/planned.ts"],"names":[],"mappings":"AAIA,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC;AACxE,CAAC"}
package/dist/project.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Project, ProjectFile } from "./define.js";
1
+ import type { Project, ProjectFile } from "./context.js";
2
2
  export declare const PROJECT_INVALID = "PROJECT_INVALID";
3
3
  /** The nearest Project file at or above `cwd`, parsed by its schema; undefined when there is none. */
4
4
  export declare function projectOf<Settings>(projectFile: ProjectFile<Settings>, cwd: string): Project<Settings> | undefined;
package/dist/route.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { CommandSpec, SpecNode } from "./command-spec.js";
1
+ import { type CommandSpec, type SpecNode } from "./command-spec.js";
2
2
  import type { UsageError } from "./errors.js";
3
3
  import { type Invocation } from "./invocation.js";
4
4
  /** Where the command line leads; `json` is set when the caller passed `--json` before any `--`. */
package/dist/route.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { visibleCommands, } from "./command-spec.js";
1
2
  import { HELP_FLAG, HELP_SHORT, JSON_FLAG, VERSION_FLAG } from "./flags.js";
2
3
  import { END_OF_OPTIONS } from "./invocation.js";
3
4
  import { closestFlags, closestNames } from "./suggest.js";
@@ -54,7 +55,7 @@ function walk(node, words, json, invocation) {
54
55
  return unknownCommand(node, first, json);
55
56
  }
56
57
  function unknownCommand(group, name, json) {
57
- const suggestions = closestNames(name, Object.keys(group.commands));
58
+ const suggestions = closestNames(name, Object.keys(visibleCommands(group)));
58
59
  return {
59
60
  kind: "usage error",
60
61
  error: unknownCommandError(group.commandLine, name, suggestions),
package/dist/route.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAmB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErE,kFAAkF;AAClF,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAuB9D,SAAS,SAAS,CAAC,KAAwB;IACzC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1C,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,KAAwB;IACzC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,OAAO,CAAC,KAAgB,EAAE,IAAY;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED,4EAA4E;AAC5E,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,IAAI,CACX,IAAc,EACd,KAAwB,EACxB,IAAa,EACb,UAAsB;IAEtB,MAAM,IAAI,GAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAChF,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,yEAAyE;IACzE,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB,EAAE,IAAY,EAAE,IAAa;IACnE,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC;QAChE,IAAI,EAAE,KAAK;QACX,IAAI;KACL,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,KAAK,CAAC,IAAc,EAAE,UAAsB;IAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;IAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC"}
package/dist/run-cli.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import { type Clock } from "./clock.js";
2
- import type { Cli, Env, NoPorts } from "./define.js";
2
+ import type { Env } from "./context.js";
3
+ import type { Cli, NoPorts } from "./define.js";
3
4
  import { type Files } from "./files.js";
4
5
  import { type RunResult } from "./output.js";
5
6
  import { type Spawn } from "./spawn.js";
7
+ import { type StdinSource } from "./stdin.js";
6
8
  export interface RunOptions<Ports = NoPorts> {
7
9
  readonly env: Env;
8
10
  readonly cwd: string;
@@ -17,6 +19,11 @@ export interface RunOptions<Ports = NoPorts> {
17
19
  * global install. Absent, the CLI counts as run from source.
18
20
  */
19
21
  readonly bin?: string;
22
+ /**
23
+ * The Node running the CLI, as `process.execPath`; `doctor` and `update` run the npm beside it,
24
+ * which installs into that Node. Absent, or with no npm beside it, they run the npm on PATH.
25
+ */
26
+ readonly node?: string;
20
27
  /** Replaces the ports the CLI's factory builds, for a test. */
21
28
  readonly ports?: Ports;
22
29
  /** Replaces the real clock, for a test that runs deadlines and waits instantly. */
@@ -25,6 +32,13 @@ export interface RunOptions<Ports = NoPorts> {
25
32
  readonly files?: Files;
26
33
  /** Replaces the real child processes, for a test of a tool that fails. */
27
34
  readonly spawn?: Spawn;
35
+ /** What an arg given `-` reads; absent, it reads an empty text. */
36
+ readonly stdin?: StdinSource;
37
+ /**
38
+ * Replaces `process.platform` in picking the wording of hints, such as `PERMISSION_DENIED`'s and
39
+ * how to end stdin, for a test of the Windows wording.
40
+ */
41
+ readonly platform?: NodeJS.Platform;
28
42
  }
29
43
  /** Where output that cannot wait for the run's end is written as it happens. */
30
44
  export interface Writers {
@@ -32,4 +46,4 @@ export interface Writers {
32
46
  stderr(text: string): void;
33
47
  }
34
48
  export declare function runCli<Ports, Settings>(cli: Cli<Ports, Settings>, argv: readonly string[], options: RunOptions<NoInfer<Ports>>): Promise<RunResult>;
35
- export declare function runWithProgress(cli: Cli, argv: readonly string[], options: RunOptions<unknown>, write: Writers): Promise<RunResult>;
49
+ export declare function runWithProgress(cli: Cli, argv: readonly string[], options: RunOptions<unknown>, write: Writers, stopNotice?: string): Promise<RunResult>;
package/dist/run-cli.js CHANGED
@@ -1,90 +1,95 @@
1
- import { resolve } from "node:path";
2
1
  import { isAgent } from "./agent.js";
3
2
  import { builtInCommands } from "./built-ins.js";
4
3
  import { poll, realClock } from "./clock.js";
5
4
  import { commandSpec, groupSpec } from "./command-spec.js";
6
- import { classifyErrno } from "./errno.js";
5
+ import { fileErrorOf } from "./errno.js";
7
6
  import { deliveredOutcome, execute } from "./execute.js";
8
- import { realFiles } from "./files.js";
7
+ import { classifiedFiles, realFiles } from "./files.js";
9
8
  import { RunControl } from "./interrupts.js";
10
9
  import { commandLineOf } from "./invocation.js";
11
- import { commandResult, errorResult, helpResult, STOPPED_RESULT, startedOutput, textHelp, versionResult, } from "./output.js";
10
+ import { checkOperator } from "./operator.js";
11
+ import { commandResult, errorResult, helpResult, progressLine, STOPPED_RESULT, startedOutput, textHelp, versionResult, } from "./output.js";
12
+ import { outputsGuard } from "./outputs.js";
12
13
  import { packageRootOf } from "./package-root.js";
13
- import { parseCommand } from "./parse-input.js";
14
+ import { knownFlags, parseCommand } from "./parse-input.js";
14
15
  import { projectOf } from "./project.js";
15
16
  import { route } from "./route.js";
16
17
  import { secretOf } from "./secrets.js";
17
18
  import { contextSpawn, realSpawn } from "./spawn.js";
18
19
  import { spillTo } from "./spill.js";
20
+ import { isTerminal, readingLine, readStdin } from "./stdin.js";
19
21
  import { styleFor } from "./style.js";
20
- /** `files` resolving paths against `cwd`, its failures classified by errno. */
21
- function classifiedFiles(files, base, callerLine) {
22
- return {
23
- exists: async (path) => {
24
- const target = resolve(base.cwd, path);
25
- try {
26
- return await files.exists(target);
27
- }
28
- catch (error) {
29
- throw classifyErrno(error, { path: target, callerLine, env: base.env });
30
- }
31
- },
32
- write: async (path, data) => {
33
- const target = resolve(base.cwd, path);
34
- try {
35
- await files.write(target, data);
36
- }
37
- catch (error) {
38
- throw classifyErrno(error, { path: target, callerLine, env: base.env });
39
- }
40
- },
41
- };
22
+ function stdinNeverEndedHint(callerLine) {
23
+ return `stdin never ended: pipe the text into \`${callerLine}\`, or redirect a file into it`;
42
24
  }
43
- async function runCommand(routed, { base, writeStdout, signal, format: baseFormat, ports, clock, files, spawn, projectFile }) {
25
+ async function runCommand(routed, { base, writeStdout, signal, format: baseFormat, ports, clock, files, spawn, projectFile, stdin, platform, }) {
44
26
  const { command, commandLine } = routed.spec;
45
- const format = { ...baseFormat, json: routed.json };
46
- const { invocation } = format;
27
+ const invocation = { ...baseFormat.invocation, flags: knownFlags(routed.spec) };
28
+ const format = { ...baseFormat, json: routed.json, invocation };
29
+ const typedLine = (change) => commandLineOf(invocation, change);
30
+ // Set once the input is parsed; a deadline before that can only have cut off the stdin read.
31
+ let resumeHint;
32
+ // Created before the input is parsed, so Ctrl-C and the run deadline also bound the stdin read.
33
+ const control = new RunControl({
34
+ commandLine,
35
+ outer: signal,
36
+ clock,
37
+ progress: base.progress,
38
+ runDeadline: command.deadline === undefined
39
+ ? undefined
40
+ : {
41
+ ms: command.deadline.ms,
42
+ hint: () => resumeHint ?? stdinNeverEndedHint(typedLine()),
43
+ },
44
+ });
47
45
  let parsed;
48
46
  let project;
49
47
  try {
50
- parsed = parseCommand(routed, invocation);
48
+ checkOperator(routed.spec, base.env, typedLine());
49
+ parsed = await parseCommand(routed, invocation, (field) => {
50
+ if (isTerminal(stdin))
51
+ base.progress(readingLine(field.name, platform));
52
+ return readStdin(stdin, control.signal);
53
+ });
51
54
  project = projectFile === undefined ? undefined : projectOf(projectFile, base.cwd);
52
55
  }
53
56
  catch (error) {
57
+ control.close();
54
58
  return errorResult(error, format);
55
59
  }
56
60
  const { input, flags } = parsed;
57
- const control = new RunControl({
58
- commandLine,
59
- outer: signal,
60
- clock,
61
- progress: base.progress,
62
- runDeadline: command.deadline === undefined
63
- ? undefined
64
- : { ms: command.deadline.ms, hint: command.deadline.resume(input) },
65
- });
61
+ resumeHint = command.deadline?.resume(input, typedLine);
66
62
  let delivered;
67
- const callerLine = commandLineOf(invocation);
68
- const classified = classifiedFiles(files, base, callerLine);
63
+ const { fileError } = base;
64
+ const outputs = outputsGuard(classifiedFiles(files, { cwd: base.cwd, fileError }), base.cwd);
69
65
  const spill = spillTo({
70
66
  cliName: format.cliName,
71
67
  commandName: command.name,
72
68
  env: base.env,
73
69
  clock,
74
- files: classified,
75
- callerLine,
70
+ files: outputs.files,
71
+ fileError,
76
72
  });
77
- const ctx = {
73
+ const portsBase = {
78
74
  ...base,
79
75
  signal: control.signal,
76
+ clock,
77
+ files: outputs.files,
78
+ spawn: contextSpawn(spawn, { cwd: base.cwd, env: base.env, signal: control.signal, progress: base.progress }, fileError),
79
+ };
80
+ const builtPorts = once(() => ports(portsBase));
81
+ const ctx = {
82
+ ...portsBase,
80
83
  deadline: (ms) => control.deadline(ms),
81
84
  runToEnd: (name, work) => control.runToEnd(name, work),
82
- ports: ports(),
83
- clock,
84
- files: classified,
85
- spawn: contextSpawn(spawn, { cwd: base.cwd, env: base.env, signal: control.signal }, callerLine),
85
+ // Built on first read, so a factory that throws fails only what needs the ports, never `doctor`.
86
+ get ports() {
87
+ return builtPorts();
88
+ },
86
89
  project,
87
- poll: (check, { intervalMs }) => poll(clock, check, intervalMs, control.signal),
90
+ force: flags.force,
91
+ commandLine: typedLine,
92
+ poll: (check, { intervalMs, signal: stop }) => poll(clock, check, intervalMs, stop === undefined ? control.signal : AbortSignal.any([control.signal, stop])),
88
93
  deliver: (data) => {
89
94
  delivered = deliveredOutcome(command, data);
90
95
  },
@@ -96,7 +101,6 @@ async function runCommand(routed, { base, writeStdout, signal, format: baseForma
96
101
  dryRun: flags.dryRun,
97
102
  confirm: flags.confirm,
98
103
  yes: flags.yes,
99
- force: flags.force,
100
104
  page: flags.page,
101
105
  invocation,
102
106
  commandLine,
@@ -104,6 +108,8 @@ async function runCommand(routed, { base, writeStdout, signal, format: baseForma
104
108
  writeStdout(await startedOutput(outcome, format, spill));
105
109
  served = true;
106
110
  },
111
+ files,
112
+ guardOutputs: outputs.guard,
107
113
  }));
108
114
  settled = { ok: true, outcome };
109
115
  }
@@ -119,6 +125,23 @@ async function runCommand(routed, { base, writeStdout, signal, format: baseForma
119
125
  }
120
126
  return commandResult(settled, { ...format, fields: flags.fields }, spill);
121
127
  }
128
+ /** `build` runs on the first call; later calls give its value or throw its error again. */
129
+ function once(build) {
130
+ let outcome;
131
+ return () => {
132
+ if (outcome === undefined) {
133
+ try {
134
+ outcome = { ok: true, value: build() };
135
+ }
136
+ catch (error) {
137
+ outcome = { ok: false, error };
138
+ }
139
+ }
140
+ if (outcome.ok)
141
+ return outcome.value;
142
+ throw outcome.error;
143
+ };
144
+ }
122
145
  export async function runCli(cli, argv, options) {
123
146
  const stdout = [];
124
147
  const stderr = [];
@@ -132,28 +155,55 @@ export async function runCli(cli, argv, options) {
132
155
  stderr: stderr.join("") + result.stderr,
133
156
  };
134
157
  }
158
+ function selfOf(name, bin) {
159
+ return bin === undefined ? [name] : [process.execPath, ...process.execArgv, bin];
160
+ }
135
161
  function portsOf(cli, replacement) {
136
162
  if (replacement !== undefined)
137
163
  return () => replacement;
138
164
  return cli.ports ?? (() => ({}));
139
165
  }
166
+ // Without --json, the leading newline moves the notice off the terminal's echoed ^C.
167
+ function stopLine(notice, json) {
168
+ return json ? progressLine(notice, true) : `\n${notice}\n`;
169
+ }
170
+ /** Calls `onStop` if `signal` aborts while `work` runs. */
171
+ async function whileStopping(signal, onStop, work) {
172
+ if (signal === undefined || onStop === undefined)
173
+ return work();
174
+ signal.addEventListener("abort", onStop, { once: true });
175
+ try {
176
+ return await work();
177
+ }
178
+ finally {
179
+ signal.removeEventListener("abort", onStop);
180
+ }
181
+ }
140
182
  // Progress is written as it happens: a Coding agent kills a process that stays silent too long.
141
183
  // A serve Command's data is too, since the caller uses it while the Command runs.
142
- export async function runWithProgress(cli, argv, options, write) {
184
+ export async function runWithProgress(cli, argv, options, write, stopNotice) {
143
185
  const format = {
144
186
  cliName: cli.name,
145
187
  env: options.env,
146
188
  style: styleFor(options.env, options.stdoutIsTTY === true),
147
- invocation: { cliName: cli.name, argv },
189
+ invocation: { cliName: cli.name, argv, flags: [] },
148
190
  json: false,
149
191
  errors: cli.errors ?? {},
150
192
  stop: options.signal,
151
193
  };
152
- const builtIns = cli.commands === undefined ? {} : builtInCommands(cli, options.bin);
194
+ const builtIns = cli.commands === undefined
195
+ ? {}
196
+ : builtInCommands(cli, { bin: options.bin, node: options.node });
153
197
  const root = cli.commands === undefined
154
198
  ? commandSpec(cli.name, cli.command)
155
199
  : groupSpec(cli.name, { ...cli.commands, ...builtIns });
156
200
  const routed = route(root, format.invocation);
201
+ const platform = options.platform ?? process.platform;
202
+ const fileError = fileErrorOf({
203
+ callerLine: commandLineOf(format.invocation),
204
+ env: options.env,
205
+ platform,
206
+ });
157
207
  const misused = (node) => isAgent(options.env)
158
208
  ? { ...format, usageHelp: textHelp(node, root, cli, format.style) }
159
209
  : format;
@@ -165,13 +215,19 @@ export async function runWithProgress(cli, argv, options, write) {
165
215
  case "usage error":
166
216
  return errorResult(routed.error, { ...misused(routed.node), json: routed.json });
167
217
  case "command":
168
- return runCommand(routed, {
218
+ return whileStopping(options.signal, stopNotice === undefined
219
+ ? undefined
220
+ : () => write.stderr(stopLine(stopNotice, routed.json)), () => runCommand(routed, {
169
221
  base: {
170
222
  cwd: options.cwd,
171
223
  env: options.env,
172
224
  packageRoot: packageRootOf(options.bin, options.cwd),
173
- progress: (message) => write.stderr(`${message}\n`),
174
- secret: (name) => secretOf(cli.name, options.env, name),
225
+ progress: (message) => write.stderr(progressLine(message, routed.json)),
226
+ secret: (name) => secretOf({ cliName: cli.name, env: options.env, fileError }, name),
227
+ fileError,
228
+ version: cli.version,
229
+ build: cli.build,
230
+ self: selfOf(cli.name, options.bin),
175
231
  },
176
232
  writeStdout: (text) => write.stdout(text),
177
233
  signal: options.signal,
@@ -184,7 +240,9 @@ export async function runWithProgress(cli, argv, options, write) {
184
240
  projectFile: Object.values(builtIns).includes(routed.spec.command)
185
241
  ? undefined
186
242
  : cli.project,
187
- });
243
+ stdin: options.stdin ?? "",
244
+ platform,
245
+ }));
188
246
  }
189
247
  }
190
248
  //# sourceMappingURL=run-cli.js.map