@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.
- package/.claude/skills/epic-commands/SKILL.md +1 -1
- package/.claude/skills/epic-commands/epic-bundle.md +5 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +5 -3
- package/.claude/skills/workflow-commands/backlogrun-steps.md +4 -3
- package/.claude/skills/workflow-commands/backlogrun.md +1 -0
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/issue-comments.md +6 -0
- package/.claude/skills/workflow-commands/observation-ledger.md +3 -2
- package/.claude/skills/workflow-commands/pre-gate-cut.md +5 -3
- package/README.md +25 -0
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-LOJTBU5V.js → chunk-2G5F2YCD.js} +3 -3
- package/dist/hooks/{chunk-4MGHBTOM.js → chunk-3LE6VLSR.js} +25 -8
- package/dist/hooks/{chunk-Y5R47QHU.js → chunk-4BHUPFKF.js} +1 -1
- package/dist/hooks/{chunk-KC6LUZZ2.js → chunk-5SJSSCJG.js} +1 -1
- package/dist/hooks/{chunk-FZ6FUSBM.js → chunk-723HKZO5.js} +1 -1
- package/dist/hooks/{chunk-RYP3TSUJ.js → chunk-7KMN5QB5.js} +3 -3
- package/dist/hooks/{chunk-NEC4AT4Z.js → chunk-DGT54IH5.js} +4 -0
- package/dist/hooks/{chunk-YKUITFT7.js → chunk-EMB55BDF.js} +4 -4
- package/dist/hooks/{chunk-JBBMAPC4.js → chunk-IX6TTTI6.js} +4 -0
- package/dist/hooks/{chunk-6MAW7BCM.js → chunk-JXQBK323.js} +2677 -190
- package/dist/hooks/{chunk-KCF2YE7O.js → chunk-MSYSUSY6.js} +5 -5
- package/dist/hooks/{chunk-LC56R53A.js → chunk-MU4LJFIV.js} +4 -4
- package/dist/hooks/{chunk-7VSZ2N4B.js → chunk-QL6QTPWN.js} +3 -3
- package/dist/hooks/{chunk-TT742SIO.js → chunk-XER6SSIB.js} +92 -19
- package/dist/hooks/{chunk-2X2ART5G.js → chunk-YW452ZAX.js} +500 -29
- package/dist/hooks/{chunk-6AC4C2IO.js → chunk-YZXYOAZ3.js} +187 -443
- package/dist/hooks/codex-hook-adapter.js +15 -15
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +262 -201
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +14 -14
- package/dist/hooks/session-lang.js +124 -15
- package/dist/hooks/stop-guard.js +98 -55
- package/dist/josh.js +63 -10
- package/package.json +4 -3
- package/prompts/review.md +22 -0
- package/scripts/agent/claude-agent-argv.ts +13 -1
- package/scripts/auth/auth-setup-cli.ts +101 -0
- package/scripts/auth/claude-token-output.ts +78 -0
- package/scripts/auth/claude-token.ts +68 -0
- package/scripts/backlog/backlog-drive-cli.ts +2 -4
- package/scripts/backlog/backlog-drive-epic.ts +24 -8
- package/scripts/backlog/backlog-drive-launch.ts +5 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +7 -2
- package/scripts/backlog/backlog-drive-named.ts +4 -2
- package/scripts/backlog/backlog-drive-owner.ts +72 -5
- package/scripts/backlog/backlog-drive-unread.ts +56 -0
- package/scripts/backlog/backlog-drive.ts +16 -8
- package/scripts/backlog/backlog-overlap.ts +22 -5
- package/scripts/backlog/backlog-ready.ts +1 -3
- package/scripts/backlog/backlogrun-args.ts +13 -2
- package/scripts/backlog/backlogrun-cli.ts +91 -19
- package/scripts/backlog/backlogrun-launch.ts +80 -5
- package/scripts/backlog/backlogrun-replace.ts +166 -0
- package/scripts/backlog/backlogrun-stop.ts +178 -0
- package/scripts/behavior/behavior-cli.ts +6 -1
- package/scripts/doctor/doctor-io.ts +60 -9
- package/scripts/doctor/doctor.ts +20 -1
- package/scripts/document/document-byte-budget.ts +3 -3
- package/scripts/epic/epic-bundle-cli.ts +8 -8
- package/scripts/epic/epic-bundle-referenced.ts +2 -5
- package/scripts/epic/epic-bundle.ts +39 -4
- package/scripts/exports/unused-members-cli.ts +2 -1
- package/scripts/followup/followup-checks-event.ts +82 -0
- package/scripts/followup/git-followup-finish.ts +16 -2
- package/scripts/followup/git-followup-workflow.ts +5 -2
- package/scripts/followup/git-pr-followup-checks.ts +18 -4
- package/scripts/followup/git-pr-followup-wrapup.ts +5 -0
- package/scripts/followup/git-pr-followup.ts +4 -1
- package/scripts/fresh-machine/fresh-machine-cli.ts +204 -0
- package/scripts/fresh-machine/fresh-machine-docker.ts +65 -0
- package/scripts/fresh-machine/fresh-machine-image.ts +62 -0
- package/scripts/fresh-machine/fresh-machine-log.ts +61 -0
- package/scripts/fresh-machine/fresh-machine-patterns.ts +130 -0
- package/scripts/fresh-machine/fresh-machine-run.ts +215 -0
- package/scripts/fresh-machine/fresh-machine-script.ts +45 -0
- package/scripts/fresh-machine/fresh-machine-spec.ts +57 -0
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +34 -0
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +31 -0
- package/scripts/gate/gate-report.ts +70 -15
- package/scripts/gate/project-checks.ts +13 -2
- package/scripts/gate/scoped-green.ts +2 -1
- package/scripts/gate/verification-gate.ts +4 -3
- package/scripts/gh/gh-author-association.ts +14 -0
- package/scripts/gh/git-gh-conditional.ts +66 -0
- package/scripts/gh/git-gh-exec.ts +1 -1
- package/scripts/gh/git-gh-issue-read.ts +6 -3
- package/scripts/gh/git-gh-issue-write.ts +5 -1
- package/scripts/gh/git-gh-issue.ts +4 -1
- package/scripts/gh/git-pr-checks-eval.ts +13 -0
- package/scripts/gh/git-pr-checks-parse.ts +8 -1
- package/scripts/gh/git-pr-checks-watch.ts +11 -4
- package/scripts/gh/git-pr-checks.ts +36 -2
- package/scripts/git/git-command.ts +16 -4
- package/scripts/git/git-schemas.ts +1 -0
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/hooks/pretool-guard.ts +3 -1
- package/scripts/init/hook-command-rewrite.ts +31 -0
- package/scripts/init/init-actions.ts +4 -1
- package/scripts/init/init-ai-copy.ts +33 -10
- package/scripts/init/init-basic.ts +8 -3
- package/scripts/init/init-logic-toolchain.ts +76 -0
- package/scripts/init/init-logic.ts +2 -0
- package/scripts/init/init.ts +5 -23
- package/scripts/init/project-profile.ts +36 -7
- package/scripts/init/start-exec.ts +27 -1
- package/scripts/init/start-plan.ts +30 -4
- package/scripts/init/start-steps.ts +77 -3
- package/scripts/init/start.ts +21 -13
- package/scripts/init/workflow-mark.ts +35 -0
- package/scripts/issue/issue-ack-cli.ts +84 -0
- package/scripts/issue/issue-labels.ts +40 -8
- package/scripts/issue/issue-state-cli.ts +14 -4
- package/scripts/issue/issue-watch-diff.ts +152 -0
- package/scripts/issue/issue-watch-gate.ts +81 -0
- package/scripts/issue/issue-watch-hook.ts +54 -0
- package/scripts/issue/issue-watch.ts +240 -0
- package/scripts/issue/measure-rerun-cli.ts +3 -4
- package/scripts/josh/josh-command-map.ts +4 -0
- package/scripts/josh/josh-commands-backlog.ts +2 -2
- package/scripts/josh/josh-commands-development.ts +1 -1
- package/scripts/josh/josh-commands-issue.ts +7 -0
- package/scripts/josh/josh-commands-lane.ts +11 -2
- package/scripts/josh/josh-commands-project.ts +25 -1
- package/scripts/josh/josh-verdict.ts +33 -4
- package/scripts/lane/claude-lane-broker.ts +142 -0
- package/scripts/lane/lane-await.ts +6 -2
- package/scripts/lane/lane-cache.ts +37 -7
- package/scripts/lane/lane-capacity.ts +8 -6
- package/scripts/lane/lane-child-invocation.ts +1 -0
- package/scripts/lane/lane-cli.ts +15 -1
- package/scripts/lane/lane-close.ts +15 -6
- package/scripts/lane/lane-dispatch.ts +36 -10
- package/scripts/lane/lane-environment.ts +1 -1
- package/scripts/lane/lane-launch-cli.ts +13 -4
- package/scripts/lane/lane-ledger.ts +21 -3
- package/scripts/lane/lane-measure-cli.ts +10 -2
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-preserve.ts +49 -0
- package/scripts/lane/lane-reap.ts +20 -5
- package/scripts/lane/lane-registry.ts +6 -0
- package/scripts/lane/lane-restart-cli.ts +51 -0
- package/scripts/lane/lane-restart.ts +175 -0
- package/scripts/lane/{openai-review-broker.ts → lane-session-broker.ts} +106 -28
- package/scripts/lane/lane-spent.ts +195 -0
- package/scripts/lane/lane-stage-stats.ts +27 -3
- package/scripts/lane/lane-stop-stats.ts +96 -0
- package/scripts/lane/openai-lane-supervisor.ts +2 -2
- package/scripts/lane/process-tools.ts +31 -0
- package/scripts/lib/buffered-process.ts +36 -2
- package/scripts/lib/pnpm-reach.ts +27 -0
- package/scripts/lib/status-icons.ts +5 -1
- package/scripts/lint/lint-parallel.ts +19 -2
- package/scripts/observations/observation-ledger-home.ts +1 -0
- package/scripts/review/review-attest-cli.ts +21 -6
- package/scripts/review/review-brief-cli.ts +2 -2
- package/scripts/review/review-comment-round.ts +114 -0
- package/scripts/review/review-record-cli.ts +39 -17
- package/scripts/rules/implementation-cut.ts +3 -3
- package/scripts/rules/pre-gate-cut.ts +1 -1
- package/scripts/run/board/run-board-checks.ts +42 -0
- package/scripts/run/board/run-board-cli.ts +2 -0
- package/scripts/run/board/run-board-every.ts +3 -1
- package/scripts/run/board/run-board-fit.ts +16 -5
- package/scripts/run/board/run-board-fresh.ts +64 -0
- package/scripts/run/board/run-board-header.ts +139 -37
- package/scripts/run/board/run-board-labels.ts +47 -4
- package/scripts/run/board/run-board-lane-event.ts +66 -0
- package/scripts/run/board/run-board-layout.ts +57 -9
- package/scripts/run/board/run-board-now.ts +234 -0
- package/scripts/run/board/run-board-operation-read.ts +75 -0
- package/scripts/run/board/run-board-operation.ts +150 -0
- package/scripts/run/board/run-board-phase.ts +26 -1
- package/scripts/run/board/run-board-plan.ts +4 -6
- package/scripts/run/board/run-board-read.ts +58 -5
- package/scripts/run/board/run-board-reason.ts +124 -0
- package/scripts/run/board/run-board-render-checks.ts +55 -0
- package/scripts/run/board/run-board-render-legend.ts +12 -3
- package/scripts/run/board/run-board-render-slot.ts +2 -2
- package/scripts/run/board/run-board-render-tail.ts +128 -0
- package/scripts/run/board/run-board-render-thanks.ts +50 -0
- package/scripts/run/board/run-board-render-title.ts +58 -0
- package/scripts/run/board/run-board-render.ts +96 -80
- package/scripts/run/board/run-board-row-yield.ts +32 -0
- package/scripts/run/board/run-board-setup.ts +121 -0
- package/scripts/run/board/run-board-span.ts +49 -7
- package/scripts/run/board/run-board-state.ts +10 -0
- package/scripts/run/board/run-board-status.ts +76 -13
- package/scripts/run/board/run-board-thanks-csv.ts +71 -0
- package/scripts/run/board/run-board-thanks-read.ts +112 -0
- package/scripts/run/board/run-board-thanks.ts +53 -0
- package/scripts/run/board/run-board-tick.ts +53 -16
- package/scripts/run/board/run-board-usual.ts +44 -0
- package/scripts/run/carry/run-carry-added.ts +1 -1
- package/scripts/run/carry/run-carry-args.ts +9 -1
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +39 -52
- package/scripts/run/carry/run-carry-end.ts +73 -0
- package/scripts/run/carry/run-carry-ended.ts +9 -1
- package/scripts/run/carry/run-carry.ts +24 -1
- package/scripts/run/entry/run-entry-cli.ts +5 -0
- package/scripts/run/event/run-event-checks.ts +54 -0
- package/scripts/run/event/run-event-render.ts +3 -0
- package/scripts/run/event/run-event-scope.ts +1 -0
- package/scripts/run/event/run-event-setup.ts +91 -0
- package/scripts/run/event/run-event-stream.ts +46 -9
- package/scripts/run/merge/run-merge-cli.ts +7 -4
- package/scripts/run/merge/run-merge-ship.ts +61 -0
- package/scripts/run/merge/run-merge-steps.ts +7 -14
- package/scripts/run/merge/run-merge-token.ts +16 -2
- package/scripts/run/run-headless.ts +1 -0
- package/scripts/run/run-step.ts +2 -0
- package/scripts/run/run-stranded-detect.ts +58 -12
- package/scripts/run/ship/run-ship-cli.ts +22 -2
- package/scripts/run/ship/run-ship-return.ts +31 -13
- package/scripts/run/ship/run-ship-review-steps.ts +17 -4
- package/scripts/run/ship/run-ship-stage.ts +1 -0
- package/scripts/run/wake/run-wake-await.ts +130 -0
- package/scripts/run/wake/run-wake-cli.ts +108 -74
- package/scripts/run/wake/run-wake-describe.ts +36 -2
- package/scripts/run/wake/run-wake-driver.ts +21 -5
- package/scripts/run/wake/run-wake-handoff.ts +1 -1
- package/scripts/run/wake/run-wake-session.ts +20 -3
- package/scripts/run/wake/run-wake-stop.ts +37 -0
- package/scripts/run/wake/run-wake-supervise.ts +44 -0
- package/scripts/sync/claude-settings-merge.ts +144 -0
- package/scripts/sync/sync-ai-files.ts +28 -3
- package/scripts/sync/sync.ts +15 -0
- package/scripts/test/project-test-script.ts +73 -0
- package/scripts/test/skip-marker.ts +14 -1
- package/scripts/test/test-related.ts +3 -2
- package/scripts/test/test-unit-guard.ts +78 -14
- package/scripts/time-runtime/time-reported-failure.ts +11 -3
- package/scripts/uninstall/distributed-files.ts +92 -0
- package/scripts/uninstall/uninstall-plan.ts +119 -0
- package/scripts/uninstall/uninstall-report.ts +61 -0
- package/scripts/uninstall/uninstall.ts +206 -0
- package/templates/AGENTS.basic.md +4 -0
- package/templates/GEMINI.basic.md +6 -0
- package/dist/hooks/chunk-6V5OPIUU.js +0 -13
- 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
|
-
|
|
10
|
-
|
|
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-
|
|
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-
|
|
23
|
+
} from "./chunk-3LE6VLSR.js";
|
|
20
24
|
import {
|
|
21
25
|
stamp_file
|
|
22
|
-
} from "./chunk-
|
|
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
|
|
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,
|
|
352
|
-
const
|
|
353
|
-
|
|
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
|
-
|
|
493
|
+
pending_launch,
|
|
494
|
+
start,
|
|
495
|
+
started_for,
|
|
496
|
+
stop_parent
|
|
388
497
|
};
|
|
389
498
|
|
|
390
499
|
// scripts/josh/session-language-cli.ts
|
package/dist/hooks/stop-guard.js
CHANGED
|
@@ -3,9 +3,8 @@ import {
|
|
|
3
3
|
RUN_LANE_LABEL,
|
|
4
4
|
RUN_SOLO_LABEL,
|
|
5
5
|
filing_cap,
|
|
6
|
-
|
|
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-
|
|
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
|
-
|
|
29
|
-
|
|
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-
|
|
29
|
+
} from "./chunk-723HKZO5.js";
|
|
33
30
|
import "./chunk-CDY4NFQG.js";
|
|
34
31
|
import {
|
|
35
32
|
hook_decision
|
|
36
|
-
} from "./chunk-
|
|
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-
|
|
38
|
+
} from "./chunk-XER6SSIB.js";
|
|
42
39
|
import {
|
|
43
40
|
lane_child_marker
|
|
44
|
-
} from "./chunk-
|
|
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-
|
|
50
|
+
} from "./chunk-3LE6VLSR.js";
|
|
54
51
|
import {
|
|
55
|
-
PROJECT_ROOT,
|
|
56
52
|
stamp_file
|
|
57
|
-
} from "./chunk-
|
|
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 =
|
|
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
|
-
|
|
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/
|
|
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:
|
|
988
|
-
started_at:
|
|
989
|
-
woke:
|
|
990
|
-
woke_at:
|
|
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:
|
|
993
|
-
woke_pid:
|
|
994
|
-
spawned:
|
|
995
|
-
idle_since:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"[
|
|
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,
|
|
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
|
|
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
|
-
|
|
1918
|
-
|
|
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 (
|
|
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.
|
|
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.
|
|
288
|
+
"zod": "^4.6.6"
|
|
288
289
|
},
|
|
289
290
|
"devEngines": {
|
|
290
291
|
"packageManager": {
|
|
291
292
|
"name": "pnpm",
|
|
292
|
-
"version": "12.12.
|
|
293
|
+
"version": "12.12.1+sha512.b7f98934c0b1f29a65f5da52f2d7f994e7faad573ffdddea1497fb4dcb5aec051590ee7c7d95a38172b4bfae103a5b83edf2ee866e11731c2cafa96063610ac5",
|
|
293
294
|
"onFail": "download"
|
|
294
295
|
}
|
|
295
296
|
},
|