@brainervirus/workit-claude-code 8.34.0 → 8.35.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "workit",
3
3
  "displayName": "Workit",
4
- "version": "8.34.0",
4
+ "version": "8.35.0",
5
5
  "description": "Workflow rails for agentic coding: task context on every session, branch policy on shell commands, and the workit method skills",
6
6
  "author": {
7
7
  "name": "BrainerVirus"
package/dist/workit.js CHANGED
@@ -9286,7 +9286,7 @@ var package_default;
9286
9286
  var init_package = __esm(() => {
9287
9287
  package_default = {
9288
9288
  name: "@brainervirus/workit-cli",
9289
- version: "8.34.0",
9289
+ version: "8.35.0",
9290
9290
  private: false,
9291
9291
  description: "Workit CLI — setup wizard, doctor, and task control for agentic coding workflows",
9292
9292
  keywords: [
@@ -9324,13 +9324,13 @@ var init_package = __esm(() => {
9324
9324
  },
9325
9325
  dependencies: {
9326
9326
  "@babel/parser": "7.29.9",
9327
- "@brainervirus/workit-cursor": "^8.34.0",
9327
+ "@brainervirus/workit-cursor": "^8.35.0",
9328
9328
  "@inkjs/ui": "2.0.0",
9329
9329
  ink: "7.1.1",
9330
9330
  react: "19.2.8"
9331
9331
  },
9332
9332
  devDependencies: {
9333
- "@brainervirus/workit-core": "^8.34.0"
9333
+ "@brainervirus/workit-core": "^8.35.0"
9334
9334
  },
9335
9335
  engines: {
9336
9336
  node: ">=24"
@@ -80235,6 +80235,22 @@ function implicitDeleteSkip(cwd, resolved, doc, branch) {
80235
80235
  return `open PR ${children.data.map((n) => `#${n}`).join(", ")} targets ${branch} (a stack)`;
80236
80236
  return null;
80237
80237
  }
80238
+ function baseCiState(cwd, resolved, base) {
80239
+ if (!isProtectedTarget(cwd, base))
80240
+ return { ok: true, note: null };
80241
+ const read = resolved.forge.branchChecks(base);
80242
+ if (!read.ok)
80243
+ return { ok: true, note: `base ${base} CI not read (${read.error}); merging anyway` };
80244
+ const { requiredKnown } = read.data;
80245
+ const failing = read.data.checks.filter((check) => check.state === "failing" && (requiredKnown ? check.required === true : check.required !== false && check.conclusion === "failure"));
80246
+ if (failing.length)
80247
+ return { ok: false, failing, sha: read.data.sha, requiredKnown };
80248
+ const pending = read.data.checks.filter((check) => check.state === "pending");
80249
+ return {
80250
+ ok: true,
80251
+ note: pending.length ? `base ${base} CI is still running (${pending.map((check) => check.name).join(", ")}); merging without waiting` : null
80252
+ };
80253
+ }
80238
80254
  async function mergePullRequest(cwd, resolved, input, sleep) {
80239
80255
  const grant = requireGrant(cwd, "merge");
80240
80256
  if (!grant.allowed)
@@ -80244,6 +80260,9 @@ async function mergePullRequest(cwd, resolved, input, sleep) {
80244
80260
  return failure3("invalid_input", "--unverified needs --reason <why the user asked for it>");
80245
80261
  if (bypass && !grant.allowUnverified)
80246
80262
  return refuse(`unverified_refused: workspace ${grant.workspace ? `"${grant.workspace}"` : "(none)"} grants merge: "verified", which never merges without an accepted independent verdict`, "a non-author session verifies the head (workit-review), then merge without --unverified", { reason: "unverified_refused" });
80263
+ const baseRed = input.baseRedOk ?? null;
80264
+ if (baseRed && !baseRed.reason.trim())
80265
+ return failure3("invalid_input", "--base-red-ok needs --reason <why merging onto a red base is fine>");
80247
80266
  const number = selectPr(cwd, resolved, { pr: input.pr });
80248
80267
  if (!number.ok)
80249
80268
  return number;
@@ -80328,6 +80347,15 @@ async function mergePullRequest(cwd, resolved, input, sleep) {
80328
80347
  const lane = gate.verification === "proportional" ? `, ${laneLabel(gate)}` : "";
80329
80348
  return refuse(gate.need === "self" ? `NEEDS_VERDICT: ${label} has no verdict for ${head.slice(0, 12)}${lane}: the author's own --self verdict is enough (${check.accepted.reasons.join(", ")})` : `NEEDS_VERDICT: ${label} has no accepted independent verdict for ${head.slice(0, 12)}${lane} (${check.accepted.reasons.join(", ")})`, gate.need === "self" ? `after an observed passing \`workit check test\`, the author runs: workit ledger verdict tests-verified --self --how "<what you ran>" --branch ${branch} (or a verifier records one)${bypassHint}` : `an independent session verifies the head and runs: workit ledger verdict verified --how "<what was exercised>" --branch ${branch}${bypassHint}`, { reason: "needs_verdict", verdict: summary });
80330
80349
  }
80350
+ const baseCi = baseCiState(cwd, resolved, doc.base);
80351
+ let baseRedOverride = null;
80352
+ if (!baseCi.ok) {
80353
+ const names = baseCi.failing.map((failed) => failed.name).join(", ");
80354
+ const url = baseCi.failing.find((failed) => failed.url)?.url ?? null;
80355
+ if (!baseRed)
80356
+ return refuse(`base_red: ${doc.base} at ${baseCi.sha?.slice(0, 12) ?? "its head"} has failing CI (${names}${baseCi.requiredKnown ? "" : "; the required checks could not be read, so every failed check counts"})${url ? `: ${url}` : ""}; merging ${label} onto it would land on a red base`, `fix ${doc.base} first, or, if the user accepts it: workit pr merge${input.pr ? ` --pr ${doc.number}` : ""} --base-red-ok --reason "<why>"`, { reason: "base_red", blockers: baseCi.failing.map((failed) => failed.name) });
80357
+ baseRedOverride = baseRed;
80358
+ }
80331
80359
  const squashMessage = squashMessageFor(cwd, resolved, input, doc);
80332
80360
  if (squashMessage && !squashMessage.ok)
80333
80361
  return squashMessage;
@@ -80343,6 +80371,7 @@ async function mergePullRequest(cwd, resolved, input, sleep) {
80343
80371
  review: verdict.review,
80344
80372
  lane: verdict.lane,
80345
80373
  ...unverified ? { unverified: unverified.recorded } : {},
80374
+ ...baseRedOverride ? { baseRedOk: baseRedOverride.reason } : {},
80346
80375
  grant: grant.source
80347
80376
  });
80348
80377
  if (!intent.ok)
@@ -80371,6 +80400,7 @@ async function mergePullRequest(cwd, resolved, input, sleep) {
80371
80400
  review: verdict.review,
80372
80401
  lane: verdict.lane,
80373
80402
  ...unverified ? { unverified: unverified.recorded } : {},
80403
+ ...baseRedOverride ? { baseRedOk: baseRedOverride.reason } : {},
80374
80404
  grant: grant.source,
80375
80405
  intent: intentId,
80376
80406
  verified: false
@@ -80427,6 +80457,10 @@ async function mergePullRequest(cwd, resolved, input, sleep) {
80427
80457
  mergeSha: merged.data.mergeSha,
80428
80458
  verdict,
80429
80459
  unverified,
80460
+ baseCi: {
80461
+ note: baseRedOverride ? `base ${doc.base} CI is red; merged anyway (--base-red-ok: ${baseRedOverride.reason})` : baseCi.ok ? baseCi.note : null,
80462
+ override: baseRedOverride
80463
+ },
80430
80464
  grant: { source: grant.source },
80431
80465
  deletedBranch,
80432
80466
  recorded,
@@ -82982,6 +83016,30 @@ function createGitHubForge(options) {
82982
83016
  };
82983
83017
  return success2(status);
82984
83018
  },
83019
+ branchChecks(branch) {
83020
+ const contexts = [];
83021
+ let sha = null;
83022
+ let cursor = null;
83023
+ for (let page = 1;page <= maxPages; page += 1) {
83024
+ const data = graphql(BRANCH_CHECKS_QUERY, { owner, name, ref: `refs/heads/${branch}`, contexts: cursor }, `checks on ${branch}`);
83025
+ if (!data.ok)
83026
+ return data;
83027
+ const commit = data.data.repository?.object ?? null;
83028
+ if (!commit)
83029
+ return failure3("not_found", `branch ${branch} was not found`);
83030
+ sha = commit.oid ?? sha;
83031
+ const rollup = commit.statusCheckRollup;
83032
+ if (!rollup)
83033
+ break;
83034
+ contexts.push(...rollup.contexts.nodes);
83035
+ if (!rollup.contexts.pageInfo.hasNextPage)
83036
+ break;
83037
+ cursor = rollup.contexts.pageInfo.endCursor;
83038
+ }
83039
+ const required = requiredContexts(branch);
83040
+ const checks = latestPerName(contexts.map(checkFromContext).filter((check) => check !== null)).map((check) => required ? { ...check, required: required.includes(check.context) } : check);
83041
+ return success2({ sha, checks, requiredKnown: required !== null });
83042
+ },
82985
83043
  jobLogTail(job, lines) {
82986
83044
  const text = apiText(runner, "gh", apiHost, ["api", `repos/${repo}/actions/jobs/${job.jobId}/logs`], `job ${job.jobId} log`, FORGE_TIMEOUTS.log);
82987
83045
  return text.ok ? success2(logTail(text.data, lines)) : text;
@@ -83179,7 +83237,7 @@ function createGitHubForge(options) {
83179
83237
  }
83180
83238
  };
83181
83239
  }
83182
- var GITHUB_MAX_PAGES = 10, PR_FIELDS = `number url state isDraft isInMergeQueue mergeable mergeStateStatus baseRefName baseRefOid baseRef { target { oid } } headRefName headRefOid reviewDecision`, THREADS = `reviewThreads(first: 100, after: $threads) { pageInfo { hasNextPage endCursor } nodes { id isResolved isOutdated path line comments(first: 1) { nodes { author { login __typename } body url } } } }`, CONTEXTS = `contexts(first: 100, after: $contexts) { pageInfo { hasNextPage endCursor } nodes { __typename ... on CheckRun { name status conclusion detailsUrl databaseId isRequired(pullRequestNumber: $number) checkSuite { workflowRun { databaseId workflow { name } } } } ... on StatusContext { context state targetUrl isRequired(pullRequestNumber: $number) } } }`, PR_STATUS_QUERY, FIND_PR_QUERY = `query($owner: String!, $name: String!, $head: String!) { repository(owner: $owner, name: $name) { pullRequests(headRefName: $head, first: 20, orderBy: { field: CREATED_AT, direction: DESC }) { nodes { number url state baseRefName headRefName headRefOid headRepositoryOwner { login } } } } }`, READY_MUTATION = `mutation($id: ID!) { markPullRequestReadyForReview(input: { pullRequestId: $id }) { pullRequest { isDraft } } }`, DRAFT_MUTATION = `mutation($id: ID!) { convertPullRequestToDraft(input: { pullRequestId: $id }) { pullRequest { isDraft } } }`, REPLY_MUTATION = `mutation($thread: ID!, $body: String!) { addPullRequestReviewThreadReply(input: { pullRequestReviewThreadId: $thread, body: $body }) { comment { url } } }`, RESOLVE_MUTATION = `mutation($thread: ID!) { resolveReviewThread(input: { threadId: $thread }) { thread { isResolved } } }`, THREAD_QUERY = `query($thread: ID!) { node(id: $thread) { ... on PullRequestReviewThread { isResolved pullRequest { number } } } }`, prState = (value) => value === "MERGED" ? "merged" : value === "CLOSED" ? "closed" : "open", FAILING2, safeUrl = (value) => value ? redactText(value) : null, encodeRef = (ref) => ref.split("/").map(encodeURIComponent).join("/");
83240
+ var GITHUB_MAX_PAGES = 10, PR_FIELDS = `number url state isDraft isInMergeQueue mergeable mergeStateStatus baseRefName baseRefOid baseRef { target { oid } } headRefName headRefOid reviewDecision`, THREADS = `reviewThreads(first: 100, after: $threads) { pageInfo { hasNextPage endCursor } nodes { id isResolved isOutdated path line comments(first: 1) { nodes { author { login __typename } body url } } } }`, CONTEXTS = `contexts(first: 100, after: $contexts) { pageInfo { hasNextPage endCursor } nodes { __typename ... on CheckRun { name status conclusion detailsUrl databaseId isRequired(pullRequestNumber: $number) checkSuite { workflowRun { databaseId workflow { name } } } } ... on StatusContext { context state targetUrl isRequired(pullRequestNumber: $number) } } }`, PR_STATUS_QUERY, FIND_PR_QUERY = `query($owner: String!, $name: String!, $head: String!) { repository(owner: $owner, name: $name) { pullRequests(headRefName: $head, first: 20, orderBy: { field: CREATED_AT, direction: DESC }) { nodes { number url state baseRefName headRefName headRefOid headRepositoryOwner { login } } } } }`, BRANCH_CHECKS_QUERY = `query($owner: String!, $name: String!, $ref: String!, $contexts: String) { repository(owner: $owner, name: $name) { object(expression: $ref) { ... on Commit { oid statusCheckRollup { contexts(first: 100, after: $contexts) { pageInfo { hasNextPage endCursor } nodes { __typename ... on CheckRun { name status conclusion detailsUrl databaseId checkSuite { workflowRun { databaseId workflow { name } } } } ... on StatusContext { context state targetUrl } } } } } } } }`, READY_MUTATION = `mutation($id: ID!) { markPullRequestReadyForReview(input: { pullRequestId: $id }) { pullRequest { isDraft } } }`, DRAFT_MUTATION = `mutation($id: ID!) { convertPullRequestToDraft(input: { pullRequestId: $id }) { pullRequest { isDraft } } }`, REPLY_MUTATION = `mutation($thread: ID!, $body: String!) { addPullRequestReviewThreadReply(input: { pullRequestReviewThreadId: $thread, body: $body }) { comment { url } } }`, RESOLVE_MUTATION = `mutation($thread: ID!) { resolveReviewThread(input: { threadId: $thread }) { thread { isResolved } } }`, THREAD_QUERY = `query($thread: ID!) { node(id: $thread) { ... on PullRequestReviewThread { isResolved pullRequest { number } } } }`, prState = (value) => value === "MERGED" ? "merged" : value === "CLOSED" ? "closed" : "open", FAILING2, safeUrl = (value) => value ? redactText(value) : null, encodeRef = (ref) => ref.split("/").map(encodeURIComponent).join("/");
83183
83241
  var init_github = __esm(() => {
83184
83242
  init_exec();
83185
83243
  init_redact();
@@ -83380,6 +83438,35 @@ function createGitLabForge(options) {
83380
83438
  };
83381
83439
  return success2(status);
83382
83440
  },
83441
+ branchChecks(branch) {
83442
+ const tip = baseTip(branch);
83443
+ if (!tip)
83444
+ return failure3("not_found", `branch ${branch} was not found`);
83445
+ const latest = apiJson(runner, "glab", apiHost, api(`${project}/pipelines?ref=${encodeURIComponent(branch)}&sha=${tip}&order_by=id&sort=desc&per_page=1`), `pipelines on ${branch}`);
83446
+ if (!latest.ok)
83447
+ return latest;
83448
+ const pipeline = Array.isArray(latest.data) ? latest.data[0] : undefined;
83449
+ if (!pipeline)
83450
+ return success2({ sha: tip, checks: [], requiredKnown: true });
83451
+ const scope = String(pipeline.project_id ?? encodeURIComponent(repo));
83452
+ const jobs = pages(`projects/${scope}/pipelines/${pipeline.id}/jobs`, `pipeline ${pipeline.id} jobs`);
83453
+ if (!jobs.ok)
83454
+ return jobs;
83455
+ const bridges = pages(`projects/${scope}/pipelines/${pipeline.id}/bridges`, `pipeline ${pipeline.id} bridges`);
83456
+ if (!bridges.ok)
83457
+ return bridges;
83458
+ const checks = [
83459
+ ...jobs.data.items.map((job) => checkFromJob(job, pipeline.id, scope)),
83460
+ ...bridges.data.items.map((bridge) => checkFromBridge(bridge, pipeline.id, scope))
83461
+ ];
83462
+ if (stateOf(pipeline.status, false) === "failing" && !checks.some((check) => check.state === "failing"))
83463
+ checks.push(pipelineCheck("failing", pipeline.status, {
83464
+ id: pipeline.id,
83465
+ project_id: pipeline.project_id ?? 0,
83466
+ web_url: pipeline.web_url
83467
+ }));
83468
+ return success2({ sha: tip, checks, requiredKnown: true });
83469
+ },
83383
83470
  jobLogTail(job, lines) {
83384
83471
  const scope = job.scope ?? encodeURIComponent(repo);
83385
83472
  const text = apiText(runner, "glab", apiHost, ["api", `projects/${scope}/jobs/${job.jobId}/trace`], `job ${job.jobId} trace`, FORGE_TIMEOUTS.log);
@@ -85487,6 +85574,7 @@ async function merge3(argv, io) {
85487
85574
  "delete-branch": "boolean",
85488
85575
  "keep-branch": "boolean",
85489
85576
  unverified: "boolean",
85577
+ "base-red-ok": "boolean",
85490
85578
  reason: "value",
85491
85579
  subject: "value",
85492
85580
  body: "value",
@@ -85494,7 +85582,11 @@ async function merge3(argv, io) {
85494
85582
  });
85495
85583
  if (typeof flags === "string")
85496
85584
  return usage4(io, flags, MERGE_USAGE);
85497
- const unverified = unverifiedFlag(flags);
85585
+ const baseRedOk = flags.booleans.has("base-red-ok");
85586
+ const baseRedReason = flags.values.reason?.trim();
85587
+ if (baseRedOk && !baseRedReason)
85588
+ return usage4(io, "--base-red-ok needs --reason <why merging onto a red base is fine>", MERGE_USAGE);
85589
+ const unverified = baseRedOk && !flags.booleans.has("unverified") ? null : unverifiedFlag(flags);
85498
85590
  if (typeof unverified === "string")
85499
85591
  return usage4(io, unverified, MERGE_USAGE);
85500
85592
  if (flags.positionals.length)
@@ -85536,6 +85628,7 @@ async function merge3(argv, io) {
85536
85628
  implicitDelete: !flags.booleans.has("keep-branch") && workspaceDeleteBranch(io.cwd),
85537
85629
  actor: actorFromEnv(io.env),
85538
85630
  ...unverified ? { unverified } : {},
85631
+ ...baseRedOk && baseRedReason ? { baseRedOk: { reason: baseRedReason } } : {},
85539
85632
  ...subject !== undefined ? { subject } : {},
85540
85633
  ...body !== undefined ? { body } : {}
85541
85634
  }, forgeDeps.sleep);
@@ -85548,6 +85641,7 @@ async function merge3(argv, io) {
85548
85641
  return emit(io, ok2({ ...result.data, localCleanup: cleanup }), (data) => [
85549
85642
  `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)}` : ""}`,
85550
85643
  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)})` : ""}`,
85644
+ ...data.baseCi.note ? [data.baseCi.note] : [],
85551
85645
  ...data.mergeBack.length ? [
85552
85646
  `merge back: ${data.base} is the ${data.mergeBackTrack} production branch; bring it into ${data.mergeBack.join(", ")}`
85553
85647
  ] : [],
@@ -85714,7 +85808,7 @@ async function run15(argv, io) {
85714
85808
  return reply(rest, io);
85715
85809
  return usage4(io, sub && !sub.startsWith("-") ? `unknown pr subcommand "${sub}"` : "missing pr subcommand", USAGE8);
85716
85810
  }
85717
- 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>] [--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]", USAGE8 = "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;
85811
+ 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]", USAGE8 = "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;
85718
85812
  var init_pr = __esm(() => {
85719
85813
  init_autonomy();
85720
85814
  init_issue_link();
@@ -106317,7 +106411,7 @@ var VERBS = [
106317
106411
  },
106318
106412
  {
106319
106413
  name: "merge",
106320
- 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>]",
106414
+ 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>]",
106321
106415
  summary: "Merge when READY, verified by a non-author and granted; --subject/--body set the squash message"
106322
106416
  }
106323
106417
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainervirus/workit-claude-code",
3
- "version": "8.34.0",
3
+ "version": "8.35.0",
4
4
  "private": false,
5
5
  "description": "Workit Claude Code plugin — session and per-turn task context, branch policy on git shell commands, workit method skills, and verifier/reviewer/implementer agents",
6
6
  "keywords": [
@@ -39,8 +39,8 @@
39
39
  "build": "bun scripts/build.ts"
40
40
  },
41
41
  "devDependencies": {
42
- "@brainervirus/workit-cli": "^8.34.0",
43
- "@brainervirus/workit-core": "^8.34.0"
42
+ "@brainervirus/workit-cli": "^8.35.0",
43
+ "@brainervirus/workit-core": "^8.35.0"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=24"