@duyquangnvx/agent-cli 0.16.0 → 0.18.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 (252) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +2 -2
  3. package/agents-section.md +5 -0
  4. package/dist/agent-cli.d.ts +69 -11
  5. package/dist/agent-cli.js +69 -10
  6. package/dist/agent-cli.js.map +1 -1
  7. package/dist/built-ins/agents-md.d.ts +9 -9
  8. package/dist/built-ins/agents-md.js +8 -8
  9. package/dist/built-ins/agents-md.js.map +1 -1
  10. package/dist/built-ins/doctor-rows.js +5 -3
  11. package/dist/built-ins/doctor-rows.js.map +1 -1
  12. package/dist/built-ins/doctor.d.ts +1 -1
  13. package/dist/built-ins/doctor.js +16 -15
  14. package/dist/built-ins/doctor.js.map +1 -1
  15. package/dist/built-ins/install/dependency.js +1 -1
  16. package/dist/built-ins/install/dependency.js.map +1 -1
  17. package/dist/built-ins/install/global-npm.js +6 -4
  18. package/dist/built-ins/install/global-npm.js.map +1 -1
  19. package/dist/built-ins/npm.d.ts +3 -2
  20. package/dist/built-ins/npm.js +16 -9
  21. package/dist/built-ins/npm.js.map +1 -1
  22. package/dist/{project-root.js → built-ins/project-root.js} +1 -1
  23. package/dist/built-ins/project-root.js.map +1 -0
  24. package/dist/built-ins/skill/hub.d.ts +3 -2
  25. package/dist/built-ins/skill/hub.js +43 -16
  26. package/dist/built-ins/skill/hub.js.map +1 -1
  27. package/dist/built-ins/skill/install-command.d.ts +3 -4
  28. package/dist/built-ins/skill/install-command.js +20 -21
  29. package/dist/built-ins/skill/install-command.js.map +1 -1
  30. package/dist/built-ins/skill/packaged.js +5 -2
  31. package/dist/built-ins/skill/packaged.js.map +1 -1
  32. package/dist/built-ins/skill/skill.d.ts +5 -2
  33. package/dist/built-ins/skill/skill.js +1 -1
  34. package/dist/built-ins/skill/skill.js.map +1 -1
  35. package/dist/built-ins/update.d.ts +1 -1
  36. package/dist/built-ins/update.js +4 -9
  37. package/dist/built-ins/update.js.map +1 -1
  38. package/dist/check-examples.d.ts +6 -0
  39. package/dist/check-examples.js +53 -0
  40. package/dist/check-examples.js.map +1 -0
  41. package/dist/check-next-steps.d.ts +10 -0
  42. package/dist/check-next-steps.js +47 -0
  43. package/dist/check-next-steps.js.map +1 -0
  44. package/dist/command-errors.d.ts +8 -0
  45. package/dist/command-errors.js +25 -0
  46. package/dist/command-errors.js.map +1 -0
  47. package/dist/{flags.d.ts → command-line/flags.d.ts} +7 -4
  48. package/dist/{flags.js → command-line/flags.js} +8 -10
  49. package/dist/command-line/flags.js.map +1 -0
  50. package/dist/{input.d.ts → command-line/input.d.ts} +1 -1
  51. package/dist/{input.js → command-line/input.js} +1 -1
  52. package/dist/command-line/input.js.map +1 -0
  53. package/dist/{invocation.d.ts → command-line/invocation.d.ts} +6 -3
  54. package/dist/{invocation.js → command-line/invocation.js} +9 -5
  55. package/dist/command-line/invocation.js.map +1 -0
  56. package/dist/{parse-input.d.ts → command-line/parse-input.d.ts} +2 -2
  57. package/dist/{parse-input.js → command-line/parse-input.js} +3 -3
  58. package/dist/command-line/parse-input.js.map +1 -0
  59. package/dist/command-line/route-line.d.ts +15 -0
  60. package/dist/command-line/route-line.js +18 -0
  61. package/dist/command-line/route-line.js.map +1 -0
  62. package/dist/{route.d.ts → command-line/route.d.ts} +2 -2
  63. package/dist/{route.js → command-line/route.js} +1 -1
  64. package/dist/command-line/route.js.map +1 -0
  65. package/dist/command-line/shell-words.d.ts +12 -0
  66. package/dist/command-line/shell-words.js +83 -0
  67. package/dist/command-line/shell-words.js.map +1 -0
  68. package/dist/command-line/suggest.js.map +1 -0
  69. package/dist/command-line/tokenize.js.map +1 -0
  70. package/dist/{usage.d.ts → command-line/usage.d.ts} +1 -1
  71. package/dist/{usage.js → command-line/usage.js} +2 -2
  72. package/dist/command-line/usage.js.map +1 -0
  73. package/dist/command-spec.d.ts +13 -4
  74. package/dist/command-spec.js +22 -11
  75. package/dist/command-spec.js.map +1 -1
  76. package/dist/{agent.d.ts → context/agent.d.ts} +1 -1
  77. package/dist/context/agent.js.map +1 -0
  78. package/dist/{confirm.d.ts → context/confirm.d.ts} +3 -3
  79. package/dist/{confirm.js → context/confirm.js} +9 -11
  80. package/dist/context/confirm.js.map +1 -0
  81. package/dist/{cost.d.ts → context/cost.d.ts} +3 -3
  82. package/dist/context/cost.js +16 -0
  83. package/dist/context/cost.js.map +1 -0
  84. package/dist/context/declared.d.ts +8 -0
  85. package/dist/context/declared.js +10 -0
  86. package/dist/context/declared.js.map +1 -0
  87. package/dist/{errno.d.ts → context/errno.d.ts} +4 -3
  88. package/dist/{errno.js → context/errno.js} +14 -7
  89. package/dist/context/errno.js.map +1 -0
  90. package/dist/{files.js → context/files.js} +1 -1
  91. package/dist/context/files.js.map +1 -0
  92. package/dist/{interrupts.d.ts → context/interrupts.d.ts} +14 -10
  93. package/dist/{interrupts.js → context/interrupts.js} +30 -27
  94. package/dist/context/interrupts.js.map +1 -0
  95. package/dist/{operator.d.ts → context/operator.d.ts} +4 -3
  96. package/dist/{operator.js → context/operator.js} +4 -3
  97. package/dist/context/operator.js.map +1 -0
  98. package/dist/{outputs.d.ts → context/outputs.d.ts} +6 -5
  99. package/dist/{outputs.js → context/outputs.js} +10 -9
  100. package/dist/context/outputs.js.map +1 -0
  101. package/dist/{project.d.ts → context/project.d.ts} +4 -3
  102. package/dist/{project.js → context/project.js} +8 -7
  103. package/dist/context/project.js.map +1 -0
  104. package/dist/{secrets.d.ts → context/secrets.d.ts} +8 -1
  105. package/dist/context/secrets.js +85 -0
  106. package/dist/context/secrets.js.map +1 -0
  107. package/dist/{side-task.d.ts → context/side-task.d.ts} +2 -2
  108. package/dist/{side-task.js → context/side-task.js} +1 -1
  109. package/dist/context/side-task.js.map +1 -0
  110. package/dist/{spawn.d.ts → context/spawn.d.ts} +4 -3
  111. package/dist/{spawn.js → context/spawn.js} +7 -6
  112. package/dist/context/spawn.js.map +1 -0
  113. package/dist/{spill.d.ts → context/spill.d.ts} +4 -3
  114. package/dist/{spill.js → context/spill.js} +4 -4
  115. package/dist/context/spill.js.map +1 -0
  116. package/dist/{stdin.d.ts → context/stdin.d.ts} +2 -2
  117. package/dist/{stdin.js → context/stdin.js} +2 -2
  118. package/dist/context/stdin.js.map +1 -0
  119. package/dist/{tools.d.ts → context/tools.d.ts} +4 -3
  120. package/dist/{tools.js → context/tools.js} +8 -10
  121. package/dist/context/tools.js.map +1 -0
  122. package/dist/context.d.ts +51 -27
  123. package/dist/define-command.d.ts +47 -0
  124. package/dist/define-command.js +25 -0
  125. package/dist/define-command.js.map +1 -0
  126. package/dist/define.d.ts +81 -61
  127. package/dist/define.js +0 -14
  128. package/dist/define.js.map +1 -1
  129. package/dist/error-table.d.ts +9 -6
  130. package/dist/error-table.js +6 -6
  131. package/dist/error-table.js.map +1 -1
  132. package/dist/errors.d.ts +15 -1
  133. package/dist/errors.js +24 -6
  134. package/dist/errors.js.map +1 -1
  135. package/dist/execute.d.ts +8 -7
  136. package/dist/execute.js +52 -23
  137. package/dist/execute.js.map +1 -1
  138. package/dist/exit-classes.d.ts +1 -2
  139. package/dist/exit-classes.js +41 -48
  140. package/dist/exit-classes.js.map +1 -1
  141. package/dist/help-json.d.ts +4 -3
  142. package/dist/help-json.js +33 -11
  143. package/dist/help-json.js.map +1 -1
  144. package/dist/help.js +1 -0
  145. package/dist/help.js.map +1 -1
  146. package/dist/index.d.ts +19 -26
  147. package/dist/index.js +6 -18
  148. package/dist/index.js.map +1 -1
  149. package/dist/list.d.ts +6 -5
  150. package/dist/list.js +17 -11
  151. package/dist/list.js.map +1 -1
  152. package/dist/next-step.d.ts +23 -0
  153. package/dist/next-step.js +20 -0
  154. package/dist/next-step.js.map +1 -0
  155. package/dist/output.d.ts +11 -5
  156. package/dist/output.js +25 -11
  157. package/dist/output.js.map +1 -1
  158. package/dist/root-spec.d.ts +5 -0
  159. package/dist/root-spec.js +15 -0
  160. package/dist/root-spec.js.map +1 -0
  161. package/dist/run-cli.d.ts +2 -2
  162. package/dist/run-cli.js +12 -11
  163. package/dist/run-cli.js.map +1 -1
  164. package/dist/run-command.d.ts +4 -4
  165. package/dist/run-command.js +66 -37
  166. package/dist/run-command.js.map +1 -1
  167. package/dist/run-options.d.ts +11 -4
  168. package/dist/run-process.js +22 -7
  169. package/dist/run-process.js.map +1 -1
  170. package/dist/runtime-codes.d.ts +33 -0
  171. package/dist/runtime-codes.js +50 -0
  172. package/dist/runtime-codes.js.map +1 -0
  173. package/dist/style.js +1 -1
  174. package/dist/style.js.map +1 -1
  175. package/dist/testing.d.ts +27 -0
  176. package/dist/testing.js +66 -0
  177. package/dist/testing.js.map +1 -0
  178. package/dist/version.d.ts +4 -1
  179. package/dist/version.js +6 -1
  180. package/dist/version.js.map +1 -1
  181. package/docs/README.md +51 -0
  182. package/docs/example/archive.test.ts +280 -0
  183. package/docs/example/archive.ts +160 -0
  184. package/docs/example/bin.test.ts +118 -0
  185. package/docs/example/bin.ts +5 -0
  186. package/docs/example/bundle.test.ts +57 -0
  187. package/docs/example/bundle.ts +57 -0
  188. package/docs/example/cli.test.ts +428 -0
  189. package/docs/example/cli.ts +191 -0
  190. package/docs/example/commit.test.ts +78 -0
  191. package/docs/example/commit.ts +26 -0
  192. package/docs/example/define.ts +16 -0
  193. package/docs/example/errors.ts +17 -0
  194. package/docs/example/export.test.ts +64 -0
  195. package/docs/example/export.ts +32 -0
  196. package/docs/example/fake-ports.ts +14 -0
  197. package/docs/example/folder.ts +48 -0
  198. package/docs/example/import.test.ts +53 -0
  199. package/docs/example/import.ts +50 -0
  200. package/docs/example/package.json +21 -0
  201. package/docs/example/ports.ts +105 -0
  202. package/docs/example/serve.test.ts +49 -0
  203. package/docs/example/serve.ts +40 -0
  204. package/docs/example/store.ts +62 -0
  205. package/docs/example/tsdown.config.ts +33 -0
  206. package/docs/getting-started.md +19 -0
  207. package/docs/guides/commands.md +35 -0
  208. package/docs/guides/doctor.md +52 -0
  209. package/docs/guides/effects-and-plans.md +44 -0
  210. package/docs/guides/errors.md +57 -0
  211. package/docs/guides/lists.md +18 -0
  212. package/docs/guides/local-state.md +28 -0
  213. package/docs/guides/long-runs.md +109 -0
  214. package/docs/guides/remote-services.md +124 -0
  215. package/docs/guides/shipping.md +61 -0
  216. package/docs/guides/testing.md +69 -0
  217. package/docs/principles.md +39 -0
  218. package/docs/reference.md +25 -0
  219. package/package.json +12 -1
  220. package/dist/agent.js.map +0 -1
  221. package/dist/confirm.js.map +0 -1
  222. package/dist/cost.js +0 -16
  223. package/dist/cost.js.map +0 -1
  224. package/dist/errno.js.map +0 -1
  225. package/dist/files.js.map +0 -1
  226. package/dist/flags.js.map +0 -1
  227. package/dist/input.js.map +0 -1
  228. package/dist/interrupts.js.map +0 -1
  229. package/dist/invocation.js.map +0 -1
  230. package/dist/operator.js.map +0 -1
  231. package/dist/outputs.js.map +0 -1
  232. package/dist/parse-input.js.map +0 -1
  233. package/dist/project-root.js.map +0 -1
  234. package/dist/project.js.map +0 -1
  235. package/dist/route.js.map +0 -1
  236. package/dist/secrets.js +0 -31
  237. package/dist/secrets.js.map +0 -1
  238. package/dist/side-task.js.map +0 -1
  239. package/dist/spawn.js.map +0 -1
  240. package/dist/spill.js.map +0 -1
  241. package/dist/stdin.js.map +0 -1
  242. package/dist/suggest.js.map +0 -1
  243. package/dist/tokenize.js.map +0 -1
  244. package/dist/tools.js.map +0 -1
  245. package/dist/usage.js.map +0 -1
  246. /package/dist/{project-root.d.ts → built-ins/project-root.d.ts} +0 -0
  247. /package/dist/{suggest.d.ts → command-line/suggest.d.ts} +0 -0
  248. /package/dist/{suggest.js → command-line/suggest.js} +0 -0
  249. /package/dist/{tokenize.d.ts → command-line/tokenize.d.ts} +0 -0
  250. /package/dist/{tokenize.js → command-line/tokenize.js} +0 -0
  251. /package/dist/{agent.js → context/agent.js} +0 -0
  252. /package/dist/{files.d.ts → context/files.d.ts} +0 -0
@@ -1,29 +1,32 @@
1
- import { after } from "./clock.js";
2
- import { CliError, causesOf, errorsOf } from "./errors.js";
1
+ import { after } from "../clock.js";
2
+ import { CliError, causesOf, errorsOf } from "../errors.js";
3
3
  export const INTERRUPTED = "INTERRUPTED";
4
4
  export const DEADLINE_EXCEEDED = "DEADLINE_EXCEEDED";
5
5
  /** How long an interrupted Command may take to settle before the run ends without it. */
6
6
  export const GRACE_MS = 3000;
7
7
  const GRACE_OVER = Symbol("grace over");
8
8
  // Ctrl-C is often the operator stopping it on purpose, and a tool timeout stops a plain rerun again.
9
- function interruptedError(callerLine) {
9
+ function interruptedError(rerun) {
10
10
  return new CliError({
11
11
  code: INTERRUPTED,
12
12
  message: "interrupted before it finished",
13
- hint: `to finish it, run \`${callerLine}\` again, unless it was stopped on purpose; if a tool timeout stopped it, give it longer`,
13
+ hint: "to finish it, run the Next step, unless it was stopped on purpose; if a tool timeout stopped it, give it longer",
14
+ next: [rerun],
14
15
  });
15
16
  }
16
- // A timeout bounds a billed call, which may have been billed before it ran out.
17
- function waitHint(callerLine, bound) {
18
- return bound === "timeout"
19
- ? `the call may have been billed: ask your user before running \`${callerLine}\` again`
20
- : `run \`${callerLine}\` again later, when the service it waits on may answer faster`;
17
+ // The word an error names a bound by: one that ignores stops bounds a single call, a timeout.
18
+ const BOUND_WORDS = { deadline: "deadline", ignoreStop: "timeout" };
19
+ // A deadline that ignores stops bounds a billed call, which may have been billed before it ran out.
20
+ function waitHint(bound) {
21
+ return bound === "ignoreStop"
22
+ ? "the call may have been billed: ask your user before running the Next step"
23
+ : "run the Next step later, when the service it waits on may answer faster";
21
24
  }
22
- function deadlineError(commandLine, ms, hint, bound = "deadline") {
25
+ function deadlineError(commandLine, ms, advice, bound = "deadline") {
23
26
  return new CliError({
24
27
  code: DEADLINE_EXCEEDED,
25
- message: `${commandLine} ran past its ${ms} ms ${bound}`,
26
- hint,
28
+ message: `${commandLine} ran past its ${ms} ms ${BOUND_WORDS[bound]}`,
29
+ ...advice,
27
30
  });
28
31
  }
29
32
  /** One Command run's cancellation: its signal, its deadlines and the steps it must finish. */
@@ -31,24 +34,24 @@ export class RunControl {
31
34
  signal;
32
35
  #controller = new AbortController();
33
36
  #commandLine;
34
- #callerLine;
37
+ #rerun;
35
38
  #outer;
36
- #onOuterAbort = () => this.#controller.abort(interruptedError(this.#callerLine));
39
+ #onOuterAbort = () => this.#controller.abort(interruptedError(this.#rerun));
37
40
  /** Each running must-finish step, tracked until it settles, with its name. */
38
41
  #steps = new Map();
39
42
  #progress;
40
43
  #clock;
41
44
  #disposed = new AbortController();
42
- /** The reasons this run's deadlines and timeouts aborted with, to tell them in a Command's error. */
45
+ /** The reasons this run's deadlines aborted with, to tell them in a Command's error. */
43
46
  #abortReasons = new WeakSet();
44
47
  #graceCancel = new AbortController();
45
48
  #endGrace = () => { };
46
49
  #graceOver = new Promise((resolve) => {
47
50
  this.#endGrace = resolve;
48
51
  });
49
- constructor({ commandLine, callerLine, outer, clock, progress, runDeadline }) {
52
+ constructor({ commandLine, rerun, outer, clock, progress, runDeadline }) {
50
53
  this.#commandLine = commandLine;
51
- this.#callerLine = callerLine;
54
+ this.#rerun = rerun;
52
55
  this.#outer = outer;
53
56
  this.#clock = clock;
54
57
  this.#progress = progress;
@@ -61,20 +64,20 @@ export class RunControl {
61
64
  outer?.addEventListener("abort", this.#onOuterAbort, { once: true });
62
65
  }
63
66
  if (runDeadline !== undefined) {
64
- const { ms, hint } = runDeadline;
65
- after(clock, ms, this.#disposed.signal, () => this.#controller.abort(deadlineError(commandLine, ms, hint())));
67
+ const { ms, advice } = runDeadline;
68
+ after(clock, ms, this.#disposed.signal, () => this.#controller.abort(deadlineError(commandLine, ms, advice())));
66
69
  }
67
70
  }
68
- deadline(ms) {
69
- return AbortSignal.any([this.signal, this.#abortsAfter(ms, "deadline")]);
70
- }
71
- timeout(ms) {
72
- return this.#abortsAfter(ms, "timeout");
71
+ deadline(ms, options = {}) {
72
+ return options.ignoreStop === true
73
+ ? this.#abortsAfter(ms, "ignoreStop")
74
+ : AbortSignal.any([this.signal, this.#abortsAfter(ms, "deadline")]);
73
75
  }
74
76
  #abortsAfter(ms, bound) {
75
77
  const controller = new AbortController();
76
78
  after(this.#clock, ms, this.#disposed.signal, () => {
77
- const reason = deadlineError(this.#commandLine, ms, waitHint(this.#callerLine, bound), bound);
79
+ const advice = { hint: waitHint(bound), next: [this.#rerun] };
80
+ const reason = deadlineError(this.#commandLine, ms, advice, bound);
78
81
  this.#abortReasons.add(reason);
79
82
  controller.abort(reason);
80
83
  });
@@ -113,8 +116,8 @@ export class RunControl {
113
116
  /**
114
117
  * The error a run ends with: an interrupt or the run deadline outranks what the Command threw,
115
118
  * unless the Command threw its own `INTERRUPTED`, saying what it finished before it stopped.
116
- * Otherwise each leaf that is not a `CliError` and whose cause chain holds a deadline's or timeout's
117
- * abort is reported as that abort, so a declared error keeps its own code.
119
+ * Otherwise each leaf that is not a `CliError` and whose cause chain holds a deadline's abort is
120
+ * reported as that abort, so a declared error keeps its own code.
118
121
  */
119
122
  errorAfter(error) {
120
123
  if (this.signal.aborted) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../../src/context/interrupts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAC;AAChD,OAAO,EAAe,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGzE,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAErD,yFAAyF;AACzF,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAExC,qGAAqG;AACrG,SAAS,gBAAgB,CAAC,KAAY;IACpC,OAAO,IAAI,QAAQ,CAAC;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,gCAAgC;QACzC,IAAI,EAAE,iHAAiH;QACvH,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;AACL,CAAC;AAED,8FAA8F;AAC9F,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAW,CAAC;AAI7E,oGAAoG;AACpG,SAAS,QAAQ,CAAC,KAAY;IAC5B,OAAO,KAAK,KAAK,YAAY;QAC3B,CAAC,CAAC,2EAA2E;QAC7E,CAAC,CAAC,yEAAyE,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CACpB,WAAmB,EACnB,EAAU,EACV,MAAc,EACd,KAAK,GAAU,UAAU;IAEzB,OAAO,IAAI,QAAQ,CAAC;QAClB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,WAAW,iBAAiB,EAAE,OAAO,WAAW,CAAC,KAAK,CAAC,EAAE;QACrE,GAAG,MAAM;KACV,CAAC,CAAC;AACL,CAAC;AAkBD,8FAA8F;AAC9F,MAAM,OAAO,UAAU;IACZ,MAAM,CAAc;IACpB,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,YAAY,CAAS;IACrB,MAAM,CAAQ;IACd,MAAM,CAA0B;IAChC,aAAa,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3F,8EAA8E;IACrE,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1C,SAAS,CAA4B;IACrC,MAAM,CAAQ;IACd,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IAC3C,wFAAwF;IAC/E,aAAa,GAAG,IAAI,OAAO,EAAY,CAAC;IACjD,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,SAAS,GAAsC,GAAG,EAAE,GAAE,CAAC,CAAC;IAC/C,UAAU,GAAG,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;QAC/D,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAqB;QACxF,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,IAAI,KAAK,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,KAAK,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;YACnC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,EAAU,EAAE,OAAO,GAAoB,EAAE;QAChD,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI;YAChC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC;YACrC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,KAAY;QACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACnE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAI,IAAY,EAAE,IAAsB;QACpD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;QACpB,oFAAoF;QACpF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,GAAG,EAAE,GAAE,CAAC,EACR,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,mGAAmG;IACnG,KAAK,CAAC,MAAM,CAAI,IAAgB;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3B,CAAC;YACD,OAAO,KAAU,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,KAAc;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9F,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,IAAI,KAAK,YAAY,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CACzB,CAAC,IAAI,EAAoB,EAAE,CAAC,IAAI,YAAY,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CACrF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,KAAK;QACH,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
- import type { CommandSpec } from "./command-spec.js";
2
- import type { Env } from "./context.js";
1
+ import type { CommandSpec } from "../command-spec.js";
2
+ import type { Env } from "../context.js";
3
+ import type { Rerun } from "../next-step.js";
3
4
  export declare const NEEDS_OPERATOR = "NEEDS_OPERATOR";
4
5
  /** Fails with `NEEDS_OPERATOR` when a Coding agent runs an Operator Command. */
5
- export declare function checkOperator({ operator, commandLine }: CommandSpec, env: Env, callerLine: string): void;
6
+ export declare function checkOperator({ operator, commandLine }: CommandSpec, env: Env, rerun: Rerun): void;
@@ -1,15 +1,16 @@
1
+ import { CliError } from "../errors.js";
1
2
  import { isAgent } from "./agent.js";
2
- import { CliError } from "./errors.js";
3
3
  export const NEEDS_OPERATOR = "NEEDS_OPERATOR";
4
4
  /** Fails with `NEEDS_OPERATOR` when a Coding agent runs an Operator Command. */
5
- export function checkOperator({ operator, commandLine }, env, callerLine) {
5
+ export function checkOperator({ operator, commandLine }, env, rerun) {
6
6
  if (!operator || !isAgent(env))
7
7
  return;
8
8
  throw new CliError({
9
9
  code: NEEDS_OPERATOR,
10
10
  message: `\`${commandLine}\` must be run by a person at a terminal, not a Coding agent`,
11
11
  // Typed at Claude Code's prompt, `!` runs the rest of the line in the operator's own shell.
12
- hint: `ask the operator to type: ! ${callerLine}`,
12
+ hint: "ask the operator to type ! then the Next step",
13
+ next: [rerun],
13
14
  });
14
15
  }
15
16
  //# sourceMappingURL=operator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/context/operator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAC3B,EAAE,QAAQ,EAAE,WAAW,EAAe,EACtC,GAAQ,EACR,KAAY;IAEZ,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO;IACvC,MAAM,IAAI,QAAQ,CAAC;QACjB,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,KAAK,WAAW,8DAA8D;QACvF,4FAA4F;QAC5F,IAAI,EAAE,+CAA+C;QACrD,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;AACL,CAAC"}
@@ -1,23 +1,24 @@
1
+ import type { Context } from "../context.js";
2
+ import type { NextStep } from "../next-step.js";
1
3
  import { type FileError } from "./errno.js";
2
4
  import { type Files } from "./files.js";
3
- import { type Invocation } from "./invocation.js";
4
5
  export declare const OUTPUT_EXISTS = "OUTPUT_EXISTS";
5
6
  export interface Overwrite {
6
- readonly invocation: Invocation;
7
+ readonly rerun: Context["rerun"];
7
8
  readonly commandLine: string;
8
9
  readonly force: boolean;
9
10
  readonly files: Files;
10
11
  }
11
12
  /** Refuses a run that would overwrite existing outputs unless the caller passed `--force`. */
12
- export declare function checkOutputs({ invocation, commandLine, force, files }: Overwrite, outputs: readonly string[] | undefined): Promise<void>;
13
+ export declare function checkOutputs({ rerun, commandLine, force, files }: Overwrite, outputs: readonly string[] | undefined): Promise<void>;
13
14
  export interface OutputsGuard {
14
15
  /**
15
16
  * The run's files: the first write to each guarded output is exclusive, so a file that appeared
16
17
  * meanwhile is kept; a later write to it replaces what this run wrote.
17
18
  */
18
19
  readonly files: Files;
19
- /** Guards `outputs` from now on; a refused write's hint names `forceLine`. */
20
- guard(outputs: readonly string[], forceLine: string): void;
20
+ /** Guards `outputs` from now on; a refused write gives `forceStep` as its Next step. */
21
+ guard(outputs: readonly string[], forceStep: NextStep): void;
21
22
  }
22
23
  /** Guards the writes to declared outputs of `files`, whose paths resolve against `cwd`. */
23
24
  export declare function outputsGuard(files: Files, cwd: string): OutputsGuard;
@@ -1,12 +1,11 @@
1
1
  import { dirname, join, resolve } from "node:path";
2
+ import { FORCE_FLAG } from "../command-line/flags.js";
3
+ import { CliError } from "../errors.js";
2
4
  import { ALREADY_EXISTS } from "./errno.js";
3
- import { CliError } from "./errors.js";
4
5
  import { tempPathOf } from "./files.js";
5
- import { FORCE_FLAG } from "./flags.js";
6
- import { commandLineOf } from "./invocation.js";
7
6
  export const OUTPUT_EXISTS = "OUTPUT_EXISTS";
8
7
  /** Refuses a run that would overwrite existing outputs unless the caller passed `--force`. */
9
- export async function checkOutputs({ invocation, commandLine, force, files }, outputs) {
8
+ export async function checkOutputs({ rerun, commandLine, force, files }, outputs) {
10
9
  if (outputs === undefined || force) {
11
10
  return;
12
11
  }
@@ -19,13 +18,14 @@ export async function checkOutputs({ invocation, commandLine, force, files }, ou
19
18
  throw new CliError({
20
19
  code: OUTPUT_EXISTS,
21
20
  message: `\`${commandLine}\` would overwrite ${existing.join(", ")}`,
22
- hint: `to replace ${them}, run \`${commandLineOf(invocation, { add: [FORCE_FLAG.flag] })}\``,
21
+ hint: `to replace ${them}, run the Next step`,
22
+ next: [rerun({ add: [FORCE_FLAG.flag] })],
23
23
  });
24
24
  }
25
25
  /** Guards the writes to declared outputs of `files`, whose paths resolve against `cwd`. */
26
26
  export function outputsGuard(files, cwd) {
27
27
  const unwritten = new Set();
28
- let forceLine = "";
28
+ let forceStep = [];
29
29
  const exclusiveWrite = async (path, data, options) => {
30
30
  const target = resolve(cwd, path);
31
31
  unwritten.delete(target);
@@ -39,7 +39,8 @@ export function outputsGuard(files, cwd) {
39
39
  throw new CliError({
40
40
  code: ALREADY_EXISTS,
41
41
  message: error.message,
42
- hint: `to replace it, run \`${forceLine}\``,
42
+ hint: "to replace it, run the Next step",
43
+ next: [forceStep],
43
44
  }, { cause: error });
44
45
  }
45
46
  };
@@ -50,8 +51,8 @@ export function outputsGuard(files, cwd) {
50
51
  ? exclusiveWrite(path, data, options)
51
52
  : files.write(path, data, options),
52
53
  },
53
- guard: (outputs, line) => {
54
- forceLine = line;
54
+ guard: (outputs, step) => {
55
+ forceStep = step;
55
56
  for (const path of outputs)
56
57
  unwritten.add(resolve(cwd, path));
57
58
  },
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputs.js","sourceRoot":"","sources":["../../src/context/outputs.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import type { Project, ProjectFile } from "./context.js";
1
+ import type { Project, ProjectFile } from "../context.js";
2
+ import type { Rerun } from "../next-step.js";
2
3
  import type { FileError } from "./errno.js";
3
4
  export declare const PROJECT_INVALID = "PROJECT_INVALID";
4
5
  export interface ProjectScope {
5
6
  readonly fileError: FileError;
6
- /** The caller's command line, ready to paste, that the hint asks to run again. */
7
- readonly callerLine: string;
7
+ /** The caller's own line, the Next step once the file is fixed. */
8
+ readonly rerun: Rerun;
8
9
  }
9
10
  /** The nearest Project file at or above `cwd`, parsed by its schema; undefined when there is none. */
10
11
  export declare function projectOf<Settings>(projectFile: ProjectFile<Settings>, cwd: string, scope: ProjectScope): Project<Settings> | undefined;
@@ -1,13 +1,14 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import * as z from "zod";
4
- import { CliError, isMissingFile, messageOf } from "./errors.js";
4
+ import { CliError, isMissingFile, messageOf } from "../errors.js";
5
5
  export const PROJECT_INVALID = "PROJECT_INVALID";
6
- function invalid(path, problem, callerLine, options) {
6
+ function invalid(path, problem, rerun, options) {
7
7
  return new CliError({
8
8
  code: PROJECT_INVALID,
9
9
  message: `the Project file ${path} is invalid: ${problem}`,
10
- hint: `fix ${path}, then run \`${callerLine}\` again`,
10
+ hint: `fix ${path}, then run the Next step`,
11
+ next: [rerun],
11
12
  }, options);
12
13
  }
13
14
  function readText(path, fileError) {
@@ -20,24 +21,24 @@ function readText(path, fileError) {
20
21
  throw fileError(error, { path, access: "read" });
21
22
  }
22
23
  }
23
- function parsed(path, text, schema, callerLine) {
24
+ function parsed(path, text, schema, rerun) {
24
25
  let json;
25
26
  try {
26
27
  json = JSON.parse(text);
27
28
  }
28
29
  catch (error) {
29
- throw invalid(path, messageOf(error), callerLine, { cause: error });
30
+ throw invalid(path, messageOf(error), rerun, { cause: error });
30
31
  }
31
32
  const result = schema.safeParse(json);
32
33
  if (!result.success)
33
- throw invalid(path, z.prettifyError(result.error), callerLine);
34
+ throw invalid(path, z.prettifyError(result.error), rerun);
34
35
  return result.data;
35
36
  }
36
37
  function projectFrom(projectFile, folder, scope) {
37
38
  const path = join(folder, projectFile.file);
38
39
  const text = readText(path, scope.fileError);
39
40
  if (text !== undefined) {
40
- return { root: folder, settings: parsed(path, text, projectFile.schema, scope.callerLine) };
41
+ return { root: folder, settings: parsed(path, text, projectFile.schema, scope.rerun) };
41
42
  }
42
43
  const parent = dirname(folder);
43
44
  return parent === folder ? undefined : projectFrom(projectFile, parent, scope);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/context/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIlE,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAQjD,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,KAAY,EAAE,OAAsB;IAClF,OAAO,IAAI,QAAQ,CACjB;QACE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,oBAAoB,IAAI,gBAAgB,OAAO,EAAE;QAC1D,IAAI,EAAE,OAAO,IAAI,0BAA0B;QAC3C,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAoB;IAClD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,IAAY,EACZ,IAAY,EACZ,MAA2B,EAC3B,KAAY;IAEZ,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAClB,WAAkC,EAClC,MAAc,EACd,KAAmB;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,SAAS,CACvB,WAAkC,EAClC,GAAW,EACX,KAAmB;IAEnB,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC"}
@@ -1,5 +1,8 @@
1
- import type { Env } from "./context.js";
1
+ import type { Env } from "../context.js";
2
+ import type { Commands, DoctorCheck, SecretDeclaration } from "../define.js";
3
+ import type { Rerun } from "../next-step.js";
2
4
  import type { FileError } from "./errno.js";
5
+ export declare const SECRET_MISSING = "SECRET_MISSING";
3
6
  export type SecretOrigin = {
4
7
  readonly kind: "env";
5
8
  } | {
@@ -21,3 +24,7 @@ export interface SecretScope {
21
24
  }
22
25
  /** Looks `name` up in the env, then in `envFile`; an empty value counts as unset. */
23
26
  export declare function secretOf({ envFile, env, fileError }: SecretScope, name: string): Secret | undefined;
27
+ /** Fails with `SECRET_MISSING`, naming every missing Secret at once, unless all are set. */
28
+ export declare function checkSecrets(secrets: readonly SecretDeclaration[], scope: SecretScope, rerun: Rerun): void;
29
+ /** The `doctor` row over every distinct Secret the CLI and its Commands declare; none without any. */
30
+ export declare function secretRows(secrets: readonly SecretDeclaration[], commands: Commands): DoctorCheck[];
@@ -0,0 +1,85 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { parseEnv } from "node:util";
5
+ import { CliError, isMissingFile } from "../errors.js";
6
+ import { declaredIn } from "./declared.js";
7
+ export const SECRET_MISSING = "SECRET_MISSING";
8
+ /** `$XDG_CONFIG_HOME/<cli>/.env`, with `~/.config` when the variable is unset or empty. */
9
+ export function envFileOf(cliName, env) {
10
+ const config = env.XDG_CONFIG_HOME || join(env.HOME || homedir(), ".config");
11
+ return join(config, cliName, ".env");
12
+ }
13
+ function readDotenv(path, fileError) {
14
+ let text;
15
+ try {
16
+ text = readFileSync(path, "utf8");
17
+ }
18
+ catch (error) {
19
+ if (isMissingFile(error))
20
+ return {};
21
+ throw fileError(error, { path, access: "read" });
22
+ }
23
+ return parseEnv(text);
24
+ }
25
+ /** Looks `name` up in the env, then in `envFile`; an empty value counts as unset. */
26
+ export function secretOf({ envFile, env, fileError }, name) {
27
+ const fromEnv = env[name];
28
+ if (fromEnv)
29
+ return { value: fromEnv, origin: { kind: "env" } };
30
+ const fromFile = readDotenv(envFile, fileError)[name];
31
+ return fromFile ? { value: fromFile, origin: { kind: "file", path: envFile } } : undefined;
32
+ }
33
+ function missingIn(scope, secrets) {
34
+ return secrets.filter(({ name }) => secretOf(scope, name) === undefined);
35
+ }
36
+ function getItFrom({ get }) {
37
+ return `(get it from ${get})`;
38
+ }
39
+ function whereToGet(secrets) {
40
+ return secrets.map((secret) => `${secret.name} ${getItFrom(secret)}`).join(", ");
41
+ }
42
+ /** Fails with `SECRET_MISSING`, naming every missing Secret at once, unless all are set. */
43
+ export function checkSecrets(secrets, scope, rerun) {
44
+ const missing = missingIn(scope, secrets);
45
+ if (missing.length === 0)
46
+ return;
47
+ const names = missing.map(({ name }) => name).join(", ");
48
+ throw new CliError({
49
+ code: SECRET_MISSING,
50
+ message: `${missing.length === 1 ? "a Secret it needs is" : "Secrets it needs are"} not set: ${names}`,
51
+ hint: `set ${whereToGet(missing)} in the environment or in ${scope.envFile}, then run the Next step`,
52
+ next: [rerun],
53
+ });
54
+ }
55
+ function originOf({ origin }) {
56
+ return origin.kind === "env" ? "the environment" : origin.path;
57
+ }
58
+ /** The `doctor` row over every distinct Secret the CLI and its Commands declare; none without any. */
59
+ export function secretRows(secrets, commands) {
60
+ const declared = declaredIn(secrets, commands, (command) => command.secrets);
61
+ if (declared.length === 0)
62
+ return [];
63
+ return [
64
+ {
65
+ name: "secrets",
66
+ run: ({ env, envFile, fileError }) => {
67
+ const read = declared.map((declaration) => ({
68
+ declaration,
69
+ secret: secretOf({ env, envFile, fileError }, declaration.name),
70
+ }));
71
+ const missing = read.filter(({ secret }) => secret === undefined);
72
+ if (missing.length > 0) {
73
+ const each = missing.map(({ declaration }) => `${declaration.name} is not set ${getItFrom(declaration)}`);
74
+ return {
75
+ state: "problem",
76
+ message: `${each.join(", ")}; add ${missing.length === 1 ? "it" : "them"} to ${envFile} or the environment`,
77
+ };
78
+ }
79
+ const found = read.flatMap(({ declaration, secret }) => secret === undefined ? [] : [`${declaration.name} from ${originOf(secret)}`]);
80
+ return { state: "ok", message: found.join(", ") };
81
+ },
82
+ },
83
+ ];
84
+ }
85
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/context/secrets.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { type Clock } from "./clock.js";
2
- import type { PortsBase } from "./context.js";
1
+ import { type Clock } from "../clock.js";
2
+ import type { PortsBase } from "../context.js";
3
3
  /** How long a run waits for its Side task once its output is written. */
4
4
  export declare const SIDE_TASK_WAIT_MS = 1000;
5
5
  /** What a CLI's Side task receives for one Command run. */
@@ -1,4 +1,4 @@
1
- import { after } from "./clock.js";
1
+ import { after } from "../clock.js";
2
2
  /** How long a run waits for its Side task once its output is written. */
3
3
  export const SIDE_TASK_WAIT_MS = 1000;
4
4
  export const noSideTask = async () => { };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-task.js","sourceRoot":"","sources":["../../src/context/side-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,aAAa,CAAC;AAGhD,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAqBtC,MAAM,CAAC,MAAM,UAAU,GAAmB,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;AAEzD,SAAS,QAAQ;IACf,OAAO,IAAI,YAAY,CACrB,8BAA8B,iBAAiB,UAAU,EACzD,cAAc,CACf,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,aAAa,CAC3B,QAA8B,EAC9B,OAA6C,EAC7C,EAAE,KAAK,EAAE,MAAM,EAAmB;IAElC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAC9B,iGAAiG;IACjG,kFAAkF;IAClF,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACjF,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAC3C,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE;YAClD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,CAAC;YACb,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CACH,CAAC;QACF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,4 +1,5 @@
1
- import type { Env } from "./context.js";
1
+ import type { Env } from "../context.js";
2
+ import type { Rerun } from "../next-step.js";
2
3
  import type { FileError } from "./errno.js";
3
4
  export declare const TOOL_FAILED = "TOOL_FAILED";
4
5
  export interface SpawnResult {
@@ -73,8 +74,8 @@ export declare const realSpawn: Spawn;
73
74
  /** `ctx.spawn`: `spawn` bound to the run, its start failures classified by errno. */
74
75
  interface SpawnScope {
75
76
  readonly fileError: FileError;
76
- /** The caller's command line, ready to paste, that a missing program's hint asks to run again. */
77
- readonly callerLine: string;
77
+ /** The caller's own line, the Next step once a missing program is installed. */
78
+ readonly rerun: Rerun;
78
79
  }
79
80
  export declare function contextSpawn(run: Spawn, defaults: {
80
81
  readonly cwd: string;
@@ -1,7 +1,7 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { constants } from "node:os";
3
- import { CliError, isMissingFile } from "./errors.js";
4
- import { lastLines } from "./tail.js";
3
+ import { CliError, isMissingFile } from "../errors.js";
4
+ import { lastLines } from "../tail.js";
5
5
  import { findTool, TOOL_MISSING } from "./tools.js";
6
6
  export const TOOL_FAILED = "TOOL_FAILED";
7
7
  const STDERR_TAIL_LINES = 20;
@@ -239,16 +239,17 @@ function failedError(command, { exitCode, stderr }) {
239
239
  hint: `the output of ${command} above says why it failed`,
240
240
  });
241
241
  }
242
- function missingError(command, callerLine, cause) {
242
+ function missingError(command, rerun, cause) {
243
243
  return new CliError({
244
244
  code: TOOL_MISSING,
245
245
  message: `${command} could not be started: it is not on PATH`,
246
- hint: `install ${command}, then run \`${callerLine}\` again`,
246
+ hint: `install ${command}, then run the Next step`,
247
+ next: [rerun],
247
248
  }, { cause });
248
249
  }
249
- function startError(command, error, { fileError, callerLine }) {
250
+ function startError(command, error, { fileError, rerun }) {
250
251
  if (isMissingFile(error))
251
- return missingError(command, callerLine, error);
252
+ return missingError(command, rerun, error);
252
253
  return fileError(error, { path: command, access: "read" });
253
254
  }
254
255
  async function* reported(stream, onError) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/context/spawn.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import type { Clock } from "./clock.js";
2
- import type { Env } from "./context.js";
1
+ import type { Clock } from "../clock.js";
2
+ import type { Env } from "../context.js";
3
3
  import type { FileError } from "./errno.js";
4
4
  import type { Files } from "./files.js";
5
5
  export interface SpillTarget {
6
6
  readonly cliName: string;
7
- readonly commandName: string;
7
+ /** The Command's label, joined with `-` in the file name. */
8
+ readonly label: readonly string[];
8
9
  readonly env: Env;
9
10
  readonly clock: Clock;
10
11
  /** Writes the spill file; its failures are already classified. */
@@ -1,15 +1,15 @@
1
1
  import { mkdir, readdir, rm, stat } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
- import { isMissingFile } from "./errors.js";
4
+ import { isMissingFile } from "../errors.js";
5
5
  const STDOUT_BUDGET_CHARS = 30_000;
6
6
  const SPILL_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
7
7
  const PREVIEW_CHARS = 2_000;
8
8
  // The time's colons become dashes: Windows forbids a colon in a file name.
9
9
  const SPILL_FILE = /^\d{4}-\d\d-\d\dT\d\d-\d\d-\d\d\.\d{3}Z-.+\.(json|txt)$/;
10
- function spillName(now, commandName, json) {
10
+ function spillName(now, label, json) {
11
11
  const time = new Date(now).toISOString().replaceAll(":", "-");
12
- return `${time}-${commandName}.${json ? "json" : "txt"}`;
12
+ return `${time}-${label.join("-")}.${json ? "json" : "txt"}`;
13
13
  }
14
14
  // Another run pruning the same folder may remove a file between readdir and stat.
15
15
  async function pruneOne(path, cutoff) {
@@ -47,7 +47,7 @@ export function spillTo(target) {
47
47
  const now = target.clock.now();
48
48
  const folder = join(tempRoot(target.env), target.cliName);
49
49
  await prepare(folder, now - SPILL_RETENTION_MS, target);
50
- const file = join(folder, spillName(now, target.commandName, json));
50
+ const file = join(folder, spillName(now, target.label, json));
51
51
  await target.files.write(file, printed);
52
52
  const bytes = Buffer.byteLength(printed);
53
53
  const preview = printed.slice(0, PREVIEW_CHARS);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spill.js","sourceRoot":"","sources":["../../src/context/spill.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { Readable } from "node:stream";
2
2
  import * as z from "zod";
3
- import { type Clock } from "./clock.js";
4
- import { CliError } from "./errors.js";
3
+ import { type Clock } from "../clock.js";
4
+ import { CliError } from "../errors.js";
5
5
  export declare const STDIN_OPERAND = "-";
6
6
  /**
7
7
  * Marks a string arg as also taking its text from stdin when the caller passes `-`: all of stdin as
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod";
2
- import { after } from "./clock.js";
3
- import { CliError } from "./errors.js";
2
+ import { after } from "../clock.js";
3
+ import { CliError } from "../errors.js";
4
4
  export const STDIN_OPERAND = "-";
5
5
  const STDIN_META = "stdin";
6
6
  /**