@brainervirus/workit-cli 8.38.0 → 8.38.2

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/README.md CHANGED
@@ -17,6 +17,8 @@ workit help # every verb; `workit help <verb>` for one
17
17
  ```
18
18
 
19
19
  Or run once without installing: `npx @brainervirus/workit-cli init`.
20
+ `workit upgrade` updates the CLI and every host together (`--preview` only
21
+ looks).
20
22
 
21
23
  Agents and hooks call `workit` from PATH. `workit doctor` warns (`workit_on_path`)
22
24
  when none is found, when it does not run, or when it is older than an installed
package/dist/index.js CHANGED
@@ -9317,7 +9317,7 @@ var package_default;
9317
9317
  var init_package = __esm(() => {
9318
9318
  package_default = {
9319
9319
  name: "@brainervirus/workit-cli",
9320
- version: "8.38.0",
9320
+ version: "8.38.2",
9321
9321
  private: false,
9322
9322
  description: "Workit CLI — setup wizard, doctor, and task control for agentic coding workflows",
9323
9323
  keywords: [
@@ -9355,13 +9355,13 @@ var init_package = __esm(() => {
9355
9355
  },
9356
9356
  dependencies: {
9357
9357
  "@babel/parser": "7.29.9",
9358
- "@brainervirus/workit-cursor": "^8.38.0",
9358
+ "@brainervirus/workit-cursor": "^8.38.2",
9359
9359
  "@inkjs/ui": "2.0.0",
9360
9360
  ink: "7.1.1",
9361
9361
  react: "19.2.8"
9362
9362
  },
9363
9363
  devDependencies: {
9364
- "@brainervirus/workit-core": "^8.38.0"
9364
+ "@brainervirus/workit-core": "^8.38.2"
9365
9365
  },
9366
9366
  engines: {
9367
9367
  node: ">=24"
@@ -69625,8 +69625,8 @@ var TOKEN_PLACEHOLDER2 = "YOUR_TOKEN_HERE", findDevFromCwd = (cwd) => {
69625
69625
  return `${minutes} min ago`;
69626
69626
  const hours = Math.round(minutes / 60);
69627
69627
  return hours < 48 ? `${hours} h ago` : `${Math.round(hours / 24)} d ago`;
69628
- }, checkHookRuns = (res) => {
69629
- const runs = readHookRuns(res.hookStateDir).filter((run) => run.event === "PreToolUse" || run.event === "SessionStart");
69628
+ }, HOOK_RUN_BASELINE, checkHookRuns = (res) => {
69629
+ const runs = readHookRuns(res.hookStateDir);
69630
69630
  if (runs.length === 0)
69631
69631
  return {
69632
69632
  id: "hook_runs",
@@ -69636,7 +69636,8 @@ var TOKEN_PLACEHOLDER2 = "YOUR_TOKEN_HERE", findDevFromCwd = (cwd) => {
69636
69636
  const now = Date.now();
69637
69637
  const hosts = [...new Set(runs.map((run) => run.host))].toSorted();
69638
69638
  const parts = hosts.map((host) => {
69639
- const seen = ["SessionStart", "PreToolUse"].map((event) => {
69639
+ const others = runs.filter((run) => run.host === host && !HOOK_RUN_BASELINE.includes(run.event)).map((run) => run.event).toSorted();
69640
+ const seen = [...HOOK_RUN_BASELINE, ...new Set(others)].map((event) => {
69640
69641
  const run = runs.find((r) => r.host === host && r.event === event);
69641
69642
  return `${event} ${run ? `${ago(now - Date.parse(run.at))} (${run.count})` : "never"}`;
69642
69643
  });
@@ -69703,6 +69704,7 @@ var init_doctor = __esm(() => {
69703
69704
  DAY_MS = 24 * 60 * 60 * 1000;
69704
69705
  SEMVER = /\d+\.\d+\.\d+/;
69705
69706
  workitVersions = new Map;
69707
+ HOOK_RUN_BASELINE = ["SessionStart", "PreToolUse"];
69706
69708
  RUN_CHECKS = [
69707
69709
  checkRuntime,
69708
69710
  checkVersions,
@@ -86256,7 +86258,7 @@ async function merge3(argv, io) {
86256
86258
  const cleanup = result.data.deletedBranch === true ? cleanupMergedBranch(io.cwd, result.data.branch, result.data.head) : null;
86257
86259
  return emit(io, ok2({ ...result.data, localCleanup: cleanup }), (data) => [
86258
86260
  `merged ${connected.data.forge.kind === "github" ? "PR #" : "MR !"}${data.number} (${data.method}) at head ${data.head.slice(0, 12)}${data.mergeSha ? ` -> ${data.mergeSha.slice(0, 12)}` : ""}`,
86259
- data.unverified ? `UNVERIFIED: merged without a verdict (--unverified: ${data.unverified.reason}); ledger ${data.unverified.recorded}` : `verdict ${data.verdict.verdictId ?? "?"} accepted for that head${data.verdict.cover ? ` (stack verdict on ${data.verdict.cover.branch} @ ${data.verdict.cover.head.slice(0, 12)})` : data.verdict.carry ? ` (${carryLabel(data.verdict.carry)})` : ""}`,
86261
+ data.unverified ? `UNVERIFIED: merged without a verdict (--unverified: ${data.unverified.reason}); ledger ${data.unverified.recorded}` : mergedOnLine(data.verdict),
86260
86262
  ...data.baseCi.note ? [data.baseCi.note] : [],
86261
86263
  ...data.mergeBack.length ? [
86262
86264
  `merge back: ${data.base} is the ${data.mergeBackTrack} production branch; bring it into ${data.mergeBack.join(", ")}`
@@ -86424,7 +86426,15 @@ async function run15(argv, io) {
86424
86426
  return reply(rest, io);
86425
86427
  return usage4(io, sub && !sub.startsWith("-") ? `unknown pr subcommand "${sub}"` : "missing pr subcommand", USAGE9);
86426
86428
  }
86427
- var STATUS_USAGE = "workit pr status [--pr <n> | --branch <b>] [--log-lines 60] [--json]", CREATE_USAGE = "workit pr create [--base <b> | --track <t>] (--title <t> [--body <text> | --body-file <f|->] | --fill) [--issue <#n|ID|url>]… [--refs] [--label <l>]… [--reviewer <login>]… [--draft] [--json]", MERGE_USAGE = "workit pr merge [--pr <n>] [--squash|--merge|--rebase | --method squash|merge|rebase] [--subject <s>] [--body <b> | --body-file <f|->] [--delete-branch | --keep-branch] [--unverified --reason <why>] [--base-red-ok --reason <why>] [--json]", READY_USAGE = "workit pr ready [--pr <n>] [--undo] [--json]", EDIT_USAGE = "workit pr edit [--pr <n>] [--title <t>] [--body-file <f|->] [--add-label <l>]… [--remove-label <l>]… [--add-reviewer <login>]… [--base <b>] [--json]", THREADS_USAGE = "workit pr threads [--pr <n>] [--json]", REPLY_USAGE = "workit pr reply [--pr <n>] --thread <id> [--body-file <f|->] [--resolve] [--json]", USAGE9 = "workit pr status|create|merge|ready|edit|threads|reply ... (workit help pr)", prLabel = (kind, number) => `${kind === "github" ? "PR #" : "MR !"}${number}`, NEED_TEXT, mergedVerdictLine = (landed) => landed === "untracked" ? "merged outside workit (no merge record)" : landed.unverified ? `merged unverified at ${(landed.head ?? "?").slice(0, 12)} (recorded bypass)` : landed.lane === "none" && !landed.verdictId ? `merged at ${(landed.head ?? "?").slice(0, 12)} with no verdict (lane none)` : landed.review === "self-reviewed" ? `merged self-reviewed (lane self) with the author's verdict ${landed.verdictId ?? "?"} at ${(landed.head ?? "?").slice(0, 12)}` : `merged with accepted verdict ${landed.verdictId ?? "?"} at ${(landed.head ?? "?").slice(0, 12)}${landed.intentOnly ? " (merge intent recorded; the merge call itself failed)" : ""}`, acceptedHow = (verdict) => verdict.cover ? `stack verdict ${verdict.cover.verdictId} on ${verdict.cover.branch} @ ${verdict.cover.head.slice(0, 12)}` : verdict.carry ? carryLabel(verdict.carry) : verdict.basis, METHODS2;
86429
+ var STATUS_USAGE = "workit pr status [--pr <n> | --branch <b>] [--log-lines 60] [--json]", CREATE_USAGE = "workit pr create [--base <b> | --track <t>] (--title <t> [--body <text> | --body-file <f|->] | --fill) [--issue <#n|ID|url>]… [--refs] [--label <l>]… [--reviewer <login>]… [--draft] [--json]", MERGE_USAGE = "workit pr merge [--pr <n>] [--squash|--merge|--rebase | --method squash|merge|rebase] [--subject <s>] [--body <b> | --body-file <f|->] [--delete-branch | --keep-branch] [--unverified --reason <why>] [--base-red-ok --reason <why>] [--json]", READY_USAGE = "workit pr ready [--pr <n>] [--undo] [--json]", EDIT_USAGE = "workit pr edit [--pr <n>] [--title <t>] [--body-file <f|->] [--add-label <l>]… [--remove-label <l>]… [--add-reviewer <login>]… [--base <b>] [--json]", THREADS_USAGE = "workit pr threads [--pr <n>] [--json]", REPLY_USAGE = "workit pr reply [--pr <n>] --thread <id> [--body-file <f|->] [--resolve] [--json]", USAGE9 = "workit pr status|create|merge|ready|edit|threads|reply ... (workit help pr)", prLabel = (kind, number) => `${kind === "github" ? "PR #" : "MR !"}${number}`, NEED_TEXT, mergedVerdictLine = (landed) => landed === "untracked" ? "merged outside workit (no merge record)" : landed.unverified ? `merged unverified at ${(landed.head ?? "?").slice(0, 12)} (recorded bypass)` : landed.lane === "none" && !landed.verdictId ? `merged at ${(landed.head ?? "?").slice(0, 12)} with no verdict (lane none)` : landed.review === "self-reviewed" ? `merged self-reviewed (lane self) with the author's verdict ${landed.verdictId ?? "?"} at ${(landed.head ?? "?").slice(0, 12)}` : `merged with accepted verdict ${landed.verdictId ?? "?"} at ${(landed.head ?? "?").slice(0, 12)}${landed.intentOnly ? " (merge intent recorded; the merge call itself failed)" : ""}`, mergedOnLine = (verdict) => {
86430
+ if (verdict.review === "self-reviewed")
86431
+ return `self-reviewed (lane ${verdict.lane}): the author's verdict ${verdict.verdictId ?? "?"}; no independent verdict accepted for that head`;
86432
+ if (!verdict.verdictId)
86433
+ return `no verdict required (lane ${verdict.lane})`;
86434
+ if (!verdict.accepted && !verdict.cover && !verdict.carry)
86435
+ return `verdict ${verdict.verdictId} satisfied lane ${verdict.lane}; not an accepted independent verdict for that head`;
86436
+ return `verdict ${verdict.verdictId} accepted for that head${verdict.cover ? ` (stack verdict on ${verdict.cover.branch} @ ${verdict.cover.head.slice(0, 12)})` : verdict.carry ? ` (${carryLabel(verdict.carry)})` : ""}`;
86437
+ }, acceptedHow = (verdict) => verdict.cover ? `stack verdict ${verdict.cover.verdictId} on ${verdict.cover.branch} @ ${verdict.cover.head.slice(0, 12)}` : verdict.carry ? carryLabel(verdict.carry) : verdict.basis, METHODS2;
86428
86438
  var init_pr = __esm(() => {
86429
86439
  init_autonomy();
86430
86440
  init_issue_link();
@@ -89527,6 +89537,8 @@ async function run22(argv, io) {
89527
89537
  if (rest.length !== 1)
89528
89538
  return usage5(io, `ledger verdict takes one result: ${VERDICT_RESULTS.join("|")}`);
89529
89539
  const claimed = values.self === true ? null : claimedSession(acting);
89540
+ if (values.self !== true && claimed === null)
89541
+ return emit(io, fail2("blocked", NO_SESSION_ERROR, { unblock: NO_SESSION_UNBLOCK }));
89530
89542
  const token = values.token ?? io.env.WORKIT_SESSION_TOKEN ?? null;
89531
89543
  const refusal = claimed === null ? null : sessionClaimRefusal(io.env, claimed, io.cwd, { token, flag: acting.source === "flag" });
89532
89544
  if (refusal)
@@ -89641,7 +89653,7 @@ var USAGE15 = "workit ledger decision|ruling|verdict|standing|list|check ... (wo
89641
89653
  };
89642
89654
  }
89643
89655
  return { actor, source: "env" };
89644
- }, claimedSession = (acting) => acting.source === "as" ? acting.derivedFrom ?? null : acting.actor.session, positiveInt2 = (value, flag) => {
89656
+ }, NO_SESSION_ERROR = "no_session: this verdict cannot bind a host session (WORKIT_SESSION_ID is unset or empty and no --session was named), so it would be stored as a self verdict that no gate accepts; nothing was recorded", NO_SESSION_UNBLOCK = "a Claude Code verifier or reviewer passes exactly the `--session <lead>:<agent id> --token=<token>` its SubagentStart hook put in its context; none there means that hook did not bind it (check `workit doctor`: hook_runs lists SubagentStart, hook_issued_sessions passes), so the lead spawns a fresh workit:verifier or workit:reviewer. On Codex, OpenCode and Pi record from the agent's own shell, where the host sets its session. The author records `--self` instead (never accepted as independent)", claimedSession = (acting) => acting.source === "as" ? acting.derivedFrom ?? null : acting.actor.session, positiveInt2 = (value, flag) => {
89645
89657
  if (value === undefined)
89646
89658
  return;
89647
89659
  const parsed = Number(value);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainervirus/workit-cli",
3
- "version": "8.38.0",
3
+ "version": "8.38.2",
4
4
  "private": false,
5
5
  "description": "Workit CLI — setup wizard, doctor, and task control for agentic coding workflows",
6
6
  "keywords": [
@@ -38,13 +38,13 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@babel/parser": "7.29.9",
41
- "@brainervirus/workit-cursor": "^8.38.0",
41
+ "@brainervirus/workit-cursor": "^8.38.2",
42
42
  "@inkjs/ui": "2.0.0",
43
43
  "ink": "7.1.1",
44
44
  "react": "19.2.8"
45
45
  },
46
46
  "devDependencies": {
47
- "@brainervirus/workit-core": "^8.38.0"
47
+ "@brainervirus/workit-core": "^8.38.2"
48
48
  },
49
49
  "engines": {
50
50
  "node": ">=24"