@joshuafolkken/kit 1.1383.0 → 1.1435.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 (244) hide show
  1. package/.claude/skills/epic-commands/SKILL.md +1 -1
  2. package/.claude/skills/epic-commands/epic-bundle.md +5 -0
  3. package/.claude/skills/workflow-commands/backlogrun-lanes.md +5 -3
  4. package/.claude/skills/workflow-commands/backlogrun-steps.md +4 -3
  5. package/.claude/skills/workflow-commands/backlogrun.md +1 -0
  6. package/.claude/skills/workflow-commands/chain-rule.md +4 -2
  7. package/.claude/skills/workflow-commands/issue-comments.md +6 -0
  8. package/.claude/skills/workflow-commands/observation-ledger.md +3 -2
  9. package/.claude/skills/workflow-commands/pre-gate-cut.md +5 -3
  10. package/README.md +25 -0
  11. package/dist/hooks/audit-provision.js +2 -2
  12. package/dist/hooks/batch-guard.js +7 -7
  13. package/dist/hooks/{chunk-LOJTBU5V.js → chunk-2G5F2YCD.js} +3 -3
  14. package/dist/hooks/{chunk-4MGHBTOM.js → chunk-3LE6VLSR.js} +25 -8
  15. package/dist/hooks/{chunk-Y5R47QHU.js → chunk-4BHUPFKF.js} +1 -1
  16. package/dist/hooks/{chunk-KC6LUZZ2.js → chunk-5SJSSCJG.js} +1 -1
  17. package/dist/hooks/{chunk-FZ6FUSBM.js → chunk-723HKZO5.js} +1 -1
  18. package/dist/hooks/{chunk-RYP3TSUJ.js → chunk-7KMN5QB5.js} +3 -3
  19. package/dist/hooks/{chunk-NEC4AT4Z.js → chunk-DGT54IH5.js} +4 -0
  20. package/dist/hooks/{chunk-YKUITFT7.js → chunk-EMB55BDF.js} +4 -4
  21. package/dist/hooks/{chunk-JBBMAPC4.js → chunk-IX6TTTI6.js} +4 -0
  22. package/dist/hooks/{chunk-6MAW7BCM.js → chunk-JXQBK323.js} +2677 -190
  23. package/dist/hooks/{chunk-KCF2YE7O.js → chunk-MSYSUSY6.js} +5 -5
  24. package/dist/hooks/{chunk-LC56R53A.js → chunk-MU4LJFIV.js} +4 -4
  25. package/dist/hooks/{chunk-7VSZ2N4B.js → chunk-QL6QTPWN.js} +3 -3
  26. package/dist/hooks/{chunk-TT742SIO.js → chunk-XER6SSIB.js} +92 -19
  27. package/dist/hooks/{chunk-2X2ART5G.js → chunk-YW452ZAX.js} +500 -29
  28. package/dist/hooks/{chunk-6AC4C2IO.js → chunk-YZXYOAZ3.js} +187 -443
  29. package/dist/hooks/codex-hook-adapter.js +15 -15
  30. package/dist/hooks/duplicate-read-guard.js +8 -8
  31. package/dist/hooks/format-edited.js +5 -5
  32. package/dist/hooks/inputs.json +262 -201
  33. package/dist/hooks/investigation-guard.js +8 -8
  34. package/dist/hooks/pretool-guard.js +14 -14
  35. package/dist/hooks/session-lang.js +124 -15
  36. package/dist/hooks/stop-guard.js +98 -55
  37. package/dist/josh.js +63 -10
  38. package/package.json +4 -3
  39. package/prompts/review.md +22 -0
  40. package/scripts/agent/claude-agent-argv.ts +13 -1
  41. package/scripts/auth/auth-setup-cli.ts +101 -0
  42. package/scripts/auth/claude-token-output.ts +78 -0
  43. package/scripts/auth/claude-token.ts +68 -0
  44. package/scripts/backlog/backlog-drive-cli.ts +2 -4
  45. package/scripts/backlog/backlog-drive-epic.ts +24 -8
  46. package/scripts/backlog/backlog-drive-launch.ts +5 -0
  47. package/scripts/backlog/backlog-drive-named-offer.ts +7 -2
  48. package/scripts/backlog/backlog-drive-named.ts +4 -2
  49. package/scripts/backlog/backlog-drive-owner.ts +72 -5
  50. package/scripts/backlog/backlog-drive-unread.ts +56 -0
  51. package/scripts/backlog/backlog-drive.ts +16 -8
  52. package/scripts/backlog/backlog-overlap.ts +22 -5
  53. package/scripts/backlog/backlog-ready.ts +1 -3
  54. package/scripts/backlog/backlogrun-args.ts +13 -2
  55. package/scripts/backlog/backlogrun-cli.ts +91 -19
  56. package/scripts/backlog/backlogrun-launch.ts +80 -5
  57. package/scripts/backlog/backlogrun-replace.ts +166 -0
  58. package/scripts/backlog/backlogrun-stop.ts +178 -0
  59. package/scripts/behavior/behavior-cli.ts +6 -1
  60. package/scripts/doctor/doctor-io.ts +60 -9
  61. package/scripts/doctor/doctor.ts +20 -1
  62. package/scripts/document/document-byte-budget.ts +3 -3
  63. package/scripts/epic/epic-bundle-cli.ts +8 -8
  64. package/scripts/epic/epic-bundle-referenced.ts +2 -5
  65. package/scripts/epic/epic-bundle.ts +39 -4
  66. package/scripts/exports/unused-members-cli.ts +2 -1
  67. package/scripts/followup/followup-checks-event.ts +82 -0
  68. package/scripts/followup/git-followup-finish.ts +16 -2
  69. package/scripts/followup/git-followup-workflow.ts +5 -2
  70. package/scripts/followup/git-pr-followup-checks.ts +18 -4
  71. package/scripts/followup/git-pr-followup-wrapup.ts +5 -0
  72. package/scripts/followup/git-pr-followup.ts +4 -1
  73. package/scripts/fresh-machine/fresh-machine-cli.ts +204 -0
  74. package/scripts/fresh-machine/fresh-machine-docker.ts +65 -0
  75. package/scripts/fresh-machine/fresh-machine-image.ts +62 -0
  76. package/scripts/fresh-machine/fresh-machine-log.ts +61 -0
  77. package/scripts/fresh-machine/fresh-machine-patterns.ts +130 -0
  78. package/scripts/fresh-machine/fresh-machine-run.ts +215 -0
  79. package/scripts/fresh-machine/fresh-machine-script.ts +45 -0
  80. package/scripts/fresh-machine/fresh-machine-spec.ts +57 -0
  81. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +34 -0
  82. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +31 -0
  83. package/scripts/gate/gate-report.ts +70 -15
  84. package/scripts/gate/project-checks.ts +13 -2
  85. package/scripts/gate/scoped-green.ts +2 -1
  86. package/scripts/gate/verification-gate.ts +4 -3
  87. package/scripts/gh/gh-author-association.ts +14 -0
  88. package/scripts/gh/git-gh-conditional.ts +66 -0
  89. package/scripts/gh/git-gh-exec.ts +1 -1
  90. package/scripts/gh/git-gh-issue-read.ts +6 -3
  91. package/scripts/gh/git-gh-issue-write.ts +5 -1
  92. package/scripts/gh/git-gh-issue.ts +4 -1
  93. package/scripts/gh/git-pr-checks-eval.ts +13 -0
  94. package/scripts/gh/git-pr-checks-parse.ts +8 -1
  95. package/scripts/gh/git-pr-checks-watch.ts +11 -4
  96. package/scripts/gh/git-pr-checks.ts +36 -2
  97. package/scripts/git/git-command.ts +16 -4
  98. package/scripts/git/git-schemas.ts +1 -0
  99. package/scripts/git/git-spawn-sync.ts +1 -1
  100. package/scripts/hooks/pretool-guard.ts +3 -1
  101. package/scripts/init/hook-command-rewrite.ts +31 -0
  102. package/scripts/init/init-actions.ts +4 -1
  103. package/scripts/init/init-ai-copy.ts +33 -10
  104. package/scripts/init/init-basic.ts +8 -3
  105. package/scripts/init/init-logic-toolchain.ts +76 -0
  106. package/scripts/init/init-logic.ts +2 -0
  107. package/scripts/init/init.ts +5 -23
  108. package/scripts/init/project-profile.ts +36 -7
  109. package/scripts/init/start-exec.ts +27 -1
  110. package/scripts/init/start-plan.ts +30 -4
  111. package/scripts/init/start-steps.ts +77 -3
  112. package/scripts/init/start.ts +21 -13
  113. package/scripts/init/workflow-mark.ts +35 -0
  114. package/scripts/issue/issue-ack-cli.ts +84 -0
  115. package/scripts/issue/issue-labels.ts +40 -8
  116. package/scripts/issue/issue-state-cli.ts +14 -4
  117. package/scripts/issue/issue-watch-diff.ts +152 -0
  118. package/scripts/issue/issue-watch-gate.ts +81 -0
  119. package/scripts/issue/issue-watch-hook.ts +54 -0
  120. package/scripts/issue/issue-watch.ts +240 -0
  121. package/scripts/issue/measure-rerun-cli.ts +3 -4
  122. package/scripts/josh/josh-command-map.ts +4 -0
  123. package/scripts/josh/josh-commands-backlog.ts +2 -2
  124. package/scripts/josh/josh-commands-development.ts +1 -1
  125. package/scripts/josh/josh-commands-issue.ts +7 -0
  126. package/scripts/josh/josh-commands-lane.ts +11 -2
  127. package/scripts/josh/josh-commands-project.ts +25 -1
  128. package/scripts/josh/josh-verdict.ts +33 -4
  129. package/scripts/lane/claude-lane-broker.ts +142 -0
  130. package/scripts/lane/lane-await.ts +6 -2
  131. package/scripts/lane/lane-cache.ts +37 -7
  132. package/scripts/lane/lane-capacity.ts +8 -6
  133. package/scripts/lane/lane-child-invocation.ts +1 -0
  134. package/scripts/lane/lane-cli.ts +15 -1
  135. package/scripts/lane/lane-close.ts +15 -6
  136. package/scripts/lane/lane-dispatch.ts +36 -10
  137. package/scripts/lane/lane-environment.ts +1 -1
  138. package/scripts/lane/lane-launch-cli.ts +13 -4
  139. package/scripts/lane/lane-ledger.ts +21 -3
  140. package/scripts/lane/lane-measure-cli.ts +10 -2
  141. package/scripts/lane/lane-open.ts +9 -1
  142. package/scripts/lane/lane-preserve.ts +49 -0
  143. package/scripts/lane/lane-reap.ts +20 -5
  144. package/scripts/lane/lane-registry.ts +6 -0
  145. package/scripts/lane/lane-restart-cli.ts +51 -0
  146. package/scripts/lane/lane-restart.ts +175 -0
  147. package/scripts/lane/{openai-review-broker.ts → lane-session-broker.ts} +106 -28
  148. package/scripts/lane/lane-spent.ts +195 -0
  149. package/scripts/lane/lane-stage-stats.ts +27 -3
  150. package/scripts/lane/lane-stop-stats.ts +96 -0
  151. package/scripts/lane/openai-lane-supervisor.ts +2 -2
  152. package/scripts/lane/process-tools.ts +31 -0
  153. package/scripts/lib/buffered-process.ts +36 -2
  154. package/scripts/lib/pnpm-reach.ts +27 -0
  155. package/scripts/lib/status-icons.ts +5 -1
  156. package/scripts/lint/lint-parallel.ts +19 -2
  157. package/scripts/observations/observation-ledger-home.ts +1 -0
  158. package/scripts/review/review-attest-cli.ts +21 -6
  159. package/scripts/review/review-brief-cli.ts +2 -2
  160. package/scripts/review/review-comment-round.ts +114 -0
  161. package/scripts/review/review-record-cli.ts +39 -17
  162. package/scripts/rules/implementation-cut.ts +3 -3
  163. package/scripts/rules/pre-gate-cut.ts +1 -1
  164. package/scripts/run/board/run-board-checks.ts +42 -0
  165. package/scripts/run/board/run-board-cli.ts +2 -0
  166. package/scripts/run/board/run-board-every.ts +3 -1
  167. package/scripts/run/board/run-board-fit.ts +16 -5
  168. package/scripts/run/board/run-board-fresh.ts +64 -0
  169. package/scripts/run/board/run-board-header.ts +139 -37
  170. package/scripts/run/board/run-board-labels.ts +47 -4
  171. package/scripts/run/board/run-board-lane-event.ts +66 -0
  172. package/scripts/run/board/run-board-layout.ts +57 -9
  173. package/scripts/run/board/run-board-now.ts +234 -0
  174. package/scripts/run/board/run-board-operation-read.ts +75 -0
  175. package/scripts/run/board/run-board-operation.ts +150 -0
  176. package/scripts/run/board/run-board-phase.ts +26 -1
  177. package/scripts/run/board/run-board-plan.ts +4 -6
  178. package/scripts/run/board/run-board-read.ts +58 -5
  179. package/scripts/run/board/run-board-reason.ts +124 -0
  180. package/scripts/run/board/run-board-render-checks.ts +55 -0
  181. package/scripts/run/board/run-board-render-legend.ts +12 -3
  182. package/scripts/run/board/run-board-render-slot.ts +2 -2
  183. package/scripts/run/board/run-board-render-tail.ts +128 -0
  184. package/scripts/run/board/run-board-render-thanks.ts +50 -0
  185. package/scripts/run/board/run-board-render-title.ts +58 -0
  186. package/scripts/run/board/run-board-render.ts +96 -80
  187. package/scripts/run/board/run-board-row-yield.ts +32 -0
  188. package/scripts/run/board/run-board-setup.ts +121 -0
  189. package/scripts/run/board/run-board-span.ts +49 -7
  190. package/scripts/run/board/run-board-state.ts +10 -0
  191. package/scripts/run/board/run-board-status.ts +76 -13
  192. package/scripts/run/board/run-board-thanks-csv.ts +71 -0
  193. package/scripts/run/board/run-board-thanks-read.ts +112 -0
  194. package/scripts/run/board/run-board-thanks.ts +53 -0
  195. package/scripts/run/board/run-board-tick.ts +53 -16
  196. package/scripts/run/board/run-board-usual.ts +44 -0
  197. package/scripts/run/carry/run-carry-added.ts +1 -1
  198. package/scripts/run/carry/run-carry-args.ts +9 -1
  199. package/scripts/run/carry/run-carry-change.ts +1 -1
  200. package/scripts/run/carry/run-carry-cli.ts +39 -52
  201. package/scripts/run/carry/run-carry-end.ts +73 -0
  202. package/scripts/run/carry/run-carry-ended.ts +9 -1
  203. package/scripts/run/carry/run-carry.ts +24 -1
  204. package/scripts/run/entry/run-entry-cli.ts +5 -0
  205. package/scripts/run/event/run-event-checks.ts +54 -0
  206. package/scripts/run/event/run-event-render.ts +3 -0
  207. package/scripts/run/event/run-event-scope.ts +1 -0
  208. package/scripts/run/event/run-event-setup.ts +91 -0
  209. package/scripts/run/event/run-event-stream.ts +46 -9
  210. package/scripts/run/merge/run-merge-cli.ts +7 -4
  211. package/scripts/run/merge/run-merge-ship.ts +61 -0
  212. package/scripts/run/merge/run-merge-steps.ts +7 -14
  213. package/scripts/run/merge/run-merge-token.ts +16 -2
  214. package/scripts/run/run-headless.ts +1 -0
  215. package/scripts/run/run-step.ts +2 -0
  216. package/scripts/run/run-stranded-detect.ts +58 -12
  217. package/scripts/run/ship/run-ship-cli.ts +22 -2
  218. package/scripts/run/ship/run-ship-return.ts +31 -13
  219. package/scripts/run/ship/run-ship-review-steps.ts +17 -4
  220. package/scripts/run/ship/run-ship-stage.ts +1 -0
  221. package/scripts/run/wake/run-wake-await.ts +130 -0
  222. package/scripts/run/wake/run-wake-cli.ts +108 -74
  223. package/scripts/run/wake/run-wake-describe.ts +36 -2
  224. package/scripts/run/wake/run-wake-driver.ts +21 -5
  225. package/scripts/run/wake/run-wake-handoff.ts +1 -1
  226. package/scripts/run/wake/run-wake-session.ts +20 -3
  227. package/scripts/run/wake/run-wake-stop.ts +37 -0
  228. package/scripts/run/wake/run-wake-supervise.ts +44 -0
  229. package/scripts/sync/claude-settings-merge.ts +144 -0
  230. package/scripts/sync/sync-ai-files.ts +28 -3
  231. package/scripts/sync/sync.ts +15 -0
  232. package/scripts/test/project-test-script.ts +73 -0
  233. package/scripts/test/skip-marker.ts +14 -1
  234. package/scripts/test/test-related.ts +3 -2
  235. package/scripts/test/test-unit-guard.ts +78 -14
  236. package/scripts/time-runtime/time-reported-failure.ts +11 -3
  237. package/scripts/uninstall/distributed-files.ts +92 -0
  238. package/scripts/uninstall/uninstall-plan.ts +119 -0
  239. package/scripts/uninstall/uninstall-report.ts +61 -0
  240. package/scripts/uninstall/uninstall.ts +206 -0
  241. package/templates/AGENTS.basic.md +4 -0
  242. package/templates/GEMINI.basic.md +6 -0
  243. package/dist/hooks/chunk-6V5OPIUU.js +0 -13
  244. package/scripts/run/board/run-board-track.ts +0 -22
@@ -1,25 +1,29 @@
1
1
  #!/usr/bin/env tsx
2
- import {
3
- session_language
4
- } from "./chunk-6V5OPIUU.js";
5
2
  import {
6
3
  agent_role_profile,
7
4
  detached_launch,
8
5
  git_common_directory,
9
- run_headless
10
- } from "./chunk-2X2ART5G.js";
6
+ issue_cite,
7
+ run_event_stream,
8
+ run_event_stream_emit,
9
+ run_headless,
10
+ session_language
11
+ } from "./chunk-YW452ZAX.js";
12
+ import {
13
+ error_text
14
+ } from "./chunk-CDY4NFQG.js";
11
15
  import {
12
16
  josh_environment_file
13
- } from "./chunk-Y5R47QHU.js";
17
+ } from "./chunk-4BHUPFKF.js";
14
18
  import {
15
19
  agent_session_environment,
16
20
  json_value,
17
21
  process_identity,
18
22
  run_carry
19
- } from "./chunk-4MGHBTOM.js";
23
+ } from "./chunk-3LE6VLSR.js";
20
24
  import {
21
25
  stamp_file
22
- } from "./chunk-NEC4AT4Z.js";
26
+ } from "./chunk-DGT54IH5.js";
23
27
 
24
28
  // scripts/josh/session-language-cli.ts
25
29
  import { fileURLToPath } from "node:url";
@@ -98,7 +102,14 @@ var agent_diagnostics = { check };
98
102
  import { existsSync } from "node:fs";
99
103
  import path from "node:path";
100
104
  var AGENT_COMMAND = "claude";
101
- var AGENT_FLAGS = ["-p", "--verbose", "--output-format", "stream-json"];
105
+ var PERMISSION_FLAGS = ["--permission-mode", "bypassPermissions"];
106
+ var AGENT_FLAGS = [
107
+ "-p",
108
+ "--verbose",
109
+ "--output-format",
110
+ "stream-json",
111
+ ...PERMISSION_FLAGS
112
+ ];
102
113
  var MODEL_FLAG = "--model";
103
114
  var EFFORT_FLAG = "--effort";
104
115
  var RESUME_FLAG = "--resume";
@@ -298,6 +309,65 @@ var agent_argv = {
298
309
  with_resume_in
299
310
  };
300
311
 
312
+ // scripts/run/event/run-event-setup.ts
313
+ var STAGE = {
314
+ // `josh backlogrun` started the parent session, which is reading its procedure.
315
+ STARTING: "starting session",
316
+ // `run:carry --begin` claimed the run, and the parent is planning it.
317
+ PLANNING: "planning",
318
+ // The supervisor took the run over from the parent and is asking for the first offer.
319
+ HANDING_OFF: "handing off",
320
+ // The driver answered something only a session can act on — an untriaged child, an epic left to a
321
+ // person — and the supervisor is waking one. The next hand-off replaces it.
322
+ JUDGING: "waiting on judgment",
323
+ // The supervisor started that session, which is now acting on the driver's answer. It is detached, so
324
+ // its end is the supervisor's next hand-off, which replaces this.
325
+ SESSION: "judgment session running",
326
+ // The driver's launch of a lane returned without a child: no lane was free to open, or a step after
327
+ // the open failed. It names no issue, so the lane's own stage ends here whatever the driver does next.
328
+ NO_CHILD: "no child launched"
329
+ };
330
+ var OPENING = "opening lane";
331
+ var INSTALLING = "installing dependencies";
332
+ var DISPATCHING = "dispatching";
333
+ var LANE_STAGE = { OPENING, INSTALLING, DISPATCHING };
334
+ function opening_lane(issue) {
335
+ return `${OPENING} ${issue_cite.plain(issue)}`;
336
+ }
337
+ function installing(issue) {
338
+ return `${INSTALLING} ${issue_cite.plain(issue)}`;
339
+ }
340
+ function dispatching(issue) {
341
+ return `${DISPATCHING} ${issue_cite.plain(issue)}`;
342
+ }
343
+ async function emit(text) {
344
+ await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SETUP, text);
345
+ }
346
+ function append_stage(resolve_target, text, at) {
347
+ try {
348
+ const { SETUP } = run_event_stream.EVENT_KIND;
349
+ run_event_stream.append(resolve_target(), SETUP, text, at.toISOString());
350
+ } catch (error) {
351
+ error_text.trace_swallowed("run_event_setup.append_stage", error);
352
+ }
353
+ }
354
+ function emit_in(repository, text, at) {
355
+ append_stage(() => run_event_stream.target_of(repository), text, at);
356
+ }
357
+ function emit_to(target, text, at) {
358
+ append_stage(() => target, text, at);
359
+ }
360
+ var run_event_setup = {
361
+ LANE_STAGE,
362
+ STAGE,
363
+ dispatching,
364
+ emit,
365
+ emit_in,
366
+ emit_to,
367
+ installing,
368
+ opening_lane
369
+ };
370
+
301
371
  // scripts/backlog/backlogrun-launch.ts
302
372
  import { z } from "zod";
303
373
  var LAUNCH_PREFIX = "josh-backlogrun-launch-";
@@ -306,7 +376,11 @@ var LOG_SUFFIX = ".log";
306
376
  var launch_schema = z.object({
307
377
  pid: z.number(),
308
378
  start: z.string().optional(),
309
- session: z.string().optional()
379
+ session: z.string().optional(),
380
+ // What the parent was started to run and when, so `run:board` has a run to draw and a clock to count
381
+ // before the parent claims the carry record. Absent on a record an earlier version wrote.
382
+ invocation: z.string().optional(),
383
+ started_at: z.string().optional()
310
384
  });
311
385
  function launch_path(git_directory) {
312
386
  return stamp_file.stamp_path(LAUNCH_PREFIX, git_directory);
@@ -348,9 +422,41 @@ function argv_of(invocation, provider, worktree, session) {
348
422
  function note_to_stderr(note) {
349
423
  console.error(`backlogrun: ${note}`);
350
424
  }
351
- function record_launch(git_directory, pid, session) {
352
- const started = process_identity.read_start(pid);
353
- stamp_file.replace_stamp(launch_path(git_directory), { pid, start: started, session });
425
+ function record_launch(git_directory, launch) {
426
+ const now = /* @__PURE__ */ new Date();
427
+ const identity = process_identity.read_start(launch.pid);
428
+ const record = { ...launch, start: identity, started_at: now.toISOString() };
429
+ stamp_file.replace_stamp(launch_path(git_directory), record);
430
+ run_event_setup.emit_in(git_directory, run_event_setup.STAGE.STARTING, now);
431
+ }
432
+ function live_launch(git_directory) {
433
+ const record = read_launch(launch_path(git_directory));
434
+ return is_launch_live(record) ? record : void 0;
435
+ }
436
+ function pending_launch(git_directory) {
437
+ const { invocation, started_at } = live_launch(git_directory) ?? {};
438
+ if (invocation === void 0 || started_at === void 0) return void 0;
439
+ return { invocation, started_at };
440
+ }
441
+ function started_for(git_directory, owner_pid) {
442
+ const record = live_launch(git_directory);
443
+ if (record?.started_at === void 0 || record.pid !== owner_pid) return void 0;
444
+ const started_ms = Date.parse(record.started_at);
445
+ return Number.isNaN(started_ms) ? void 0 : new Date(started_ms);
446
+ }
447
+ function signal_parent(pid) {
448
+ try {
449
+ process.kill(pid, "SIGTERM");
450
+ } catch {
451
+ note_to_stderr(`process ${String(pid)} could not be signalled; its launch record is removed.`);
452
+ }
453
+ }
454
+ function stop_parent(git_directory) {
455
+ const record = live_launch(git_directory);
456
+ stamp_file.remove_stamp(launch_path(git_directory));
457
+ if (record === void 0) return void 0;
458
+ signal_parent(record.pid);
459
+ return record.pid;
354
460
  }
355
461
  function spawn_parent(argv, provider, target) {
356
462
  const environment = {
@@ -376,7 +482,7 @@ function start(invocation, provider, target) {
376
482
  if (built.kind === "rejected") return { kind: "failed", note: built.note };
377
483
  const result = spawn_parent(built, provider, target);
378
484
  if (result.kind === "failed") return result;
379
- record_launch(target.git_directory, result.pid, session);
485
+ record_launch(target.git_directory, { pid: result.pid, session, invocation });
380
486
  const launched = { pid: result.pid, session, log_path: log_path(target.git_directory) };
381
487
  return { kind: "launched", launched };
382
488
  }
@@ -384,7 +490,10 @@ var backlogrun_launch = {
384
490
  argv_of,
385
491
  chosen_environment,
386
492
  is_running,
387
- start
493
+ pending_launch,
494
+ start,
495
+ started_for,
496
+ stop_parent
388
497
  };
389
498
 
390
499
  // scripts/josh/session-language-cli.ts
@@ -3,9 +3,8 @@ import {
3
3
  RUN_LANE_LABEL,
4
4
  RUN_SOLO_LABEL,
5
5
  filing_cap,
6
- git_gh_api_path,
6
+ gh_spawn,
7
7
  git_gh_command,
8
- git_gh_exec,
9
8
  has_label_name,
10
9
  issue_citation,
11
10
  lane_background,
@@ -13,35 +12,33 @@ import {
13
12
  lane_park,
14
13
  repo_party,
15
14
  run_cut,
16
- run_event_stream,
17
- run_event_stream_emit,
18
15
  run_hold
19
- } from "./chunk-6AC4C2IO.js";
20
- import {
21
- session_language
22
- } from "./chunk-6V5OPIUU.js";
16
+ } from "./chunk-YZXYOAZ3.js";
23
17
  import {
24
18
  agent_headless,
25
19
  agent_role_profile,
26
20
  issue_cite,
27
21
  lane_registry,
28
- run_headless
29
- } from "./chunk-2X2ART5G.js";
22
+ run_event_stream,
23
+ run_event_stream_emit,
24
+ run_headless,
25
+ session_language
26
+ } from "./chunk-YW452ZAX.js";
30
27
  import {
31
28
  timed_fetch
32
- } from "./chunk-FZ6FUSBM.js";
29
+ } from "./chunk-723HKZO5.js";
33
30
  import "./chunk-CDY4NFQG.js";
34
31
  import {
35
32
  hook_decision
36
- } from "./chunk-LC56R53A.js";
33
+ } from "./chunk-MU4LJFIV.js";
37
34
  import {
38
35
  time_density_hook,
39
36
  time_hook_transcript,
40
37
  time_reported_failure
41
- } from "./chunk-TT742SIO.js";
38
+ } from "./chunk-XER6SSIB.js";
42
39
  import {
43
40
  lane_child_marker
44
- } from "./chunk-Y5R47QHU.js";
41
+ } from "./chunk-4BHUPFKF.js";
45
42
  import {
46
43
  backlog_budget,
47
44
  issue_number_shape,
@@ -50,11 +47,10 @@ import {
50
47
  process_owner_schema,
51
48
  run_carry,
52
49
  run_invocation
53
- } from "./chunk-4MGHBTOM.js";
50
+ } from "./chunk-3LE6VLSR.js";
54
51
  import {
55
- PROJECT_ROOT,
56
52
  stamp_file
57
- } from "./chunk-NEC4AT4Z.js";
53
+ } from "./chunk-DGT54IH5.js";
58
54
 
59
55
  // scripts/hooks/stop-guard.ts
60
56
  import { text } from "node:stream/consumers";
@@ -136,7 +132,7 @@ var lane_seed_policy = {
136
132
  };
137
133
 
138
134
  // scripts/lane/lane-capacity.ts
139
- var DEFAULT_LANE_LIMIT = 6;
135
+ var DEFAULT_LANE_LIMIT = 4;
140
136
  var LANE_LIMIT_KEY = "JOSH_LANE_LIMIT";
141
137
  var POSITIVE_INTEGER = /^[1-9]\d*$/u;
142
138
  var NO_LANES = 0;
@@ -245,8 +241,7 @@ var backlog_stalled = {
245
241
  var NO_FREE = 0;
246
242
  var NONE2 = 0;
247
243
  async function live_lane_count() {
248
- const lanes = await lane_registry.list_lanes();
249
- return lanes.filter((lane) => !lane.is_stranded).length;
244
+ return lane_registry.live_count(await lane_registry.list_lanes());
250
245
  }
251
246
  async function free_under(limit) {
252
247
  return lane_capacity.free_lanes(limit, await live_lane_count());
@@ -320,26 +315,6 @@ var backlog_ready = {
320
315
  ready_line
321
316
  };
322
317
 
323
- // scripts/gh/gh-spawn.ts
324
- var NO_BUDGET = 0;
325
- function fetch_repo_name(timeout_ms) {
326
- const stdout = git_gh_exec.read_gh_api_sync({
327
- path: git_gh_api_path.repo_api_path(),
328
- jq_filter: ".full_name",
329
- cwd: PROJECT_ROOT,
330
- timeout_ms: timeout_ms ?? NO_BUDGET
331
- });
332
- const name = stdout?.trim();
333
- return name === "" ? void 0 : name;
334
- }
335
- function get_repo_name_with_owner() {
336
- return fetch_repo_name(void 0);
337
- }
338
- function get_repo_name_with_owner_within(timeout_ms) {
339
- return fetch_repo_name(timeout_ms);
340
- }
341
- var gh_spawn = { get_repo_name_with_owner, get_repo_name_with_owner_within };
342
-
343
318
  // scripts/notify/telegram-notify.ts
344
319
  import { z } from "zod";
345
320
  var TELEGRAM_API_BASE = "https://api.telegram.org";
@@ -964,8 +939,53 @@ var run_halfrun_resume = {
964
939
  take_over
965
940
  };
966
941
 
967
- // scripts/run/wake/run-wake.ts
942
+ // scripts/run/carry/run-carry-ended.ts
943
+ import path from "node:path";
968
944
  import { z as z4 } from "zod";
945
+ var ENDED_PREFIX = "josh-run-ended-";
946
+ var TRANSCRIPT_SUFFIX = ".jsonl";
947
+ var ended_run_schema = z4.object({
948
+ invocation: z4.string(),
949
+ started_at: z4.string(),
950
+ ended_at: z4.string(),
951
+ stopped: z4.string().optional(),
952
+ session: z4.string().optional()
953
+ });
954
+ function ended_path(git_directory) {
955
+ return stamp_file.stamp_path(ENDED_PREFIX, git_directory);
956
+ }
957
+ function session_of(transcript) {
958
+ return transcript === void 0 ? void 0 : path.basename(transcript, TRANSCRIPT_SUFFIX);
959
+ }
960
+ function stop_of(transcript, stopped) {
961
+ return stopped === void 0 ? {} : { stopped, session: session_of(transcript) };
962
+ }
963
+ function record_ended(target, read, now = /* @__PURE__ */ new Date(), stopped) {
964
+ if (read.kind !== "carried") return;
965
+ const { invocation, started_at, owner_transcript } = read.carry;
966
+ const ended_at = now.toISOString();
967
+ stamp_file.replace_stamp(target, {
968
+ invocation,
969
+ started_at,
970
+ ended_at,
971
+ ...stop_of(owner_transcript, stopped)
972
+ });
973
+ }
974
+ function parse_ended(raw) {
975
+ return json_value.parse_with(raw, ended_run_schema);
976
+ }
977
+ function read_ended(target) {
978
+ const raw = stamp_file.read_stamp_text(target);
979
+ return raw === void 0 ? void 0 : parse_ended(raw);
980
+ }
981
+ function has_ended(target, started_at) {
982
+ const ended = read_ended(target);
983
+ return ended !== void 0 && ended.started_at === started_at;
984
+ }
985
+ var run_carry_ended = { ended_path, has_ended, read_ended, record_ended };
986
+
987
+ // scripts/run/wake/run-wake.ts
988
+ import { z as z5 } from "zod";
969
989
  var WAKE_PREFIX = "josh-run-wake-";
970
990
  var WAKE_LOG_PREFIX = "josh-run-wake-log-";
971
991
  var WAKE_LOG_SUFFIX = ".log";
@@ -984,15 +1004,15 @@ var STOP_REASONS = {
984
1004
  unreadable: "unreadable"
985
1005
  };
986
1006
  var run_wake_schema = process_owner_schema.extend({
987
- invocation: z4.string(),
988
- started_at: z4.string(),
989
- woke: z4.number(),
990
- woke_at: z4.string().optional(),
1007
+ invocation: z5.string(),
1008
+ started_at: z5.string(),
1009
+ woke: z5.number(),
1010
+ woke_at: z5.string().optional(),
991
1011
  // Every optional `RunWake` field must be listed: `z.object` strips undeclared ones on the round trip.
992
- attempts: z4.number().optional(),
993
- woke_pid: z4.number().optional(),
994
- spawned: z4.array(z4.string()).optional(),
995
- idle_since: z4.string().optional(),
1012
+ attempts: z5.number().optional(),
1013
+ woke_pid: z5.number().optional(),
1014
+ spawned: z5.array(z5.string()).optional(),
1015
+ idle_since: z5.string().optional(),
996
1016
  profile: agent_role_profile.PROFILE_SCHEMA.optional()
997
1017
  });
998
1018
  function is_overdue(marked_at, now, limit_ms = WAKE_GRACE_MS) {
@@ -1186,10 +1206,12 @@ var run_stranded = {
1186
1206
 
1187
1207
  // scripts/run/run-stranded-detect.ts
1188
1208
  var STRAND_RECOVERY = `Restart supervision with \`${run_stranded.RECOVERY_COMMAND}\` \u2014 it wakes a fresh successor to claim the budget; the cutting session must not resume it itself.`;
1209
+ function targets_of(directory) {
1210
+ return { carry: run_carry.carry_path(directory), wake: run_wake.wake_path(directory) };
1211
+ }
1189
1212
  async function real_resolve_targets() {
1190
1213
  const directory = await run_carry.repository_directory();
1191
- if (directory === void 0) return void 0;
1192
- return { carry: run_carry.carry_path(directory), wake: run_wake.wake_path(directory) };
1214
+ return directory === void 0 ? void 0 : targets_of(directory);
1193
1215
  }
1194
1216
  async function real_emit_stranded(text2) {
1195
1217
  return await run_event_stream_emit.emit_once(run_event_stream.EVENT_KIND.STRANDED, text2);
@@ -1201,14 +1223,13 @@ var DEFAULT_PORTS3 = {
1201
1223
  resolve_targets: real_resolve_targets,
1202
1224
  read_carry: (target) => run_carry.read_carry(target),
1203
1225
  is_owner_live: run_carry.is_owner_live,
1226
+ has_ended: run_carry_ended.has_ended,
1204
1227
  read_wake: (target) => run_wake.read_wake(target),
1205
1228
  supervisor_liveness: (wake) => run_stranded.supervisor_liveness(wake),
1206
1229
  emit_stranded: real_emit_stranded,
1207
1230
  notify_stranded: real_notify_stranded
1208
1231
  };
1209
- async function gather2(ports) {
1210
- const targets = await ports.resolve_targets();
1211
- if (targets === void 0) return void 0;
1232
+ function input_at(ports, targets) {
1212
1233
  const read = ports.read_carry(targets.carry);
1213
1234
  if (read.kind !== "carried") return void 0;
1214
1235
  return {
@@ -1217,6 +1238,10 @@ async function gather2(ports) {
1217
1238
  supervisor: ports.supervisor_liveness(ports.read_wake(targets.wake))
1218
1239
  };
1219
1240
  }
1241
+ async function gather2(ports) {
1242
+ const targets = await ports.resolve_targets();
1243
+ return targets === void 0 ? void 0 : input_at(ports, targets);
1244
+ }
1220
1245
  async function report2(ports, input) {
1221
1246
  if (input.read.kind !== "carried") return;
1222
1247
  const text2 = run_stranded.describe(input.read.carry);
@@ -1235,7 +1260,25 @@ async function run_stranded_check() {
1235
1260
  } catch {
1236
1261
  }
1237
1262
  }
1238
- var run_stranded_detect = { detect_and_report: detect_and_report2, run_stranded_check };
1263
+ function is_stranded_at(directory, ports = DEFAULT_PORTS3) {
1264
+ const input = input_at(ports, targets_of(directory));
1265
+ return input !== void 0 && run_stranded.is_stranded(input);
1266
+ }
1267
+ function is_left_stranded(run, ports = DEFAULT_PORTS3) {
1268
+ const read = ports.read_carry(run.carry_target);
1269
+ if (read.kind !== "carried") return !ports.has_ended(run.ended_target, run.started_at);
1270
+ return run_stranded.is_stranded({
1271
+ read,
1272
+ is_owner_live: run_carry.is_held_by_another(read.carry, ports.is_owner_live),
1273
+ supervisor: run_stranded.GONE
1274
+ });
1275
+ }
1276
+ var run_stranded_detect = {
1277
+ detect_and_report: detect_and_report2,
1278
+ is_left_stranded,
1279
+ is_stranded_at,
1280
+ run_stranded_check
1281
+ };
1239
1282
 
1240
1283
  // scripts/hooks/stop-guard.ts
1241
1284
  async function hold_facts() {
package/dist/josh.js CHANGED
@@ -1275,10 +1275,10 @@ var BACKLOG_COMMANDS = {
1275
1275
  // Started from a terminal: the `backlogrun` keyword's launcher, and the board.
1276
1276
  backlogrun: {
1277
1277
  script: "scripts/backlog/backlogrun-cli.ts",
1278
- description: "Start a backlogrun in the background and show its board; with one already running, only show the board",
1278
+ description: "Start a backlogrun in the background and show its board; with one already running, only show the board, or replace it when it is idle and the invocation differs; --stop stops it",
1279
1279
  category: "AI tools",
1280
1280
  reference: [
1281
- "[#<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex]",
1281
+ "[<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex] | --stop",
1282
1282
  "developer",
1283
1283
  ["files", "network", "processes"]
1284
1284
  ]
@@ -1388,6 +1388,12 @@ var GUARD_COMMANDS = {
1388
1388
  // scripts/josh/josh-commands-issue.ts
1389
1389
  var ISSUES_WITH_REPO = "<issue...> [--repo <owner/repo>]";
1390
1390
  var ISSUE_COMMANDS = {
1391
+ "issue:ack": {
1392
+ script: "scripts/issue/issue-ack-cli.ts",
1393
+ description: "Record that the run read a person's update to its issue, printing the update it acknowledges",
1394
+ category: "AI tools",
1395
+ reference: ["<issue>", "automation", ["network"]]
1396
+ },
1391
1397
  "issue:read": {
1392
1398
  script: "scripts/issue/issue-read-cli.ts",
1393
1399
  description: "Print each issue's title, body and every comment on it, in one call",
@@ -1486,7 +1492,7 @@ var LANE_COMMANDS = {
1486
1492
  },
1487
1493
  "lane:prune": {
1488
1494
  ...LANE_ARGUMENTS,
1489
- description: "Close every lane an interruption left without its work tree, then sweep unregistered leftovers under the lanes root",
1495
+ description: "Close every lane an interruption left without its work tree and every spent lane, then sweep unregistered leftovers under the lanes root",
1490
1496
  category: "AI tools",
1491
1497
  reference: ["", "automation", ["files", "git"]],
1492
1498
  default_script_arguments: ["prune"]
@@ -1518,6 +1524,14 @@ var LANE_COMMANDS = {
1518
1524
  category: "AI tools",
1519
1525
  reference: ["<issue> [--stash <message>]", "automation", ["files", "git", "processes"]]
1520
1526
  },
1527
+ // `.env` is read for `JOSH_LANE_ROOT`, as every lane command reads it, so the lane is found.
1528
+ "lane:restart": {
1529
+ script: "scripts/lane/lane-restart-cli.ts",
1530
+ tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
1531
+ description: "Stop a running lane child, stash its uncommitted work and re-dispatch its issue in a fresh session \u2014 not counted as an outage or a failure",
1532
+ category: "AI tools",
1533
+ reference: ["<issue>", "developer", ["files", "git", "processes", "network"]]
1534
+ },
1521
1535
  // A live run's lane limit: `.env` is read so the bare form reports the
1522
1536
  // `JOSH_LANE_LIMIT` a person set there when no override stands.
1523
1537
  "lane:limit": {
@@ -1538,7 +1552,7 @@ var LANE_COMMANDS = {
1538
1552
  },
1539
1553
  "lane:stats": {
1540
1554
  ...MEASURE_ARGUMENTS,
1541
- description: "Print one table row of lane throughput, gate duration and machine load over a period, and the per-stage durations of a lane under it",
1555
+ description: "Print one table row of lane throughput, gate duration and machine load over a period, the per-stage durations of a lane under it, and the wait after each ship stop reason under those",
1542
1556
  category: "AI tools",
1543
1557
  reference: ["--period <days> [--limit <lane-limit>]", "maintainer", ["none"]],
1544
1558
  default_script_arguments: ["stats"]
@@ -1905,17 +1919,27 @@ import { availableParallelism as availableParallelism4 } from "node:os";
1905
1919
  // scripts/lib/status-icons.ts
1906
1920
  var FAIL_ICON = "\u2717";
1907
1921
  var PASS_ICON = "\u2714";
1908
- var status_icons = { FAIL_ICON, PASS_ICON };
1922
+ var WARN_ICON = "\u26A0";
1923
+ var status_icons = { FAIL_ICON, PASS_ICON, WARN_ICON };
1909
1924
 
1910
1925
  // scripts/josh/josh-verdict.ts
1911
- var { FAIL_ICON: FAIL_ICON2, PASS_ICON: PASS_ICON2 } = status_icons;
1926
+ var { FAIL_ICON: FAIL_ICON2, PASS_ICON: PASS_ICON2, WARN_ICON: WARN_ICON2 } = status_icons;
1912
1927
  var GATE_SUBJECT = "verification gate";
1913
1928
  var GATE_PASSED_PREFIX = `${PASS_ICON2} ${GATE_SUBJECT} passed`;
1914
1929
  var GATE_FAILED_PREFIX = `${FAIL_ICON2} ${GATE_SUBJECT} failed`;
1930
+ var GATE_UNVERIFIED_PREFIX = `${WARN_ICON2} ${GATE_SUBJECT} not verified`;
1915
1931
  var PASSED_VERDICT = "passed";
1916
1932
  var FAILED_VERDICT = "failed";
1917
- function format_gate_passed(step_count, total) {
1918
- return `${GATE_PASSED_PREFIX} (${step_count} checks) in ${total}.`;
1933
+ var UNVERIFIED_VERDICT = "unverified";
1934
+ function format_counts(counts) {
1935
+ if (counts.skipped === 0) return `${String(counts.ran)} checks`;
1936
+ return `${String(counts.ran)} ran, ${String(counts.skipped)} skipped`;
1937
+ }
1938
+ function format_gate_passed(counts, total) {
1939
+ return `${GATE_PASSED_PREFIX} (${format_counts(counts)}) in ${total}.`;
1940
+ }
1941
+ function format_gate_unverified(skipped, total) {
1942
+ return `${GATE_UNVERIFIED_PREFIX} (0 ran, ${String(skipped)} skipped) in ${total}.`;
1919
1943
  }
1920
1944
  function format_gate_failed(failed_labels, total) {
1921
1945
  return `${GATE_FAILED_PREFIX}: ${failed_labels} (${total})`;
@@ -1930,13 +1954,16 @@ function read_verdict(line) {
1930
1954
  const trimmed = line.trimStart();
1931
1955
  if (trimmed.startsWith(GATE_FAILED_PREFIX)) return FAILED_VERDICT;
1932
1956
  if (trimmed.startsWith(GATE_PASSED_PREFIX)) return PASSED_VERDICT;
1957
+ if (trimmed.startsWith(GATE_UNVERIFIED_PREFIX)) return UNVERIFIED_VERDICT;
1933
1958
  return void 0;
1934
1959
  }
1935
1960
  var josh_verdict = {
1936
1961
  PASSED_VERDICT,
1937
1962
  FAILED_VERDICT,
1963
+ UNVERIFIED_VERDICT,
1938
1964
  format_gate_passed,
1939
1965
  format_gate_failed,
1966
+ format_gate_unverified,
1940
1967
  GATE_OPENING_MARK,
1941
1968
  GATE_OPENING_PREFIX,
1942
1969
  is_gate_opening,
@@ -2269,7 +2296,7 @@ var DEV_COMMANDS = {
2269
2296
  },
2270
2297
  "test:unit": {
2271
2298
  script: "scripts/test/test-unit-guard.ts",
2272
- description: "Run unit tests with Vitest (skips when Vitest is absent; fails when it has no tests)",
2299
+ description: "Run unit tests with Vitest (without Vitest: a basic project runs its own test script, others skip; fails when Vitest has no tests)",
2273
2300
  category: "Development",
2274
2301
  reference: [FILTER_ARGUMENTS, "developer", ["processes"]],
2275
2302
  core_weight: gate_plan.direct_unit_weight,
@@ -2501,7 +2528,7 @@ var PROJECT_COMMANDS = {
2501
2528
  description: "Set a project up for the GitHub Issue workflow, from git init to the setup PR",
2502
2529
  category: "Project",
2503
2530
  reference: [
2504
- `${PROFILE_ARGUMENTS} [--yes] [--github] [--public] [--init-command <command>]`,
2531
+ `${PROFILE_ARGUMENTS} [--yes] [--github] [--public] [--init-command <command>] [--push-preflight-command <command>]`,
2505
2532
  "developer",
2506
2533
  ["files", "git", "network", "processes"]
2507
2534
  ]
@@ -2513,6 +2540,22 @@ var PROJECT_COMMANDS = {
2513
2540
  reference: ["<dir>", "automation", ["files", "git"]],
2514
2541
  is_kit_only: true
2515
2542
  },
2543
+ "fresh:run": {
2544
+ script: "scripts/fresh-machine/fresh-machine-cli.ts",
2545
+ description: "Run an install scenario in a Docker container of a machine with nothing installed, and keep the log",
2546
+ category: "Project",
2547
+ reference: [
2548
+ "<pattern> | --spec <file.json> [--package-version <version>] [--log-dir <dir>] [--rebuild] | --list",
2549
+ "maintainer",
2550
+ ["files", "network", "processes"]
2551
+ ]
2552
+ },
2553
+ "auth:setup": {
2554
+ script: "scripts/auth/auth-setup-cli.ts",
2555
+ description: "Save the long-lived Claude Code token `claude setup-token` prints in the macOS keychain, for josh fresh:run",
2556
+ category: "Project",
2557
+ reference: ["[--check]", "maintainer", ["network", "processes"]]
2558
+ },
2516
2559
  init: {
2517
2560
  script: "scripts/init/init.ts",
2518
2561
  description: "Initialize config in a new project",
@@ -2529,6 +2572,12 @@ var PROJECT_COMMANDS = {
2529
2572
  category: "Project",
2530
2573
  reference: ["", "developer", ["files"]]
2531
2574
  },
2575
+ uninstall: {
2576
+ script: "scripts/uninstall/uninstall.ts",
2577
+ description: "Remove what kit added to a project and list what is left to review by hand",
2578
+ category: "Project",
2579
+ reference: [`${PROFILE_ARGUMENTS} [--yes]`, "developer", ["files", "processes"]]
2580
+ },
2532
2581
  "registry:migrate": {
2533
2582
  script: "scripts/registry-migration/migrate.ts",
2534
2583
  description: "Migrate a project from GitHub Packages to public npm",
@@ -2791,6 +2840,7 @@ var ALIASES = {
2791
2840
  pf: "profile",
2792
2841
  st: "start",
2793
2842
  sy: "sync",
2843
+ un: "uninstall",
2794
2844
  rmi: "registry:migrate",
2795
2845
  g: "git",
2796
2846
  gp: "pr",
@@ -2816,9 +2866,12 @@ var ALIASES = {
2816
2866
  rvf: "review:findings",
2817
2867
  ruv: "rule:value",
2818
2868
  ev: "eval",
2869
+ fr: "fresh:run",
2870
+ as: "auth:setup",
2819
2871
  lsm: "lane:sample",
2820
2872
  lst: "lane:stats",
2821
2873
  lli: "lane:limit",
2874
+ lrs: "lane:restart",
2822
2875
  blr: "backlogrun"
2823
2876
  };
2824
2877
 
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1383.0",
2
+ "version": "1.1435.0",
3
3
  "name": "@joshuafolkken/kit",
4
4
  "description": "Development toolkit for AI-assisted projects: formatting, AI assistant rules and a Git/GitHub Issue workflow for any repository, plus lint, type check, tests and hooks for Node projects",
5
5
  "keywords": [
@@ -276,6 +276,7 @@
276
276
  },
277
277
  "dependencies": {
278
278
  "cli-spinners": "^3.4.0",
279
+ "csv-parse": "^7.0.3",
279
280
  "execa": "^10.1.0",
280
281
  "js-yaml": "^5.4.3",
281
282
  "jsonc-parser": "^3.3.1",
@@ -284,12 +285,12 @@
284
285
  "string-width": "^8.3.0",
285
286
  "terminal-link": "^5.0.0",
286
287
  "tsx": "^4.23.15",
287
- "zod": "^4.6.5"
288
+ "zod": "^4.6.6"
288
289
  },
289
290
  "devEngines": {
290
291
  "packageManager": {
291
292
  "name": "pnpm",
292
- "version": "12.12.0+sha512.2ee06ac86db554cf384421461220f0e336a487bfd41b2acd04e17a86b1487832fe45e8d1743f7fc52acc77de12d2356b536fedf8229fc483239e40b13d474449",
293
+ "version": "12.12.1+sha512.b7f98934c0b1f29a65f5da52f2d7f994e7faad573ffdddea1497fb4dcb5aec051590ee7c7d95a38172b4bfae103a5b83edf2ee866e11731c2cafa96063610ac5",
293
294
  "onFail": "download"
294
295
  }
295
296
  },