@brainervirus/workit-opencode 8.0.0 → 8.1.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 (2) hide show
  1. package/dist/plugin.js +262 -248
  2. package/package.json +2 -2
package/dist/plugin.js CHANGED
@@ -3,12 +3,12 @@ function define(plugin) {
3
3
  return plugin;
4
4
  }
5
5
 
6
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core.ts
7
- import { spawnSync as spawnSync12 } from "node:child_process";
6
+ // packages/workit-core/src/core.ts
7
+ import { spawnSync as spawnSync13 } from "node:child_process";
8
8
  import { existsSync as existsSync7, realpathSync as realpathSync5 } from "node:fs";
9
9
  import path19 from "node:path";
10
10
 
11
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-contract.ts
11
+ // packages/workit-core/src/core/task-contract.ts
12
12
  import { createHash, randomUUID } from "node:crypto";
13
13
 
14
14
  // node_modules/zod/v4/core/util.js
@@ -7740,7 +7740,7 @@ function refine(fn, _params = {}) {
7740
7740
  function superRefine(fn, params) {
7741
7741
  return _superRefine(fn, params);
7742
7742
  }
7743
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-contract.ts
7743
+ // packages/workit-core/src/core/task-contract.ts
7744
7744
  var SCHEMA_VERSION = 1;
7745
7745
  var POLICY_VERSION = "1.0.0";
7746
7746
  var OPERATION_FAMILIES = [
@@ -8595,7 +8595,7 @@ function requirementId(input) {
8595
8595
  }
8596
8596
  });
8597
8597
  }
8598
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/operation-input.ts
8598
+ // packages/workit-core/src/core/operation-input.ts
8599
8599
  var str = (d, values) => ({
8600
8600
  type: "string",
8601
8601
  ...values ? { enum: values } : {},
@@ -8991,7 +8991,7 @@ function parseAdvertisedOperation(family, input, host) {
8991
8991
  }))
8992
8992
  });
8993
8993
  }
8994
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-store.ts
8994
+ // packages/workit-core/src/core/task-store.ts
8995
8995
  import { createHash as createHash4, randomUUID as randomUUID3 } from "node:crypto";
8996
8996
  import * as fs7 from "node:fs";
8997
8997
  import path6 from "node:path";
@@ -9597,7 +9597,7 @@ function acquireFileLockSync(targetPath, options) {
9597
9597
  }
9598
9598
  }
9599
9599
  }
9600
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/package-root.ts
9600
+ // packages/workit-core/src/core/package-root.ts
9601
9601
  import { existsSync } from "node:fs";
9602
9602
  import path3 from "node:path";
9603
9603
  import { fileURLToPath } from "node:url";
@@ -9616,12 +9616,12 @@ var assetRoot = () => {
9616
9616
  return existsSync(assets) ? assets : root;
9617
9617
  };
9618
9618
 
9619
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/store-lock.ts
9619
+ // packages/workit-core/src/core/store-lock.ts
9620
9620
  import { spawnSync as spawnSync2 } from "node:child_process";
9621
9621
  import fs5 from "node:fs";
9622
9622
  import { hostname } from "node:os";
9623
9623
 
9624
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/store/paths.ts
9624
+ // packages/workit-core/src/store/paths.ts
9625
9625
  import { spawnSync } from "node:child_process";
9626
9626
  import { createHash as createHash2 } from "node:crypto";
9627
9627
  import fs4 from "node:fs";
@@ -9901,7 +9901,7 @@ var checkoutSlug = (root) => {
9901
9901
  return `${base}-${shortHash(canonical)}`;
9902
9902
  };
9903
9903
 
9904
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/store-lock.ts
9904
+ // packages/workit-core/src/core/store-lock.ts
9905
9905
  var metadataLockSchema = object({
9906
9906
  pid: number2().int().nonnegative().safe(),
9907
9907
  processStart: string2().nullable(),
@@ -10032,7 +10032,7 @@ var clearAbandonedReclaimGuard = (lockPath, nowMs = Date.now()) => {
10032
10032
  }
10033
10033
  };
10034
10034
 
10035
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/store/event-log.ts
10035
+ // packages/workit-core/src/store/event-log.ts
10036
10036
  import { randomUUID as randomUUID2 } from "node:crypto";
10037
10037
  import fs6 from "node:fs";
10038
10038
  import path5 from "node:path";
@@ -10192,7 +10192,7 @@ var retryTransient = (run) => {
10192
10192
  };
10193
10193
  var renameWithRetry = (from, to) => retryTransient(() => fs6.renameSync(from, to));
10194
10194
 
10195
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/store/patch.ts
10195
+ // packages/workit-core/src/store/patch.ts
10196
10196
  var isPlainObject2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
10197
10197
  var equal = (left, right) => {
10198
10198
  if (left === right)
@@ -10302,7 +10302,7 @@ var isPatch = (value) => Array.isArray(value) && value.every((op) => {
10302
10302
  return false;
10303
10303
  });
10304
10304
 
10305
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/store/reduce.ts
10305
+ // packages/workit-core/src/store/reduce.ts
10306
10306
  import { createHash as createHash3 } from "node:crypto";
10307
10307
  var OPENING_TYPES = new Set([
10308
10308
  "task.opened",
@@ -10433,7 +10433,7 @@ function eventType(before, after) {
10433
10433
  return "task.updated";
10434
10434
  }
10435
10435
 
10436
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/store/notes.ts
10436
+ // packages/workit-core/src/store/notes.ts
10437
10437
  var SLOT = Symbol.for("workit.migrationReporter");
10438
10438
  var reportMigration = (report) => {
10439
10439
  try {
@@ -10444,7 +10444,7 @@ var reportMigration = (report) => {
10444
10444
  };
10445
10445
  var migrationReporterInstalled = () => typeof globalThis[SLOT] === "function";
10446
10446
 
10447
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-store.ts
10447
+ // packages/workit-core/src/core/task-store.ts
10448
10448
  var MIGRATION_PENDING = "workit migration pending";
10449
10449
  var STORE_FORMAT = 3;
10450
10450
  var STORE_MIN_RUNTIME = "3.0.0";
@@ -12080,18 +12080,18 @@ class TaskStore {
12080
12080
  return failure2(recovery ? "recovery_required" : "storage_error", `lock operation failed: ${String(error)}`, { path: lockPath });
12081
12081
  }
12082
12082
  }
12083
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/workers.ts
12083
+ // packages/workit-core/src/core/workers.ts
12084
12084
  var UNCERTAIN_WORKER_STATES = ["dispatching", "running", "cancelling", "unknown"];
12085
12085
  var isUncertainWorker = (state) => UNCERTAIN_WORKER_STATES.includes(state);
12086
12086
  var workerBlocksTransition = (transition, state) => transition === "pause" ? false : isUncertainWorker(state);
12087
12087
 
12088
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-evaluation.ts
12088
+ // packages/workit-core/src/core/task-evaluation.ts
12089
12089
  import { createHash as createHash7 } from "node:crypto";
12090
12090
  import * as fs11 from "node:fs";
12091
12091
  import { spawnSync as spawnSync6 } from "node:child_process";
12092
12092
  import path11 from "node:path";
12093
12093
 
12094
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/check-config.ts
12094
+ // packages/workit-core/src/check-config.ts
12095
12095
  import { spawnSync as spawnSync3 } from "node:child_process";
12096
12096
  import fs8 from "node:fs";
12097
12097
  import path7 from "node:path";
@@ -12296,7 +12296,7 @@ function checkCommand(args, version, onPath = workitAvailable()) {
12296
12296
  return onPath ? `workit check ${args}` : `npx -y @brainervirus/workit-cli@${version} check ${args}`;
12297
12297
  }
12298
12298
 
12299
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/git/rev.ts
12299
+ // packages/workit-core/src/git/rev.ts
12300
12300
  import { spawnSync as spawnSync4 } from "node:child_process";
12301
12301
  import { createHash as createHash5 } from "node:crypto";
12302
12302
  import fs9 from "node:fs";
@@ -12477,11 +12477,11 @@ function pushRemoteName(cwd, branch) {
12477
12477
  return remotes.length === 1 ? remotes[0] : null;
12478
12478
  }
12479
12479
 
12480
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/policy/derive.ts
12480
+ // packages/workit-core/src/core/policy/derive.ts
12481
12481
  import { existsSync as existsSync3 } from "node:fs";
12482
12482
  import path10 from "node:path";
12483
12483
 
12484
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/ledger.ts
12484
+ // packages/workit-core/src/ledger.ts
12485
12485
  import { spawnSync as spawnSync5 } from "node:child_process";
12486
12486
  import { createHash as createHash6, randomBytes as randomBytes2 } from "node:crypto";
12487
12487
  import fs10 from "node:fs";
@@ -12723,7 +12723,7 @@ var independenceReasons = (row, authors) => {
12723
12723
  reasons.push("self");
12724
12724
  return reasons;
12725
12725
  };
12726
- function effectiveOf(rows, authors) {
12726
+ function effectiveOf(rows, authors, sameCode) {
12727
12727
  let effective = null;
12728
12728
  for (const row of rows) {
12729
12729
  if (!effective) {
@@ -12734,7 +12734,7 @@ function effectiveOf(rows, authors) {
12734
12734
  const effIndependent = independenceReasons(effective, authors).length === 0;
12735
12735
  if (effIndependent && !rowIndependent)
12736
12736
  continue;
12737
- if (effIndependent && FAILING.has(String(effective.result)) && row.actor.session === effective.actor.session)
12737
+ if (effIndependent && FAILING.has(String(effective.result)) && row.actor.session === effective.actor.session && sameCode(effective, row))
12738
12738
  continue;
12739
12739
  effective = row;
12740
12740
  }
@@ -12765,16 +12765,22 @@ function checkVerdicts(cwd, branch, rows) {
12765
12765
  const head = branchHead(cwd, branch);
12766
12766
  const fallbackBase = defaultBase(cwd);
12767
12767
  const keyCache = new Map;
12768
- const keyFor = (base) => {
12769
- if (!base || !head)
12768
+ const keysAt = (base, at) => {
12769
+ if (!base || !at)
12770
12770
  return { patchId: null, diffHash: null };
12771
- let key = keyCache.get(base);
12771
+ const cacheKey = `${base}\x00${at}`;
12772
+ let key = keyCache.get(cacheKey);
12772
12773
  if (!key) {
12773
- key = { patchId: patchId(cwd, base, head), diffHash: diffHash(cwd, base, head) };
12774
- keyCache.set(base, key);
12774
+ key = { patchId: patchId(cwd, base, at), diffHash: diffHash(cwd, base, at) };
12775
+ keyCache.set(cacheKey, key);
12775
12776
  }
12776
12777
  return key;
12777
12778
  };
12779
+ const keyFor = (base) => keysAt(base, head);
12780
+ const sameCode = (failed, row) => verdictBasis(failed, {
12781
+ head: row.head,
12782
+ ...keysAt(failed.base ?? fallbackBase, row.head)
12783
+ }) !== "stale" || restackCarries(rows, branch, failed.head, row.head);
12778
12784
  const authors = authorSessions(cwd, rows, branch, { base: fallbackBase, head });
12779
12785
  const byKind = new Map;
12780
12786
  for (const row of rows)
@@ -12784,7 +12790,7 @@ function checkVerdicts(cwd, branch, rows) {
12784
12790
  }
12785
12791
  const verdicts = [];
12786
12792
  for (const [kind, list] of byKind) {
12787
- const row = effectiveOf(list, authors);
12793
+ const row = effectiveOf(list, authors, sameCode);
12788
12794
  if (!row)
12789
12795
  continue;
12790
12796
  let basis = verdictBasis(row, { head, ...keyFor(row.base ?? fallbackBase) });
@@ -12810,11 +12816,11 @@ function checkVerdicts(cwd, branch, rows) {
12810
12816
  verdicts.sort((a, b) => a.verdict.seq - b.verdict.seq);
12811
12817
  const newestCurrent = verdicts.findLast((entry) => entry.current) ?? verdicts.at(-1) ?? null;
12812
12818
  const failing = verdicts.find((entry) => entry.current && entry.independent && FAILING.has(String(entry.verdict.result)));
12813
- const newestAccepted = verdicts.findLast((entry) => entry.accepted) ?? null;
12819
+ const newestAccepted = verdicts.findLast((entry) => entry.accepted && STRONG_RESULTS.has(String(entry.verdict.result))) ?? null;
12814
12820
  const accepted = newestAccepted && !failing ? { accepted: true, verdict: newestAccepted.verdict, reasons: [] } : {
12815
12821
  accepted: false,
12816
12822
  verdict: failing?.verdict ?? null,
12817
- reasons: failing ? ["failing_verdict"] : newestCurrent?.reasons ?? ["no_verdict"]
12823
+ reasons: failing ? ["failing_verdict"] : !newestCurrent ? ["no_verdict"] : newestCurrent.reasons.length ? newestCurrent.reasons : ["type_check_only"]
12818
12824
  };
12819
12825
  const selfEntry = failing ? undefined : verdicts.findLast((entry) => entry.current && !entry.independent && STRONG_RESULTS.has(String(entry.verdict.result)));
12820
12826
  return {
@@ -12830,9 +12836,9 @@ function checkVerdicts(cwd, branch, rows) {
12830
12836
  authors: [...authors].toSorted()
12831
12837
  };
12832
12838
  }
12833
- var OBSERVED_ONLY = new Set(["check", ...PR_ROW_TYPES]);
12839
+ var OBSERVED_ONLY = new Set(["check", "merge.unverified", ...PR_ROW_TYPES]);
12834
12840
 
12835
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/policy/derive.ts
12841
+ // packages/workit-core/src/core/policy/derive.ts
12836
12842
  var RULES = {
12837
12843
  test: "check:test",
12838
12844
  self: "verdict:self",
@@ -13031,7 +13037,7 @@ function writeBlockers(task, root) {
13031
13037
  });
13032
13038
  }
13033
13039
 
13034
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-evaluation.ts
13040
+ // packages/workit-core/src/core/task-evaluation.ts
13035
13041
  var digestBytes = (value) => createHash7("sha256").update(value).digest("hex");
13036
13042
  var inside = (root, candidate) => candidate === root || candidate.startsWith(`${root}${path11.sep}`);
13037
13043
  var relative = (root, candidate) => path11.relative(root, candidate).split(path11.sep).join("/") || ".";
@@ -13697,7 +13703,7 @@ function evaluateClosure(requestedOutcome, view) {
13697
13703
  });
13698
13704
  }
13699
13705
 
13700
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/methods.ts
13706
+ // packages/workit-core/src/core/methods.ts
13701
13707
  var METHODS = {
13702
13708
  "workit-shape": { dimensions: ["challenge", "decisions", "artifacts", "continuity"] },
13703
13709
  "workit-bdd": { dimensions: ["testing"] },
@@ -13805,7 +13811,7 @@ Skills: load the skill, never act from memory of it (slash aliases /wk-<name>).
13805
13811
  - architecture, deepen modules (user-invoked; offer it): workit-architecture
13806
13812
  `.trim();
13807
13813
 
13808
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-context.ts
13814
+ // packages/workit-core/src/core/task-context.ts
13809
13815
  function reconcileResume(view, observations = []) {
13810
13816
  if (observations.length > 0)
13811
13817
  return failure2("permission_denied", "worker observations require native host verification");
@@ -13919,78 +13925,13 @@ var exportDigest = (bundle) => sha256({
13919
13925
  sourceWorkspaceId: bundle.sourceWorkspaceId,
13920
13926
  task: bundle.task
13921
13927
  });
13922
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/branch.ts
13928
+ // packages/workit-core/src/core/branch.ts
13923
13929
  import { createHash as createHash10 } from "node:crypto";
13924
13930
 
13925
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/git.ts
13926
- import { execFileSync } from "node:child_process";
13927
- var run = (cwd, args) => {
13928
- try {
13929
- const stdout = execFileSync("git", args, {
13930
- cwd,
13931
- encoding: "utf8",
13932
- stdio: ["pipe", "pipe", "pipe"]
13933
- });
13934
- return { stdout: stdout.trimEnd(), stderr: "", exitCode: 0 };
13935
- } catch (error) {
13936
- const e = error;
13937
- return {
13938
- stdout: (e.stdout ?? "").trimEnd(),
13939
- stderr: (e.stderr ?? "").trimEnd(),
13940
- exitCode: e.status ?? 1
13941
- };
13942
- }
13943
- };
13944
- var gitContext = (workspaceRoot, paths = []) => {
13945
- const cwd = workspaceRoot;
13946
- let failure;
13947
- const runHere = (args) => {
13948
- const result = run(cwd, args);
13949
- if (!failure && result.exitCode !== 0) {
13950
- failure = { stderr: result.stderr, exitCode: result.exitCode };
13951
- }
13952
- return result.stdout;
13953
- };
13954
- const branch = runHere(["rev-parse", "--abbrev-ref", "HEAD"]) || "unknown";
13955
- const status_short = runHere(["status", "--porcelain"]);
13956
- const staged = [];
13957
- const unstaged = [];
13958
- const untracked = [];
13959
- for (const line of status_short.split(`
13960
- `).filter(Boolean)) {
13961
- const code = line.slice(0, 2);
13962
- const file = line.slice(3);
13963
- if (code === "??") {
13964
- untracked.push(file);
13965
- } else {
13966
- if (code[0] !== " " && code[0] !== "?")
13967
- staged.push(file);
13968
- if (code[1] !== " " && code[1] !== "?")
13969
- unstaged.push(file);
13970
- }
13971
- }
13972
- const pathArgs = paths.length ? ["--", ...paths] : [];
13973
- const diff_stat = runHere(["diff", "--stat", ...pathArgs]);
13974
- const cached_stat = runHere(["diff", "--cached", "--stat", ...pathArgs]);
13975
- const stagedSet = new Set(staged);
13976
- const unstagedSet = new Set(unstaged);
13977
- const partial_staged = [...stagedSet].filter((f) => unstagedSet.has(f));
13978
- return {
13979
- workspace_root: cwd,
13980
- branch,
13981
- status_short,
13982
- staged,
13983
- unstaged,
13984
- untracked,
13985
- diff_stat: [diff_stat, cached_stat].filter(Boolean).join(`
13986
- `),
13987
- partial_staged: partial_staged.length > 0,
13988
- partial_staged_files: partial_staged,
13989
- ...failure ? { stderr: failure.stderr, exitCode: failure.exitCode } : {}
13990
- };
13991
- };
13931
+ // packages/workit-core/src/core/branch-policy.ts
13932
+ import { spawnSync as spawnSync7 } from "node:child_process";
13992
13933
 
13993
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/config.ts
13934
+ // packages/workit-core/src/core/config.ts
13994
13935
  import {
13995
13936
  copyFileSync as copyFileSync2,
13996
13937
  cpSync as cpSync2,
@@ -14003,7 +13944,7 @@ import {
14003
13944
  import os2 from "node:os";
14004
13945
  import path12 from "node:path";
14005
13946
 
14006
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/boundary.ts
13947
+ // packages/workit-core/src/core/boundary.ts
14007
13948
  import { statSync as statSync2 } from "node:fs";
14008
13949
  var EVENT = {
14009
13950
  initialization: "initialization",
@@ -14039,7 +13980,7 @@ var changedSourcesSinceLoad = (marker) => {
14039
13980
  return changed;
14040
13981
  };
14041
13982
 
14042
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/config.ts
13983
+ // packages/workit-core/src/core/config.ts
14043
13984
  var diagnosticLogger;
14044
13985
  var PRESETS = {
14045
13986
  gitflow: {
@@ -14114,6 +14055,7 @@ var DEFAULTS = {
14114
14055
  },
14115
14056
  commitPolicy: { preset: "conventional" }
14116
14057
  };
14058
+ var unchosenBranchPolicy = new WeakSet([DEFAULTS]);
14117
14059
  var readSafe = (p) => {
14118
14060
  try {
14119
14061
  return readFileSync3(p, "utf8");
@@ -14138,22 +14080,21 @@ var parseConfigResult = (raw, file) => {
14138
14080
  const locale = LOCALE_RE.test(String(input.locale ?? "")) ? input.locale : DEFAULTS.locale;
14139
14081
  const preset = Object.hasOwn(PRESETS, input.branchPolicy?.preset) ? input.branchPolicy?.preset : "gitflow";
14140
14082
  const commitPreset = COMMIT_PRESETS.includes(String(input.commitPolicy?.preset ?? "")) ? input.commitPolicy?.preset : "conventional";
14141
- return {
14142
- status: "valid",
14143
- path: file,
14144
- config: {
14145
- locale,
14146
- localeOptions: Array.isArray(input.localeOptions) ? input.localeOptions : DEFAULTS.localeOptions,
14147
- branchPolicy: mergePreset(preset, {
14148
- allowed: Array.isArray(input.branchPolicy?.allowed) ? input.branchPolicy.allowed : undefined,
14149
- protectedNames: Array.isArray(input.branchPolicy?.protected) ? input.branchPolicy.protected : undefined
14150
- }, DEFAULTS),
14151
- commitPolicy: {
14152
- preset: commitPreset,
14153
- ...typeof input.commitPolicy?.pattern === "string" ? { pattern: input.commitPolicy.pattern } : {}
14154
- }
14083
+ const config = {
14084
+ locale,
14085
+ localeOptions: Array.isArray(input.localeOptions) ? input.localeOptions : DEFAULTS.localeOptions,
14086
+ branchPolicy: mergePreset(preset, {
14087
+ allowed: Array.isArray(input.branchPolicy?.allowed) ? input.branchPolicy.allowed : undefined,
14088
+ protectedNames: Array.isArray(input.branchPolicy?.protected) ? input.branchPolicy.protected : undefined
14089
+ }, DEFAULTS),
14090
+ commitPolicy: {
14091
+ preset: commitPreset,
14092
+ ...typeof input.commitPolicy?.pattern === "string" ? { pattern: input.commitPolicy.pattern } : {}
14155
14093
  }
14156
14094
  };
14095
+ if (!Object.hasOwn(PRESETS, input.branchPolicy?.preset))
14096
+ unchosenBranchPolicy.add(config);
14097
+ return { status: "valid", path: file, config };
14157
14098
  };
14158
14099
  var readConfigTyped = (dir) => {
14159
14100
  const file = path12.join(dir ?? configDir(), "config.json");
@@ -14179,9 +14120,11 @@ var writeConfig = (config) => {
14179
14120
  };
14180
14121
  var vcsConfigPath = () => process.env.WORKFLOW_VCS_CONFIG ?? path12.join(configDir(), "vcs.json");
14181
14122
  var branchGlobPattern = (glob) => new RegExp(`^${glob.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*")}$`, "i");
14182
- var resolveBranchPolicy = (config, workspace) => {
14123
+ var resolveBranchPolicy = (config, workspace, repoPreset) => {
14183
14124
  const wp = workspace?.branchPolicy ?? {};
14184
- const preset = Object.hasOwn(PRESETS, wp.preset) ? wp.preset : config.branchPolicy?.preset ?? "gitflow";
14125
+ const workspacePreset = Object.hasOwn(PRESETS, wp.preset);
14126
+ const detected = !workspacePreset && unchosenBranchPolicy.has(config) ? repoPreset?.() ?? null : null;
14127
+ const preset = workspacePreset ? wp.preset : detected ?? config.branchPolicy?.preset ?? "gitflow";
14185
14128
  const merged = mergePreset(preset, {
14186
14129
  allowed: wp.allowed,
14187
14130
  protectedNames: wp.protected
@@ -14190,9 +14133,10 @@ var resolveBranchPolicy = (config, workspace) => {
14190
14133
  return {
14191
14134
  preset,
14192
14135
  allowed,
14193
- protected: new Set(merged.protected.map((p) => p.toLowerCase())),
14136
+ protected: new Set([...merged.protected, ...detected ? PRESETS.gitflow.protected : []].map((p) => p.toLowerCase())),
14194
14137
  integration: wp.integration === "merge" ? "merge" : "pr",
14195
- defaultTargetBranch: preset === "github-flow" ? "main" : preset === "trunk-based" ? "master" : "develop"
14138
+ defaultTargetBranch: preset === "github-flow" ? "main" : preset === "trunk-based" ? "master" : "develop",
14139
+ detected: detected !== null
14196
14140
  };
14197
14141
  };
14198
14142
  var COMMIT_PRESETS = [
@@ -14214,7 +14158,139 @@ var resolveCommitPolicy = (config, workspace) => {
14214
14158
  return config.commitPolicy ?? { preset: "conventional" };
14215
14159
  };
14216
14160
 
14217
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/workspaces.ts
14161
+ // packages/workit-core/src/core/branch-policy.ts
14162
+ var PREFIXES = {
14163
+ feature: "feature/*",
14164
+ bugfix: "bugfix/*",
14165
+ release: "release/*",
14166
+ hotfix: "hotfix/*"
14167
+ };
14168
+ var branchNames = (workspaceRoot) => {
14169
+ const r = spawnSync7("git", ["for-each-ref", "--format=%(refname)", "refs/heads", "refs/remotes/origin"], { cwd: workspaceRoot, encoding: "utf8" });
14170
+ if (r.status !== 0)
14171
+ return new Set;
14172
+ return new Set((r.stdout ?? "").split(`
14173
+ `).filter(Boolean).map((ref) => ref.startsWith("refs/heads/") ? ref.slice("refs/heads/".length) : ref.slice("refs/remotes/origin/".length)));
14174
+ };
14175
+ var detectBranchPolicy = (workspaceRoot) => {
14176
+ const names = branchNames(workspaceRoot);
14177
+ const develop = names.has("develop");
14178
+ const main = names.has("main");
14179
+ const master = names.has("master");
14180
+ const root = main ? "main" : master ? "master" : null;
14181
+ if (develop) {
14182
+ return {
14183
+ preset: "gitflow",
14184
+ developBranch: "develop",
14185
+ integration: "merge",
14186
+ protected: root ? [root, "develop"] : ["develop"],
14187
+ allowed: [...PRESETS.gitflow.allowed],
14188
+ prefixes: PREFIXES
14189
+ };
14190
+ }
14191
+ if (root === "main") {
14192
+ return {
14193
+ preset: "github-flow",
14194
+ developBranch: null,
14195
+ integration: "pr",
14196
+ protected: [root],
14197
+ allowed: ["*"],
14198
+ prefixes: PREFIXES
14199
+ };
14200
+ }
14201
+ if (root === "master") {
14202
+ return {
14203
+ preset: "trunk-based",
14204
+ developBranch: null,
14205
+ integration: "pr",
14206
+ protected: [root],
14207
+ allowed: ["*"],
14208
+ prefixes: PREFIXES
14209
+ };
14210
+ }
14211
+ return {
14212
+ preset: "gitflow",
14213
+ developBranch: null,
14214
+ integration: "merge",
14215
+ protected: [],
14216
+ allowed: [],
14217
+ prefixes: PREFIXES
14218
+ };
14219
+ };
14220
+ var repoBranchPreset = (workspaceRoot) => {
14221
+ const detected = detectBranchPolicy(workspaceRoot);
14222
+ return detected.developBranch || detected.allowed.length ? detected.preset : null;
14223
+ };
14224
+
14225
+ // packages/workit-core/src/core/git.ts
14226
+ import { execFileSync } from "node:child_process";
14227
+ var run = (cwd, args) => {
14228
+ try {
14229
+ const stdout = execFileSync("git", args, {
14230
+ cwd,
14231
+ encoding: "utf8",
14232
+ stdio: ["pipe", "pipe", "pipe"]
14233
+ });
14234
+ return { stdout: stdout.trimEnd(), stderr: "", exitCode: 0 };
14235
+ } catch (error) {
14236
+ const e = error;
14237
+ return {
14238
+ stdout: (e.stdout ?? "").trimEnd(),
14239
+ stderr: (e.stderr ?? "").trimEnd(),
14240
+ exitCode: e.status ?? 1
14241
+ };
14242
+ }
14243
+ };
14244
+ var gitContext = (workspaceRoot, paths = []) => {
14245
+ const cwd = workspaceRoot;
14246
+ let failure;
14247
+ const runHere = (args) => {
14248
+ const result = run(cwd, args);
14249
+ if (!failure && result.exitCode !== 0) {
14250
+ failure = { stderr: result.stderr, exitCode: result.exitCode };
14251
+ }
14252
+ return result.stdout;
14253
+ };
14254
+ const branch = runHere(["rev-parse", "--abbrev-ref", "HEAD"]) || "unknown";
14255
+ const status_short = runHere(["status", "--porcelain"]);
14256
+ const staged = [];
14257
+ const unstaged = [];
14258
+ const untracked = [];
14259
+ for (const line of status_short.split(`
14260
+ `).filter(Boolean)) {
14261
+ const code = line.slice(0, 2);
14262
+ const file = line.slice(3);
14263
+ if (code === "??") {
14264
+ untracked.push(file);
14265
+ } else {
14266
+ if (code[0] !== " " && code[0] !== "?")
14267
+ staged.push(file);
14268
+ if (code[1] !== " " && code[1] !== "?")
14269
+ unstaged.push(file);
14270
+ }
14271
+ }
14272
+ const pathArgs = paths.length ? ["--", ...paths] : [];
14273
+ const diff_stat = runHere(["diff", "--stat", ...pathArgs]);
14274
+ const cached_stat = runHere(["diff", "--cached", "--stat", ...pathArgs]);
14275
+ const stagedSet = new Set(staged);
14276
+ const unstagedSet = new Set(unstaged);
14277
+ const partial_staged = [...stagedSet].filter((f) => unstagedSet.has(f));
14278
+ return {
14279
+ workspace_root: cwd,
14280
+ branch,
14281
+ status_short,
14282
+ staged,
14283
+ unstaged,
14284
+ untracked,
14285
+ diff_stat: [diff_stat, cached_stat].filter(Boolean).join(`
14286
+ `),
14287
+ partial_staged: partial_staged.length > 0,
14288
+ partial_staged_files: partial_staged,
14289
+ ...failure ? { stderr: failure.stderr, exitCode: failure.exitCode } : {}
14290
+ };
14291
+ };
14292
+
14293
+ // packages/workit-core/src/core/workspaces.ts
14218
14294
  import { createHash as createHash8 } from "node:crypto";
14219
14295
  import { readFileSync as readFileSync4, realpathSync as realpathSync3 } from "node:fs";
14220
14296
  import path13 from "node:path";
@@ -14619,18 +14695,18 @@ function workspaceDefaultTarget(cwd, globalDefault) {
14619
14695
  const wp = ws?.branchPolicy ?? {};
14620
14696
  const hasWorkspacePolicy = typeof wp.preset === "string" && Object.hasOwn(PRESETS, wp.preset);
14621
14697
  const selected = resolveRuntimeWorkspacePolicy(cwd, "branch", process.env.WORKFLOW_PROFILE?.trim() || undefined);
14622
- const policyDefault = resolveBranchPolicy(readConfig(), selected.policy ? { branchPolicy: selected.policy } : null).defaultTargetBranch;
14698
+ const policyDefault = resolveBranchPolicy(readConfig(), selected.policy ? { branchPolicy: selected.policy } : null, () => repoBranchPreset(cwd)).defaultTargetBranch;
14623
14699
  return String(ws?.vcs?.defaultTargetBranch ?? (hasWorkspacePolicy ? policyDefault : globalDefault ?? policyDefault) ?? "develop");
14624
14700
  }
14625
14701
 
14626
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/vcs-config.ts
14702
+ // packages/workit-core/src/core/vcs-config.ts
14627
14703
  import fs12 from "node:fs";
14628
14704
  import path14 from "node:path";
14629
- import { spawnSync as spawnSync8 } from "node:child_process";
14705
+ import { spawnSync as spawnSync9 } from "node:child_process";
14630
14706
 
14631
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/release-tracks.ts
14707
+ // packages/workit-core/src/core/release-tracks.ts
14632
14708
  import { createHash as createHash9 } from "node:crypto";
14633
- import { spawnSync as spawnSync7 } from "node:child_process";
14709
+ import { spawnSync as spawnSync8 } from "node:child_process";
14634
14710
  class ReleaseTrackError extends Error {
14635
14711
  }
14636
14712
  var KNOWN_FIELDS = new Set([
@@ -14915,7 +14991,7 @@ function resolveReleaseTrack(input) {
14915
14991
  return fallback(`${branch} has the same or unrelated fork points with ${[...new Set(newest.map((fork) => `${fork.ref} (${fork.track.name === IMPLICIT ? "workspace default" : fork.track.name})`))].join(" and ")}`);
14916
14992
  }
14917
14993
  var git4 = (cwd, args) => {
14918
- const run = spawnSync7("git", args, {
14994
+ const run = spawnSync8("git", args, {
14919
14995
  cwd,
14920
14996
  encoding: "utf8",
14921
14997
  timeout: 20000,
@@ -15026,11 +15102,11 @@ function resolveTrackFor(cwd, options) {
15026
15102
  return resolution;
15027
15103
  }
15028
15104
 
15029
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/vcs-config.ts
15105
+ // packages/workit-core/src/core/vcs-config.ts
15030
15106
  var workspacesPath = () => path14.join(configDir(), "workspaces.json");
15031
15107
  var vcsCwd = (cwd) => cwd ?? process.env.WORKFLOW_WORKSPACE_ROOT ?? process.cwd();
15032
15108
  var remoteProvider = (cwd) => {
15033
- const r = spawnSync8("git", ["remote", "get-url", "origin"], { cwd, encoding: "utf8" });
15109
+ const r = spawnSync9("git", ["remote", "get-url", "origin"], { cwd, encoding: "utf8" });
15034
15110
  if (r.status !== 0)
15035
15111
  return null;
15036
15112
  const url = (r.stdout ?? "").trim();
@@ -15067,7 +15143,7 @@ var remoteEndpoint = (remote) => {
15067
15143
  var configuredSshEndpoint = (host) => {
15068
15144
  if (host.startsWith("-"))
15069
15145
  return null;
15070
- const resolved = spawnSync8("ssh", ["-G", host], {
15146
+ const resolved = spawnSync9("ssh", ["-G", host], {
15071
15147
  encoding: "utf8",
15072
15148
  timeout: 5000,
15073
15149
  maxBuffer: 1024 * 1024,
@@ -15240,7 +15316,7 @@ function mergedPrStyle(limit = 6, cwd) {
15240
15316
  `).filter((l) => l.startsWith("## ")).map((l) => l.trim()),
15241
15317
  descriptionPreview: desc.slice(0, 600)
15242
15318
  });
15243
- const remoteResult = spawnSync8("git", ["remote", "get-url", "--push", "--all", "origin"], {
15319
+ const remoteResult = spawnSync9("git", ["remote", "get-url", "--push", "--all", "origin"], {
15244
15320
  cwd,
15245
15321
  encoding: "utf8"
15246
15322
  });
@@ -15256,7 +15332,7 @@ function mergedPrStyle(limit = 6, cwd) {
15256
15332
  if (!hostingApiHostMatches(remote, host))
15257
15333
  return { ok: false, error: "PR style target does not match the provider host" };
15258
15334
  if (provider === "gitlab") {
15259
- const run = (args) => spawnSync8("glab", ["api", ...args], {
15335
+ const run = (args) => spawnSync9("glab", ["api", ...args], {
15260
15336
  cwd,
15261
15337
  encoding: "utf8",
15262
15338
  env
@@ -15276,7 +15352,7 @@ function mergedPrStyle(limit = 6, cwd) {
15276
15352
  });
15277
15353
  }
15278
15354
  } else if (provider === "github") {
15279
- const r = spawnSync8("gh", [
15355
+ const r = spawnSync9("gh", [
15280
15356
  "pr",
15281
15357
  "list",
15282
15358
  "--repo",
@@ -15308,7 +15384,7 @@ function mergedPrStyle(limit = 6, cwd) {
15308
15384
  };
15309
15385
  }
15310
15386
 
15311
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/branch.ts
15387
+ // packages/workit-core/src/core/branch.ts
15312
15388
  var withReleaseTracks = (workspaceRoot, policy) => {
15313
15389
  const read = workspaceReleaseTracks(workspaceRoot);
15314
15390
  if (read.error)
@@ -15337,7 +15413,7 @@ function effectiveWorkspacePolicy(workspaceRoot, kind, profileName) {
15337
15413
  const selected = resolveRuntimeWorkspacePolicy(workspaceRoot, kind, profileName?.trim() || process.env.WORKFLOW_PROFILE?.trim() || undefined);
15338
15414
  const config = readConfig();
15339
15415
  return kind === "branch" ? {
15340
- branchPolicy: withReleaseTracks(workspaceRoot, resolveBranchPolicy(config, selected.policy ? { branchPolicy: selected.policy } : null)),
15416
+ branchPolicy: withReleaseTracks(workspaceRoot, resolveBranchPolicy(config, selected.policy ? { branchPolicy: selected.policy } : null, () => repoBranchPreset(workspaceRoot))),
15341
15417
  provenance: { branchPolicy: selected.source }
15342
15418
  } : {
15343
15419
  commitPolicy: resolveCommitPolicy(config, selected.policy ? { commitPolicy: selected.policy } : null),
@@ -15401,7 +15477,7 @@ var validateBranchNameFor = (workspaceRoot, name) => {
15401
15477
  }
15402
15478
  };
15403
15479
 
15404
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/route-intent.ts
15480
+ // packages/workit-core/src/core/route-intent.ts
15405
15481
  var shellBranchTarget = (command) => {
15406
15482
  if (!command.trim() || /[\r\n;&|<>`'"$()\\*?{}~!#]/u.test(command) || command.includes("[") || command.includes("]"))
15407
15483
  return null;
@@ -15416,10 +15492,10 @@ var shellBranchPolicyViolation = (root, command) => {
15416
15492
  const target = shellBranchTarget(command);
15417
15493
  return target === null ? null : validateBranchNameFor(root, target);
15418
15494
  };
15419
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-engine.ts
15495
+ // packages/workit-core/src/core/task-engine.ts
15420
15496
  import { realpathSync as realpathSync4 } from "node:fs";
15421
15497
 
15422
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/policy-resolver.ts
15498
+ // packages/workit-core/src/core/policy-resolver.ts
15423
15499
  function resolvePolicy(input) {
15424
15500
  const ids = input.constraints.map((constraint) => constraint.id);
15425
15501
  if (new Set(ids).size !== ids.length)
@@ -15475,7 +15551,7 @@ function diffPolicy(previous, next, reason, now) {
15475
15551
  return parsed.data;
15476
15552
  }
15477
15553
 
15478
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/policy/judgment.ts
15554
+ // packages/workit-core/src/core/policy/judgment.ts
15479
15555
  var isObject6 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
15480
15556
  var squash = (key) => key.toLowerCase().replace(/[_-]/g, "");
15481
15557
  var ALIASES = {
@@ -15599,11 +15675,11 @@ function normalizeJudgment(raw, previous) {
15599
15675
  return success(null, null, { judgment: parsed.data, ignored, legacy });
15600
15676
  }
15601
15677
 
15602
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/autonomy.ts
15678
+ // packages/workit-core/src/autonomy.ts
15603
15679
  import os3 from "node:os";
15604
15680
  import path15 from "node:path";
15605
15681
 
15606
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/safe-write.ts
15682
+ // packages/workit-core/src/core/safe-write.ts
15607
15683
  import {
15608
15684
  closeSync as closeSync2,
15609
15685
  fchmodSync,
@@ -15626,7 +15702,7 @@ function writeFileExclusive(file, content, mode) {
15626
15702
  }
15627
15703
  }
15628
15704
 
15629
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/autonomy.ts
15705
+ // packages/workit-core/src/autonomy.ts
15630
15706
  var accountHome = () => {
15631
15707
  try {
15632
15708
  return os3.userInfo().homedir;
@@ -15761,7 +15837,7 @@ function resolveAutonomy(cwd) {
15761
15837
  var suggested = (kind) => kind === "merge" ? "verified" : "true";
15762
15838
  var grantHint = (workspace, kind) => `ask the user to run, in their own terminal: workit grant set ${workspace ?? "<workspace>"} ${kind}=${suggested(kind)}`;
15763
15839
 
15764
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/task-engine.ts
15840
+ // packages/workit-core/src/core/task-engine.ts
15765
15841
  var workspaceVerification = (root) => {
15766
15842
  try {
15767
15843
  return resolveAutonomy(root).verification;
@@ -17346,8 +17422,8 @@ class WorkitCore {
17346
17422
  return this.summary(changed.data.task);
17347
17423
  }
17348
17424
  }
17349
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/repo-context.ts
17350
- import { spawnSync as spawnSync9 } from "node:child_process";
17425
+ // packages/workit-core/src/core/repo-context.ts
17426
+ import { spawnSync as spawnSync10 } from "node:child_process";
17351
17427
  import { existsSync as existsSync6, readFileSync as readFileSync5, readdirSync as readdirSync4 } from "node:fs";
17352
17428
  import path16 from "node:path";
17353
17429
  var isSafeContextRange = (value) => value.length <= 4096 && (() => {
@@ -17376,7 +17452,7 @@ var invalidRange = (cwd) => ({
17376
17452
  cwd
17377
17453
  });
17378
17454
  var runGit = (cwd, args) => {
17379
- const result = spawnSync9("git", args, { cwd, encoding: "utf8" });
17455
+ const result = spawnSync10("git", args, { cwd, encoding: "utf8" });
17380
17456
  return {
17381
17457
  stdout: (result.stdout ?? "").trimEnd(),
17382
17458
  stderr: (result.stderr ?? "").trimEnd(),
@@ -17816,20 +17892,20 @@ function releaseNotesContext(root, rangeOrTag) {
17816
17892
  return { stdout, stderr: "", exitCode: 0, cwd };
17817
17893
  }
17818
17894
 
17819
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/tracker-issues.ts
17820
- import { spawnSync as spawnSync11 } from "node:child_process";
17895
+ // packages/workit-core/src/core/tracker-issues.ts
17896
+ import { spawnSync as spawnSync12 } from "node:child_process";
17821
17897
 
17822
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/pr-create.ts
17898
+ // packages/workit-core/src/core/pr-create.ts
17823
17899
  import fs13 from "node:fs";
17824
17900
  import path17 from "node:path";
17825
- import { spawnSync as spawnSync10 } from "node:child_process";
17826
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/forge/pr-body.ts
17901
+ import { spawnSync as spawnSync11 } from "node:child_process";
17902
+ // packages/workit-core/src/forge/pr-body.ts
17827
17903
  function parseGhIssue(value) {
17828
17904
  const m = /issues\/(\d+)/.exec(value);
17829
17905
  return m ? m[1] : String(value).trim().replace(/^#/, "");
17830
17906
  }
17831
17907
 
17832
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/pr-create.ts
17908
+ // packages/workit-core/src/core/pr-create.ts
17833
17909
  function whichOnPath(tool) {
17834
17910
  const names = process.platform === "win32" ? [tool, `${tool}.exe`, `${tool}.cmd`] : [tool];
17835
17911
  for (const dir of (process.env.PATH ?? "").split(path17.delimiter)) {
@@ -17847,7 +17923,7 @@ function whichOnPath(tool) {
17847
17923
  }
17848
17924
  var hostingCliAvailable = (provider) => whichOnPath(provider === "gitlab" ? "glab" : "gh") !== null;
17849
17925
  var pushRemote = (cwd) => {
17850
- const result = spawnSync10("git", ["remote", "get-url", "--push", "--all", "origin"], {
17926
+ const result = spawnSync11("git", ["remote", "get-url", "--push", "--all", "origin"], {
17851
17927
  cwd,
17852
17928
  encoding: "utf8"
17853
17929
  });
@@ -17857,7 +17933,7 @@ var pushRemote = (cwd) => {
17857
17933
  return urls.length === 1 ? urls[0] : null;
17858
17934
  };
17859
17935
 
17860
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/tracker-issues.ts
17936
+ // packages/workit-core/src/core/tracker-issues.ts
17861
17937
  var repoPathFromRemote = (remote) => {
17862
17938
  let rest = (remote || "").trim().replace(/\/+$/, "");
17863
17939
  if (!rest)
@@ -17878,7 +17954,7 @@ var defaultCli = (bin, available) => {
17878
17954
  if (!available)
17879
17955
  return null;
17880
17956
  return (args, root) => {
17881
- const out = spawnSync11(bin, args, {
17957
+ const out = spawnSync12(bin, args, {
17882
17958
  cwd: root,
17883
17959
  encoding: "utf8",
17884
17960
  env: { ...process.env, PATH: process.env.PATH ?? "" }
@@ -17955,19 +18031,19 @@ var fetchGitLabIssueBody = async (ref, root, deps = {}) => {
17955
18031
  return tryCliTriple(deps.cli ?? defaultCli("glab", hostingCliAvailable("gitlab")), "glab", ["issue", "view", id, "-R", repoArg, "-F", "json"], root, id, ["iid"], ["description"]);
17956
18032
  };
17957
18033
 
17958
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/youtrack.ts
18034
+ // packages/workit-core/src/core/youtrack.ts
17959
18035
  import fs14 from "node:fs";
17960
18036
  import path18 from "node:path";
17961
18037
 
17962
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/templates.ts
18038
+ // packages/workit-core/src/core/templates.ts
17963
18039
  var repoRoot2 = assetRoot();
17964
18040
 
17965
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/scripts.ts
18041
+ // packages/workit-core/src/core/scripts.ts
17966
18042
  var PLUGIN_ROOT = packageRoot();
17967
18043
  var ASSET_ROOT = assetRoot();
17968
18044
  var resolveWorkspaceRoot = (explicit) => explicit || process.cwd();
17969
18045
 
17970
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/youtrack.ts
18046
+ // packages/workit-core/src/core/youtrack.ts
17971
18047
  var ISSUE_RE = /^[A-Z]+-\d+$/;
17972
18048
  var TOKEN_PLACEHOLDER = "YOUR_TOKEN_HERE";
17973
18049
  var youTrackConfigPath = () => process.env.WORKFLOW_YOUTRACK_CONFIG ?? path18.join(configDir(), "youtrack.json");
@@ -18294,7 +18370,7 @@ var fetchYouTrackIssueBody = async (issue, creds = youTrackToken, request = youT
18294
18370
  }
18295
18371
  };
18296
18372
 
18297
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/context-read.ts
18373
+ // packages/workit-core/src/core/context-read.ts
18298
18374
  var contextReadSchema = object({
18299
18375
  kind: _enum([
18300
18376
  "git",
@@ -18405,7 +18481,7 @@ var readExternalContext = async (root, payload) => {
18405
18481
  }
18406
18482
  };
18407
18483
 
18408
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core.ts
18484
+ // packages/workit-core/src/core.ts
18409
18485
  var ok = (data) => ({ ok: true, data, error: null });
18410
18486
  var fail = (error, data = null) => ({
18411
18487
  ok: false,
@@ -18454,7 +18530,7 @@ function resolveInside(root, candidate) {
18454
18530
  }
18455
18531
  function run2(root, executable, args, env = {}) {
18456
18532
  const cwd = realpathSync5(root);
18457
- const result = spawnSync12(executable, args, {
18533
+ const result = spawnSync13(executable, args, {
18458
18534
  cwd,
18459
18535
  encoding: "utf8",
18460
18536
  env: { ...process.env, ...env }
@@ -18466,7 +18542,7 @@ function run2(root, executable, args, env = {}) {
18466
18542
  cwd
18467
18543
  };
18468
18544
  }
18469
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/descriptor.ts
18545
+ // packages/workit-core/src/hooks/descriptor.ts
18470
18546
  var support = (descriptor, axis) => {
18471
18547
  if (axis.startsWith("event:"))
18472
18548
  return descriptor.events[axis.slice("event:".length)].support;
@@ -18490,7 +18566,7 @@ var capabilitiesFor = (descriptor, observed = {}) => descriptor.capabilities.map
18490
18566
  refs: rule.refs.map((handle) => ({ kind: "host", host: descriptor.host, handle }))
18491
18567
  };
18492
18568
  });
18493
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/context.ts
18569
+ // packages/workit-core/src/hooks/context.ts
18494
18570
  import path20 from "node:path";
18495
18571
  var MIGRATION_PENDING_NOTE = "workit migration pending — run `workit task status`";
18496
18572
  var migrationPending = (result) => !result.ok && result.code === "needs_input" && (result.error ?? "").startsWith(MIGRATION_PENDING);
@@ -18587,12 +18663,12 @@ function entryCompactContext(store, entry, session, context) {
18587
18663
  cache.delete(cache.keys().next().value);
18588
18664
  return compact.data;
18589
18665
  }
18590
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/policy.ts
18666
+ // packages/workit-core/src/hooks/policy.ts
18591
18667
  var shellPolicy = (cwd, command) => {
18592
18668
  const policy = shellBranchPolicyViolation(cwd, command);
18593
18669
  return policy && !policy.ok ? { kind: "deny", reason: `branch_policy_denied: ${policy.error}`, unblock: null } : { kind: "none" };
18594
18670
  };
18595
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/write-gate.ts
18671
+ // packages/workit-core/src/hooks/write-gate.ts
18596
18672
  import { realpathSync as realpathSync6 } from "node:fs";
18597
18673
  import path21 from "node:path";
18598
18674
  var NONE2 = { kind: "none" };
@@ -18704,11 +18780,11 @@ var segmentsOf = (command) => {
18704
18780
  flushSegment();
18705
18781
  return segments;
18706
18782
  };
18707
- var PREFIXES = new Set(["sudo", "command", "env", "nohup", "time", "exec", "xargs"]);
18783
+ var PREFIXES2 = new Set(["sudo", "command", "env", "nohup", "time", "exec", "xargs"]);
18708
18784
  var operands = (words) => words.filter((item) => !item.startsWith("-"));
18709
18785
  var editsOf = (input) => {
18710
18786
  let words = input;
18711
- while (words.length && (PREFIXES.has(words[0]) || /^\w+=/.test(words[0])))
18787
+ while (words.length && (PREFIXES2.has(words[0]) || /^\w+=/.test(words[0])))
18712
18788
  words = words.slice(1);
18713
18789
  const [verb, ...args] = words;
18714
18790
  const name = (verb?.split(/[\\/]/).at(-1) ?? "").toLowerCase();
@@ -18853,7 +18929,7 @@ function writeGate(cwd, paths) {
18853
18929
  return NONE2;
18854
18930
  }
18855
18931
  }
18856
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/hosts/fields.ts
18932
+ // packages/workit-core/src/hooks/hosts/fields.ts
18857
18933
  var SHELLS = new Set(["sh", "bash", "zsh", "dash", "pwsh", "powershell", "cmd"]);
18858
18934
  var WRITE_TOOLS = new Set([
18859
18935
  "write",
@@ -18874,24 +18950,24 @@ var WRITE_TOOLS = new Set([
18874
18950
  "editfile",
18875
18951
  "writefile"
18876
18952
  ]);
18877
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/handle.ts
18953
+ // packages/workit-core/src/hooks/handle.ts
18878
18954
  var offered = new Set;
18879
18955
  var CLAUDE_JUDGES = new Set(["workit:verifier", "workit:reviewer"]);
18880
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/hosts/claude-code.ts
18956
+ // packages/workit-core/src/hooks/hosts/claude-code.ts
18881
18957
  var SOURCES = new Set(["startup", "resume", "clear", "compact", "fork"]);
18882
18958
  var SHELL_TOOLS = new Set(["Bash", "PowerShell"]);
18883
18959
  var CONTEXT_EVENTS = new Set(["SessionStart", "UserPromptSubmit", "SubagentStart"]);
18884
18960
 
18885
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/hosts/codex.ts
18961
+ // packages/workit-core/src/hooks/hosts/codex.ts
18886
18962
  var SHELL_TOOLS2 = new Set(["bash", "unified-exec"]);
18887
18963
  var SOURCES2 = new Set(["startup", "resume", "clear", "compact"]);
18888
18964
 
18889
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/hosts/cursor.ts
18965
+ // packages/workit-core/src/hooks/hosts/cursor.ts
18890
18966
  var BLOCKING = new Set(["preToolUse", "beforeShellExecution", "subagentStart"]);
18891
18967
 
18892
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/run.ts
18968
+ // packages/workit-core/src/hooks/run.ts
18893
18969
  if (false) {}
18894
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/hooks/hosts/opencode.ts
18970
+ // packages/workit-core/src/hooks/hosts/opencode.ts
18895
18971
  var OPENCODE_DESCRIPTOR = {
18896
18972
  host: "opencode",
18897
18973
  label: "OpenCode",
@@ -18960,7 +19036,7 @@ var OPENCODE_DESCRIPTOR = {
18960
19036
  // packages/workit-opencode/src/shared/init-apply.ts
18961
19037
  import path26 from "node:path";
18962
19038
 
18963
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/gitignore.ts
19039
+ // packages/workit-core/src/core/gitignore.ts
18964
19040
  import { existsSync as existsSync8, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "node:fs";
18965
19041
  import path22 from "node:path";
18966
19042
  var GITIGNORE_ENTRIES = [
@@ -19008,7 +19084,7 @@ var ensureProjectGitignore = (workspaceRoot, confirmed) => {
19008
19084
  return { ok: true, path: file, added };
19009
19085
  };
19010
19086
 
19011
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/hygiene.ts
19087
+ // packages/workit-core/src/core/hygiene.ts
19012
19088
  import { existsSync as existsSync9, readFileSync as readFileSync7, writeFileSync as writeFileSync5 } from "node:fs";
19013
19089
  import path23 from "node:path";
19014
19090
  var repoRoot3 = assetRoot();
@@ -19072,77 +19148,15 @@ var ensureHygieneFiles = (root, opts) => {
19072
19148
  return { ok: true, created };
19073
19149
  };
19074
19150
 
19075
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/init.ts
19151
+ // packages/workit-core/src/core/init.ts
19076
19152
  import fs15 from "node:fs";
19077
19153
  import path25 from "node:path";
19078
19154
  import { spawnSync as spawnSync14 } from "node:child_process";
19079
19155
 
19080
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/workspace-branch-policy.ts
19156
+ // packages/workit-core/src/core/workspace-branch-policy.ts
19081
19157
  import { mkdirSync as mkdirSync4, readFileSync as readFileSync8, renameSync as renameSync3, rmSync as rmSync2, writeFileSync as writeFileSync6 } from "node:fs";
19082
19158
  import path24 from "node:path";
19083
19159
  import { isDeepStrictEqual } from "node:util";
19084
-
19085
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/branch-policy.ts
19086
- import { spawnSync as spawnSync13 } from "node:child_process";
19087
- var PREFIXES2 = {
19088
- feature: "feature/*",
19089
- bugfix: "bugfix/*",
19090
- release: "release/*",
19091
- hotfix: "hotfix/*"
19092
- };
19093
- var detectBranchPolicy = (workspaceRoot) => {
19094
- const branchExists = (name) => {
19095
- const r = spawnSync13("git", ["branch", "--list", name], {
19096
- cwd: workspaceRoot,
19097
- encoding: "utf8"
19098
- });
19099
- return r.status === 0 && (r.stdout ?? "").trim() !== "";
19100
- };
19101
- const develop = branchExists("develop");
19102
- const main = branchExists("main");
19103
- const master = branchExists("master");
19104
- const root = main ? "main" : master ? "master" : null;
19105
- if (develop) {
19106
- return {
19107
- preset: "gitflow",
19108
- developBranch: "develop",
19109
- integration: "merge",
19110
- protected: root ? [root, "develop"] : ["develop"],
19111
- allowed: [...PRESETS.gitflow.allowed],
19112
- prefixes: PREFIXES2
19113
- };
19114
- }
19115
- if (root === "main") {
19116
- return {
19117
- preset: "github-flow",
19118
- developBranch: null,
19119
- integration: "pr",
19120
- protected: [root],
19121
- allowed: ["*"],
19122
- prefixes: PREFIXES2
19123
- };
19124
- }
19125
- if (root === "master") {
19126
- return {
19127
- preset: "trunk-based",
19128
- developBranch: null,
19129
- integration: "pr",
19130
- protected: [root],
19131
- allowed: ["*"],
19132
- prefixes: PREFIXES2
19133
- };
19134
- }
19135
- return {
19136
- preset: "gitflow",
19137
- developBranch: null,
19138
- integration: "merge",
19139
- protected: [],
19140
- allowed: [],
19141
- prefixes: PREFIXES2
19142
- };
19143
- };
19144
-
19145
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/workspace-branch-policy.ts
19146
19160
  var readFileSafe = (p) => {
19147
19161
  try {
19148
19162
  return readFileSync8(p, "utf8");
@@ -19244,7 +19258,7 @@ function applyWorkspaceBranchPolicy(opts) {
19244
19258
  };
19245
19259
  }
19246
19260
 
19247
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/init.ts
19261
+ // packages/workit-core/src/core/init.ts
19248
19262
  var TOKEN_PLACEHOLDER2 = "YOUR_TOKEN_HERE";
19249
19263
  var readJson = (p) => {
19250
19264
  try {
@@ -20173,7 +20187,7 @@ var evaluateShellPermission = (root, event) => {
20173
20187
  import { existsSync as existsSync11, readFileSync as readFileSync9 } from "node:fs";
20174
20188
  import path30 from "node:path";
20175
20189
 
20176
- // packages/workit-opencode/node_modules/@brainervirus/workit-core/src/core/skill-manifests.ts
20190
+ // packages/workit-core/src/core/skill-manifests.ts
20177
20191
  var WORKIT_METHOD_SKILLS = [
20178
20192
  "workit-shape",
20179
20193
  "workit-implement",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brainervirus/workit-opencode",
3
- "version": "8.0.0",
3
+ "version": "8.1.0",
4
4
  "private": false,
5
5
  "description": "Workit OpenCode plugin — native tools, adaptive policy, and sixteen method skills",
6
6
  "keywords": [
@@ -39,7 +39,7 @@
39
39
  "typecheck": "tsc --noEmit"
40
40
  },
41
41
  "dependencies": {
42
- "@brainervirus/workit-core": "^8.0.0"
42
+ "@brainervirus/workit-core": "^8.1.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@opencode/plugin": "2.0.18"