@staff0rd/assist 0.485.1 → 0.485.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/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { Command } from "commander";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "@staff0rd/assist",
9
- version: "0.485.1",
9
+ version: "0.485.2",
10
10
  type: "module",
11
11
  main: "dist/index.js",
12
12
  bin: {
@@ -142,9 +142,9 @@ import chalk from "chalk";
142
142
  import { stringify as stringifyYaml } from "yaml";
143
143
 
144
144
  // src/shared/loadConfigFrom.ts
145
- import { existsSync as existsSync2 } from "fs";
145
+ import { existsSync as existsSync3 } from "fs";
146
146
  import { homedir } from "os";
147
- import { dirname, join } from "path";
147
+ import { dirname as dirname2, join as join2 } from "path";
148
148
 
149
149
  // src/commands/backlog/getCurrentOrigin.ts
150
150
  import { execFileSync } from "child_process";
@@ -201,13 +201,68 @@ function getCurrentOrigin(cwd) {
201
201
  return `local:${root ?? cwd}`;
202
202
  }
203
203
 
204
+ // src/shared/linkedWorktree.ts
205
+ import { existsSync, readFileSync, statSync } from "fs";
206
+ import { basename, dirname, isAbsolute, join, resolve } from "path";
207
+ function linkedWorktree(dir) {
208
+ const root = findGitLink(dir);
209
+ if (!root) return null;
210
+ const gitDir = readGitDirPointer(root);
211
+ if (!gitDir) return null;
212
+ const commonDir = resolveCommonDir(gitDir);
213
+ if (!commonDir || basename(commonDir) !== ".git") return null;
214
+ const clone = dirname(commonDir);
215
+ return existsSync(clone) ? { root, clone } : null;
216
+ }
217
+ function findGitLink(dir) {
218
+ let current = resolve(dir);
219
+ while (current !== dirname(current)) {
220
+ const entry = join(current, ".git");
221
+ if (existsSync(entry)) return isFile(entry) ? current : null;
222
+ current = dirname(current);
223
+ }
224
+ return null;
225
+ }
226
+ function isFile(path71) {
227
+ try {
228
+ return statSync(path71).isFile();
229
+ } catch {
230
+ return false;
231
+ }
232
+ }
233
+ function readGitDirPointer(root) {
234
+ const target = readTrimmed(join(root, ".git"));
235
+ if (!target?.startsWith("gitdir:")) return null;
236
+ return absolute(target.slice("gitdir:".length).trim(), root);
237
+ }
238
+ function resolveCommonDir(gitDir) {
239
+ const recorded = readTrimmed(join(gitDir, "commondir"));
240
+ if (recorded) return absolute(recorded, gitDir);
241
+ return linkedGitDirParent(gitDir);
242
+ }
243
+ function linkedGitDirParent(gitDir) {
244
+ const match = /^(.*)[/\\]worktrees[/\\][^/\\]+[/\\]?$/.exec(gitDir);
245
+ return match ? match[1] : null;
246
+ }
247
+ function readTrimmed(path71) {
248
+ try {
249
+ const content = readFileSync(path71, "utf8").trim();
250
+ return content === "" ? null : content;
251
+ } catch {
252
+ return null;
253
+ }
254
+ }
255
+ function absolute(target, from) {
256
+ return isAbsolute(target) ? target : resolve(from, target);
257
+ }
258
+
204
259
  // src/shared/loadRawYaml.ts
205
- import { existsSync, readFileSync } from "fs";
260
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
206
261
  import { parse as parseYaml } from "yaml";
207
262
  function loadRawYaml(path71) {
208
- if (!existsSync(path71)) return {};
263
+ if (!existsSync2(path71)) return {};
209
264
  try {
210
- const content = readFileSync(path71, "utf8");
265
+ const content = readFileSync2(path71, "utf8");
211
266
  return parseYaml(content) || {};
212
267
  } catch {
213
268
  return {};
@@ -580,30 +635,35 @@ var assistConfigSchema = z2.strictObject({
580
635
  // src/shared/loadConfigFrom.ts
581
636
  function findConfigUp(startDir) {
582
637
  let current = startDir;
583
- while (current !== dirname(current)) {
584
- const claudePath = join(current, ".claude", "assist.yml");
585
- if (existsSync2(claudePath))
638
+ while (current !== dirname2(current)) {
639
+ const claudePath = join2(current, ".claude", "assist.yml");
640
+ if (existsSync3(claudePath))
586
641
  return { configPath: claudePath, rootDir: current };
587
- const rootPath = join(current, "assist.yml");
588
- if (existsSync2(rootPath)) return { configPath: rootPath, rootDir: current };
589
- current = dirname(current);
642
+ const rootPath = join2(current, "assist.yml");
643
+ if (existsSync3(rootPath)) return { configPath: rootPath, rootDir: current };
644
+ current = dirname2(current);
590
645
  }
591
646
  return null;
592
647
  }
593
648
  function getConfigPathFrom(cwd) {
594
649
  const found = findConfigUp(cwd);
595
650
  if (found) return found.configPath;
596
- return join(cwd, "assist.yml");
651
+ return join2(cwd, "assist.yml");
597
652
  }
598
653
  function getGlobalConfigPath() {
599
- return join(homedir(), ".assist.yml");
654
+ return join2(homedir(), ".assist.yml");
600
655
  }
601
656
  function getConfigDirFrom(cwd) {
602
- return dirname(getConfigPathFrom(cwd));
657
+ return dirname2(getConfigPathFrom(cwd));
658
+ }
659
+ function projectConfigPathFrom(cwd) {
660
+ if (findConfigUp(cwd)) return getConfigPathFrom(cwd);
661
+ const clone = linkedWorktree(cwd)?.clone;
662
+ return getConfigPathFrom(clone ?? cwd);
603
663
  }
604
664
  function loadConfigFrom(cwd) {
605
665
  const globalRaw = loadRawYaml(getGlobalConfigPath());
606
- const projectRaw = loadRawYaml(getConfigPathFrom(cwd));
666
+ const projectRaw = loadRawYaml(projectConfigPathFrom(cwd));
607
667
  const repoOverride = globalRaw.repos ? resolveRepoOverride(globalRaw, getCurrentOrigin(cwd)) : {};
608
668
  const globalWithRepo = mergeRawConfigs(globalRaw, repoOverride);
609
669
  const merged = mergeRawConfigs(globalWithRepo, projectRaw);
@@ -624,7 +684,7 @@ function loadConfig() {
624
684
  return loadConfigFrom(process.cwd());
625
685
  }
626
686
  function loadProjectConfig(cwd = process.cwd()) {
627
- return loadRawYaml(getConfigPathFrom(cwd));
687
+ return loadRawYaml(projectConfigPathFrom(cwd));
628
688
  }
629
689
  function loadGlobalConfigRaw() {
630
690
  return loadRawYaml(getGlobalConfigPath());
@@ -633,7 +693,7 @@ function saveGlobalConfig(config) {
633
693
  writeFileSync(getGlobalConfigPath(), stringifyYaml(config, { lineWidth: 0 }));
634
694
  }
635
695
  function saveConfig(config, cwd = process.cwd()) {
636
- const configPath = getConfigPathFrom(cwd);
696
+ const configPath = projectConfigPathFrom(cwd);
637
697
  writeFileSync(configPath, stringifyYaml(config, { lineWidth: 0 }));
638
698
  }
639
699
  function getTranscriptConfig() {
@@ -1781,7 +1841,7 @@ function gitRefUrl(kind, ref, cwd) {
1781
1841
  }
1782
1842
 
1783
1843
  // src/commands/commit/collectCommitRefs.ts
1784
- function collectCommitRefs(message2) {
1844
+ function collectCommitRefs(message3) {
1785
1845
  const refs = [];
1786
1846
  const branch2 = git("rev-parse --abbrev-ref HEAD");
1787
1847
  if (branch2 && branch2 !== "HEAD") {
@@ -1798,7 +1858,7 @@ function collectCommitRefs(message2) {
1798
1858
  ref: sha,
1799
1859
  url: gitRefUrl("commit", sha)
1800
1860
  };
1801
- const subject = message2.split("\n", 1)[0];
1861
+ const subject = message3.split("\n", 1)[0];
1802
1862
  if (subject) ref.title = subject;
1803
1863
  refs.push(ref);
1804
1864
  const parent = git("rev-parse HEAD^");
@@ -1866,16 +1926,16 @@ function shouldPull(config) {
1866
1926
 
1867
1927
  // src/commands/commit/stageAndCommit.ts
1868
1928
  import { execSync as execSync7 } from "child_process";
1869
- function commitStaged(message2) {
1870
- execSync7(`git commit -m ${shellQuote(message2)}`, { stdio: "inherit" });
1929
+ function commitStaged(message3) {
1930
+ execSync7(`git commit -m ${shellQuote(message3)}`, { stdio: "inherit" });
1871
1931
  return execSync7("git rev-parse --short=7 HEAD", {
1872
1932
  encoding: "utf8"
1873
1933
  }).trim();
1874
1934
  }
1875
- function stageAndCommit(files, message2) {
1935
+ function stageAndCommit(files, message3) {
1876
1936
  const escaped = files.map(shellQuote).join(" ");
1877
1937
  execSync7(`git add ${escaped}`, { stdio: "inherit" });
1878
- return commitStaged(message2);
1938
+ return commitStaged(message3);
1879
1939
  }
1880
1940
 
1881
1941
  // src/commands/sessions/summarise/iterateUserMessages.ts
@@ -1970,34 +2030,34 @@ function backlogRefError(subject, context, ids) {
1970
2030
  // src/commands/commit/validateMessage.ts
1971
2031
  var MAX_MESSAGE_LENGTH = 50;
1972
2032
  var CONVENTIONAL_COMMIT_REGEX = /^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(!)?(\(.+\))?!?: .+$/;
1973
- function validateMessage(message2, config) {
1974
- if (message2.toLowerCase().includes("claude")) {
2033
+ function validateMessage(message3, config) {
2034
+ if (message3.toLowerCase().includes("claude")) {
1975
2035
  console.error("Error: Commit message must not reference Claude");
1976
2036
  process.exit(1);
1977
2037
  }
1978
- const backlogIds = findBacklogRefs(message2);
2038
+ const backlogIds = findBacklogRefs(message3);
1979
2039
  if (backlogIds.length > 0) {
1980
2040
  console.error(
1981
2041
  backlogRefError("Commit message", "commit messages", backlogIds)
1982
2042
  );
1983
2043
  process.exit(1);
1984
2044
  }
1985
- if (config.commit?.conventional && !CONVENTIONAL_COMMIT_REGEX.test(message2)) {
2045
+ if (config.commit?.conventional && !CONVENTIONAL_COMMIT_REGEX.test(message3)) {
1986
2046
  console.error(
1987
2047
  "Error: Commit message must follow conventional commit format (e.g., 'feat: add feature', 'fix(scope): fix bug')"
1988
2048
  );
1989
2049
  process.exit(1);
1990
2050
  }
1991
- if (message2.length > MAX_MESSAGE_LENGTH) {
2051
+ if (message3.length > MAX_MESSAGE_LENGTH) {
1992
2052
  console.error(
1993
- `Error: Commit message must be ${MAX_MESSAGE_LENGTH} characters or less (current: ${message2.length})`
2053
+ `Error: Commit message must be ${MAX_MESSAGE_LENGTH} characters or less (current: ${message3.length})`
1994
2054
  );
1995
2055
  process.exit(1);
1996
2056
  }
1997
2057
  }
1998
2058
 
1999
2059
  // src/commands/commit.ts
2000
- async function execCommit(files, message2, config) {
2060
+ async function execCommit(files, message3, config) {
2001
2061
  try {
2002
2062
  warnIfUnexpectedBranch(config);
2003
2063
  const pulled = shouldPull(config);
@@ -2005,21 +2065,21 @@ async function execCommit(files, message2, config) {
2005
2065
  execSync8("git pull --autostash", { stdio: "inherit" });
2006
2066
  }
2007
2067
  abortOnConflicts(files, pulled);
2008
- const sha = files.length > 0 ? stageAndCommit(files, message2) : commitStaged(message2);
2068
+ const sha = files.length > 0 ? stageAndCommit(files, message3) : commitStaged(message3);
2009
2069
  console.log(`Committed: ${sha}`);
2010
2070
  if (config.commit?.push) {
2011
2071
  pushCommit(config.worktree?.trunk === true);
2012
2072
  console.log("Pushed to remote");
2013
2073
  }
2014
- await recordCommitActivity(message2);
2074
+ await recordCommitActivity(message3);
2015
2075
  process.exit(0);
2016
2076
  } catch {
2017
2077
  process.exit(1);
2018
2078
  }
2019
2079
  }
2020
- async function recordCommitActivity(message2) {
2080
+ async function recordCommitActivity(message3) {
2021
2081
  if (resolveSessionItemId() === null) return;
2022
- await recordSessionRefs(collectCommitRefs(message2));
2082
+ await recordSessionRefs(collectCommitRefs(message3));
2023
2083
  }
2024
2084
  async function commit(args) {
2025
2085
  if (args[0] === "status") {
@@ -2032,11 +2092,11 @@ async function commit(args) {
2032
2092
  console.error("Usage: assist commit <message> [files...]");
2033
2093
  process.exit(1);
2034
2094
  }
2035
- const message2 = args[0];
2095
+ const message3 = args[0];
2036
2096
  const files = args.slice(1);
2037
2097
  const config = loadConfig();
2038
- validateMessage(message2, config);
2039
- await execCommit(files, message2, config);
2098
+ validateMessage(message3, config);
2099
+ await execCommit(files, message3, config);
2040
2100
  }
2041
2101
 
2042
2102
  // src/commands/coverage.ts
@@ -2074,12 +2134,12 @@ async function exitOnCancel(promise) {
2074
2134
  }
2075
2135
 
2076
2136
  // src/shared/promptMultiselect.ts
2077
- async function promptMultiselect(message2, options2) {
2137
+ async function promptMultiselect(message3, options2) {
2078
2138
  const { selected } = await exitOnCancel(
2079
2139
  enquirer.prompt({
2080
2140
  type: "multiselect",
2081
2141
  name: "selected",
2082
- message: message2,
2142
+ message: message3,
2083
2143
  choices: options2.map((opt) => ({
2084
2144
  name: opt.value,
2085
2145
  message: `${opt.name} - ${chalk4.dim(opt.description)}`
@@ -2259,17 +2319,17 @@ import * as path3 from "path";
2259
2319
  import chalk10 from "chalk";
2260
2320
 
2261
2321
  // src/commands/verify/addToKnipIgnoreBinaries.ts
2262
- import { existsSync as existsSync4, readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "fs";
2263
- import { join as join3 } from "path";
2322
+ import { existsSync as existsSync5, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "fs";
2323
+ import { join as join4 } from "path";
2264
2324
  import chalk9 from "chalk";
2265
2325
  function loadKnipConfig(knipJsonPath) {
2266
- if (existsSync4(knipJsonPath)) {
2267
- return JSON.parse(readFileSync3(knipJsonPath, "utf8"));
2326
+ if (existsSync5(knipJsonPath)) {
2327
+ return JSON.parse(readFileSync4(knipJsonPath, "utf8"));
2268
2328
  }
2269
2329
  return { $schema: "https://unpkg.com/knip@5/schema.json" };
2270
2330
  }
2271
2331
  function addToKnipIgnoreBinaries(cwd, binary) {
2272
- const knipJsonPath = join3(cwd, "knip.json");
2332
+ const knipJsonPath = join4(cwd, "knip.json");
2273
2333
  try {
2274
2334
  const knipConfig = loadKnipConfig(knipJsonPath);
2275
2335
  const ignoreBinaries = knipConfig.ignoreBinaries ?? [];
@@ -2316,17 +2376,17 @@ import * as path5 from "path";
2316
2376
  import chalk15 from "chalk";
2317
2377
 
2318
2378
  // src/commands/format/init.ts
2319
- import { existsSync as existsSync5, readFileSync as readFileSync4, writeFileSync as writeFileSync4 } from "fs";
2379
+ import { existsSync as existsSync6, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
2320
2380
  import chalk13 from "chalk";
2321
2381
 
2322
2382
  // src/shared/promptConfirm.ts
2323
2383
  import enquirer2 from "enquirer";
2324
- async function promptConfirm(message2, initial = true) {
2384
+ async function promptConfirm(message3, initial = true) {
2325
2385
  const { confirmed } = await exitOnCancel(
2326
2386
  enquirer2.prompt({
2327
2387
  type: "confirm",
2328
2388
  name: "confirmed",
2329
- message: message2,
2389
+ message: message3,
2330
2390
  initial,
2331
2391
  // @ts-expect-error - enquirer types don't include symbols but it's supported
2332
2392
  symbols: {
@@ -2378,7 +2438,7 @@ async function init() {
2378
2438
  const newContent = `${JSON.stringify(oxfmtrc_template_default, null, " ")}
2379
2439
  `;
2380
2440
  const configPath = ".oxfmtrc.json";
2381
- const oldContent = existsSync5(configPath) ? readFileSync4(configPath, "utf8") : "";
2441
+ const oldContent = existsSync6(configPath) ? readFileSync5(configPath, "utf8") : "";
2382
2442
  if (oldContent === newContent) {
2383
2443
  console.log(".oxfmtrc.json already has the baseline formatter config");
2384
2444
  return;
@@ -2401,15 +2461,15 @@ async function init() {
2401
2461
  }
2402
2462
 
2403
2463
  // src/commands/lint/init.ts
2404
- import { existsSync as existsSync8, readFileSync as readFileSync6, writeFileSync as writeFileSync6 } from "fs";
2464
+ import { existsSync as existsSync9, readFileSync as readFileSync7, writeFileSync as writeFileSync6 } from "fs";
2405
2465
  import chalk14 from "chalk";
2406
2466
 
2407
2467
  // src/shared/removeEslint/index.ts
2408
2468
  import { execSync as execSync11 } from "child_process";
2409
- import { existsSync as existsSync7, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "fs";
2469
+ import { existsSync as existsSync8, readFileSync as readFileSync6, writeFileSync as writeFileSync5 } from "fs";
2410
2470
 
2411
2471
  // src/shared/removeEslint/removeEslintConfigFiles.ts
2412
- import { existsSync as existsSync6, unlinkSync } from "fs";
2472
+ import { existsSync as existsSync7, unlinkSync } from "fs";
2413
2473
  var ESLINT_CONFIG_FILES = [
2414
2474
  "eslint.config.js",
2415
2475
  "eslint.config.mjs",
@@ -2425,7 +2485,7 @@ var ESLINT_CONFIG_FILES = [
2425
2485
  function removeEslintConfigFiles() {
2426
2486
  let removed = false;
2427
2487
  for (const configFile of ESLINT_CONFIG_FILES) {
2428
- if (existsSync6(configFile)) {
2488
+ if (existsSync7(configFile)) {
2429
2489
  unlinkSync(configFile);
2430
2490
  console.log(`Removed ${configFile}`);
2431
2491
  removed = true;
@@ -2447,10 +2507,10 @@ function removeEslint(options2 = {}) {
2447
2507
  }
2448
2508
  function removeEslintFromPackageJson(options2) {
2449
2509
  const packageJsonPath = "package.json";
2450
- if (!existsSync7(packageJsonPath)) {
2510
+ if (!existsSync8(packageJsonPath)) {
2451
2511
  return false;
2452
2512
  }
2453
- const packageJson = JSON.parse(readFileSync5(packageJsonPath, "utf8"));
2513
+ const packageJson = JSON.parse(readFileSync6(packageJsonPath, "utf8"));
2454
2514
  let modified = false;
2455
2515
  modified = removeEslintDeps(packageJson.dependencies) || modified;
2456
2516
  modified = removeEslintDeps(packageJson.devDependencies) || modified;
@@ -2514,7 +2574,7 @@ async function writeOxlintConfig() {
2514
2574
  const newContent = `${JSON.stringify(oxlintrc_template_default, null, " ")}
2515
2575
  `;
2516
2576
  const configPath = ".oxlintrc.json";
2517
- const oldContent = existsSync8(configPath) ? readFileSync6(configPath, "utf8") : "";
2577
+ const oldContent = existsSync9(configPath) ? readFileSync7(configPath, "utf8") : "";
2518
2578
  if (oldContent === newContent) {
2519
2579
  console.log(".oxlintrc.json already has the baseline linter config");
2520
2580
  return;
@@ -3289,7 +3349,7 @@ function lint(options2 = {}) {
3289
3349
 
3290
3350
  // src/commands/new/registerNew/newCli/index.ts
3291
3351
  import { execSync as execSync20 } from "child_process";
3292
- import { basename as basename2, resolve as resolve5 } from "path";
3352
+ import { basename as basename3, resolve as resolve6 } from "path";
3293
3353
 
3294
3354
  // src/commands/verify/blockCodeComments/findComments.ts
3295
3355
  import { execSync as execSync12 } from "child_process";
@@ -3872,7 +3932,7 @@ function configKeys() {
3872
3932
  }
3873
3933
 
3874
3934
  // src/commands/verify/forbiddenStrings/index.ts
3875
- import { existsSync as existsSync12, readFileSync as readFileSync9 } from "fs";
3935
+ import { existsSync as existsSync13, readFileSync as readFileSync10 } from "fs";
3876
3936
 
3877
3937
  // src/commands/verify/forbiddenStrings/findForbiddenStrings.ts
3878
3938
  import { minimatch as minimatch2 } from "minimatch";
@@ -3913,13 +3973,13 @@ function forbiddenStrings() {
3913
3973
  const cache4 = /* @__PURE__ */ new Map();
3914
3974
  const readJson = (file) => {
3915
3975
  if (cache4.has(file)) return cache4.get(file);
3916
- if (!existsSync12(file)) {
3976
+ if (!existsSync13(file)) {
3917
3977
  console.log(`Forbidden-strings file not found: ${file}`);
3918
3978
  process.exit(1);
3919
3979
  }
3920
3980
  let parsed;
3921
3981
  try {
3922
- parsed = JSON.parse(readFileSync9(file, "utf8"));
3982
+ parsed = JSON.parse(readFileSync10(file, "utf8"));
3923
3983
  } catch (error) {
3924
3984
  console.log(`Could not parse ${file}: ${error.message}`);
3925
3985
  process.exit(1);
@@ -3992,7 +4052,7 @@ Total: ${lines.length} hardcoded color(s)`);
3992
4052
  import * as path19 from "path";
3993
4053
 
3994
4054
  // src/shared/resolveRunConfigs.ts
3995
- import { dirname as dirname9, relative, resolve as resolve3 } from "path";
4055
+ import { dirname as dirname10, relative, resolve as resolve4 } from "path";
3996
4056
 
3997
4057
  // src/shared/assertNoDuplicateRunNames.ts
3998
4058
  function findDuplicateNames(configs) {
@@ -4014,14 +4074,14 @@ function assertNoDuplicateRunNames(configs) {
4014
4074
  }
4015
4075
 
4016
4076
  // src/shared/findLinkedConfigPath.ts
4017
- import { existsSync as existsSync13 } from "fs";
4018
- import { join as join8, resolve } from "path";
4077
+ import { existsSync as existsSync14 } from "fs";
4078
+ import { join as join9, resolve as resolve2 } from "path";
4019
4079
  function findLinkedConfigPath(linkPath, fromDir) {
4020
- const resolved = resolve(fromDir, linkPath);
4021
- const claudePath = join8(resolved, ".claude", "assist.yml");
4022
- if (existsSync13(claudePath)) return claudePath;
4023
- const rootPath = join8(resolved, "assist.yml");
4024
- if (existsSync13(rootPath)) return rootPath;
4080
+ const resolved = resolve2(fromDir, linkPath);
4081
+ const claudePath = join9(resolved, ".claude", "assist.yml");
4082
+ if (existsSync14(claudePath)) return claudePath;
4083
+ const rootPath = join9(resolved, "assist.yml");
4084
+ if (existsSync14(rootPath)) return rootPath;
4025
4085
  throw new Error(`No assist.yml found in linked project: ${resolved}`);
4026
4086
  }
4027
4087
 
@@ -4031,9 +4091,9 @@ function isRunLink(entry) {
4031
4091
  }
4032
4092
 
4033
4093
  // src/shared/loadLinkedEntries.ts
4034
- import { resolve as resolve2 } from "path";
4094
+ import { resolve as resolve3 } from "path";
4035
4095
  function loadLinkedEntries(configPath, visited) {
4036
- const canonical = resolve2(configPath);
4096
+ const canonical = resolve3(configPath);
4037
4097
  if (visited.has(canonical)) {
4038
4098
  throw new Error(
4039
4099
  `Circular link detected: ${canonical} has already been visited`
@@ -4055,15 +4115,15 @@ function applyPrefix(configs, prefix2) {
4055
4115
  function setDefaultCwd(configs, defaultCwd) {
4056
4116
  return configs.map((c) => c.cwd ? c : { ...c, cwd: defaultCwd });
4057
4117
  }
4058
- function relativeToRoot(ctx, absolute) {
4059
- return relative(ctx.rootConfigDir, absolute);
4118
+ function relativeToRoot(ctx, absolute2) {
4119
+ return relative(ctx.rootConfigDir, absolute2);
4060
4120
  }
4061
4121
  function loadAndResolveLink(linkPath, configDir, ctx) {
4062
4122
  const configPath = findLinkedConfigPath(linkPath, configDir);
4063
4123
  const entries = loadLinkedEntries(configPath, ctx.visited);
4064
- const defaultCwd = relativeToRoot(ctx, resolve3(configDir, linkPath));
4124
+ const defaultCwd = relativeToRoot(ctx, resolve4(configDir, linkPath));
4065
4125
  return setDefaultCwd(
4066
- resolveRecursive(entries, dirname9(configPath), ctx),
4126
+ resolveRecursive(entries, dirname10(configPath), ctx),
4067
4127
  defaultCwd
4068
4128
  );
4069
4129
  }
@@ -4085,7 +4145,7 @@ function resolveLocalCwd(config, configDir, ctx) {
4085
4145
  if (!config.cwd || configDir === ctx.rootConfigDir) return config;
4086
4146
  return {
4087
4147
  ...config,
4088
- cwd: relativeToRoot(ctx, resolve3(configDir, config.cwd))
4148
+ cwd: relativeToRoot(ctx, resolve4(configDir, config.cwd))
4089
4149
  };
4090
4150
  }
4091
4151
 
@@ -4132,7 +4192,7 @@ function list() {
4132
4192
  }
4133
4193
 
4134
4194
  // src/commands/verify/migrations/index.ts
4135
- import { readFileSync as readFileSync10 } from "fs";
4195
+ import { readFileSync as readFileSync11 } from "fs";
4136
4196
  import path20 from "path";
4137
4197
  import { fileURLToPath } from "url";
4138
4198
 
@@ -4213,7 +4273,7 @@ function listMigrationFiles(dir) {
4213
4273
 
4214
4274
  // src/commands/verify/migrations/readBaselineMigrations.ts
4215
4275
  import { execSync as execSync14 } from "child_process";
4216
- import { basename } from "path";
4276
+ import { basename as basename2 } from "path";
4217
4277
  var MIGRATION_FILE3 = /^migration\d+[A-Za-z0-9]*\.ts$/;
4218
4278
  function readBaselineMigrations(repoRelativeDir, ref) {
4219
4279
  const baseline = /* @__PURE__ */ new Map();
@@ -4226,7 +4286,7 @@ function readBaselineMigrations(repoRelativeDir, ref) {
4226
4286
  } catch {
4227
4287
  return baseline;
4228
4288
  }
4229
- const paths = listing.split("\n").map((line) => line.trim()).filter(Boolean).filter((path71) => MIGRATION_FILE3.test(basename(path71)));
4289
+ const paths = listing.split("\n").map((line) => line.trim()).filter(Boolean).filter((path71) => MIGRATION_FILE3.test(basename2(path71)));
4230
4290
  for (const path71 of paths) {
4231
4291
  try {
4232
4292
  const content = execSync14(`git show "${ref}:${path71}"`, {
@@ -4234,7 +4294,7 @@ function readBaselineMigrations(repoRelativeDir, ref) {
4234
4294
  maxBuffer: 16 * 1024 * 1024,
4235
4295
  stdio: ["pipe", "pipe", "pipe"]
4236
4296
  });
4237
- baseline.set(basename(path71), content);
4297
+ baseline.set(basename2(path71), content);
4238
4298
  } catch {
4239
4299
  }
4240
4300
  }
@@ -4294,7 +4354,7 @@ function migrations2() {
4294
4354
  if (ref) {
4295
4355
  const baseline = readBaselineMigrations(REPO_RELATIVE_DIR, ref);
4296
4356
  const current = new Map(
4297
- files.map((file) => [file, readFileSync10(path20.join(dir, file), "utf8")])
4357
+ files.map((file) => [file, readFileSync11(path20.join(dir, file), "utf8")])
4298
4358
  );
4299
4359
  for (const finding of checkAppendOnly(baseline, current)) {
4300
4360
  problems.push(
@@ -4462,7 +4522,7 @@ ${failed2.length} script(s) failed:`);
4462
4522
  }
4463
4523
  }
4464
4524
  function runEntry(entry) {
4465
- return new Promise((resolve20) => {
4525
+ return new Promise((resolve21) => {
4466
4526
  const startTime = Date.now();
4467
4527
  const child = spawnCommand(
4468
4528
  entry.fullCommand,
@@ -4474,7 +4534,7 @@ function runEntry(entry) {
4474
4534
  child.on("close", (code) => {
4475
4535
  const exitCode = code ?? 1;
4476
4536
  flushIfFailed(exitCode, chunks);
4477
- resolve20({
4537
+ resolve21({
4478
4538
  script: entry.name,
4479
4539
  code: exitCode,
4480
4540
  durationMs: Date.now() - startTime
@@ -4605,7 +4665,7 @@ program.parse();
4605
4665
 
4606
4666
  // src/commands/new/registerNew/newCli/index.ts
4607
4667
  async function newCli() {
4608
- const name = basename2(resolve5("."));
4668
+ const name = basename3(resolve6("."));
4609
4669
  initGit();
4610
4670
  initPackageJson(name);
4611
4671
  console.log("Installing dependencies...");
@@ -4620,7 +4680,7 @@ async function newCli() {
4620
4680
 
4621
4681
  // src/commands/new/registerNew/newProject.ts
4622
4682
  import { execSync as execSync22 } from "child_process";
4623
- import { existsSync as existsSync15, readFileSync as readFileSync12, writeFileSync as writeFileSync13 } from "fs";
4683
+ import { existsSync as existsSync16, readFileSync as readFileSync13, writeFileSync as writeFileSync13 } from "fs";
4624
4684
 
4625
4685
  // src/commands/deploy/init/index.ts
4626
4686
  import { execSync as execSync21 } from "child_process";
@@ -4628,33 +4688,33 @@ import chalk28 from "chalk";
4628
4688
  import enquirer3 from "enquirer";
4629
4689
 
4630
4690
  // src/commands/deploy/init/updateWorkflow.ts
4631
- import { existsSync as existsSync14, mkdirSync as mkdirSync3, readFileSync as readFileSync11, writeFileSync as writeFileSync12 } from "fs";
4632
- import { dirname as dirname11, join as join9 } from "path";
4691
+ import { existsSync as existsSync15, mkdirSync as mkdirSync3, readFileSync as readFileSync12, writeFileSync as writeFileSync12 } from "fs";
4692
+ import { dirname as dirname12, join as join10 } from "path";
4633
4693
  import { fileURLToPath as fileURLToPath2 } from "url";
4634
4694
  import chalk27 from "chalk";
4635
4695
  var WORKFLOW_PATH = ".github/workflows/build.yml";
4636
- var __dirname2 = dirname11(fileURLToPath2(import.meta.url));
4696
+ var __dirname2 = dirname12(fileURLToPath2(import.meta.url));
4637
4697
  function getExistingSiteId() {
4638
- if (!existsSync14(WORKFLOW_PATH)) {
4698
+ if (!existsSync15(WORKFLOW_PATH)) {
4639
4699
  return null;
4640
4700
  }
4641
- const content = readFileSync11(WORKFLOW_PATH, "utf8");
4701
+ const content = readFileSync12(WORKFLOW_PATH, "utf8");
4642
4702
  const match = content.match(/-s\s+([a-f0-9-]{36})/);
4643
4703
  return match ? match[1] : null;
4644
4704
  }
4645
4705
  function getTemplateContent(siteId) {
4646
- const templatePath = join9(__dirname2, "commands/deploy/build.yml");
4647
- const template = readFileSync11(templatePath, "utf8");
4706
+ const templatePath = join10(__dirname2, "commands/deploy/build.yml");
4707
+ const template = readFileSync12(templatePath, "utf8");
4648
4708
  return template.replace("{{NETLIFY_SITE_ID}}", siteId);
4649
4709
  }
4650
4710
  async function updateWorkflow(siteId) {
4651
4711
  const newContent = getTemplateContent(siteId);
4652
4712
  const workflowDir = ".github/workflows";
4653
- if (!existsSync14(workflowDir)) {
4713
+ if (!existsSync15(workflowDir)) {
4654
4714
  mkdirSync3(workflowDir, { recursive: true });
4655
4715
  }
4656
- if (existsSync14(WORKFLOW_PATH)) {
4657
- const oldContent = readFileSync11(WORKFLOW_PATH, "utf8");
4716
+ if (existsSync15(WORKFLOW_PATH)) {
4717
+ const oldContent = readFileSync12(WORKFLOW_PATH, "utf8");
4658
4718
  if (oldContent === newContent) {
4659
4719
  console.log(chalk27.green("build.yml is already up to date"));
4660
4720
  return;
@@ -4748,11 +4808,11 @@ async function newProject() {
4748
4808
  }
4749
4809
  function addViteBaseConfig() {
4750
4810
  const viteConfigPath = "vite.config.ts";
4751
- if (!existsSync15(viteConfigPath)) {
4811
+ if (!existsSync16(viteConfigPath)) {
4752
4812
  console.log("No vite.config.ts found, skipping base config");
4753
4813
  return;
4754
4814
  }
4755
- const content = readFileSync12(viteConfigPath, "utf8");
4815
+ const content = readFileSync13(viteConfigPath, "utf8");
4756
4816
  if (content.includes("base:")) {
4757
4817
  console.log("vite.config.ts already has base config");
4758
4818
  return;
@@ -4819,13 +4879,13 @@ function getSnoreToastPath() {
4819
4879
  return path21.join(notifierPath, "vendor", "snoreToast", "snoretoast-x64.exe");
4820
4880
  }
4821
4881
  function showWindowsNotificationFromWsl(options2) {
4822
- const { title, message: message2, sound } = options2;
4882
+ const { title, message: message3, sound } = options2;
4823
4883
  const snoreToastPath = getSnoreToastPath();
4824
4884
  try {
4825
4885
  fs16.chmodSync(snoreToastPath, 493);
4826
4886
  } catch {
4827
4887
  }
4828
- const args = ["-t", title, "-m", message2];
4888
+ const args = ["-t", title, "-m", message3];
4829
4889
  if (sound) {
4830
4890
  args.push("-s", "ms-winsoundevent:Notification.Default");
4831
4891
  }
@@ -4839,14 +4899,14 @@ function showWindowsNotificationFromWsl(options2) {
4839
4899
 
4840
4900
  // src/commands/notify/showNotification/index.ts
4841
4901
  function showNotification(options2) {
4842
- const { title, message: message2, sound } = options2;
4902
+ const { title, message: message3, sound } = options2;
4843
4903
  const platform = detectPlatform();
4844
4904
  if (platform === "wsl") {
4845
- return showWindowsNotificationFromWsl({ title, message: message2, sound });
4905
+ return showWindowsNotificationFromWsl({ title, message: message3, sound });
4846
4906
  }
4847
4907
  const notificationOptions = {
4848
4908
  title,
4849
- message: message2,
4909
+ message: message3,
4850
4910
  wait: false
4851
4911
  };
4852
4912
  if (platform === "windows") {
@@ -4868,7 +4928,7 @@ async function notify() {
4868
4928
  }
4869
4929
  const inputData = await readStdin();
4870
4930
  const data = JSON.parse(inputData);
4871
- const { notification_type, cwd, message: message2 } = data;
4931
+ const { notification_type, cwd, message: message3 } = data;
4872
4932
  const projectName = cwd?.split(/[/\\]/).pop() ?? "Unknown Project";
4873
4933
  let title;
4874
4934
  let body;
@@ -4876,7 +4936,7 @@ async function notify() {
4876
4936
  switch (notification_type) {
4877
4937
  case "permission_prompt":
4878
4938
  title = "Claude needs permission";
4879
- body = `${projectName} - ${message2 || "Permission required"}`;
4939
+ body = `${projectName} - ${message3 || "Permission required"}`;
4880
4940
  sound = "Alarm";
4881
4941
  break;
4882
4942
  case "idle_prompt":
@@ -4886,7 +4946,7 @@ async function notify() {
4886
4946
  break;
4887
4947
  default:
4888
4948
  title = "Claude Code";
4889
- body = message2 ? `${projectName} - ${message2}` : projectName;
4949
+ body = message3 ? `${projectName} - ${message3}` : projectName;
4890
4950
  sound = "Default";
4891
4951
  }
4892
4952
  showNotification({ title, message: body, sound });
@@ -4994,7 +5054,7 @@ function registerActivity(program2) {
4994
5054
 
4995
5055
  // src/commands/registerBackup.ts
4996
5056
  import { mkdir as mkdir2, stat } from "fs/promises";
4997
- import { join as join11, resolve as resolve6 } from "path";
5057
+ import { join as join12, resolve as resolve7 } from "path";
4998
5058
  import chalk31 from "chalk";
4999
5059
 
5000
5060
  // src/shared/db/recordBackup.ts
@@ -5014,7 +5074,7 @@ function expandTilde2(value) {
5014
5074
 
5015
5075
  // src/commands/backup/scheduleBackup.ts
5016
5076
  import { mkdir } from "fs/promises";
5017
- import { join as join10 } from "path";
5077
+ import { join as join11 } from "path";
5018
5078
  import chalk29 from "chalk";
5019
5079
 
5020
5080
  // src/commands/backup/readCrontab.ts
@@ -5140,8 +5200,8 @@ function readScheduleBlock(crontab) {
5140
5200
  }
5141
5201
 
5142
5202
  // src/commands/backup/scheduleBackup.ts
5143
- function fail(message2) {
5144
- console.error(chalk29.red(message2));
5203
+ function fail(message3) {
5204
+ console.error(chalk29.red(message3));
5145
5205
  process.exit(1);
5146
5206
  }
5147
5207
  async function scheduleBackup({
@@ -5156,7 +5216,7 @@ async function scheduleBackup({
5156
5216
  const cronExpr = durationToCron(every);
5157
5217
  const dir = expandTilde2(loadConfig().backup.dir);
5158
5218
  await mkdir(dir, { recursive: true });
5159
- const logPath2 = join10(dir, "cron.log");
5219
+ const logPath2 = join11(dir, "cron.log");
5160
5220
  const cronLine = `${cronExpr} ${resolveAssistCommand()} backup >> ${logPath2} 2>&1`;
5161
5221
  writeCrontab(upsertScheduleBlock(readCrontab(), every, cronLine));
5162
5222
  console.error(
@@ -5335,7 +5395,7 @@ async function backup({ out }) {
5335
5395
  await mkdir2(dir, { recursive: true });
5336
5396
  const start3 = Date.now();
5337
5397
  const timestamp6 = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
5338
- const filePath = resolve6(join11(dir, `backup-${timestamp6}.dump`));
5398
+ const filePath = resolve7(join12(dir, `backup-${timestamp6}.dump`));
5339
5399
  await exportBacklog(filePath);
5340
5400
  const { size } = await stat(filePath);
5341
5401
  const durationMs = Date.now() - start3;
@@ -5442,19 +5502,19 @@ function parseItemId(input) {
5442
5502
 
5443
5503
  // src/commands/backlog/acquireLock.ts
5444
5504
  import {
5445
- existsSync as existsSync16,
5505
+ existsSync as existsSync17,
5446
5506
  mkdirSync as mkdirSync4,
5447
- readFileSync as readFileSync13,
5507
+ readFileSync as readFileSync14,
5448
5508
  unlinkSync as unlinkSync2,
5449
5509
  writeFileSync as writeFileSync14
5450
5510
  } from "fs";
5451
5511
  import { homedir as homedir4 } from "os";
5452
- import { join as join12 } from "path";
5512
+ import { join as join13 } from "path";
5453
5513
  function getLocksDir() {
5454
- return join12(homedir4(), ".assist", "locks");
5514
+ return join13(homedir4(), ".assist", "locks");
5455
5515
  }
5456
5516
  function getLockPath(itemId2) {
5457
- return join12(getLocksDir(), `lock-${itemId2}.json`);
5517
+ return join13(getLocksDir(), `lock-${itemId2}.json`);
5458
5518
  }
5459
5519
  function isProcessAlive(pid) {
5460
5520
  try {
@@ -5466,9 +5526,9 @@ function isProcessAlive(pid) {
5466
5526
  }
5467
5527
  function foreignLockHolder(itemId2) {
5468
5528
  const lockPath = getLockPath(itemId2);
5469
- if (!existsSync16(lockPath)) return null;
5529
+ if (!existsSync17(lockPath)) return null;
5470
5530
  try {
5471
- const lock2 = JSON.parse(readFileSync13(lockPath, "utf8"));
5531
+ const lock2 = JSON.parse(readFileSync14(lockPath, "utf8"));
5472
5532
  if (typeof lock2.pid !== "number" || lock2.pid === process.pid) return null;
5473
5533
  if (!isProcessAlive(lock2.pid)) return null;
5474
5534
  return { pid: lock2.pid, timestamp: lock2.timestamp };
@@ -5579,19 +5639,19 @@ import chalk45 from "chalk";
5579
5639
 
5580
5640
  // src/commands/sessions/daemon/ensureHooksSettings.ts
5581
5641
  import { mkdirSync as mkdirSync5, writeFileSync as writeFileSync15 } from "fs";
5582
- import { dirname as dirname12 } from "path";
5642
+ import { dirname as dirname13 } from "path";
5583
5643
 
5584
5644
  // src/commands/sessions/daemon/daemonPaths.ts
5585
5645
  import { homedir as homedir5 } from "os";
5586
- import { join as join13 } from "path";
5587
- var DAEMON_DIR = join13(homedir5(), ".assist", "daemon");
5646
+ import { join as join14 } from "path";
5647
+ var DAEMON_DIR = join14(homedir5(), ".assist", "daemon");
5588
5648
  var daemonPaths = {
5589
5649
  dir: DAEMON_DIR,
5590
- socket: process.platform === "win32" ? String.raw`\\.\pipe\assist-sessions-daemon` : join13(DAEMON_DIR, "daemon.sock"),
5591
- log: join13(DAEMON_DIR, "daemon.log"),
5592
- pid: join13(DAEMON_DIR, "daemon.pid"),
5593
- spawnLock: join13(DAEMON_DIR, "spawn.lock"),
5594
- hooksSettings: join13(DAEMON_DIR, "hooks-settings.json")
5650
+ socket: process.platform === "win32" ? String.raw`\\.\pipe\assist-sessions-daemon` : join14(DAEMON_DIR, "daemon.sock"),
5651
+ log: join14(DAEMON_DIR, "daemon.log"),
5652
+ pid: join14(DAEMON_DIR, "daemon.pid"),
5653
+ spawnLock: join14(DAEMON_DIR, "spawn.lock"),
5654
+ hooksSettings: join14(DAEMON_DIR, "hooks-settings.json")
5595
5655
  };
5596
5656
 
5597
5657
  // src/commands/sessions/daemon/ensureHooksSettings.ts
@@ -5626,7 +5686,7 @@ var hooksSettings = {
5626
5686
  };
5627
5687
  function ensureHooksSettings() {
5628
5688
  const path71 = daemonPaths.hooksSettings;
5629
- mkdirSync5(dirname12(path71), { recursive: true });
5689
+ mkdirSync5(dirname13(path71), { recursive: true });
5630
5690
  writeFileSync15(path71, JSON.stringify(hooksSettings, null, 2));
5631
5691
  return path71;
5632
5692
  }
@@ -5644,8 +5704,8 @@ function spawnInherit(command, args, options2 = {}) {
5644
5704
  env,
5645
5705
  cwd: options2.cwd
5646
5706
  });
5647
- const done2 = new Promise((resolve20, reject) => {
5648
- child.on("close", (code) => resolve20(code ?? 0));
5707
+ const done2 = new Promise((resolve21, reject) => {
5708
+ child.on("close", (code) => resolve21(code ?? 0));
5649
5709
  child.on("error", reject);
5650
5710
  });
5651
5711
  return { child, done: done2 };
@@ -5679,6 +5739,10 @@ function buildArgs(prompt, options2) {
5679
5739
  return [prompt];
5680
5740
  }
5681
5741
 
5742
+ // src/commands/backlog/ensureStoryBranch.ts
5743
+ import { execSync as execSync28 } from "child_process";
5744
+ import { basename as basename4 } from "path";
5745
+
5682
5746
  // src/commands/branch/createBranch.ts
5683
5747
  import { execSync as execSync27 } from "child_process";
5684
5748
 
@@ -5829,8 +5893,8 @@ function buildPrompt(description) {
5829
5893
 
5830
5894
  // src/commands/sessions/daemon/appendDaemonLog.ts
5831
5895
  import { appendFileSync } from "fs";
5832
- function appendDaemonLog(message2) {
5833
- const line = `${(/* @__PURE__ */ new Date()).toISOString()} [${process.pid}] ${message2}`;
5896
+ function appendDaemonLog(message3) {
5897
+ const line = `${(/* @__PURE__ */ new Date()).toISOString()} [${process.pid}] ${message3}`;
5834
5898
  try {
5835
5899
  appendFileSync(daemonPaths.log, `${line}
5836
5900
  `);
@@ -5841,36 +5905,89 @@ function appendDaemonLog(message2) {
5841
5905
  // src/commands/backlog/ensureStoryBranch.ts
5842
5906
  async function ensureStoryBranch(item) {
5843
5907
  const config = loadConfig();
5844
- if (!config.prs?.required) return;
5845
- if (hasBranchRef(item)) return;
5908
+ if (!config.prs?.required) {
5909
+ log(item, "prs.required not set; left the session on its current branch");
5910
+ return;
5911
+ }
5912
+ const recorded = recordedBranch(item);
5913
+ if (recorded) {
5914
+ adoptRecordedBranch(item, recorded);
5915
+ return;
5916
+ }
5846
5917
  process.env.ASSIST_BACKLOG_ITEM_ID = String(item.id);
5847
5918
  const slug = await generateBranchSlug(item.name);
5848
5919
  const { branchName } = await createBranch({ slug, jira: item.jiraKey });
5849
- appendDaemonLog(
5850
- `backlog run ${item.id}: prs.required set and no branch recorded; created ${branchName}`
5851
- );
5920
+ log(item, `prs.required set and no branch recorded; created ${branchName}`);
5852
5921
  }
5853
- function hasBranchRef(item) {
5854
- return (item.gitRefs ?? []).some((ref) => ref.kind === "branch");
5922
+ function recordedBranch(item) {
5923
+ return (item.gitRefs ?? []).find((ref) => ref.kind === "branch")?.ref;
5924
+ }
5925
+ function adoptRecordedBranch(item, branch2) {
5926
+ const parked = worktreeBranchInPlay();
5927
+ if (!parked) {
5928
+ log(
5929
+ item,
5930
+ `branch ${branch2} already recorded; left the session on its current branch`
5931
+ );
5932
+ return;
5933
+ }
5934
+ try {
5935
+ execSync28("git fetch", { stdio: "ignore" });
5936
+ } catch {
5937
+ }
5938
+ try {
5939
+ execSync28(`git switch ${shellQuote(branch2)}`, { stdio: "inherit" });
5940
+ log(
5941
+ item,
5942
+ `branch ${branch2} already recorded; switched off ${parked} onto it`
5943
+ );
5944
+ } catch (error) {
5945
+ log(
5946
+ item,
5947
+ `branch ${branch2} already recorded but the worktree stayed on ${parked}: ${message(error)}`
5948
+ );
5949
+ }
5950
+ }
5951
+ function worktreeBranchInPlay() {
5952
+ const tree = linkedWorktree(process.cwd());
5953
+ if (!tree) return null;
5954
+ const head = currentBranch2();
5955
+ return head === basename4(tree.root) ? head : null;
5956
+ }
5957
+ function currentBranch2() {
5958
+ try {
5959
+ return execSync28("git rev-parse --abbrev-ref HEAD", {
5960
+ encoding: "utf8",
5961
+ stdio: ["ignore", "pipe", "ignore"]
5962
+ }).trim();
5963
+ } catch {
5964
+ return null;
5965
+ }
5966
+ }
5967
+ function log(item, outcome) {
5968
+ appendDaemonLog(`backlog run ${item.id}: ${outcome}`);
5969
+ }
5970
+ function message(error) {
5971
+ return error instanceof Error ? error.message : String(error);
5855
5972
  }
5856
5973
 
5857
5974
  // src/commands/backlog/shared.ts
5858
5975
  import chalk37 from "chalk";
5859
5976
 
5860
5977
  // src/commands/backlog/migrateLocalBacklog.ts
5861
- import { existsSync as existsSync18 } from "fs";
5862
- import { join as join15 } from "path";
5978
+ import { existsSync as existsSync19 } from "fs";
5979
+ import { join as join16 } from "path";
5863
5980
  import chalk36 from "chalk";
5864
5981
 
5865
5982
  // src/commands/backlog/backupLocalBacklogFiles.ts
5866
- import { existsSync as existsSync17, renameSync } from "fs";
5867
- import { join as join14 } from "path";
5983
+ import { existsSync as existsSync18, renameSync } from "fs";
5984
+ import { join as join15 } from "path";
5868
5985
  var LOCAL_FILES = ["backlog.jsonl", "backlog.db"];
5869
5986
  function backupLocalBacklogFiles(dir) {
5870
5987
  const moved = [];
5871
5988
  for (const name of LOCAL_FILES) {
5872
- const path71 = join14(dir, ".assist", name);
5873
- if (existsSync17(path71)) {
5989
+ const path71 = join15(dir, ".assist", name);
5990
+ if (existsSync18(path71)) {
5874
5991
  renameSync(path71, `${path71}.bak`);
5875
5992
  moved.push(`${name} \u2192 ${name}.bak`);
5876
5993
  }
@@ -5879,11 +5996,11 @@ function backupLocalBacklogFiles(dir) {
5879
5996
  }
5880
5997
 
5881
5998
  // src/commands/backlog/gitPullBacklog.ts
5882
- import { execSync as execSync28 } from "child_process";
5999
+ import { execSync as execSync29 } from "child_process";
5883
6000
  import chalk35 from "chalk";
5884
6001
  function gitPullBacklog(dir) {
5885
6002
  try {
5886
- execSync28("git pull --ff-only", {
6003
+ execSync29("git pull --ff-only", {
5887
6004
  cwd: dir,
5888
6005
  stdio: ["pipe", "pipe", "pipe"]
5889
6006
  });
@@ -6258,7 +6375,7 @@ async function loadAllItems(orm, origin) {
6258
6375
  }
6259
6376
 
6260
6377
  // src/commands/backlog/parseBacklogJsonl.ts
6261
- import { readFileSync as readFileSync14 } from "fs";
6378
+ import { readFileSync as readFileSync15 } from "fs";
6262
6379
 
6263
6380
  // src/commands/backlog/types.ts
6264
6381
  import { z as z3 } from "zod";
@@ -6350,14 +6467,14 @@ var backlogFileSchema = z3.array(backlogItemSchema);
6350
6467
 
6351
6468
  // src/commands/backlog/parseBacklogJsonl.ts
6352
6469
  function parseBacklogJsonl(path71) {
6353
- const content = readFileSync14(path71, "utf8").trim();
6470
+ const content = readFileSync15(path71, "utf8").trim();
6354
6471
  if (content.length === 0) return [];
6355
6472
  return content.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => backlogItemSchema.parse(JSON.parse(line)));
6356
6473
  }
6357
6474
 
6358
6475
  // src/commands/backlog/migrateLocalBacklog.ts
6359
6476
  function jsonlPath(dir) {
6360
- return join15(dir, ".assist", "backlog.jsonl");
6477
+ return join16(dir, ".assist", "backlog.jsonl");
6361
6478
  }
6362
6479
  async function verifyImport(orm, origin, items2, imported) {
6363
6480
  const reloaded = await loadAllItems(orm, origin);
@@ -6373,7 +6490,7 @@ async function verifyImport(orm, origin, items2, imported) {
6373
6490
  }
6374
6491
  }
6375
6492
  async function migrateLocalBacklog(orm, dir, origin) {
6376
- if (!existsSync18(jsonlPath(dir))) return;
6493
+ if (!existsSync19(jsonlPath(dir))) return;
6377
6494
  const existing = (await loadAllItems(orm, origin)).length;
6378
6495
  if (existing > 0) {
6379
6496
  const moved2 = backupLocalBacklogFiles(dir);
@@ -6412,20 +6529,20 @@ async function deleteItem(orm, id) {
6412
6529
  }
6413
6530
 
6414
6531
  // src/commands/backlog/findBacklogUp.ts
6415
- import { existsSync as existsSync19 } from "fs";
6416
- import { dirname as dirname13, join as join16 } from "path";
6532
+ import { existsSync as existsSync20 } from "fs";
6533
+ import { dirname as dirname14, join as join17 } from "path";
6417
6534
  var BACKLOG_MARKERS = [
6418
- join16(".assist", "backlog.db"),
6419
- join16(".assist", "backlog.jsonl"),
6535
+ join17(".assist", "backlog.db"),
6536
+ join17(".assist", "backlog.jsonl"),
6420
6537
  "assist.backlog.yml"
6421
6538
  ];
6422
6539
  function findBacklogUp(startDir) {
6423
6540
  let current = startDir;
6424
- while (current !== dirname13(current)) {
6425
- if (BACKLOG_MARKERS.some((marker) => existsSync19(join16(current, marker)))) {
6541
+ while (current !== dirname14(current)) {
6542
+ if (BACKLOG_MARKERS.some((marker) => existsSync20(join17(current, marker)))) {
6426
6543
  return current;
6427
6544
  }
6428
- current = dirname13(current);
6545
+ current = dirname14(current);
6429
6546
  }
6430
6547
  return null;
6431
6548
  }
@@ -6610,10 +6727,10 @@ async function reconcileResumePhase(orm, item, startPhase, resumeSessionId) {
6610
6727
  if (resumedPhaseIdx === void 0 || resumedPhaseIdx === startPhase) {
6611
6728
  return startPhase;
6612
6729
  }
6613
- const message2 = `resume reconciliation: currentPhase implied phase ${startPhase + 1} but the resumed conversation ${resumeSessionId} ran phase ${resumedPhaseIdx + 1}; resuming phase ${resumedPhaseIdx + 1} to match the conversation`;
6614
- appendDaemonLog(`backlog run ${item.id}: ${message2}`);
6730
+ const message3 = `resume reconciliation: currentPhase implied phase ${startPhase + 1} but the resumed conversation ${resumeSessionId} ran phase ${resumedPhaseIdx + 1}; resuming phase ${resumedPhaseIdx + 1} to match the conversation`;
6731
+ appendDaemonLog(`backlog run ${item.id}: ${message3}`);
6615
6732
  try {
6616
- await appendComment(orm, item.id, `Resume reconciled \u2014 ${message2}`, {
6733
+ await appendComment(orm, item.id, `Resume reconciled \u2014 ${message3}`, {
6617
6734
  phase: resumedPhaseIdx + 1
6618
6735
  });
6619
6736
  } catch {
@@ -6676,14 +6793,14 @@ function reportDuplicateRun(itemId2, holder) {
6676
6793
  }
6677
6794
 
6678
6795
  // src/commands/backlog/consumePause.ts
6679
- import { existsSync as existsSync20, mkdirSync as mkdirSync6, unlinkSync as unlinkSync3, writeFileSync as writeFileSync16 } from "fs";
6796
+ import { existsSync as existsSync21, mkdirSync as mkdirSync6, unlinkSync as unlinkSync3, writeFileSync as writeFileSync16 } from "fs";
6680
6797
  import { homedir as homedir6 } from "os";
6681
- import { join as join17 } from "path";
6798
+ import { join as join18 } from "path";
6682
6799
  function getControlsDir() {
6683
- return join17(homedir6(), ".assist", "controls");
6800
+ return join18(homedir6(), ".assist", "controls");
6684
6801
  }
6685
6802
  function getPausePath(itemId2) {
6686
- return join17(getControlsDir(), `pause-${itemId2}.json`);
6803
+ return join18(getControlsDir(), `pause-${itemId2}.json`);
6687
6804
  }
6688
6805
  function requestPause(itemId2) {
6689
6806
  mkdirSync6(getControlsDir(), { recursive: true });
@@ -6693,7 +6810,7 @@ function requestPause(itemId2) {
6693
6810
  );
6694
6811
  }
6695
6812
  function isPausePending(itemId2) {
6696
- return existsSync20(getPausePath(itemId2));
6813
+ return existsSync21(getPausePath(itemId2));
6697
6814
  }
6698
6815
  function clearPause(itemId2) {
6699
6816
  try {
@@ -6703,7 +6820,7 @@ function clearPause(itemId2) {
6703
6820
  }
6704
6821
  function consumePause(itemId2) {
6705
6822
  const pausePath = getPausePath(itemId2);
6706
- if (!existsSync20(pausePath)) return false;
6823
+ if (!existsSync21(pausePath)) return false;
6707
6824
  try {
6708
6825
  unlinkSync3(pausePath);
6709
6826
  } catch {
@@ -6722,10 +6839,10 @@ async function awaitClaude(done2, context) {
6722
6839
  try {
6723
6840
  return await done2;
6724
6841
  } catch (error) {
6725
- const message2 = error instanceof Error ? error.message : String(error);
6842
+ const message3 = error instanceof Error ? error.message : String(error);
6726
6843
  console.error(
6727
6844
  chalk40.red(`
6728
- Failed to launch Claude for ${context}: ${message2}`)
6845
+ Failed to launch Claude for ${context}: ${message3}`)
6729
6846
  );
6730
6847
  return CLAUDE_SPAWN_FAILED;
6731
6848
  }
@@ -6734,9 +6851,9 @@ Failed to launch Claude for ${context}: ${message2}`)
6734
6851
  // src/commands/sessions/daemon/connectToDaemon.ts
6735
6852
  import * as net from "net";
6736
6853
  function connectToDaemon() {
6737
- return new Promise((resolve20, reject) => {
6854
+ return new Promise((resolve21, reject) => {
6738
6855
  const socket = net.connect(daemonPaths.socket);
6739
- socket.once("connect", () => resolve20(socket));
6856
+ socket.once("connect", () => resolve21(socket));
6740
6857
  socket.once("error", reject);
6741
6858
  });
6742
6859
  }
@@ -6751,8 +6868,8 @@ async function isDaemonRunning() {
6751
6868
 
6752
6869
  // src/commands/sessions/daemon/sendToDaemon.ts
6753
6870
  var WRITE_TIMEOUT_MS = 500;
6754
- function sendToDaemon(message2) {
6755
- return new Promise((resolve20, reject) => {
6871
+ function sendToDaemon(message3) {
6872
+ return new Promise((resolve21, reject) => {
6756
6873
  connectToDaemon().then((socket) => {
6757
6874
  const timer = setTimeout(() => {
6758
6875
  socket.destroy();
@@ -6762,11 +6879,11 @@ function sendToDaemon(message2) {
6762
6879
  clearTimeout(timer);
6763
6880
  reject(error);
6764
6881
  });
6765
- socket.write(`${JSON.stringify(message2)}
6882
+ socket.write(`${JSON.stringify(message3)}
6766
6883
  `, () => {
6767
6884
  clearTimeout(timer);
6768
6885
  socket.end();
6769
- resolve20();
6886
+ resolve21();
6770
6887
  });
6771
6888
  }, reject);
6772
6889
  });
@@ -6788,8 +6905,8 @@ function readSocketLines(socket, onLine) {
6788
6905
 
6789
6906
  // src/commands/sessions/daemon/sendToDaemonAwaitAck.ts
6790
6907
  var ACK_TIMEOUT_MS = 1e3;
6791
- function sendToDaemonAwaitAck(message2) {
6792
- return new Promise((resolve20, reject) => {
6908
+ function sendToDaemonAwaitAck(message3) {
6909
+ return new Promise((resolve21, reject) => {
6793
6910
  connectToDaemon().then((socket) => {
6794
6911
  let settled = false;
6795
6912
  const finish = (error) => {
@@ -6798,7 +6915,7 @@ function sendToDaemonAwaitAck(message2) {
6798
6915
  clearTimeout(timer);
6799
6916
  socket.destroy();
6800
6917
  if (error) reject(error);
6801
- else resolve20();
6918
+ else resolve21();
6802
6919
  };
6803
6920
  const timer = setTimeout(
6804
6921
  () => finish(new Error("timed out awaiting daemon ack")),
@@ -6812,7 +6929,7 @@ function sendToDaemonAwaitAck(message2) {
6812
6929
  "close",
6813
6930
  () => finish(new Error("daemon closed before acknowledging"))
6814
6931
  );
6815
- socket.write(`${JSON.stringify(message2)}
6932
+ socket.write(`${JSON.stringify(message3)}
6816
6933
  `);
6817
6934
  }, reject);
6818
6935
  });
@@ -6872,7 +6989,7 @@ async function deliverReliably(sessionId, status3, payload) {
6872
6989
  }
6873
6990
  }
6874
6991
  function sleep(ms) {
6875
- return new Promise((resolve20) => setTimeout(resolve20, ms));
6992
+ return new Promise((resolve21) => setTimeout(resolve21, ms));
6876
6993
  }
6877
6994
  function describeError(error) {
6878
6995
  return error instanceof Error ? error.message : String(error);
@@ -7026,42 +7143,42 @@ function buildPhasePrompt(item, phaseNumber, phase) {
7026
7143
  }
7027
7144
 
7028
7145
  // src/commands/backlog/watchForMarker.ts
7029
- import { existsSync as existsSync23, unwatchFile, watchFile } from "fs";
7146
+ import { existsSync as existsSync24, unwatchFile, watchFile } from "fs";
7030
7147
 
7031
7148
  // src/commands/backlog/readSignal.ts
7032
- import { existsSync as existsSync22, readFileSync as readFileSync16 } from "fs";
7149
+ import { existsSync as existsSync23, readFileSync as readFileSync17 } from "fs";
7033
7150
 
7034
7151
  // src/commands/backlog/writeSignal.ts
7035
7152
  import { mkdirSync as mkdirSync8, writeFileSync as writeFileSync18 } from "fs";
7036
7153
  import { homedir as homedir8 } from "os";
7037
- import { dirname as dirname15, join as join19 } from "path";
7154
+ import { dirname as dirname16, join as join20 } from "path";
7038
7155
  import chalk41 from "chalk";
7039
7156
 
7040
7157
  // src/commands/backlog/recordSignalOwner.ts
7041
7158
  import {
7042
- existsSync as existsSync21,
7159
+ existsSync as existsSync22,
7043
7160
  mkdirSync as mkdirSync7,
7044
- readFileSync as readFileSync15,
7161
+ readFileSync as readFileSync16,
7045
7162
  rmSync,
7046
7163
  writeFileSync as writeFileSync17
7047
7164
  } from "fs";
7048
7165
  import { homedir as homedir7 } from "os";
7049
- import { dirname as dirname14, join as join18 } from "path";
7166
+ import { dirname as dirname15, join as join19 } from "path";
7050
7167
  function getOwnerPath(itemId2) {
7051
- return join18(homedir7(), ".assist", "signals", `owner-${itemId2}.json`);
7168
+ return join19(homedir7(), ".assist", "signals", `owner-${itemId2}.json`);
7052
7169
  }
7053
7170
  function recordSignalOwner(itemId2) {
7054
7171
  const sessionId = process.env.ASSIST_SESSION_ID;
7055
7172
  if (!sessionId) return;
7056
7173
  const path71 = getOwnerPath(itemId2);
7057
- mkdirSync7(dirname14(path71), { recursive: true });
7174
+ mkdirSync7(dirname15(path71), { recursive: true });
7058
7175
  writeFileSync17(path71, JSON.stringify({ sessionId }));
7059
7176
  }
7060
7177
  function readSignalOwner(itemId2) {
7061
7178
  const path71 = getOwnerPath(itemId2);
7062
- if (!existsSync21(path71)) return void 0;
7179
+ if (!existsSync22(path71)) return void 0;
7063
7180
  try {
7064
- const parsed = JSON.parse(readFileSync15(path71, "utf8"));
7181
+ const parsed = JSON.parse(readFileSync16(path71, "utf8"));
7065
7182
  return parsed.sessionId;
7066
7183
  } catch {
7067
7184
  return void 0;
@@ -7078,7 +7195,7 @@ function clearSignalOwner(itemId2) {
7078
7195
  // src/commands/backlog/writeSignal.ts
7079
7196
  function getSignalPath(sessionId = process.env.ASSIST_SESSION_ID) {
7080
7197
  if (!sessionId) return void 0;
7081
- return join19(homedir8(), ".assist", "signals", `signal-${sessionId}.json`);
7198
+ return join20(homedir8(), ".assist", "signals", `signal-${sessionId}.json`);
7082
7199
  }
7083
7200
  function resolveSignalTarget(event, data) {
7084
7201
  const caller = process.env.ASSIST_SESSION_ID;
@@ -7110,16 +7227,16 @@ function writeSignal(event, data) {
7110
7227
  const path71 = getSignalPath(target);
7111
7228
  if (!path71) return;
7112
7229
  const signal = { event, sessionId: target, ...data };
7113
- mkdirSync8(dirname15(path71), { recursive: true });
7230
+ mkdirSync8(dirname16(path71), { recursive: true });
7114
7231
  writeFileSync18(path71, JSON.stringify(signal));
7115
7232
  }
7116
7233
 
7117
7234
  // src/commands/backlog/readSignal.ts
7118
7235
  function readSignal() {
7119
7236
  const path71 = getSignalPath();
7120
- if (!path71 || !existsSync22(path71)) return void 0;
7237
+ if (!path71 || !existsSync23(path71)) return void 0;
7121
7238
  try {
7122
- return JSON.parse(readFileSync16(path71, "utf8"));
7239
+ return JSON.parse(readFileSync17(path71, "utf8"));
7123
7240
  } catch {
7124
7241
  return void 0;
7125
7242
  }
@@ -7131,7 +7248,7 @@ function watchForMarker(child, options2) {
7131
7248
  const statusPath = getSignalPath();
7132
7249
  if (!statusPath) return { killedOnMarker: () => killed };
7133
7250
  watchFile(statusPath, { interval: 1e3 }, () => {
7134
- if (!existsSync23(statusPath)) return;
7251
+ if (!existsSync24(statusPath)) return;
7135
7252
  const signal = readSignal();
7136
7253
  if (!signal) return;
7137
7254
  if (signal.event === "done" && !options2?.actOnDone) return;
@@ -7230,9 +7347,9 @@ async function persistPhaseSessionId(itemId2, phaseIdx, claudeSessionId) {
7230
7347
  }
7231
7348
 
7232
7349
  // src/shared/emitActivity.ts
7233
- import { mkdirSync as mkdirSync9, readFileSync as readFileSync17, rmSync as rmSync2, writeFileSync as writeFileSync19 } from "fs";
7350
+ import { mkdirSync as mkdirSync9, readFileSync as readFileSync18, rmSync as rmSync2, writeFileSync as writeFileSync19 } from "fs";
7234
7351
  import { homedir as homedir9 } from "os";
7235
- import { dirname as dirname16, join as join20 } from "path";
7352
+ import { dirname as dirname17, join as join21 } from "path";
7236
7353
  import { z as z4 } from "zod";
7237
7354
  var activitySchema = z4.object({
7238
7355
  kind: z4.enum(["command", "backlog"]),
@@ -7247,18 +7364,18 @@ var activitySchema = z4.object({
7247
7364
  startedAt: z4.number()
7248
7365
  });
7249
7366
  function activityPath(sessionId) {
7250
- return join20(homedir9(), ".assist", "activity", `activity-${sessionId}.json`);
7367
+ return join21(homedir9(), ".assist", "activity", `activity-${sessionId}.json`);
7251
7368
  }
7252
7369
  function emitActivity(activity2) {
7253
7370
  const sessionId = process.env.ASSIST_ACTIVITY_ID;
7254
7371
  if (!sessionId) return;
7255
7372
  const path71 = activityPath(sessionId);
7256
- mkdirSync9(dirname16(path71), { recursive: true });
7373
+ mkdirSync9(dirname17(path71), { recursive: true });
7257
7374
  writeFileSync19(path71, JSON.stringify({ ...activity2, startedAt: Date.now() }));
7258
7375
  }
7259
7376
  function readActivity(path71) {
7260
7377
  try {
7261
- return JSON.parse(readFileSync17(path71, "utf8"));
7378
+ return JSON.parse(readFileSync18(path71, "utf8"));
7262
7379
  } catch {
7263
7380
  return void 0;
7264
7381
  }
@@ -7269,7 +7386,7 @@ function reconcileActivity(sessionId, activity2) {
7269
7386
  return;
7270
7387
  }
7271
7388
  const path71 = activityPath(sessionId);
7272
- mkdirSync9(dirname16(path71), { recursive: true });
7389
+ mkdirSync9(dirname17(path71), { recursive: true });
7273
7390
  writeFileSync19(path71, JSON.stringify(activity2));
7274
7391
  }
7275
7392
  function removeActivity(sessionId) {
@@ -7294,7 +7411,7 @@ function reportPhaseActivity(item, phaseNumber, totalPhases, phase, claudeSessio
7294
7411
  }
7295
7412
 
7296
7413
  // src/commands/backlog/resolvePhaseResult.ts
7297
- import { existsSync as existsSync24, unlinkSync as unlinkSync4 } from "fs";
7414
+ import { existsSync as existsSync25, unlinkSync as unlinkSync4 } from "fs";
7298
7415
  import chalk42 from "chalk";
7299
7416
 
7300
7417
  // src/commands/backlog/handleIncompletePhase.ts
@@ -7316,7 +7433,7 @@ async function handleIncompletePhase() {
7316
7433
  // src/commands/backlog/resolvePhaseResult.ts
7317
7434
  function cleanupSignal() {
7318
7435
  const statusPath = getSignalPath();
7319
- if (statusPath && existsSync24(statusPath)) {
7436
+ if (statusPath && existsSync25(statusPath)) {
7320
7437
  unlinkSync4(statusPath);
7321
7438
  }
7322
7439
  }
@@ -7327,7 +7444,7 @@ async function isTerminalStatus(itemId2) {
7327
7444
  }
7328
7445
  async function resolvePhaseResult(phaseIndex, itemId2) {
7329
7446
  const signalPath = getSignalPath();
7330
- if (!signalPath || !existsSync24(signalPath)) {
7447
+ if (!signalPath || !existsSync25(signalPath)) {
7331
7448
  if (await isTerminalStatus(itemId2)) return { kind: "abort" };
7332
7449
  const action = await handleIncompletePhase();
7333
7450
  if (action === "abort") return { kind: "abort" };
@@ -7566,13 +7683,13 @@ async function findSessionJsonlPath(sessionId) {
7566
7683
  // src/commands/backlog/verifyResumeConversation.ts
7567
7684
  async function verifyResumeConversation(itemId2, resumeSessionId, phaseLabel2) {
7568
7685
  if (await findSessionJsonlPath(resumeSessionId)) return true;
7569
- const message2 = `${phaseLabel2}: resume found no conversation for session ${resumeSessionId}; phase not advanced`;
7686
+ const message3 = `${phaseLabel2}: resume found no conversation for session ${resumeSessionId}; phase not advanced`;
7570
7687
  console.error(chalk43.red(`
7571
- ${message2}`));
7572
- appendDaemonLog(`backlog run ${itemId2}: ${message2}`);
7688
+ ${message3}`));
7689
+ appendDaemonLog(`backlog run ${itemId2}: ${message3}`);
7573
7690
  try {
7574
7691
  const { orm } = await getReady();
7575
- await appendComment(orm, itemId2, `Resume failed \u2014 ${message2}`);
7692
+ await appendComment(orm, itemId2, `Resume failed \u2014 ${message3}`);
7576
7693
  } catch {
7577
7694
  }
7578
7695
  return false;
@@ -8183,21 +8300,21 @@ import chalk61 from "chalk";
8183
8300
  import { WebSocketServer } from "ws";
8184
8301
 
8185
8302
  // src/shared/getInstallDir.ts
8186
- import { execSync as execSync29 } from "child_process";
8187
- import { dirname as dirname18, resolve as resolve7 } from "path";
8303
+ import { execSync as execSync30 } from "child_process";
8304
+ import { dirname as dirname19, resolve as resolve8 } from "path";
8188
8305
  import { fileURLToPath as fileURLToPath3 } from "url";
8189
8306
  var __filename2 = fileURLToPath3(import.meta.url);
8190
- var __dirname3 = dirname18(__filename2);
8307
+ var __dirname3 = dirname19(__filename2);
8191
8308
  function getInstallDir() {
8192
- return resolve7(__dirname3, "..");
8309
+ return resolve8(__dirname3, "..");
8193
8310
  }
8194
8311
  function isGitRepo(dir) {
8195
8312
  try {
8196
- const result = execSync29("git rev-parse --show-toplevel", {
8313
+ const result = execSync30("git rev-parse --show-toplevel", {
8197
8314
  cwd: dir,
8198
8315
  stdio: "pipe"
8199
8316
  }).toString().trim();
8200
- return resolve7(result) === resolve7(dir);
8317
+ return resolve8(result) === resolve8(dir);
8201
8318
  } catch {
8202
8319
  return false;
8203
8320
  }
@@ -8210,11 +8327,11 @@ import {
8210
8327
  import chalk57 from "chalk";
8211
8328
 
8212
8329
  // src/lib/openBrowser.ts
8213
- import { execSync as execSync30 } from "child_process";
8330
+ import { execSync as execSync31 } from "child_process";
8214
8331
  function tryExec(commands) {
8215
8332
  for (const cmd of commands) {
8216
8333
  try {
8217
- execSync30(cmd, { stdio: "ignore" });
8334
+ execSync31(cmd, { stdio: "ignore" });
8218
8335
  return true;
8219
8336
  } catch {
8220
8337
  }
@@ -8332,7 +8449,7 @@ import {
8332
8449
  closeSync as closeSync2,
8333
8450
  mkdirSync as mkdirSync10,
8334
8451
  openSync as openSync2,
8335
- statSync,
8452
+ statSync as statSync2,
8336
8453
  unlinkSync as unlinkSync5,
8337
8454
  writeSync
8338
8455
  } from "fs";
@@ -8381,7 +8498,7 @@ function tryCreateLock() {
8381
8498
  }
8382
8499
  function isLockStale() {
8383
8500
  try {
8384
- return Date.now() - statSync(daemonPaths.spawnLock).mtimeMs > STALE_LOCK_MS;
8501
+ return Date.now() - statSync2(daemonPaths.spawnLock).mtimeMs > STALE_LOCK_MS;
8385
8502
  } catch {
8386
8503
  return true;
8387
8504
  }
@@ -8393,16 +8510,16 @@ function releaseSpawnLock() {
8393
8510
  }
8394
8511
  }
8395
8512
  function spawnDaemon(reason4) {
8396
- const log = openSync2(daemonPaths.log, "a");
8513
+ const log2 = openSync2(daemonPaths.log, "a");
8397
8514
  const child = spawn4(process.execPath, [process.argv[1], "daemon", "run"], {
8398
8515
  detached: true,
8399
- stdio: ["ignore", log, log],
8516
+ stdio: ["ignore", log2, log2],
8400
8517
  env: { ...process.env, ASSIST_DAEMON_SPAWN_REASON: reason4 }
8401
8518
  });
8402
8519
  child.unref();
8403
8520
  }
8404
8521
  function delay(ms) {
8405
- return new Promise((resolve20) => setTimeout(resolve20, ms));
8522
+ return new Promise((resolve21) => setTimeout(resolve21, ms));
8406
8523
  }
8407
8524
 
8408
8525
  // src/commands/sessions/daemon/isWindowsCwd.ts
@@ -8439,10 +8556,10 @@ function gitInvocation(cwd, args) {
8439
8556
  }
8440
8557
  function git2(cwd, args) {
8441
8558
  const { file, argv, options: options2 } = gitInvocation(cwd, args);
8442
- return new Promise((resolve20, reject) => {
8559
+ return new Promise((resolve21, reject) => {
8443
8560
  execFile2(file, argv, options2, (error, stdout) => {
8444
8561
  if (error) reject(error);
8445
- else resolve20(stdout.toString());
8562
+ else resolve21(stdout.toString());
8446
8563
  });
8447
8564
  });
8448
8565
  }
@@ -8514,20 +8631,20 @@ function gitCommonDir(cwd) {
8514
8631
  }
8515
8632
 
8516
8633
  // src/shared/loadJson.ts
8517
- import { existsSync as existsSync25, mkdirSync as mkdirSync11, readFileSync as readFileSync18, writeFileSync as writeFileSync20 } from "fs";
8634
+ import { existsSync as existsSync26, mkdirSync as mkdirSync11, readFileSync as readFileSync19, writeFileSync as writeFileSync20 } from "fs";
8518
8635
  import { homedir as homedir11 } from "os";
8519
- import { join as join22 } from "path";
8636
+ import { join as join23 } from "path";
8520
8637
  function getStoreDir() {
8521
- return join22(homedir11(), ".assist");
8638
+ return join23(homedir11(), ".assist");
8522
8639
  }
8523
8640
  function getStorePath(filename) {
8524
- return join22(getStoreDir(), filename);
8641
+ return join23(getStoreDir(), filename);
8525
8642
  }
8526
8643
  function loadJson(filename) {
8527
8644
  const path71 = getStorePath(filename);
8528
- if (existsSync25(path71)) {
8645
+ if (existsSync26(path71)) {
8529
8646
  try {
8530
- return JSON.parse(readFileSync18(path71, "utf8"));
8647
+ return JSON.parse(readFileSync19(path71, "utf8"));
8531
8648
  } catch {
8532
8649
  return {};
8533
8650
  }
@@ -8536,7 +8653,7 @@ function loadJson(filename) {
8536
8653
  }
8537
8654
  function saveJson(filename, data) {
8538
8655
  const dir = getStoreDir();
8539
- if (!existsSync25(dir)) {
8656
+ if (!existsSync26(dir)) {
8540
8657
  mkdirSync11(dir, { recursive: true });
8541
8658
  }
8542
8659
  writeFileSync20(getStorePath(filename), JSON.stringify(data, null, 2));
@@ -8591,16 +8708,16 @@ function hostedGroup(cwd, origin, clone) {
8591
8708
 
8592
8709
  // src/shared/createBundleHandler.ts
8593
8710
  import { createHash } from "crypto";
8594
- import { readFileSync as readFileSync19, statSync as statSync2 } from "fs";
8595
- import { dirname as dirname19, join as join23 } from "path";
8711
+ import { readFileSync as readFileSync20, statSync as statSync3 } from "fs";
8712
+ import { dirname as dirname20, join as join24 } from "path";
8596
8713
  import { fileURLToPath as fileURLToPath4 } from "url";
8597
8714
  function createBundleHandler(importMetaUrl, bundlePath, contentType = "application/javascript") {
8598
- const file = join23(dirname19(fileURLToPath4(importMetaUrl)), bundlePath);
8715
+ const file = join24(dirname20(fileURLToPath4(importMetaUrl)), bundlePath);
8599
8716
  let cache4;
8600
8717
  return (req, res) => {
8601
- const mtimeMs = statSync2(file).mtimeMs;
8718
+ const mtimeMs = statSync3(file).mtimeMs;
8602
8719
  if (cache4?.mtimeMs !== mtimeMs) {
8603
- const body = readFileSync19(file, "utf8");
8720
+ const body = readFileSync20(file, "utf8");
8604
8721
  const etag = `"${createHash("sha256").update(body).digest("hex").slice(0, 16)}"`;
8605
8722
  cache4 = { body, etag, mtimeMs };
8606
8723
  }
@@ -8729,15 +8846,15 @@ async function loadItemSummaries(orm, origin) {
8729
8846
  }
8730
8847
 
8731
8848
  // src/commands/backlog/resolveRepoLocation.ts
8732
- import { existsSync as existsSync26 } from "fs";
8849
+ import { existsSync as existsSync27 } from "fs";
8733
8850
 
8734
8851
  // src/commands/backlog/cloneTargetDir.ts
8735
- import { join as join24, resolve as resolve8 } from "path";
8852
+ import { join as join25, resolve as resolve9 } from "path";
8736
8853
  function cloneTargetDir(origin, baseDir) {
8737
8854
  if (origin.startsWith("local:")) return null;
8738
8855
  const repoName = origin.split("/").filter(Boolean).pop();
8739
8856
  if (!repoName) return null;
8740
- return resolve8(join24(baseDir, repoName));
8857
+ return resolve9(join25(baseDir, repoName));
8741
8858
  }
8742
8859
 
8743
8860
  // src/commands/backlog/resolveRepoLocation.ts
@@ -8745,7 +8862,7 @@ function resolveRepoLocation(origin, knownCwd, baseDir) {
8745
8862
  if (knownCwd) return { cwd: knownCwd };
8746
8863
  const target = cloneTargetDir(origin, baseDir);
8747
8864
  if (!target) return {};
8748
- if (existsSync26(target) && getCurrentOrigin(target) === origin)
8865
+ if (existsSync27(target) && getCurrentOrigin(target) === origin)
8749
8866
  return { cwd: target };
8750
8867
  return { cloneTarget: target };
8751
8868
  }
@@ -8854,12 +8971,12 @@ async function loadVisibleItems(req) {
8854
8971
 
8855
8972
  // src/commands/backlog/web/parseStatusBody.ts
8856
8973
  function readBody(req) {
8857
- return new Promise((resolve20, reject) => {
8974
+ return new Promise((resolve21, reject) => {
8858
8975
  let body = "";
8859
8976
  req.on("data", (chunk) => {
8860
8977
  body += chunk.toString();
8861
8978
  });
8862
- req.on("end", () => resolve20(body));
8979
+ req.on("end", () => resolve21(body));
8863
8980
  req.on("error", reject);
8864
8981
  });
8865
8982
  }
@@ -9441,13 +9558,13 @@ async function diffScopes(req, res) {
9441
9558
 
9442
9559
  // src/commands/sessions/web/fileContent.ts
9443
9560
  import { readFile, stat as stat2 } from "fs/promises";
9444
- import { isAbsolute, relative as relative2, resolve as resolve9 } from "path";
9561
+ import { isAbsolute as isAbsolute2, relative as relative2, resolve as resolve10 } from "path";
9445
9562
  var MAX_FILE_BYTES = 2 * 1024 * 1024;
9446
9563
  function resolveWithinCwd(cwd, path71) {
9447
- const root = resolve9(toGitCwd(cwd));
9448
- const target = resolve9(root, path71);
9564
+ const root = resolve10(toGitCwd(cwd));
9565
+ const target = resolve10(root, path71);
9449
9566
  const rel = relative2(root, target);
9450
- if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return null;
9567
+ if (rel === "" || rel.startsWith("..") || isAbsolute2(rel)) return null;
9451
9568
  return target;
9452
9569
  }
9453
9570
  async function fileContent(req, res) {
@@ -9516,13 +9633,13 @@ function readRawConfigLayers(cwd) {
9516
9633
  const global = loadRawYaml(getGlobalConfigPath());
9517
9634
  if (!global.repos)
9518
9635
  return {
9519
- project: loadRawYaml(getConfigPathFrom(cwd)),
9636
+ project: loadRawYaml(projectConfigPathFrom(cwd)),
9520
9637
  global,
9521
9638
  repoOverride: {}
9522
9639
  };
9523
9640
  const origin = getCurrentOrigin(cwd);
9524
9641
  return {
9525
- project: loadRawYaml(getConfigPathFrom(cwd)),
9642
+ project: loadRawYaml(projectConfigPathFrom(cwd)),
9526
9643
  global,
9527
9644
  repoOverride: resolveRepoOverride(global, origin),
9528
9645
  repoKey: matchRepoConfigKey(global, origin)
@@ -9710,20 +9827,20 @@ function handleServerRuns(req, res) {
9710
9827
 
9711
9828
  // src/commands/sessions/web/getReviewSynthesis.ts
9712
9829
  import { execFile as execFile4 } from "child_process";
9713
- import { readFileSync as readFileSync20 } from "fs";
9830
+ import { readFileSync as readFileSync21 } from "fs";
9714
9831
  import { homedir as homedir12 } from "os";
9715
- import { basename as basename6, join as join26 } from "path";
9832
+ import { basename as basename8, join as join27 } from "path";
9716
9833
  import { promisify as promisify3 } from "util";
9717
9834
 
9718
9835
  // src/commands/sessions/web/findSynthesisForBranch.ts
9719
- import { existsSync as existsSync27, readdirSync as readdirSync2, statSync as statSync3 } from "fs";
9720
- import { basename as basename5, dirname as dirname20, join as join25 } from "path";
9836
+ import { existsSync as existsSync28, readdirSync as readdirSync2, statSync as statSync4 } from "fs";
9837
+ import { basename as basename7, dirname as dirname21, join as join26 } from "path";
9721
9838
  function findSynthesisForBranch(repoReviewsDir, branch2) {
9722
- const branchKeyPath = join25(repoReviewsDir, `${branch2}-`);
9723
- const parent = dirname20(branchKeyPath);
9724
- const branchPrefix = basename5(branchKeyPath);
9725
- if (!existsSync27(parent)) return null;
9726
- const synthesisFiles = readdirSync2(parent).filter((name) => name.startsWith(branchPrefix)).map((name) => join25(parent, name, "synthesis.md")).filter((path71) => existsSync27(path71)).map((path71) => ({ path: path71, mtime: statSync3(path71).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
9839
+ const branchKeyPath = join26(repoReviewsDir, `${branch2}-`);
9840
+ const parent = dirname21(branchKeyPath);
9841
+ const branchPrefix = basename7(branchKeyPath);
9842
+ if (!existsSync28(parent)) return null;
9843
+ const synthesisFiles = readdirSync2(parent).filter((name) => name.startsWith(branchPrefix)).map((name) => join26(parent, name, "synthesis.md")).filter((path71) => existsSync28(path71)).map((path71) => ({ path: path71, mtime: statSync4(path71).mtimeMs })).sort((a, b) => b.mtime - a.mtime);
9727
9844
  return synthesisFiles[0]?.path ?? null;
9728
9845
  }
9729
9846
 
@@ -9740,11 +9857,11 @@ async function resolveSynthesisPath(cwd) {
9740
9857
  runGit(cwd, ["rev-parse", "--show-toplevel"]),
9741
9858
  runGit(cwd, ["rev-parse", "--abbrev-ref", "HEAD"])
9742
9859
  ]);
9743
- const repoReviewsDir = join26(
9860
+ const repoReviewsDir = join27(
9744
9861
  homedir12(),
9745
9862
  ".assist",
9746
9863
  "reviews",
9747
- basename6(repoRoot)
9864
+ basename8(repoRoot)
9748
9865
  );
9749
9866
  return findSynthesisForBranch(repoReviewsDir, branch2);
9750
9867
  }
@@ -9757,7 +9874,7 @@ async function getReviewSynthesis(req, res) {
9757
9874
  respondJson(res, 404, { error: "No synthesis found" });
9758
9875
  return;
9759
9876
  }
9760
- respondJson(res, 200, { synthesis: readFileSync20(path71, "utf8") });
9877
+ respondJson(res, 200, { synthesis: readFileSync21(path71, "utf8") });
9761
9878
  } catch {
9762
9879
  respondJson(res, 404, { error: "No synthesis found" });
9763
9880
  }
@@ -9888,7 +10005,7 @@ import * as os3 from "os";
9888
10005
  import * as path25 from "path";
9889
10006
 
9890
10007
  // src/shared/checkCliAvailable.ts
9891
- import { execSync as execSync31 } from "child_process";
10008
+ import { execSync as execSync32 } from "child_process";
9892
10009
  function checkCliAvailable(cli) {
9893
10010
  const binary = cli.split(/\s+/)[0];
9894
10011
  const opts = {
@@ -9896,11 +10013,11 @@ function checkCliAvailable(cli) {
9896
10013
  stdio: ["ignore", "pipe", "pipe"]
9897
10014
  };
9898
10015
  try {
9899
- execSync31(`command -v ${binary}`, opts);
10016
+ execSync32(`command -v ${binary}`, opts);
9900
10017
  return true;
9901
10018
  } catch {
9902
10019
  try {
9903
- execSync31(`where ${binary}`, opts);
10020
+ execSync32(`where ${binary}`, opts);
9904
10021
  return true;
9905
10022
  } catch {
9906
10023
  return false;
@@ -9991,8 +10108,8 @@ function subsequenceScore(text17, query) {
9991
10108
  function scoreFilePath(path71, query) {
9992
10109
  const needle = query.trim().toLowerCase();
9993
10110
  if (!needle) return 0;
9994
- const basename19 = path71.slice(path71.lastIndexOf("/") + 1);
9995
- const inBasename = subsequenceScore(basename19, needle);
10111
+ const basename21 = path71.slice(path71.lastIndexOf("/") + 1);
10112
+ const inBasename = subsequenceScore(basename21, needle);
9996
10113
  if (inBasename !== null) return BASENAME_WEIGHT + inBasename;
9997
10114
  return subsequenceScore(path71, needle);
9998
10115
  }
@@ -10389,17 +10506,17 @@ async function stopDaemon() {
10389
10506
  }
10390
10507
  }
10391
10508
  function closedBeforeTimeout(socket) {
10392
- return new Promise((resolve20) => {
10509
+ return new Promise((resolve21) => {
10393
10510
  const timer = setTimeout(() => {
10394
10511
  socket.destroy();
10395
- resolve20(false);
10512
+ resolve21(false);
10396
10513
  }, STOP_TIMEOUT_MS);
10397
10514
  socket.resume();
10398
10515
  socket.on("error", () => {
10399
10516
  });
10400
10517
  socket.once("close", () => {
10401
10518
  clearTimeout(timer);
10402
- resolve20(true);
10519
+ resolve21(true);
10403
10520
  });
10404
10521
  });
10405
10522
  }
@@ -10450,8 +10567,8 @@ async function restartWeb(req, res, deps2 = {}) {
10450
10567
  respondJson(res, 400, { error: "Invalid target" });
10451
10568
  return;
10452
10569
  }
10453
- await new Promise((resolve20) => {
10454
- res.once("finish", resolve20);
10570
+ await new Promise((resolve21) => {
10571
+ res.once("finish", resolve21);
10455
10572
  respondJson(res, 200, { ok: true });
10456
10573
  });
10457
10574
  if (target === "daemon" || target === "both") {
@@ -10966,7 +11083,7 @@ async function readRequestBuffer(req, limit) {
10966
11083
  // src/commands/sessions/web/writeTempImage.ts
10967
11084
  import { mkdtemp, writeFile as writeFile2 } from "fs/promises";
10968
11085
  import { tmpdir } from "os";
10969
- import { extname, join as join28 } from "path";
11086
+ import { extname, join as join29 } from "path";
10970
11087
  var EXT_BY_MIME = {
10971
11088
  "image/png": "png",
10972
11089
  "image/jpeg": "jpg",
@@ -10986,8 +11103,8 @@ function safeBaseName(name) {
10986
11103
  return base.replace(/^-+|-+$/g, "").slice(0, 60) || "screenshot";
10987
11104
  }
10988
11105
  async function writeTempImage(name, contentType, body) {
10989
- const dir = await mkdtemp(join28(tmpdir(), "assist-pr-img-"));
10990
- const filePath = join28(
11106
+ const dir = await mkdtemp(join29(tmpdir(), "assist-pr-img-"));
11107
+ const filePath = join29(
10991
11108
  dir,
10992
11109
  `${safeBaseName(name)}.${pickExtension(name, contentType)}`
10993
11110
  );
@@ -11035,7 +11152,7 @@ async function uploadPrImage(req, res) {
11035
11152
 
11036
11153
  // src/commands/sessions/web/createCssHandler.ts
11037
11154
  import { createHash as createHash2 } from "crypto";
11038
- import { readFileSync as readFileSync21 } from "fs";
11155
+ import { readFileSync as readFileSync22 } from "fs";
11039
11156
  import { createRequire as createRequire2 } from "module";
11040
11157
  var require3 = createRequire2(import.meta.url);
11041
11158
  function createCssHandler(packageEntry) {
@@ -11043,7 +11160,7 @@ function createCssHandler(packageEntry) {
11043
11160
  return (req, res) => {
11044
11161
  if (!cache4) {
11045
11162
  const resolved = require3.resolve(packageEntry);
11046
- const body = readFileSync21(resolved, "utf8");
11163
+ const body = readFileSync22(resolved, "utf8");
11047
11164
  const etag = `"${createHash2("sha256").update(body).digest("hex").slice(0, 16)}"`;
11048
11165
  cache4 = { body, etag };
11049
11166
  }
@@ -11193,8 +11310,8 @@ async function runRestartItem(item, { runRestartDaemon, reExec }) {
11193
11310
  reExec();
11194
11311
  }
11195
11312
  } catch (error) {
11196
- const message2 = error instanceof Error ? error.message : String(error);
11197
- console.error(chalk58.red(`Restart failed: ${message2}`));
11313
+ const message3 = error instanceof Error ? error.message : String(error);
11314
+ console.error(chalk58.red(`Restart failed: ${message3}`));
11198
11315
  }
11199
11316
  }
11200
11317
 
@@ -11294,10 +11411,10 @@ function renderRestartMenu(items2, selected) {
11294
11411
  }
11295
11412
 
11296
11413
  // src/commands/sessions/web/restartMenu/createMenuState.ts
11297
- function createMenuState(items2, log) {
11414
+ function createMenuState(items2, log2) {
11298
11415
  let open = false;
11299
11416
  let selected = firstEnabledIndex(items2);
11300
- const render = () => log(renderRestartMenu(items2, selected));
11417
+ const render = () => log2(renderRestartMenu(items2, selected));
11301
11418
  return {
11302
11419
  isOpen: () => open,
11303
11420
  open() {
@@ -11308,7 +11425,7 @@ function createMenuState(items2, log) {
11308
11425
  close() {
11309
11426
  if (!open) return;
11310
11427
  open = false;
11311
- log.clear();
11428
+ log2.clear();
11312
11429
  },
11313
11430
  move(direction) {
11314
11431
  selected = nextIndex(items2, selected, direction);
@@ -11365,8 +11482,8 @@ function installRestartMenu(options2 = {}) {
11365
11482
  const { stdin, out, toggleKey, exit, restartDaemonFn, reExecFn, items: items2 } = resolveOptions(options2);
11366
11483
  if (!stdin.isTTY) return () => {
11367
11484
  };
11368
- const log = createLogUpdate(out);
11369
- const menu = createMenuState(items2, log);
11485
+ const log2 = createLogUpdate(out);
11486
+ const menu = createMenuState(items2, log2);
11370
11487
  const reExec = () => reExecFn({ beforeExec: () => cleanup(), exit });
11371
11488
  const { isBusy, activate } = createActivate(menu, {
11372
11489
  runRestartDaemon: restartDaemonFn,
@@ -11582,13 +11699,13 @@ async function beginAssociation(id, options2, clearPatch, label2) {
11582
11699
  }
11583
11700
 
11584
11701
  // src/commands/backlog/associate-github/fetchGithubIssueTitle.ts
11585
- import { execSync as execSync32 } from "child_process";
11702
+ import { execSync as execSync33 } from "child_process";
11586
11703
  function fetchGithubIssueTitle(issue) {
11587
11704
  const match = /^([^/]+)\/([^#]+)#(\d+)$/.exec(issue);
11588
11705
  if (!match) return void 0;
11589
11706
  const [, owner, repo, number] = match;
11590
11707
  try {
11591
- const result = execSync32(
11708
+ const result = execSync33(
11592
11709
  `gh issue view ${number} -R ${owner}/${repo} --json title`,
11593
11710
  { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }
11594
11711
  );
@@ -11655,12 +11772,12 @@ import chalk66 from "chalk";
11655
11772
  import { eq as eq22 } from "drizzle-orm";
11656
11773
 
11657
11774
  // src/commands/jira/fetchIssue.ts
11658
- import { execSync as execSync33 } from "child_process";
11775
+ import { execSync as execSync34 } from "child_process";
11659
11776
  import chalk65 from "chalk";
11660
11777
  function fetchIssue(issueKey, fields) {
11661
11778
  let result;
11662
11779
  try {
11663
- result = execSync33(
11780
+ result = execSync34(
11664
11781
  `acli jira workitem view ${issueKey} -f ${fields} --json`,
11665
11782
  { encoding: "utf8", stdio: ["pipe", "pipe", "pipe"] }
11666
11783
  );
@@ -11731,7 +11848,7 @@ function registerAssociateJiraCommand(cmd) {
11731
11848
 
11732
11849
  // src/commands/backlog/cloneRepo.ts
11733
11850
  import { spawnSync as spawnSync2 } from "child_process";
11734
- import { existsSync as existsSync28 } from "fs";
11851
+ import { existsSync as existsSync29 } from "fs";
11735
11852
  import { mkdir as mkdir3 } from "fs/promises";
11736
11853
  import chalk67 from "chalk";
11737
11854
 
@@ -11747,8 +11864,8 @@ function originToSshUrl(origin) {
11747
11864
  }
11748
11865
 
11749
11866
  // src/commands/backlog/cloneRepo.ts
11750
- function fail2(message2) {
11751
- console.log(chalk67.red(message2));
11867
+ function fail2(message3) {
11868
+ console.log(chalk67.red(message3));
11752
11869
  process.exitCode = 1;
11753
11870
  }
11754
11871
  async function cloneRepo(originRaw) {
@@ -11767,7 +11884,7 @@ async function cloneRepo(originRaw) {
11767
11884
  if (!target) {
11768
11885
  return fail2(`Could not derive a repository name from "${origin}".`);
11769
11886
  }
11770
- if (existsSync28(target)) {
11887
+ if (existsSync29(target)) {
11771
11888
  return fail2(`Clone target already exists: ${target}`);
11772
11889
  }
11773
11890
  await mkdir3(baseDir, { recursive: true });
@@ -12190,9 +12307,9 @@ function ensureRemoteOrigin() {
12190
12307
 
12191
12308
  // src/commands/backlog/add/shared.ts
12192
12309
  import { spawnSync as spawnSync3 } from "child_process";
12193
- import { mkdtempSync, readFileSync as readFileSync22, unlinkSync as unlinkSync6, writeFileSync as writeFileSync21 } from "fs";
12310
+ import { mkdtempSync, readFileSync as readFileSync23, unlinkSync as unlinkSync6, writeFileSync as writeFileSync21 } from "fs";
12194
12311
  import { tmpdir as tmpdir2 } from "os";
12195
- import { join as join29 } from "path";
12312
+ import { join as join30 } from "path";
12196
12313
  import enquirer6 from "enquirer";
12197
12314
  async function promptType() {
12198
12315
  const { type } = await enquirer6.prompt({
@@ -12232,15 +12349,15 @@ async function promptDescription() {
12232
12349
  }
12233
12350
  function openEditor() {
12234
12351
  const editor = process.env.EDITOR || process.env.VISUAL || "vi";
12235
- const dir = mkdtempSync(join29(tmpdir2(), "assist-"));
12236
- const filePath = join29(dir, "description.md");
12352
+ const dir = mkdtempSync(join30(tmpdir2(), "assist-"));
12353
+ const filePath = join30(dir, "description.md");
12237
12354
  writeFileSync21(filePath, "");
12238
12355
  const result = spawnSync3(editor, [filePath], { stdio: "inherit" });
12239
12356
  if (result.status !== 0) {
12240
12357
  unlinkSync6(filePath);
12241
12358
  return void 0;
12242
12359
  }
12243
- const content = readFileSync22(filePath, "utf8").trim();
12360
+ const content = readFileSync23(filePath, "utf8").trim();
12244
12361
  unlinkSync6(filePath);
12245
12362
  return content || void 0;
12246
12363
  }
@@ -12356,7 +12473,7 @@ function parsePreviewDecision(line, requestId) {
12356
12473
 
12357
12474
  // src/commands/sessions/shared/requestPreviewDecision.ts
12358
12475
  function requestPreviewDecision(request) {
12359
- return new Promise((resolve20, reject) => {
12476
+ return new Promise((resolve21, reject) => {
12360
12477
  connectToDaemon().then((socket) => {
12361
12478
  let settled = false;
12362
12479
  const finish = (error, decision) => {
@@ -12364,7 +12481,7 @@ function requestPreviewDecision(request) {
12364
12481
  settled = true;
12365
12482
  socket.destroy();
12366
12483
  if (error) reject(error);
12367
- else resolve20(decision);
12484
+ else resolve21(decision);
12368
12485
  };
12369
12486
  readSocketLines(socket, (line) => {
12370
12487
  const incoming = parsePreviewDecision(line, request.requestId);
@@ -12507,10 +12624,10 @@ import { randomUUID as randomUUID3 } from "crypto";
12507
12624
  import chalk79 from "chalk";
12508
12625
 
12509
12626
  // src/commands/backlog/readJsonPayload.ts
12510
- import { readFileSync as readFileSync23 } from "fs";
12627
+ import { readFileSync as readFileSync24 } from "fs";
12511
12628
  import chalk78 from "chalk";
12512
- function fail3(message2) {
12513
- console.error(chalk78.red(message2));
12629
+ function fail3(message3) {
12630
+ console.error(chalk78.red(message3));
12514
12631
  process.exit(1);
12515
12632
  }
12516
12633
  function describe(error) {
@@ -12519,7 +12636,7 @@ function describe(error) {
12519
12636
  async function readSource(source) {
12520
12637
  try {
12521
12638
  if (source === "-") return (await readStdinBuffer()).toString("utf8");
12522
- return readFileSync23(source, "utf8");
12639
+ return readFileSync24(source, "utf8");
12523
12640
  } catch (error) {
12524
12641
  return fail3(
12525
12642
  `Cannot read the payload from ${source === "-" ? "stdin" : source}: ${describe(error)}`
@@ -12679,8 +12796,8 @@ function validateLinkTarget(fromItem, fromNum, toNum, linkType) {
12679
12796
  }
12680
12797
 
12681
12798
  // src/commands/backlog/link.ts
12682
- function fail4(message2) {
12683
- console.log(chalk81.red(message2));
12799
+ function fail4(message3) {
12800
+ console.log(chalk81.red(message3));
12684
12801
  return void 0;
12685
12802
  }
12686
12803
  function parseLinkType(type) {
@@ -12802,8 +12919,8 @@ Pass the full origin.`
12802
12919
  }
12803
12920
 
12804
12921
  // src/commands/backlog/move-repo/index.ts
12805
- function fail5(message2) {
12806
- console.log(chalk84.red(message2));
12922
+ function fail5(message3) {
12923
+ console.log(chalk84.red(message3));
12807
12924
  process.exitCode = 1;
12808
12925
  }
12809
12926
  async function moveRepo(oldOriginRaw, newOriginRaw, options2 = {}) {
@@ -12958,11 +13075,11 @@ async function handleLaunchSignal(slashCommand, once) {
12958
13075
  await next({ allowEdits: true, once });
12959
13076
  }
12960
13077
  } catch (error) {
12961
- const message2 = error instanceof Error ? error.message : String(error);
13078
+ const message3 = error instanceof Error ? error.message : String(error);
12962
13079
  console.error(
12963
13080
  chalk86.yellow(
12964
13081
  `
12965
- Could not complete post-run step (${message2}).
13082
+ Could not complete post-run step (${message3}).
12966
13083
  This is usually a transient database/network blip \u2014 the work is saved and the session is safe to resume.`
12967
13084
  )
12968
13085
  );
@@ -14334,7 +14451,7 @@ function registerBranch(program2) {
14334
14451
  }
14335
14452
 
14336
14453
  // src/commands/cliHook/index.ts
14337
- import { basename as basename7 } from "path";
14454
+ import { basename as basename9 } from "path";
14338
14455
 
14339
14456
  // src/shared/splitCompound.ts
14340
14457
  import { parse } from "shell-quote";
@@ -14520,7 +14637,7 @@ function findBuiltinDenyRaw(rawCommand) {
14520
14637
  }
14521
14638
 
14522
14639
  // src/shared/isApprovedRead.ts
14523
- import { resolve as resolve11, sep } from "path";
14640
+ import { resolve as resolve12, sep } from "path";
14524
14641
 
14525
14642
  // src/shared/tokenize.ts
14526
14643
  function tokenize(command) {
@@ -14601,29 +14718,29 @@ function extractGraphqlQuery(args) {
14601
14718
  }
14602
14719
 
14603
14720
  // src/shared/loadCliReads.ts
14604
- import { existsSync as existsSync29, readFileSync as readFileSync24, writeFileSync as writeFileSync22 } from "fs";
14605
- import { dirname as dirname21, resolve as resolve10 } from "path";
14721
+ import { existsSync as existsSync30, readFileSync as readFileSync25, writeFileSync as writeFileSync22 } from "fs";
14722
+ import { dirname as dirname22, resolve as resolve11 } from "path";
14606
14723
  import { fileURLToPath as fileURLToPath5 } from "url";
14607
14724
  var __filename3 = fileURLToPath5(import.meta.url);
14608
- var __dirname4 = dirname21(__filename3);
14725
+ var __dirname4 = dirname22(__filename3);
14609
14726
  function packageRoot() {
14610
14727
  return __dirname4;
14611
14728
  }
14612
14729
  function readLines(path71) {
14613
- if (!existsSync29(path71)) return [];
14614
- return readFileSync24(path71, "utf8").split("\n").filter((line) => line.trim() !== "");
14730
+ if (!existsSync30(path71)) return [];
14731
+ return readFileSync25(path71, "utf8").split("\n").filter((line) => line.trim() !== "");
14615
14732
  }
14616
14733
  var cachedReads;
14617
14734
  var cachedWrites;
14618
14735
  function getCliReadsLines() {
14619
14736
  if (!cachedReads) {
14620
- cachedReads = readLines(resolve10(packageRoot(), "allowed.cli-reads"));
14737
+ cachedReads = readLines(resolve11(packageRoot(), "allowed.cli-reads"));
14621
14738
  }
14622
14739
  return cachedReads;
14623
14740
  }
14624
14741
  function getCliWritesLines() {
14625
14742
  if (!cachedWrites) {
14626
- cachedWrites = readLines(resolve10(packageRoot(), "allowed.cli-writes"));
14743
+ cachedWrites = readLines(resolve11(packageRoot(), "allowed.cli-writes"));
14627
14744
  }
14628
14745
  return cachedWrites;
14629
14746
  }
@@ -14632,7 +14749,7 @@ function loadCliReads() {
14632
14749
  }
14633
14750
  function saveCliReads(commands) {
14634
14751
  writeFileSync22(
14635
- resolve10(packageRoot(), "allowed.cli-reads"),
14752
+ resolve11(packageRoot(), "allowed.cli-reads"),
14636
14753
  `${commands.join("\n")}
14637
14754
  `
14638
14755
  );
@@ -14657,14 +14774,14 @@ function findCliWrite(command) {
14657
14774
  }
14658
14775
 
14659
14776
  // src/shared/readSettingsPerms.ts
14660
- import { existsSync as existsSync30, readFileSync as readFileSync25 } from "fs";
14777
+ import { existsSync as existsSync31, readFileSync as readFileSync26 } from "fs";
14661
14778
  import { homedir as homedir14 } from "os";
14662
- import { join as join30 } from "path";
14779
+ import { join as join31 } from "path";
14663
14780
  function readSettingsPerms(key) {
14664
14781
  const paths = [
14665
- join30(homedir14(), ".claude", "settings.json"),
14666
- join30(process.cwd(), ".claude", "settings.json"),
14667
- join30(process.cwd(), ".claude", "settings.local.json")
14782
+ join31(homedir14(), ".claude", "settings.json"),
14783
+ join31(process.cwd(), ".claude", "settings.json"),
14784
+ join31(process.cwd(), ".claude", "settings.local.json")
14668
14785
  ];
14669
14786
  const entries = [];
14670
14787
  for (const p of paths) {
@@ -14673,9 +14790,9 @@ function readSettingsPerms(key) {
14673
14790
  return entries;
14674
14791
  }
14675
14792
  function readPermissionArray(filePath, key) {
14676
- if (!existsSync30(filePath)) return [];
14793
+ if (!existsSync31(filePath)) return [];
14677
14794
  try {
14678
- const data = JSON.parse(readFileSync25(filePath, "utf8"));
14795
+ const data = JSON.parse(readFileSync26(filePath, "utf8"));
14679
14796
  const arr = data?.permissions?.[key];
14680
14797
  return Array.isArray(arr) ? arr.filter((e) => typeof e === "string") : [];
14681
14798
  } catch {
@@ -14754,19 +14871,19 @@ function isCdToCwd(command) {
14754
14871
  const parts = command.split(/\s+/);
14755
14872
  if (parts[0] !== "cd" || parts.length > 2) return false;
14756
14873
  if (parts.length === 1) return false;
14757
- const resolved = resolve11(normalizeMsysPath(parts[1]));
14758
- return resolved === resolve11(process.cwd());
14874
+ const resolved = resolve12(normalizeMsysPath(parts[1]));
14875
+ return resolved === resolve12(process.cwd());
14759
14876
  }
14760
14877
  function isCdToReadAllowedDir(command) {
14761
14878
  const parts = command.split(/\s+/);
14762
14879
  if (parts[0] !== "cd" || parts.length !== 2) return void 0;
14763
- const target = resolve11(normalizeMsysPath(parts[1]));
14880
+ const target = resolve12(normalizeMsysPath(parts[1]));
14764
14881
  for (const entry of readSettingsPerms("allow")) {
14765
14882
  const m = entry.match(READ_RE);
14766
14883
  if (!m) continue;
14767
14884
  const base = globBaseDir(m[1]);
14768
14885
  if (!base) continue;
14769
- const resolved = resolve11(normalizeMsysPath(base));
14886
+ const resolved = resolve12(normalizeMsysPath(base));
14770
14887
  if (target === resolved || target.startsWith(resolved + sep)) {
14771
14888
  return `cd to Read-allowed directory: ${entry}`;
14772
14889
  }
@@ -14866,11 +14983,11 @@ function decideCommand(toolName, rawCommand) {
14866
14983
  // src/commands/cliHook/logDeniedToolCall.ts
14867
14984
  import { mkdirSync as mkdirSync12 } from "fs";
14868
14985
  import { homedir as homedir15 } from "os";
14869
- import { join as join31 } from "path";
14986
+ import { join as join32 } from "path";
14870
14987
  import Database from "better-sqlite3";
14871
14988
  var _db;
14872
14989
  function getDbDir() {
14873
- return join31(homedir15(), ".assist");
14990
+ return join32(homedir15(), ".assist");
14874
14991
  }
14875
14992
  function initSchema(db) {
14876
14993
  db.exec(`
@@ -14889,7 +15006,7 @@ function openPromptsDb(dir) {
14889
15006
  if (_db) return _db;
14890
15007
  const dbDir = dir ?? getDbDir();
14891
15008
  mkdirSync12(dbDir, { recursive: true });
14892
- const db = new Database(join31(dbDir, "assist.db"));
15009
+ const db = new Database(join32(dbDir, "assist.db"));
14893
15010
  db.pragma("journal_mode = WAL");
14894
15011
  initSchema(db);
14895
15012
  _db = db;
@@ -14939,7 +15056,7 @@ async function cliHook() {
14939
15056
  logDeniedToolCall({
14940
15057
  tool: input.toolName,
14941
15058
  command: input.command,
14942
- repo: basename7(process.cwd()),
15059
+ repo: basename9(process.cwd()),
14943
15060
  sessionId: process.env.CLAUDE_SESSION_ID,
14944
15061
  denyReason: decision.permissionDecisionReason
14945
15062
  });
@@ -14985,9 +15102,9 @@ ${reasons.join("\n")}`);
14985
15102
  }
14986
15103
 
14987
15104
  // src/commands/permitCliReads/index.ts
14988
- import { existsSync as existsSync31, mkdirSync as mkdirSync13, readFileSync as readFileSync26, writeFileSync as writeFileSync23 } from "fs";
15105
+ import { existsSync as existsSync32, mkdirSync as mkdirSync13, readFileSync as readFileSync27, writeFileSync as writeFileSync23 } from "fs";
14989
15106
  import { homedir as homedir16 } from "os";
14990
- import { join as join32 } from "path";
15107
+ import { join as join33 } from "path";
14991
15108
 
14992
15109
  // src/commands/permitCliReads/assertCliExists.ts
14993
15110
  function assertCliExists(cli) {
@@ -15078,12 +15195,12 @@ function hasSubcommands(helpText) {
15078
15195
  // src/commands/permitCliReads/runHelp.ts
15079
15196
  import { exec as exec2 } from "child_process";
15080
15197
  function runHelp(args) {
15081
- return new Promise((resolve20) => {
15198
+ return new Promise((resolve21) => {
15082
15199
  exec2(
15083
15200
  `${args.join(" ")} --help`,
15084
15201
  { encoding: "utf8", timeout: 3e4 },
15085
15202
  (_err, stdout, stderr) => {
15086
- resolve20(stdout || stderr || "");
15203
+ resolve21(stdout || stderr || "");
15087
15204
  }
15088
15205
  );
15089
15206
  });
@@ -15250,15 +15367,15 @@ function updateSettings(cli, commands) {
15250
15367
  // src/commands/permitCliReads/index.ts
15251
15368
  function logPath(cli) {
15252
15369
  const safeName = cli.replace(/\s+/g, "-");
15253
- return join32(homedir16(), ".assist", `cli-discover-${safeName}.log`);
15370
+ return join33(homedir16(), ".assist", `cli-discover-${safeName}.log`);
15254
15371
  }
15255
15372
  function readCache(cli) {
15256
15373
  const path71 = logPath(cli);
15257
- if (!existsSync31(path71)) return void 0;
15258
- return readFileSync26(path71, "utf8");
15374
+ if (!existsSync32(path71)) return void 0;
15375
+ return readFileSync27(path71, "utf8");
15259
15376
  }
15260
15377
  function writeCache(cli, output) {
15261
- const dir = join32(homedir16(), ".assist");
15378
+ const dir = join33(homedir16(), ".assist");
15262
15379
  mkdirSync13(dir, { recursive: true });
15263
15380
  writeFileSync23(logPath(cli), output);
15264
15381
  }
@@ -15311,15 +15428,15 @@ function loadDenyConfig(global) {
15311
15428
  }
15312
15429
 
15313
15430
  // src/commands/deny/denyAdd.ts
15314
- function denyAdd(pattern2, message2, options2) {
15431
+ function denyAdd(pattern2, message3, options2) {
15315
15432
  const { deny, saveDeny } = loadDenyConfig(options2.global);
15316
15433
  if (deny.some((r) => r.pattern === pattern2)) {
15317
15434
  console.log(chalk115.yellow(`Deny rule already exists for: ${pattern2}`));
15318
15435
  return;
15319
15436
  }
15320
- deny.push({ pattern: pattern2, message: message2 });
15437
+ deny.push({ pattern: pattern2, message: message3 });
15321
15438
  saveDeny(deny);
15322
- console.log(chalk115.green(`Added deny rule: ${pattern2} \u2192 ${message2}`));
15439
+ console.log(chalk115.green(`Added deny rule: ${pattern2} \u2192 ${message3}`));
15323
15440
  }
15324
15441
 
15325
15442
  // src/commands/deny/denyList.ts
@@ -15401,22 +15518,22 @@ function registerCliHook(program2) {
15401
15518
  }
15402
15519
 
15403
15520
  // src/commands/codeComment/codeCommentConfirm.ts
15404
- import { existsSync as existsSync33, readFileSync as readFileSync28, unlinkSync as unlinkSync8, writeFileSync as writeFileSync24 } from "fs";
15521
+ import { existsSync as existsSync34, readFileSync as readFileSync29, unlinkSync as unlinkSync8, writeFileSync as writeFileSync24 } from "fs";
15405
15522
  import chalk118 from "chalk";
15406
15523
 
15407
15524
  // src/commands/codeComment/getRestrictedDir.ts
15408
15525
  import { homedir as homedir17 } from "os";
15409
- import { join as join33 } from "path";
15526
+ import { join as join34 } from "path";
15410
15527
  function getRestrictedDir() {
15411
- return join33(homedir17(), ".assist", "restricted");
15528
+ return join34(homedir17(), ".assist", "restricted");
15412
15529
  }
15413
15530
  function getPinStatePath(pin) {
15414
- return join33(getRestrictedDir(), `code-comment-${pin}.json`);
15531
+ return join34(getRestrictedDir(), `code-comment-${pin}.json`);
15415
15532
  }
15416
15533
 
15417
15534
  // src/commands/codeComment/sweepRestrictedDir.ts
15418
- import { readdirSync as readdirSync3, statSync as statSync4, unlinkSync as unlinkSync7 } from "fs";
15419
- import { join as join34 } from "path";
15535
+ import { readdirSync as readdirSync3, statSync as statSync5, unlinkSync as unlinkSync7 } from "fs";
15536
+ import { join as join35 } from "path";
15420
15537
  var STALE_AFTER_MS = 30 * 60 * 1e3;
15421
15538
  function sweepRestrictedDir(dir = getRestrictedDir()) {
15422
15539
  let entries;
@@ -15427,9 +15544,9 @@ function sweepRestrictedDir(dir = getRestrictedDir()) {
15427
15544
  }
15428
15545
  const cutoff = Date.now() - STALE_AFTER_MS;
15429
15546
  for (const entry of entries) {
15430
- const path71 = join34(dir, entry);
15547
+ const path71 = join35(dir, entry);
15431
15548
  try {
15432
- if (statSync4(path71).mtimeMs < cutoff) unlinkSync7(path71);
15549
+ if (statSync5(path71).mtimeMs < cutoff) unlinkSync7(path71);
15433
15550
  } catch {
15434
15551
  continue;
15435
15552
  }
@@ -15437,12 +15554,12 @@ function sweepRestrictedDir(dir = getRestrictedDir()) {
15437
15554
  }
15438
15555
 
15439
15556
  // src/commands/codeComment/readPinState.ts
15440
- import { existsSync as existsSync32, readFileSync as readFileSync27 } from "fs";
15557
+ import { existsSync as existsSync33, readFileSync as readFileSync28 } from "fs";
15441
15558
  function readPinState(pin) {
15442
15559
  const path71 = getPinStatePath(pin);
15443
- if (!existsSync32(path71)) return void 0;
15560
+ if (!existsSync33(path71)) return void 0;
15444
15561
  try {
15445
- const state = JSON.parse(readFileSync27(path71, "utf8"));
15562
+ const state = JSON.parse(readFileSync28(path71, "utf8"));
15446
15563
  if (state.pin !== pin) return void 0;
15447
15564
  return state;
15448
15565
  } catch {
@@ -15459,12 +15576,12 @@ function codeCommentConfirm(pin) {
15459
15576
  process.exitCode = 1;
15460
15577
  return;
15461
15578
  }
15462
- if (!existsSync33(state.file)) {
15579
+ if (!existsSync34(state.file)) {
15463
15580
  console.error(chalk118.red(`Target file no longer exists: ${state.file}`));
15464
15581
  process.exitCode = 1;
15465
15582
  return;
15466
15583
  }
15467
- const original = readFileSync28(state.file, "utf8");
15584
+ const original = readFileSync29(state.file, "utf8");
15468
15585
  const lines = original.split("\n");
15469
15586
  const index3 = state.line - 1;
15470
15587
  if (index3 > lines.length) {
@@ -16061,10 +16178,10 @@ function formatResultLine(entry, failing) {
16061
16178
  }
16062
16179
 
16063
16180
  // src/commands/complexity/maintainability/getMaintainabilityGitState.ts
16064
- import { execSync as execSync34 } from "child_process";
16181
+ import { execSync as execSync35 } from "child_process";
16065
16182
  import path28 from "path";
16066
16183
  function git3(command) {
16067
- return execSync34(command, { encoding: "utf8" });
16184
+ return execSync35(command, { encoding: "utf8" });
16068
16185
  }
16069
16186
  function toAbsolute(root, repoRelative) {
16070
16187
  return path28.resolve(root, repoRelative);
@@ -16481,21 +16598,21 @@ import { unlinkSync as unlinkSync9, writeFileSync as writeFileSync26 } from "fs"
16481
16598
  import chalk134 from "chalk";
16482
16599
 
16483
16600
  // src/commands/dbMigration/getMigrationPinPath.ts
16484
- import { join as join35 } from "path";
16601
+ import { join as join36 } from "path";
16485
16602
  function getMigrationPinPath(pin) {
16486
- return join35(getRestrictedDir(), `db-migration-pin-${pin}.json`);
16603
+ return join36(getRestrictedDir(), `db-migration-pin-${pin}.json`);
16487
16604
  }
16488
16605
  function getMigrationApprovalPath(migrationId) {
16489
- return join35(getRestrictedDir(), `db-migration-approval-${migrationId}.json`);
16606
+ return join36(getRestrictedDir(), `db-migration-approval-${migrationId}.json`);
16490
16607
  }
16491
16608
 
16492
16609
  // src/commands/dbMigration/readMigrationPinState.ts
16493
- import { existsSync as existsSync34, readFileSync as readFileSync29 } from "fs";
16610
+ import { existsSync as existsSync35, readFileSync as readFileSync30 } from "fs";
16494
16611
  function readMigrationPinState(pin) {
16495
16612
  const path71 = getMigrationPinPath(pin);
16496
- if (!existsSync34(path71)) return void 0;
16613
+ if (!existsSync35(path71)) return void 0;
16497
16614
  try {
16498
- const state = JSON.parse(readFileSync29(path71, "utf8"));
16615
+ const state = JSON.parse(readFileSync30(path71, "utf8"));
16499
16616
  if (state.pin !== pin) return void 0;
16500
16617
  if (!Number.isInteger(state.migrationId)) return void 0;
16501
16618
  return state;
@@ -16582,7 +16699,7 @@ function registerDbMigration(parent) {
16582
16699
  }
16583
16700
 
16584
16701
  // src/commands/deploy/redirect.ts
16585
- import { existsSync as existsSync35, readFileSync as readFileSync30, writeFileSync as writeFileSync28 } from "fs";
16702
+ import { existsSync as existsSync36, readFileSync as readFileSync31, writeFileSync as writeFileSync28 } from "fs";
16586
16703
  import chalk136 from "chalk";
16587
16704
  var TRAILING_SLASH_SCRIPT = ` <script>
16588
16705
  if (!window.location.pathname.endsWith('/')) {
@@ -16591,11 +16708,11 @@ var TRAILING_SLASH_SCRIPT = ` <script>
16591
16708
  </script>`;
16592
16709
  function redirect() {
16593
16710
  const indexPath = "index.html";
16594
- if (!existsSync35(indexPath)) {
16711
+ if (!existsSync36(indexPath)) {
16595
16712
  console.log(chalk136.yellow("No index.html found"));
16596
16713
  return;
16597
16714
  }
16598
- const content = readFileSync30(indexPath, "utf8");
16715
+ const content = readFileSync31(indexPath, "utf8");
16599
16716
  if (content.includes("window.location.pathname.endsWith('/')")) {
16600
16717
  console.log(chalk136.dim("Trailing slash script already present"));
16601
16718
  return;
@@ -16620,35 +16737,35 @@ function registerDeploy(program2) {
16620
16737
 
16621
16738
  // src/commands/devlog/list/index.ts
16622
16739
  import { execFileSync as execFileSync3 } from "child_process";
16623
- import { basename as basename9 } from "path";
16740
+ import { basename as basename11 } from "path";
16624
16741
 
16625
16742
  // src/commands/devlog/loadBlogSkipDays.ts
16626
16743
  import { homedir as homedir18 } from "os";
16627
- import { join as join36 } from "path";
16628
- var BLOG_REPO_ROOT = join36(homedir18(), "git/blog");
16744
+ import { join as join37 } from "path";
16745
+ var BLOG_REPO_ROOT = join37(homedir18(), "git/blog");
16629
16746
  function loadBlogSkipDays(repoName) {
16630
- const config = loadRawYaml(join36(BLOG_REPO_ROOT, "assist.yml"));
16747
+ const config = loadRawYaml(join37(BLOG_REPO_ROOT, "assist.yml"));
16631
16748
  const devlog = config.devlog;
16632
16749
  const skip2 = devlog?.skip;
16633
16750
  return new Set(skip2?.[repoName]);
16634
16751
  }
16635
16752
 
16636
16753
  // src/commands/devlog/shared.ts
16637
- import { execSync as execSync35 } from "child_process";
16754
+ import { execSync as execSync36 } from "child_process";
16638
16755
  import chalk137 from "chalk";
16639
16756
 
16640
16757
  // src/shared/getRepoName.ts
16641
- import { existsSync as existsSync36, readFileSync as readFileSync31 } from "fs";
16642
- import { basename as basename8, join as join37 } from "path";
16758
+ import { existsSync as existsSync37, readFileSync as readFileSync32 } from "fs";
16759
+ import { basename as basename10, join as join38 } from "path";
16643
16760
  function getRepoName() {
16644
16761
  const config = loadConfig();
16645
16762
  if (config.devlog?.name) {
16646
16763
  return config.devlog.name;
16647
16764
  }
16648
- const packageJsonPath = join37(process.cwd(), "package.json");
16649
- if (existsSync36(packageJsonPath)) {
16765
+ const packageJsonPath = join38(process.cwd(), "package.json");
16766
+ if (existsSync37(packageJsonPath)) {
16650
16767
  try {
16651
- const content = readFileSync31(packageJsonPath, "utf8");
16768
+ const content = readFileSync32(packageJsonPath, "utf8");
16652
16769
  const pkg = JSON.parse(content);
16653
16770
  if (pkg.name) {
16654
16771
  return pkg.name;
@@ -16656,13 +16773,13 @@ function getRepoName() {
16656
16773
  } catch {
16657
16774
  }
16658
16775
  }
16659
- return basename8(process.cwd());
16776
+ return basename10(process.cwd());
16660
16777
  }
16661
16778
 
16662
16779
  // src/commands/devlog/loadDevlogEntries.ts
16663
- import { readdirSync as readdirSync4, readFileSync as readFileSync32 } from "fs";
16664
- import { join as join38 } from "path";
16665
- var DEVLOG_DIR = join38(BLOG_REPO_ROOT, "src/content/devlog");
16780
+ import { readdirSync as readdirSync4, readFileSync as readFileSync33 } from "fs";
16781
+ import { join as join39 } from "path";
16782
+ var DEVLOG_DIR = join39(BLOG_REPO_ROOT, "src/content/devlog");
16666
16783
  function extractFrontmatter(content) {
16667
16784
  const fm = content.match(/^---\n([\s\S]*?)\n---/);
16668
16785
  return fm?.[1] ?? null;
@@ -16690,7 +16807,7 @@ function readDevlogFiles(callback) {
16690
16807
  try {
16691
16808
  const files = readdirSync4(DEVLOG_DIR).filter((f) => f.endsWith(".md"));
16692
16809
  for (const file of files) {
16693
- const content = readFileSync32(join38(DEVLOG_DIR, file), "utf8");
16810
+ const content = readFileSync33(join39(DEVLOG_DIR, file), "utf8");
16694
16811
  const parsed = parseFrontmatter(content, file);
16695
16812
  if (parsed) callback(parsed);
16696
16813
  }
@@ -16726,7 +16843,7 @@ function loadAllDevlogLatestDates() {
16726
16843
  // src/commands/devlog/shared.ts
16727
16844
  function getCommitFiles(hash) {
16728
16845
  try {
16729
- const output = execSync35(`git show --name-only --format="" ${hash}`, {
16846
+ const output = execSync36(`git show --name-only --format="" ${hash}`, {
16730
16847
  encoding: "utf8"
16731
16848
  });
16732
16849
  return output.trim().split("\n").filter(Boolean);
@@ -16760,14 +16877,14 @@ function parseGitLogCommits(output, ignore3, afterDate) {
16760
16877
  const commitsByDate = /* @__PURE__ */ new Map();
16761
16878
  for (const line of lines) {
16762
16879
  const [date, hash, ...messageParts] = line.split("|");
16763
- const message2 = messageParts.join("|");
16880
+ const message3 = messageParts.join("|");
16764
16881
  if (afterDate && date <= afterDate) {
16765
16882
  continue;
16766
16883
  }
16767
16884
  const files = getCommitFiles(hash);
16768
16885
  if (!shouldIgnoreCommit(files, ignore3)) {
16769
16886
  const existing = commitsByDate.get(date) || [];
16770
- existing.push({ date, hash, message: message2, files });
16887
+ existing.push({ date, hash, message: message3, files });
16771
16888
  commitsByDate.set(date, existing);
16772
16889
  }
16773
16890
  }
@@ -16792,7 +16909,7 @@ function list3(options2) {
16792
16909
  const config = loadConfig();
16793
16910
  const days = options2.days ?? 30;
16794
16911
  const ignore3 = options2.ignore ?? config.devlog?.ignore ?? [];
16795
- const repoName = basename9(process.cwd());
16912
+ const repoName = basename11(process.cwd());
16796
16913
  const skipDays = loadBlogSkipDays(repoName);
16797
16914
  const devlogEntries = loadDevlogEntries(repoName);
16798
16915
  const args = ["log"];
@@ -16822,11 +16939,11 @@ function list3(options2) {
16822
16939
  }
16823
16940
 
16824
16941
  // src/commands/devlog/getLastVersionInfo.ts
16825
- import { execFileSync as execFileSync4, execSync as execSync36 } from "child_process";
16942
+ import { execFileSync as execFileSync4, execSync as execSync37 } from "child_process";
16826
16943
  import semver from "semver";
16827
16944
  function getVersionAtCommit(hash) {
16828
16945
  try {
16829
- const content = execSync36(`git show ${hash}:package.json`, {
16946
+ const content = execSync37(`git show ${hash}:package.json`, {
16830
16947
  encoding: "utf8"
16831
16948
  });
16832
16949
  const pkg = JSON.parse(content);
@@ -16999,7 +17116,7 @@ function next2(options2) {
16999
17116
  }
17000
17117
 
17001
17118
  // src/commands/devlog/repos/index.ts
17002
- import { execSync as execSync37 } from "child_process";
17119
+ import { execSync as execSync38 } from "child_process";
17003
17120
 
17004
17121
  // src/commands/devlog/repos/printReposTable.ts
17005
17122
  import chalk141 from "chalk";
@@ -17034,7 +17151,7 @@ function getStatus(lastPush, lastDevlog) {
17034
17151
  return lastDevlog < lastPush ? "outdated" : "ok";
17035
17152
  }
17036
17153
  function fetchRepos(days, all) {
17037
- const json = execSync37(
17154
+ const json = execSync38(
17038
17155
  "gh repo list staff0rd --json name,pushedAt,isArchived --limit 200",
17039
17156
  { encoding: "utf8" }
17040
17157
  );
@@ -17078,11 +17195,11 @@ function repos(options2) {
17078
17195
 
17079
17196
  // src/commands/devlog/skip.ts
17080
17197
  import { writeFileSync as writeFileSync29 } from "fs";
17081
- import { join as join39 } from "path";
17198
+ import { join as join40 } from "path";
17082
17199
  import chalk142 from "chalk";
17083
17200
  import { stringify as stringifyYaml3 } from "yaml";
17084
17201
  function getBlogConfigPath() {
17085
- return join39(BLOG_REPO_ROOT, "assist.yml");
17202
+ return join40(BLOG_REPO_ROOT, "assist.yml");
17086
17203
  }
17087
17204
  function skip(date) {
17088
17205
  if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) {
@@ -17163,16 +17280,16 @@ function registerDevlog(program2) {
17163
17280
 
17164
17281
  // src/commands/dotnet/checkBuildLocks.ts
17165
17282
  import { closeSync as closeSync3, openSync as openSync3, readdirSync as readdirSync5 } from "fs";
17166
- import { join as join40 } from "path";
17283
+ import { join as join41 } from "path";
17167
17284
  import chalk144 from "chalk";
17168
17285
 
17169
17286
  // src/shared/findRepoRoot.ts
17170
- import { existsSync as existsSync37 } from "fs";
17287
+ import { existsSync as existsSync38 } from "fs";
17171
17288
  import path30 from "path";
17172
17289
  function findRepoRoot(dir) {
17173
17290
  let current = dir;
17174
17291
  while (current !== path30.dirname(current)) {
17175
- if (existsSync37(path30.join(current, ".git"))) {
17292
+ if (existsSync38(path30.join(current, ".git"))) {
17176
17293
  return current;
17177
17294
  }
17178
17295
  current = path30.dirname(current);
@@ -17191,7 +17308,7 @@ function isLockedDll(debugDir) {
17191
17308
  }
17192
17309
  for (const file of files) {
17193
17310
  if (!file.toLowerCase().endsWith(".dll")) continue;
17194
- const dllPath = join40(debugDir, file);
17311
+ const dllPath = join41(debugDir, file);
17195
17312
  try {
17196
17313
  const fd = openSync3(dllPath, "r+");
17197
17314
  closeSync3(fd);
@@ -17209,13 +17326,13 @@ function findFirstLockedDll(dir) {
17209
17326
  return null;
17210
17327
  }
17211
17328
  if (entries.includes("bin")) {
17212
- const locked = isLockedDll(join40(dir, "bin", "Debug"));
17329
+ const locked = isLockedDll(join41(dir, "bin", "Debug"));
17213
17330
  if (locked) return locked;
17214
17331
  }
17215
17332
  for (const entry of entries) {
17216
17333
  if (SKIP_DIRS.has(entry) || entry === "bin" || entry.startsWith("."))
17217
17334
  continue;
17218
- const found = findFirstLockedDll(join40(dir, entry));
17335
+ const found = findFirstLockedDll(join41(dir, entry));
17219
17336
  if (found) return found;
17220
17337
  }
17221
17338
  return null;
@@ -17238,11 +17355,11 @@ async function checkBuildLocksCommand() {
17238
17355
  }
17239
17356
 
17240
17357
  // src/commands/dotnet/buildTree.ts
17241
- import { readFileSync as readFileSync33 } from "fs";
17358
+ import { readFileSync as readFileSync34 } from "fs";
17242
17359
  import path31 from "path";
17243
17360
  var PROJECT_REF_RE = /<ProjectReference\s+Include="([^"]+)"/g;
17244
17361
  function getProjectRefs(csprojPath) {
17245
- const content = readFileSync33(csprojPath, "utf8");
17362
+ const content = readFileSync34(csprojPath, "utf8");
17246
17363
  const refs = [];
17247
17364
  for (const match of content.matchAll(PROJECT_REF_RE)) {
17248
17365
  refs.push(match[1].replace(/\\/g, "/"));
@@ -17259,7 +17376,7 @@ function buildTree(csprojPath, repoRoot, visited = /* @__PURE__ */ new Set()) {
17259
17376
  for (const ref of getProjectRefs(abs)) {
17260
17377
  const childAbs = path31.resolve(dir, ref);
17261
17378
  try {
17262
- readFileSync33(childAbs);
17379
+ readFileSync34(childAbs);
17263
17380
  node.children.push(buildTree(childAbs, repoRoot, visited));
17264
17381
  } catch {
17265
17382
  node.children.push({
@@ -17284,7 +17401,7 @@ function collectAllDeps(node) {
17284
17401
  }
17285
17402
 
17286
17403
  // src/commands/dotnet/findContainingSolutions.ts
17287
- import { readdirSync as readdirSync6, readFileSync as readFileSync34, statSync as statSync5 } from "fs";
17404
+ import { readdirSync as readdirSync6, readFileSync as readFileSync35, statSync as statSync6 } from "fs";
17288
17405
  import path32 from "path";
17289
17406
  function findSlnFiles(dir, maxDepth, depth = 0) {
17290
17407
  if (depth > maxDepth) return [];
@@ -17300,7 +17417,7 @@ function findSlnFiles(dir, maxDepth, depth = 0) {
17300
17417
  continue;
17301
17418
  const full = path32.join(dir, entry);
17302
17419
  try {
17303
- const stat3 = statSync5(full);
17420
+ const stat3 = statSync6(full);
17304
17421
  if (stat3.isFile() && entry.endsWith(".sln")) {
17305
17422
  results.push(full);
17306
17423
  } else if (stat3.isDirectory()) {
@@ -17319,7 +17436,7 @@ function findContainingSolutions(csprojPath, repoRoot) {
17319
17436
  const pattern2 = new RegExp(`[\\\\"/]${escapeRegex(csprojBasename)}"`);
17320
17437
  for (const sln of slnFiles) {
17321
17438
  try {
17322
- const content = readFileSync34(sln, "utf8");
17439
+ const content = readFileSync35(sln, "utf8");
17323
17440
  if (pattern2.test(content)) {
17324
17441
  matches.push(path32.relative(repoRoot, sln));
17325
17442
  }
@@ -17383,12 +17500,12 @@ function printJson(tree, totalCount, solutions) {
17383
17500
  }
17384
17501
 
17385
17502
  // src/commands/dotnet/resolveCsproj.ts
17386
- import { existsSync as existsSync38 } from "fs";
17503
+ import { existsSync as existsSync39 } from "fs";
17387
17504
  import path33 from "path";
17388
17505
  import chalk146 from "chalk";
17389
17506
  function resolveCsproj(csprojPath) {
17390
17507
  const resolved = path33.resolve(csprojPath);
17391
- if (!existsSync38(resolved)) {
17508
+ if (!existsSync39(resolved)) {
17392
17509
  console.error(chalk146.red(`File not found: ${resolved}`));
17393
17510
  process.exit(1);
17394
17511
  }
@@ -17414,7 +17531,7 @@ async function deps(csprojPath, options2) {
17414
17531
  }
17415
17532
 
17416
17533
  // src/commands/dotnet/getChangedCsFiles.ts
17417
- import { execSync as execSync38 } from "child_process";
17534
+ import { execSync as execSync39 } from "child_process";
17418
17535
  var SCOPE_ALL = "all";
17419
17536
  var SCOPE_BASE = "base:";
17420
17537
  var SCOPE_COMMIT = "commit:";
@@ -17438,7 +17555,7 @@ function getChangedCsFiles(scope) {
17438
17555
  } else {
17439
17556
  cmd = "git diff --name-only HEAD";
17440
17557
  }
17441
- const output = execSync38(cmd, { encoding: "utf8" }).trim();
17558
+ const output = execSync39(cmd, { encoding: "utf8" }).trim();
17442
17559
  if (output === "") return [];
17443
17560
  return output.split("\n").filter((f) => f.toLowerCase().endsWith(".cs"));
17444
17561
  }
@@ -17556,17 +17673,17 @@ function filterIssues(issues, all, cliOnly, cliSuppress) {
17556
17673
  }
17557
17674
 
17558
17675
  // src/commands/dotnet/resolveSolution.ts
17559
- import { existsSync as existsSync39 } from "fs";
17676
+ import { existsSync as existsSync40 } from "fs";
17560
17677
  import path34 from "path";
17561
17678
  import chalk150 from "chalk";
17562
17679
 
17563
17680
  // src/commands/dotnet/findSolution.ts
17564
17681
  import { readdirSync as readdirSync7 } from "fs";
17565
- import { dirname as dirname22, join as join41 } from "path";
17682
+ import { dirname as dirname23, join as join42 } from "path";
17566
17683
  import chalk149 from "chalk";
17567
17684
  function findSlnInDir(dir) {
17568
17685
  try {
17569
- return readdirSync7(dir).filter((f) => f.endsWith(".sln")).map((f) => join41(dir, f));
17686
+ return readdirSync7(dir).filter((f) => f.endsWith(".sln")).map((f) => join42(dir, f));
17570
17687
  } catch {
17571
17688
  return [];
17572
17689
  }
@@ -17587,7 +17704,7 @@ function findSolution() {
17587
17704
  process.exit(1);
17588
17705
  }
17589
17706
  if (current === ceiling) break;
17590
- current = dirname22(current);
17707
+ current = dirname23(current);
17591
17708
  }
17592
17709
  console.error(chalk149.red("No .sln file found between cwd and repo root"));
17593
17710
  process.exit(1);
@@ -17597,7 +17714,7 @@ function findSolution() {
17597
17714
  function resolveSolution(sln) {
17598
17715
  if (sln) {
17599
17716
  const resolved = path34.resolve(sln);
17600
- if (!existsSync39(resolved)) {
17717
+ if (!existsSync40(resolved)) {
17601
17718
  console.error(chalk150.red(`Solution file not found: ${resolved}`));
17602
17719
  process.exit(1);
17603
17720
  }
@@ -17636,14 +17753,14 @@ function parseInspectReport(json) {
17636
17753
  }
17637
17754
 
17638
17755
  // src/commands/dotnet/runInspectCode.ts
17639
- import { execSync as execSync39 } from "child_process";
17640
- import { existsSync as existsSync40, readFileSync as readFileSync35, unlinkSync as unlinkSync10 } from "fs";
17756
+ import { execSync as execSync40 } from "child_process";
17757
+ import { existsSync as existsSync41, readFileSync as readFileSync36, unlinkSync as unlinkSync10 } from "fs";
17641
17758
  import { tmpdir as tmpdir4 } from "os";
17642
17759
  import path35 from "path";
17643
17760
  import chalk151 from "chalk";
17644
17761
  function assertJbInstalled() {
17645
17762
  try {
17646
- execSync39("jb inspectcode --version", { stdio: "pipe" });
17763
+ execSync40("jb inspectcode --version", { stdio: "pipe" });
17647
17764
  } catch {
17648
17765
  console.error(chalk151.red("jb is not installed. Install with:"));
17649
17766
  console.error(
@@ -17657,7 +17774,7 @@ function runInspectCode(slnPath, include, swea) {
17657
17774
  const includeFlag = include ? ` --include="${include}"` : "";
17658
17775
  const sweaFlag = swea ? " --swea" : "";
17659
17776
  try {
17660
- execSync39(
17777
+ execSync40(
17661
17778
  `jb inspectcode "${slnPath}" -o="${reportPath}"${includeFlag}${sweaFlag} --verbosity=OFF`,
17662
17779
  { stdio: "pipe" }
17663
17780
  );
@@ -17668,17 +17785,17 @@ function runInspectCode(slnPath, include, swea) {
17668
17785
  console.error(chalk151.red("jb inspectcode failed"));
17669
17786
  process.exit(1);
17670
17787
  }
17671
- if (!existsSync40(reportPath)) {
17788
+ if (!existsSync41(reportPath)) {
17672
17789
  console.error(chalk151.red("Report file not generated"));
17673
17790
  process.exit(1);
17674
17791
  }
17675
- const xml = readFileSync35(reportPath, "utf8");
17792
+ const xml = readFileSync36(reportPath, "utf8");
17676
17793
  unlinkSync10(reportPath);
17677
17794
  return xml;
17678
17795
  }
17679
17796
 
17680
17797
  // src/commands/dotnet/runRoslynInspect.ts
17681
- import { execSync as execSync40 } from "child_process";
17798
+ import { execSync as execSync41 } from "child_process";
17682
17799
  import chalk152 from "chalk";
17683
17800
  function resolveMsbuildPath() {
17684
17801
  const { run: run4 } = loadConfig();
@@ -17689,7 +17806,7 @@ function resolveMsbuildPath() {
17689
17806
  function assertMsbuildInstalled() {
17690
17807
  const msbuild = resolveMsbuildPath();
17691
17808
  try {
17692
- execSync40(`"${msbuild}" -version`, { stdio: "pipe" });
17809
+ execSync41(`"${msbuild}" -version`, { stdio: "pipe" });
17693
17810
  } catch {
17694
17811
  console.error(chalk152.red(`msbuild not found at: ${msbuild}`));
17695
17812
  console.error(
@@ -17715,7 +17832,7 @@ function runRoslynInspect(slnPath) {
17715
17832
  const msbuild = resolveMsbuildPath();
17716
17833
  let output;
17717
17834
  try {
17718
- output = execSync40(
17835
+ output = execSync41(
17719
17836
  `"${msbuild}" "${slnPath}" -t:Build -v:minimal -maxcpucount -p:EnforceCodeStyleInBuild=true -p:RunAnalyzersDuringBuild=true 2>&1`,
17720
17837
  { encoding: "utf8", stdio: "pipe", maxBuffer: 50 * 1024 * 1024 }
17721
17838
  );
@@ -17931,11 +18048,11 @@ function decideCommentGuard(input, existingContent) {
17931
18048
  }
17932
18049
 
17933
18050
  // src/commands/dbMigration/consumeMigrationApproval.ts
17934
- import { existsSync as existsSync41, unlinkSync as unlinkSync11 } from "fs";
18051
+ import { existsSync as existsSync42, unlinkSync as unlinkSync11 } from "fs";
17935
18052
  function consumeMigrationApproval(migrationId) {
17936
18053
  sweepRestrictedDir();
17937
18054
  const path71 = getMigrationApprovalPath(migrationId);
17938
- if (!existsSync41(path71)) return false;
18055
+ if (!existsSync42(path71)) return false;
17939
18056
  try {
17940
18057
  unlinkSync11(path71);
17941
18058
  return true;
@@ -18055,7 +18172,7 @@ function aggregateCommitters(authorLists) {
18055
18172
  import { spawnSync as spawnSync4 } from "child_process";
18056
18173
  import { unlinkSync as unlinkSync12, writeFileSync as writeFileSync30 } from "fs";
18057
18174
  import { tmpdir as tmpdir5 } from "os";
18058
- import { join as join42 } from "path";
18175
+ import { join as join43 } from "path";
18059
18176
  function buildArgs2(queryFile, vars) {
18060
18177
  const args = ["api", "graphql", "-F", `query=@${queryFile}`];
18061
18178
  for (const [key, value] of Object.entries(vars)) {
@@ -18080,7 +18197,7 @@ function throwOnGraphqlErrors(stdout) {
18080
18197
  throw new Error(messages || "GraphQL request returned errors");
18081
18198
  }
18082
18199
  function runGhGraphql(mutation, vars) {
18083
- const queryFile = join42(tmpdir5(), `gh-query-${Date.now()}.graphql`);
18200
+ const queryFile = join43(tmpdir5(), `gh-query-${Date.now()}.graphql`);
18084
18201
  writeFileSync30(queryFile, mutation);
18085
18202
  try {
18086
18203
  const result = spawnSync4("gh", buildArgs2(queryFile, vars), {
@@ -18267,24 +18384,24 @@ async function countPendingHandovers(orm, origin) {
18267
18384
 
18268
18385
  // src/commands/handover/migrateDiskHandovers.ts
18269
18386
  import {
18270
- existsSync as existsSync42,
18387
+ existsSync as existsSync43,
18271
18388
  readdirSync as readdirSync8,
18272
- readFileSync as readFileSync36,
18389
+ readFileSync as readFileSync37,
18273
18390
  rmSync as rmSync3,
18274
- statSync as statSync6
18391
+ statSync as statSync7
18275
18392
  } from "fs";
18276
- import { basename as basename10, join as join45 } from "path";
18393
+ import { basename as basename12, join as join46 } from "path";
18277
18394
 
18278
18395
  // src/commands/handover/getHandoverPath.ts
18279
- import { join as join43 } from "path";
18396
+ import { join as join44 } from "path";
18280
18397
  function getHandoverPath(cwd = process.cwd()) {
18281
- return join43(cwd, ".assist", "HANDOVER.md");
18398
+ return join44(cwd, ".assist", "HANDOVER.md");
18282
18399
  }
18283
18400
 
18284
18401
  // src/commands/handover/getHandoversDir.ts
18285
- import { join as join44 } from "path";
18402
+ import { join as join45 } from "path";
18286
18403
  function getHandoversDir(cwd = process.cwd()) {
18287
- return join44(cwd, ".assist", "handovers");
18404
+ return join45(cwd, ".assist", "handovers");
18288
18405
  }
18289
18406
 
18290
18407
  // src/commands/handover/parseArchiveTimestamp.ts
@@ -18322,17 +18439,17 @@ function summariseHandoverContent(content) {
18322
18439
 
18323
18440
  // src/commands/handover/migrateDiskHandovers.ts
18324
18441
  function collectMarkdown(dir) {
18325
- if (!existsSync42(dir)) return [];
18442
+ if (!existsSync43(dir)) return [];
18326
18443
  const out = [];
18327
18444
  for (const entry of readdirSync8(dir, { withFileTypes: true })) {
18328
- const full = join45(dir, entry.name);
18445
+ const full = join46(dir, entry.name);
18329
18446
  if (entry.isDirectory()) out.push(...collectMarkdown(full));
18330
18447
  else if (entry.isFile() && entry.name.endsWith(".md")) out.push(full);
18331
18448
  }
18332
18449
  return out;
18333
18450
  }
18334
18451
  async function migrateFile(orm, origin, file, createdAt) {
18335
- const content = readFileSync36(file, "utf8");
18452
+ const content = readFileSync37(file, "utf8");
18336
18453
  await saveHandover(orm, {
18337
18454
  origin,
18338
18455
  summary: summariseHandoverContent(content),
@@ -18344,13 +18461,13 @@ async function migrateFile(orm, origin, file, createdAt) {
18344
18461
  async function migrateDiskHandovers(orm, origin, cwd = process.cwd()) {
18345
18462
  let migrated = 0;
18346
18463
  for (const file of collectMarkdown(getHandoversDir(cwd))) {
18347
- const createdAt = parseArchiveTimestamp(basename10(file)) ?? statSync6(file).mtime;
18464
+ const createdAt = parseArchiveTimestamp(basename12(file)) ?? statSync7(file).mtime;
18348
18465
  await migrateFile(orm, origin, file, createdAt);
18349
18466
  migrated++;
18350
18467
  }
18351
18468
  const handoverPath = getHandoverPath(cwd);
18352
- if (existsSync42(handoverPath)) {
18353
- await migrateFile(orm, origin, handoverPath, statSync6(handoverPath).mtime);
18469
+ if (existsSync43(handoverPath)) {
18470
+ await migrateFile(orm, origin, handoverPath, statSync7(handoverPath).mtime);
18354
18471
  migrated++;
18355
18472
  }
18356
18473
  return migrated;
@@ -18380,10 +18497,10 @@ function advisory(count8) {
18380
18497
  const noun = count8 === 1 ? "handover" : "handovers";
18381
18498
  return `${count8} unrecalled ${noun} for this repo. Run /recall to load.`;
18382
18499
  }
18383
- function emit2(message2) {
18500
+ function emit2(message3) {
18384
18501
  const json = JSON.stringify({
18385
18502
  hookSpecificOutput: { hookEventName: "SessionStart" },
18386
- systemMessage: message2
18503
+ systemMessage: message3
18387
18504
  });
18388
18505
  console.log(json);
18389
18506
  return json;
@@ -18562,16 +18679,16 @@ function acceptanceCriteria(issueKey) {
18562
18679
  }
18563
18680
 
18564
18681
  // src/commands/jira/jiraAuth.ts
18565
- import { execSync as execSync41 } from "child_process";
18682
+ import { execSync as execSync42 } from "child_process";
18566
18683
 
18567
18684
  // src/shared/promptInput.ts
18568
18685
  import Enquirer from "enquirer";
18569
18686
  var prompts = Enquirer;
18570
- async function promptInput(name, message2, initial) {
18571
- return exitOnCancel(new prompts.Input({ name, message: message2, initial }).run());
18687
+ async function promptInput(name, message3, initial) {
18688
+ return exitOnCancel(new prompts.Input({ name, message: message3, initial }).run());
18572
18689
  }
18573
- async function promptPassword(name, message2) {
18574
- return exitOnCancel(new prompts.Password({ name, message: message2 }).run());
18690
+ async function promptPassword(name, message3) {
18691
+ return exitOnCancel(new prompts.Password({ name, message: message3 }).run());
18575
18692
  }
18576
18693
 
18577
18694
  // src/commands/jira/jiraAuth.ts
@@ -18597,7 +18714,7 @@ async function jiraAuth() {
18597
18714
  console.error("All fields are required.");
18598
18715
  process.exit(1);
18599
18716
  }
18600
- execSync41(`acli jira auth login --site ${site} --email "${email}" --token`, {
18717
+ execSync42(`acli jira auth login --site ${site} --email "${email}" --token`, {
18601
18718
  encoding: "utf8",
18602
18719
  input: token,
18603
18720
  stdio: ["pipe", "inherit", "inherit"]
@@ -18698,8 +18815,8 @@ import chalk158 from "chalk";
18698
18815
  var RING_CAPACITY = 1e3;
18699
18816
  var ring = [];
18700
18817
  var sink;
18701
- function daemonLog(message2) {
18702
- emit3(`${(/* @__PURE__ */ new Date()).toISOString()} [${process.pid}] ${message2}`);
18818
+ function daemonLog(message3) {
18819
+ emit3(`${(/* @__PURE__ */ new Date()).toISOString()} [${process.pid}] ${message3}`);
18703
18820
  }
18704
18821
  function relayDaemonLog(line) {
18705
18822
  emit3(`[windows] ${line}`);
@@ -18718,18 +18835,18 @@ function recentDaemonLogLines() {
18718
18835
  }
18719
18836
 
18720
18837
  // src/commands/sessions/daemon/worktree/createWorktree.ts
18721
- import { existsSync as existsSync43 } from "fs";
18722
- import { basename as basename12, dirname as dirname23 } from "path";
18838
+ import { existsSync as existsSync44 } from "fs";
18839
+ import { basename as basename14, dirname as dirname24 } from "path";
18723
18840
 
18724
18841
  // src/commands/sessions/daemon/worktree/planAllocation.ts
18725
- import { basename as basename11, join as join46 } from "path";
18842
+ import { basename as basename13, join as join47 } from "path";
18726
18843
  function planAllocation(clone, boundTreeRoots2) {
18727
18844
  return boundTreeRoots2.has(clone) ? "spill" : "primary";
18728
18845
  }
18729
18846
  function nextWorktreePath(clone, base, isTaken) {
18730
- const name = basename11(clone);
18847
+ const name = basename13(clone);
18731
18848
  for (let n = 2; n < 1e3; n++) {
18732
- const candidate = join46(base, `${name}-${n}`);
18849
+ const candidate = join47(base, `${name}-${n}`);
18733
18850
  if (!isTaken(candidate)) return candidate;
18734
18851
  }
18735
18852
  throw new Error(`no free worktree suffix for ${clone}`);
@@ -18762,13 +18879,13 @@ function cloneHead(clone) {
18762
18879
 
18763
18880
  // src/commands/sessions/daemon/worktree/createWorktree.ts
18764
18881
  function createWorktree(clone, strategy, boundTreeRoots2) {
18765
- const base = strategy.root ? expandTilde2(strategy.root) : dirname23(clone);
18882
+ const base = strategy.root ? expandTilde2(strategy.root) : dirname24(clone);
18766
18883
  const registered = new Set(listWorktreePaths(clone));
18767
18884
  const branches = new Set(listLocalBranches(clone));
18768
18885
  const path71 = nextWorktreePath(
18769
18886
  clone,
18770
18887
  base,
18771
- (candidate) => registered.has(candidate) || existsSync43(candidate) || boundTreeRoots2.has(candidate) || branches.has(basename12(candidate))
18888
+ (candidate) => registered.has(candidate) || existsSync44(candidate) || boundTreeRoots2.has(candidate) || branches.has(basename14(candidate))
18772
18889
  );
18773
18890
  const start3 = worktreeStartPoint(clone, strategy.trunk);
18774
18891
  gitSync(clone, [
@@ -18776,19 +18893,19 @@ function createWorktree(clone, strategy, boundTreeRoots2) {
18776
18893
  "add",
18777
18894
  start3.track ? "--track" : "--no-track",
18778
18895
  "-b",
18779
- basename12(path71),
18896
+ basename14(path71),
18780
18897
  path71,
18781
18898
  start3.ref
18782
18899
  ]);
18783
18900
  recordWorktree(path71, clone, getCurrentOrigin(clone));
18784
18901
  daemonLog(
18785
- start3.track ? `worktree allocated ${path71} (branch ${basename12(path71)} tracking ${start3.ref}) for clone ${clone}` : `worktree allocated ${path71} (branch ${basename12(path71)} off ${start3.ref}, no mainline tracking) for clone ${clone}`
18902
+ start3.track ? `worktree allocated ${path71} (branch ${basename14(path71)} tracking ${start3.ref}) for clone ${clone}` : `worktree allocated ${path71} (branch ${basename14(path71)} off ${start3.ref}, no mainline tracking) for clone ${clone}`
18786
18903
  );
18787
18904
  return path71;
18788
18905
  }
18789
18906
 
18790
18907
  // src/commands/sessions/daemon/worktree/treeDurability.ts
18791
- import { existsSync as existsSync44 } from "fs";
18908
+ import { existsSync as existsSync45 } from "fs";
18792
18909
  function treeDurability(state) {
18793
18910
  if (state.dirty) return { durable: false, reason: "uncommitted changes" };
18794
18911
  if (state.localOnlyCommits)
@@ -18818,14 +18935,14 @@ function* durabilityProbes() {
18818
18935
  });
18819
18936
  }
18820
18937
  async function checkDurability(cwd) {
18821
- if (!existsSync44(cwd)) return { durable: true };
18938
+ if (!existsSync45(cwd)) return { durable: true };
18822
18939
  const probes = durabilityProbes();
18823
18940
  let step2 = probes.next();
18824
18941
  while (!step2.done) step2 = probes.next(await gitResult(cwd, step2.value));
18825
18942
  return step2.value;
18826
18943
  }
18827
18944
  function checkDurabilitySync(cwd) {
18828
- if (!existsSync44(cwd)) return { durable: true };
18945
+ if (!existsSync45(cwd)) return { durable: true };
18829
18946
  const probes = durabilityProbes();
18830
18947
  let step2 = probes.next();
18831
18948
  while (!step2.done) step2 = probes.next(gitSyncResult(cwd, step2.value));
@@ -18987,20 +19104,20 @@ function persistedTreeRoots() {
18987
19104
  }
18988
19105
 
18989
19106
  // src/commands/sessions/daemon/worktree/seedWorktree.ts
18990
- import { copyFileSync, existsSync as existsSync46, mkdirSync as mkdirSync16 } from "fs";
18991
- import { dirname as dirname24, join as join48 } from "path";
19107
+ import { copyFileSync, existsSync as existsSync47, mkdirSync as mkdirSync16 } from "fs";
19108
+ import { dirname as dirname25, join as join49 } from "path";
18992
19109
 
18993
19110
  // src/commands/sessions/daemon/worktree/runInstall.ts
18994
19111
  import { spawn as spawn5 } from "child_process";
18995
19112
 
18996
19113
  // src/commands/sessions/daemon/worktree/resolveInstallCommand.ts
18997
- import { existsSync as existsSync45 } from "fs";
18998
- import { join as join47 } from "path";
19114
+ import { existsSync as existsSync46 } from "fs";
19115
+ import { join as join48 } from "path";
18999
19116
  function detectInstallCommand(repoRoot) {
19000
- if (!existsSync45(join47(repoRoot, "package.json"))) return null;
19001
- if (existsSync45(join47(repoRoot, "pnpm-lock.yaml"))) return "pnpm install";
19002
- if (existsSync45(join47(repoRoot, "yarn.lock"))) return "yarn install";
19003
- if (existsSync45(join47(repoRoot, "bun.lockb"))) return "bun install";
19117
+ if (!existsSync46(join48(repoRoot, "package.json"))) return null;
19118
+ if (existsSync46(join48(repoRoot, "pnpm-lock.yaml"))) return "pnpm install";
19119
+ if (existsSync46(join48(repoRoot, "yarn.lock"))) return "yarn install";
19120
+ if (existsSync46(join48(repoRoot, "bun.lockb"))) return "bun install";
19004
19121
  return "npm install";
19005
19122
  }
19006
19123
  function resolveInstallCommand(repoRoot, install) {
@@ -19102,21 +19219,21 @@ function seedWorktree(worktreePath, clone, onSeeded = () => {
19102
19219
  }
19103
19220
  function copyConfigFiles(worktreePath, clone, copy) {
19104
19221
  for (const rel of copy) {
19105
- const src = join48(clone, rel);
19106
- if (!existsSync46(src)) continue;
19107
- const dest = join48(worktreePath, rel);
19222
+ const src = join49(clone, rel);
19223
+ if (!existsSync47(src)) continue;
19224
+ const dest = join49(worktreePath, rel);
19108
19225
  try {
19109
- mkdirSync16(dirname24(dest), { recursive: true });
19226
+ mkdirSync16(dirname25(dest), { recursive: true });
19110
19227
  copyFileSync(src, dest);
19111
19228
  daemonLog(`worktree ${worktreePath} seeded ${rel}`);
19112
19229
  } catch (error) {
19113
19230
  daemonLog(
19114
- `worktree ${worktreePath} failed to seed ${rel}: ${message(error)}`
19231
+ `worktree ${worktreePath} failed to seed ${rel}: ${message2(error)}`
19115
19232
  );
19116
19233
  }
19117
19234
  }
19118
19235
  }
19119
- function message(error) {
19236
+ function message2(error) {
19120
19237
  return error instanceof Error ? error.message : String(error);
19121
19238
  }
19122
19239
 
@@ -19127,7 +19244,7 @@ function placedByDaemon() {
19127
19244
  function seed(worktreePath, clone) {
19128
19245
  console.log(`Preparing ${worktreePath}\u2026`);
19129
19246
  return new Promise(
19130
- (resolve20) => seedWorktree(worktreePath, clone, resolve20)
19247
+ (resolve21) => seedWorktree(worktreePath, clone, resolve21)
19131
19248
  );
19132
19249
  }
19133
19250
  async function moveToPrCheckoutTree() {
@@ -19175,11 +19292,11 @@ function worktreeHoldingBranch(cwd, branch2) {
19175
19292
  }
19176
19293
 
19177
19294
  // src/commands/review/checkoutPr.ts
19178
- function currentBranch2() {
19295
+ function currentBranch3() {
19179
19296
  return gitSyncOrNull(process.cwd(), ["rev-parse", "--abbrev-ref", "HEAD"]);
19180
19297
  }
19181
19298
  function moveToExistingCheckout(number, headRef) {
19182
- if (currentBranch2() === headRef) {
19299
+ if (currentBranch3() === headRef) {
19183
19300
  console.log(`Already on ${headRef} for PR #${number}; reviewing here.`);
19184
19301
  return true;
19185
19302
  }
@@ -19273,12 +19390,12 @@ function registerList(program2) {
19273
19390
 
19274
19391
  // src/commands/mermaid/index.ts
19275
19392
  import { mkdirSync as mkdirSync17, readdirSync as readdirSync9 } from "fs";
19276
- import { resolve as resolve13 } from "path";
19393
+ import { resolve as resolve14 } from "path";
19277
19394
  import chalk161 from "chalk";
19278
19395
 
19279
19396
  // src/commands/mermaid/exportFile.ts
19280
- import { readFileSync as readFileSync37, writeFileSync as writeFileSync31 } from "fs";
19281
- import { basename as basename13, extname as extname2, resolve as resolve12 } from "path";
19397
+ import { readFileSync as readFileSync38, writeFileSync as writeFileSync31 } from "fs";
19398
+ import { basename as basename15, extname as extname2, resolve as resolve13 } from "path";
19282
19399
  import chalk160 from "chalk";
19283
19400
 
19284
19401
  // src/commands/mermaid/renderBlock.ts
@@ -19303,9 +19420,9 @@ async function renderBlock(krokiUrl, source) {
19303
19420
 
19304
19421
  // src/commands/mermaid/exportFile.ts
19305
19422
  async function exportFile(file, outDir, krokiUrl, onlyIndex) {
19306
- const content = readFileSync37(file, "utf8");
19423
+ const content = readFileSync38(file, "utf8");
19307
19424
  const blocks = extractMermaidBlocks(content);
19308
- const stem = basename13(file, extname2(file));
19425
+ const stem = basename15(file, extname2(file));
19309
19426
  if (onlyIndex !== void 0) {
19310
19427
  if (onlyIndex < 1 || onlyIndex > blocks.length) {
19311
19428
  console.error(
@@ -19326,7 +19443,7 @@ async function exportFile(file, outDir, krokiUrl, onlyIndex) {
19326
19443
  for (const [i, source] of blocks.entries()) {
19327
19444
  const idx = i + 1;
19328
19445
  if (onlyIndex !== void 0 && idx !== onlyIndex) continue;
19329
- const outPath = resolve12(outDir, `${stem}-${idx}.svg`);
19446
+ const outPath = resolve13(outDir, `${stem}-${idx}.svg`);
19330
19447
  const svg = await renderBlock(krokiUrl, source);
19331
19448
  writeFileSync31(outPath, svg, "utf8");
19332
19449
  console.log(chalk160.green(` \u2192 ${outPath}`));
@@ -19340,7 +19457,7 @@ function extractMermaidBlocks(markdown) {
19340
19457
  // src/commands/mermaid/index.ts
19341
19458
  async function mermaidExport(file, options2 = {}) {
19342
19459
  const { mermaid } = loadConfig();
19343
- const outDir = resolve13(process.cwd(), options2.out ?? ".");
19460
+ const outDir = resolve14(process.cwd(), options2.out ?? ".");
19344
19461
  mkdirSync17(outDir, { recursive: true });
19345
19462
  if (options2.index !== void 0) {
19346
19463
  if (!Number.isInteger(options2.index) || options2.index < 1) {
@@ -19388,7 +19505,7 @@ function registerMermaid(program2) {
19388
19505
  // src/commands/netcap/netcap.ts
19389
19506
  import { mkdir as mkdir4 } from "fs/promises";
19390
19507
  import { createServer as createServer2 } from "http";
19391
- import { dirname as dirname26 } from "path";
19508
+ import { dirname as dirname27 } from "path";
19392
19509
  import chalk163 from "chalk";
19393
19510
 
19394
19511
  // src/commands/netcap/corsHeaders.ts
@@ -19467,15 +19584,15 @@ function createNetcapHandler(options2) {
19467
19584
  // src/commands/netcap/prepareExtensionForLoad.ts
19468
19585
  import { cp, readFile as readFile3, writeFile as writeFile3 } from "fs/promises";
19469
19586
  import { networkInterfaces } from "os";
19470
- import { join as join50 } from "path";
19587
+ import { join as join51 } from "path";
19471
19588
  import chalk162 from "chalk";
19472
19589
 
19473
19590
  // src/commands/netcap/netcapExtensionDir.ts
19474
- import { dirname as dirname25, join as join49 } from "path";
19591
+ import { dirname as dirname26, join as join50 } from "path";
19475
19592
  import { fileURLToPath as fileURLToPath6 } from "url";
19476
- var moduleDir = dirname25(fileURLToPath6(import.meta.url));
19593
+ var moduleDir = dirname26(fileURLToPath6(import.meta.url));
19477
19594
  function netcapExtensionDir() {
19478
- return join49(moduleDir, "commands", "netcap", "netcap-extension");
19595
+ return join50(moduleDir, "commands", "netcap", "netcap-extension");
19479
19596
  }
19480
19597
 
19481
19598
  // src/commands/netcap/prepareExtensionForLoad.ts
@@ -19490,7 +19607,7 @@ function lanIPv4() {
19490
19607
  return void 0;
19491
19608
  }
19492
19609
  async function configureBackground(dir, host, port, filter) {
19493
- const file = join50(dir, "background.js");
19610
+ const file = join51(dir, "background.js");
19494
19611
  const source = await readFile3(file, "utf8");
19495
19612
  await writeFile3(
19496
19613
  file,
@@ -19530,20 +19647,20 @@ async function prepareExtensionForLoad(port, filter = "") {
19530
19647
  }
19531
19648
 
19532
19649
  // src/commands/netcap/resolveNetcapOutPath.ts
19533
- import { isAbsolute as isAbsolute2, join as join52, resolve as resolve14 } from "path";
19650
+ import { isAbsolute as isAbsolute3, join as join53, resolve as resolve15 } from "path";
19534
19651
 
19535
19652
  // src/commands/netcap/defaultCapturePath.ts
19536
19653
  import { homedir as homedir19 } from "os";
19537
- import { join as join51 } from "path";
19654
+ import { join as join52 } from "path";
19538
19655
  function defaultCapturePath() {
19539
- return join51(homedir19(), ".assist", "netcap", "capture.jsonl");
19656
+ return join52(homedir19(), ".assist", "netcap", "capture.jsonl");
19540
19657
  }
19541
19658
 
19542
19659
  // src/commands/netcap/resolveNetcapOutPath.ts
19543
19660
  function resolveNetcapOutPath(out) {
19544
19661
  if (!out) return defaultCapturePath();
19545
- const dir = isAbsolute2(out) ? out : resolve14(process.cwd(), out);
19546
- return join52(dir, "capture.jsonl");
19662
+ const dir = isAbsolute3(out) ? out : resolve15(process.cwd(), out);
19663
+ return join53(dir, "capture.jsonl");
19547
19664
  }
19548
19665
 
19549
19666
  // src/commands/netcap/netcap.ts
@@ -19551,7 +19668,7 @@ async function netcap(options2) {
19551
19668
  const port = Number(options2.port);
19552
19669
  const outPath = resolveNetcapOutPath(options2.out);
19553
19670
  const filter = options2.filter ?? "";
19554
- await mkdir4(dirname26(outPath), { recursive: true });
19671
+ await mkdir4(dirname27(outPath), { recursive: true });
19555
19672
  const extensionPath = await prepareExtensionForLoad(port, filter);
19556
19673
  let count8 = 0;
19557
19674
  const handler = createNetcapHandler({
@@ -19590,11 +19707,11 @@ netcap stopped \u2014 captured ${count8} ${count8 === 1 ? "entry" : "entries"} t
19590
19707
 
19591
19708
  // src/commands/netcap/netcapExtract.ts
19592
19709
  import { writeFileSync as writeFileSync32 } from "fs";
19593
- import { join as join53 } from "path";
19710
+ import { join as join54 } from "path";
19594
19711
  import chalk164 from "chalk";
19595
19712
 
19596
19713
  // src/commands/netcap/extractPostsFromCapture.ts
19597
- import { readFileSync as readFileSync38 } from "fs";
19714
+ import { readFileSync as readFileSync39 } from "fs";
19598
19715
 
19599
19716
  // src/commands/netcap/parseRscRows.ts
19600
19717
  var isRscRef = (v) => typeof v === "string" && /^\$[0-9a-fL@]/.test(v);
@@ -19633,25 +19750,25 @@ function isVisibleText(t) {
19633
19750
  return /[a-zA-Z]{3,}/.test(t);
19634
19751
  }
19635
19752
  var isHashtag = (t) => /^#[A-Za-z0-9_]+$/.test(t);
19636
- function collectRscText(v, resolve20, sink2, seen) {
19753
+ function collectRscText(v, resolve21, sink2, seen) {
19637
19754
  if (v == null) return;
19638
19755
  if (typeof v === "string") {
19639
19756
  if (isRscRef(v)) {
19640
19757
  if (!seen.has(v)) {
19641
19758
  seen.add(v);
19642
- collectRscText(resolve20(v), resolve20, sink2, seen);
19759
+ collectRscText(resolve21(v), resolve21, sink2, seen);
19643
19760
  }
19644
19761
  } else if (isHashtag(v)) sink2.hashtags.push(v);
19645
19762
  else if (isVisibleText(v)) sink2.text.push(v);
19646
19763
  return;
19647
19764
  }
19648
19765
  if (Array.isArray(v)) {
19649
- for (const x of v) collectRscText(x, resolve20, sink2, seen);
19766
+ for (const x of v) collectRscText(x, resolve21, sink2, seen);
19650
19767
  return;
19651
19768
  }
19652
19769
  if (typeof v === "object") {
19653
19770
  for (const val of Object.values(v)) {
19654
- collectRscText(val, resolve20, sink2, seen);
19771
+ collectRscText(val, resolve21, sink2, seen);
19655
19772
  }
19656
19773
  }
19657
19774
  }
@@ -19683,7 +19800,7 @@ function visitObjects(root, fn) {
19683
19800
  }
19684
19801
  }
19685
19802
  }
19686
- function buildMentionMap(rows, resolve20) {
19803
+ function buildMentionMap(rows, resolve21) {
19687
19804
  const map = /* @__PURE__ */ new Map();
19688
19805
  visitObjects(rows, (o) => {
19689
19806
  const url = profileActionUrl(o);
@@ -19691,7 +19808,7 @@ function buildMentionMap(rows, resolve20) {
19691
19808
  const slug = slugFromProfileUrl(url);
19692
19809
  if (!slug || map.has(slug)) return;
19693
19810
  const sink2 = { text: [], hashtags: [] };
19694
- collectRscText(o.children, resolve20, sink2, /* @__PURE__ */ new Set());
19811
+ collectRscText(o.children, resolve21, sink2, /* @__PURE__ */ new Set());
19695
19812
  const name = sink2.text.join(" ").replace(/\s+/g, " ").trim();
19696
19813
  map.set(slug, name ? { slug, name, url } : { slug, url });
19697
19814
  });
@@ -19777,10 +19894,10 @@ function buildPost(raw, mentionMap, author) {
19777
19894
 
19778
19895
  // src/commands/netcap/walkPostRow.ts
19779
19896
  var isCommentary = (o) => asObject(o.viewTrackingSpecs)?.viewName === "feed-commentary";
19780
- function walkPostRow(v, resolve20, raw) {
19897
+ function walkPostRow(v, resolve21, raw) {
19781
19898
  if (v == null || typeof v !== "object") return;
19782
19899
  if (Array.isArray(v)) {
19783
- for (const x of v) walkPostRow(x, resolve20, raw);
19900
+ for (const x of v) walkPostRow(x, resolve21, raw);
19784
19901
  return;
19785
19902
  }
19786
19903
  const o = v;
@@ -19794,9 +19911,9 @@ function walkPostRow(v, resolve20, raw) {
19794
19911
  }
19795
19912
  if (isCommentary(o)) {
19796
19913
  const sink2 = { text: raw.text, hashtags: raw.hashtags };
19797
- collectRscText(o.children, resolve20, sink2, /* @__PURE__ */ new Set());
19914
+ collectRscText(o.children, resolve21, sink2, /* @__PURE__ */ new Set());
19798
19915
  }
19799
- for (const val of Object.values(o)) walkPostRow(val, resolve20, raw);
19916
+ for (const val of Object.values(o)) walkPostRow(val, resolve21, raw);
19800
19917
  }
19801
19918
 
19802
19919
  // src/commands/netcap/extractLinkedInPosts.ts
@@ -19810,8 +19927,8 @@ function findCommentaryRows(rows) {
19810
19927
  }
19811
19928
  function extractLinkedInPosts(flight, author = findAuthorSlug(flight)) {
19812
19929
  const rows = parseRscRows(flight);
19813
- const resolve20 = makeRscResolver(rows);
19814
- const mentionMap = buildMentionMap(rows, resolve20);
19930
+ const resolve21 = makeRscResolver(rows);
19931
+ const mentionMap = buildMentionMap(rows, resolve21);
19815
19932
  const posts = [];
19816
19933
  for (const id of findCommentaryRows(rows)) {
19817
19934
  const raw = {
@@ -19821,7 +19938,7 @@ function extractLinkedInPosts(flight, author = findAuthorSlug(flight)) {
19821
19938
  links: [],
19822
19939
  related: []
19823
19940
  };
19824
- walkPostRow(rows[id], resolve20, raw);
19941
+ walkPostRow(rows[id], resolve21, raw);
19825
19942
  const post = buildPost(raw, mentionMap, author);
19826
19943
  if (post) posts.push(post);
19827
19944
  }
@@ -19990,7 +20107,7 @@ function extractVoyagerPosts(body) {
19990
20107
 
19991
20108
  // src/commands/netcap/extractPostsFromCapture.ts
19992
20109
  function captureEntries(captureFile) {
19993
- const lines = readFileSync38(captureFile, "utf8").split("\n").filter(Boolean);
20110
+ const lines = readFileSync39(captureFile, "utf8").split("\n").filter(Boolean);
19994
20111
  const entries = [];
19995
20112
  for (const line of lines) {
19996
20113
  let entry;
@@ -20035,7 +20152,7 @@ function extractPostsFromCapture(captureFile) {
20035
20152
  function netcapExtract(file) {
20036
20153
  const captureFile = file ?? defaultCapturePath();
20037
20154
  const posts = extractPostsFromCapture(captureFile);
20038
- const outFile = join53(captureFile, "..", "posts.json");
20155
+ const outFile = join54(captureFile, "..", "posts.json");
20039
20156
  writeFileSync32(outFile, `${JSON.stringify(posts, null, 2)}
20040
20157
  `);
20041
20158
  console.log(
@@ -20187,7 +20304,7 @@ function registerPrompts(program2) {
20187
20304
  }
20188
20305
 
20189
20306
  // src/commands/prs/shared.ts
20190
- import { execSync as execSync42 } from "child_process";
20307
+ import { execSync as execSync43 } from "child_process";
20191
20308
  function isGhNotInstalled(error) {
20192
20309
  if (error instanceof Error) {
20193
20310
  const msg = error.message.toLowerCase();
@@ -20205,12 +20322,12 @@ function getRepoInfo() {
20205
20322
  const preferred = getPreferredRemoteRepo();
20206
20323
  if (preferred) return preferred;
20207
20324
  const repoInfo = JSON.parse(
20208
- execSync42("gh repo view --json owner,name", { encoding: "utf8" })
20325
+ execSync43("gh repo view --json owner,name", { encoding: "utf8" })
20209
20326
  );
20210
20327
  return { org: repoInfo.owner.login, repo: repoInfo.name };
20211
20328
  }
20212
20329
  function getCurrentBranch2() {
20213
- return execSync42("git rev-parse --abbrev-ref HEAD", {
20330
+ return execSync43("git rev-parse --abbrev-ref HEAD", {
20214
20331
  encoding: "utf8"
20215
20332
  }).trim();
20216
20333
  }
@@ -20218,7 +20335,7 @@ function viewCurrentPr(fields) {
20218
20335
  const { org, repo } = getRepoInfo();
20219
20336
  const branch2 = getCurrentBranch2();
20220
20337
  return JSON.parse(
20221
- execSync42(`gh pr view ${branch2} --json ${fields} -R ${org}/${repo}`, {
20338
+ execSync43(`gh pr view ${branch2} --json ${fields} -R ${org}/${repo}`, {
20222
20339
  encoding: "utf8"
20223
20340
  })
20224
20341
  );
@@ -20520,23 +20637,23 @@ function edit(options2) {
20520
20637
  }
20521
20638
 
20522
20639
  // src/commands/prs/fixed.ts
20523
- import { execSync as execSync45 } from "child_process";
20640
+ import { execSync as execSync46 } from "child_process";
20524
20641
 
20525
20642
  // src/commands/prs/resolveCommentWithReply.ts
20526
- import { execSync as execSync44 } from "child_process";
20643
+ import { execSync as execSync45 } from "child_process";
20527
20644
  import { unlinkSync as unlinkSync14, writeFileSync as writeFileSync33 } from "fs";
20528
20645
  import { tmpdir as tmpdir6 } from "os";
20529
- import { join as join55 } from "path";
20646
+ import { join as join56 } from "path";
20530
20647
 
20531
20648
  // src/commands/prs/loadCommentsCache.ts
20532
- import { existsSync as existsSync47, readFileSync as readFileSync39, unlinkSync as unlinkSync13 } from "fs";
20649
+ import { existsSync as existsSync48, readFileSync as readFileSync40, unlinkSync as unlinkSync13 } from "fs";
20533
20650
  import { parse as parse2 } from "yaml";
20534
20651
 
20535
20652
  // src/commands/prs/commentsCachePath.ts
20536
20653
  import { homedir as homedir20 } from "os";
20537
- import { join as join54 } from "path";
20654
+ import { join as join55 } from "path";
20538
20655
  function commentsCachePath(org, repo, prNumber) {
20539
- return join54(
20656
+ return join55(
20540
20657
  homedir20(),
20541
20658
  ".assist",
20542
20659
  "pr-comments",
@@ -20549,25 +20666,25 @@ function commentsCachePath(org, repo, prNumber) {
20549
20666
  // src/commands/prs/loadCommentsCache.ts
20550
20667
  function loadCommentsCache(org, repo, prNumber) {
20551
20668
  const cachePath = commentsCachePath(org, repo, prNumber);
20552
- if (!existsSync47(cachePath)) {
20669
+ if (!existsSync48(cachePath)) {
20553
20670
  return null;
20554
20671
  }
20555
- const content = readFileSync39(cachePath, "utf8");
20672
+ const content = readFileSync40(cachePath, "utf8");
20556
20673
  return parse2(content);
20557
20674
  }
20558
20675
  function deleteCommentsCache(org, repo, prNumber) {
20559
20676
  const cachePath = commentsCachePath(org, repo, prNumber);
20560
- if (existsSync47(cachePath)) {
20677
+ if (existsSync48(cachePath)) {
20561
20678
  unlinkSync13(cachePath);
20562
20679
  console.log("No more unresolved line comments. Cache dropped.");
20563
20680
  }
20564
20681
  }
20565
20682
 
20566
20683
  // src/commands/prs/replyToComment.ts
20567
- import { execSync as execSync43 } from "child_process";
20568
- function replyToComment(org, repo, prNumber, commentId, message2) {
20569
- execSync43(
20570
- `gh api repos/${org}/${repo}/pulls/${prNumber}/comments -f body="${message2.replace(/"/g, String.raw`\"`)}" -F in_reply_to=${commentId}`,
20684
+ import { execSync as execSync44 } from "child_process";
20685
+ function replyToComment(org, repo, prNumber, commentId, message3) {
20686
+ execSync44(
20687
+ `gh api repos/${org}/${repo}/pulls/${prNumber}/comments -f body="${message3.replace(/"/g, String.raw`\"`)}" -F in_reply_to=${commentId}`,
20571
20688
  { stdio: ["inherit", "pipe", "inherit"] }
20572
20689
  );
20573
20690
  }
@@ -20575,10 +20692,10 @@ function replyToComment(org, repo, prNumber, commentId, message2) {
20575
20692
  // src/commands/prs/resolveCommentWithReply.ts
20576
20693
  function resolveThread(threadId) {
20577
20694
  const mutation = `mutation($threadId: ID!) { resolveReviewThread(input: {threadId: $threadId}) { thread { isResolved } } }`;
20578
- const queryFile = join55(tmpdir6(), `gh-mutation-${Date.now()}.graphql`);
20695
+ const queryFile = join56(tmpdir6(), `gh-mutation-${Date.now()}.graphql`);
20579
20696
  writeFileSync33(queryFile, mutation);
20580
20697
  try {
20581
- execSync44(
20698
+ execSync45(
20582
20699
  `gh api graphql -F query=@${queryFile} -f threadId="${threadId}"`,
20583
20700
  { stdio: ["inherit", "pipe", "inherit"] }
20584
20701
  );
@@ -20615,12 +20732,12 @@ function cleanupCacheIfDone(cache4, org, repo, prNumber, commentId) {
20615
20732
  );
20616
20733
  if (!hasRemaining) deleteCommentsCache(org, repo, prNumber);
20617
20734
  }
20618
- function resolveCommentWithReply(commentId, message2) {
20735
+ function resolveCommentWithReply(commentId, message3) {
20619
20736
  const prNumber = getCurrentPrNumber();
20620
20737
  const { org, repo } = getRepoInfo();
20621
20738
  const cache4 = requireCache(org, repo, prNumber);
20622
20739
  const comment3 = requireLineComment(cache4, commentId);
20623
- replyToComment(org, repo, prNumber, commentId, message2);
20740
+ replyToComment(org, repo, prNumber, commentId, message3);
20624
20741
  console.log("Reply posted successfully.");
20625
20742
  resolveThread(comment3.threadId);
20626
20743
  console.log("Thread resolved successfully.");
@@ -20630,7 +20747,7 @@ function resolveCommentWithReply(commentId, message2) {
20630
20747
  // src/commands/prs/fixed.ts
20631
20748
  function verifySha(sha) {
20632
20749
  try {
20633
- return execSync45(`git rev-parse --verify ${sha}`, {
20750
+ return execSync46(`git rev-parse --verify ${sha}`, {
20634
20751
  encoding: "utf8"
20635
20752
  }).trim();
20636
20753
  } catch {
@@ -20643,9 +20760,9 @@ function fixed(commentId, sha) {
20643
20760
  const fullSha = verifySha(sha);
20644
20761
  const { org, repo } = getRepoInfo();
20645
20762
  const repoUrl = `https://github.com/${org}/${repo}`;
20646
- const message2 = `Fixed in [${fullSha}](${repoUrl}/commit/${fullSha})`;
20763
+ const message3 = `Fixed in [${fullSha}](${repoUrl}/commit/${fullSha})`;
20647
20764
  pushCommit(loadConfig().worktree?.trunk === true);
20648
- resolveCommentWithReply(commentId, message2);
20765
+ resolveCommentWithReply(commentId, message3);
20649
20766
  } catch (error) {
20650
20767
  if (isGhNotInstalled(error)) {
20651
20768
  console.error("Error: GitHub CLI (gh) is not installed.");
@@ -20657,16 +20774,16 @@ function fixed(commentId, sha) {
20657
20774
  }
20658
20775
 
20659
20776
  // src/commands/prs/fetchThreadIds.ts
20660
- import { execSync as execSync46 } from "child_process";
20777
+ import { execSync as execSync47 } from "child_process";
20661
20778
  import { unlinkSync as unlinkSync15, writeFileSync as writeFileSync34 } from "fs";
20662
20779
  import { tmpdir as tmpdir7 } from "os";
20663
- import { join as join56 } from "path";
20780
+ import { join as join57 } from "path";
20664
20781
  var THREAD_QUERY = `query($owner: String!, $repo: String!, $prNumber: Int!) { repository(owner: $owner, name: $repo) { pullRequest(number: $prNumber) { reviewThreads(first: 100) { nodes { id isResolved comments(first: 100) { nodes { databaseId } } } } } } }`;
20665
20782
  function fetchThreadIds(org, repo, prNumber) {
20666
- const queryFile = join56(tmpdir7(), `gh-query-${Date.now()}.graphql`);
20783
+ const queryFile = join57(tmpdir7(), `gh-query-${Date.now()}.graphql`);
20667
20784
  writeFileSync34(queryFile, THREAD_QUERY);
20668
20785
  try {
20669
- const result = execSync46(
20786
+ const result = execSync47(
20670
20787
  `gh api graphql -F query=@${queryFile} -F owner="${org}" -F repo="${repo}" -F prNumber=${prNumber}`,
20671
20788
  { encoding: "utf8" }
20672
20789
  );
@@ -20688,9 +20805,9 @@ function fetchThreadIds(org, repo, prNumber) {
20688
20805
  }
20689
20806
 
20690
20807
  // src/commands/prs/listComments/fetchReviewComments.ts
20691
- import { execSync as execSync47 } from "child_process";
20808
+ import { execSync as execSync48 } from "child_process";
20692
20809
  function fetchJson(endpoint) {
20693
- const result = execSync47(`gh api --paginate ${endpoint}`, {
20810
+ const result = execSync48(`gh api --paginate ${endpoint}`, {
20694
20811
  encoding: "utf8"
20695
20812
  });
20696
20813
  if (!result.trim()) return [];
@@ -20733,11 +20850,11 @@ function fetchLineComments(org, repo, prNumber, threadInfo) {
20733
20850
 
20734
20851
  // src/commands/prs/listComments/updateCommentsCache.ts
20735
20852
  import { mkdirSync as mkdirSync18, writeFileSync as writeFileSync35 } from "fs";
20736
- import { dirname as dirname27 } from "path";
20853
+ import { dirname as dirname28 } from "path";
20737
20854
  import { stringify } from "yaml";
20738
20855
  function writeCommentsCache(org, repo, prNumber, comments3) {
20739
20856
  const cachePath = commentsCachePath(org, repo, prNumber);
20740
- mkdirSync18(dirname27(cachePath), { recursive: true });
20857
+ mkdirSync18(dirname28(cachePath), { recursive: true });
20741
20858
  const cacheData = {
20742
20859
  prNumber,
20743
20860
  fetchedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -20831,7 +20948,7 @@ async function listComments() {
20831
20948
  }
20832
20949
 
20833
20950
  // src/commands/prs/prs/index.ts
20834
- import { execSync as execSync48 } from "child_process";
20951
+ import { execSync as execSync49 } from "child_process";
20835
20952
 
20836
20953
  // src/commands/prs/prs/displayPaginated/index.ts
20837
20954
  import enquirer9 from "enquirer";
@@ -20938,7 +21055,7 @@ async function prs(options2) {
20938
21055
  const state = options2.open ? "open" : options2.closed ? "closed" : "all";
20939
21056
  try {
20940
21057
  const { org, repo } = getRepoInfo();
20941
- const result = execSync48(
21058
+ const result = execSync49(
20942
21059
  `gh pr list --state ${state} --json number,title,url,author,createdAt,mergedAt,closedAt,state,changedFiles --limit 100 -R ${org}/${repo}`,
20943
21060
  { encoding: "utf8" }
20944
21061
  );
@@ -21009,16 +21126,16 @@ function buildCreateArgs(title, body, options2) {
21009
21126
  }
21010
21127
 
21011
21128
  // src/commands/prs/readSessionPrRef.ts
21012
- import { execSync as execSync49 } from "child_process";
21129
+ import { execSync as execSync50 } from "child_process";
21013
21130
  function readSessionPrRef() {
21014
21131
  try {
21015
- const branch2 = execSync49("git rev-parse --abbrev-ref HEAD", {
21132
+ const branch2 = execSync50("git rev-parse --abbrev-ref HEAD", {
21016
21133
  encoding: "utf8",
21017
21134
  stdio: ["pipe", "pipe", "pipe"]
21018
21135
  }).trim();
21019
21136
  if (!branch2 || branch2 === "HEAD") return null;
21020
21137
  const pr = JSON.parse(
21021
- execSync49(`gh pr view ${branch2} --json number,title,url,state`, {
21138
+ execSync50(`gh pr view ${branch2} --json number,title,url,state`, {
21022
21139
  encoding: "utf8",
21023
21140
  stdio: ["pipe", "pipe", "pipe"]
21024
21141
  })
@@ -21146,7 +21263,7 @@ function reply(commentId, body) {
21146
21263
  }
21147
21264
 
21148
21265
  // src/commands/prs/wontfix.ts
21149
- import { execSync as execSync50 } from "child_process";
21266
+ import { execSync as execSync51 } from "child_process";
21150
21267
  function validateReason(reason4) {
21151
21268
  const lowerReason = reason4.toLowerCase();
21152
21269
  if (lowerReason.includes("claude") || lowerReason.includes("opus")) {
@@ -21163,7 +21280,7 @@ function validateShaReferences(reason4) {
21163
21280
  const invalidShas = [];
21164
21281
  for (const sha of shas) {
21165
21282
  try {
21166
- execSync50(`git cat-file -t ${sha}`, { stdio: "pipe" });
21283
+ execSync51(`git cat-file -t ${sha}`, { stdio: "pipe" });
21167
21284
  } catch {
21168
21285
  invalidShas.push(sha);
21169
21286
  }
@@ -21440,10 +21557,10 @@ import chalk171 from "chalk";
21440
21557
  import Enquirer2 from "enquirer";
21441
21558
 
21442
21559
  // src/commands/ravendb/searchItems.ts
21443
- import { execSync as execSync51 } from "child_process";
21560
+ import { execSync as execSync52 } from "child_process";
21444
21561
  import chalk170 from "chalk";
21445
21562
  function opExec(args) {
21446
- return execSync51(`op ${args}`, {
21563
+ return execSync52(`op ${args}`, {
21447
21564
  encoding: "utf8",
21448
21565
  stdio: ["pipe", "pipe", "pipe"]
21449
21566
  }).trim();
@@ -21475,9 +21592,9 @@ function getItemFields(itemId2) {
21475
21592
 
21476
21593
  // src/commands/ravendb/selectOpSecret.ts
21477
21594
  var { Input, Select } = Enquirer2;
21478
- async function selectOne(message2, choices) {
21595
+ async function selectOne(message3, choices) {
21479
21596
  if (choices.length === 1) return choices[0].value;
21480
- const selected = await new Select({ name: "choice", message: message2, choices }).run();
21597
+ const selected = await new Select({ name: "choice", message: message3, choices }).run();
21481
21598
  return choices.find((c) => c.name === selected)?.value ?? selected;
21482
21599
  }
21483
21600
  async function selectOpSecret(searchTerm) {
@@ -21595,7 +21712,7 @@ ${errorText}`
21595
21712
  }
21596
21713
 
21597
21714
  // src/commands/ravendb/resolveOpSecret.ts
21598
- import { execSync as execSync52 } from "child_process";
21715
+ import { execSync as execSync53 } from "child_process";
21599
21716
  import chalk175 from "chalk";
21600
21717
  function resolveOpSecret(reference) {
21601
21718
  if (!reference.startsWith("op://")) {
@@ -21603,7 +21720,7 @@ function resolveOpSecret(reference) {
21603
21720
  process.exit(1);
21604
21721
  }
21605
21722
  try {
21606
- return execSync52(`op read "${reference}"`, {
21723
+ return execSync53(`op read "${reference}"`, {
21607
21724
  encoding: "utf8",
21608
21725
  stdio: ["pipe", "pipe", "pipe"]
21609
21726
  }).trim();
@@ -21867,7 +21984,7 @@ Refactor check failed:
21867
21984
  }
21868
21985
 
21869
21986
  // src/commands/refactor/check/getViolations/index.ts
21870
- import { execSync as execSync53 } from "child_process";
21987
+ import { execSync as execSync54 } from "child_process";
21871
21988
  import fs25 from "fs";
21872
21989
  import { minimatch as minimatch6 } from "minimatch";
21873
21990
 
@@ -21917,7 +22034,7 @@ function getGitFiles(options2) {
21917
22034
  }
21918
22035
  const files = /* @__PURE__ */ new Set();
21919
22036
  if (options2.staged || options2.modified) {
21920
- const staged = execSync53("git diff --cached --name-only", {
22037
+ const staged = execSync54("git diff --cached --name-only", {
21921
22038
  encoding: "utf8"
21922
22039
  });
21923
22040
  for (const file of staged.trim().split("\n").filter(Boolean)) {
@@ -21925,7 +22042,7 @@ function getGitFiles(options2) {
21925
22042
  }
21926
22043
  }
21927
22044
  if (options2.unstaged || options2.modified) {
21928
- const unstaged = execSync53("git diff --name-only", { encoding: "utf8" });
22045
+ const unstaged = execSync54("git diff --name-only", { encoding: "utf8" });
21929
22046
  for (const file of unstaged.trim().split("\n").filter(Boolean)) {
21930
22047
  files.add(file);
21931
22048
  }
@@ -21955,7 +22072,7 @@ function getViolations(pattern2, options2 = {}, maxLines = DEFAULT_MAX_LINES) {
21955
22072
 
21956
22073
  // src/commands/refactor/check/index.ts
21957
22074
  function runScript(script, cwd) {
21958
- return new Promise((resolve20) => {
22075
+ return new Promise((resolve21) => {
21959
22076
  const child = spawn6("npm", ["run", script], {
21960
22077
  stdio: "pipe",
21961
22078
  shell: true,
@@ -21969,7 +22086,7 @@ function runScript(script, cwd) {
21969
22086
  output += data.toString();
21970
22087
  });
21971
22088
  child.on("close", (code) => {
21972
- resolve20({ script, code: code ?? 1, output });
22089
+ resolve21({ script, code: code ?? 1, output });
21973
22090
  });
21974
22091
  });
21975
22092
  }
@@ -22541,9 +22658,9 @@ function rewriteImportPaths(imports, sourcePath, destPath) {
22541
22658
  const destDir = path39.dirname(destPath);
22542
22659
  return imports.map((imp) => {
22543
22660
  if (!imp.moduleSpecifier.startsWith(".")) return imp;
22544
- const absolute = path39.resolve(sourceDir, imp.moduleSpecifier);
22545
- let rel = path39.relative(destDir, absolute).replace(/\\/g, "/");
22546
- if (rel === "") rel = `../${path39.basename(absolute)}`;
22661
+ const absolute2 = path39.resolve(sourceDir, imp.moduleSpecifier);
22662
+ let rel = path39.relative(destDir, absolute2).replace(/\\/g, "/");
22663
+ if (rel === "") rel = `../${path39.basename(absolute2)}`;
22547
22664
  else if (!rel.startsWith(".")) rel = `./${rel}`;
22548
22665
  return { ...imp, moduleSpecifier: rel };
22549
22666
  });
@@ -23192,8 +23309,8 @@ function findRootParent(file, importedBy, visited) {
23192
23309
  function clusterFiles(graph) {
23193
23310
  const clusters = /* @__PURE__ */ new Map();
23194
23311
  for (const file of graph.files) {
23195
- const basename19 = path52.basename(file, path52.extname(file));
23196
- if (basename19 === "index") continue;
23312
+ const basename21 = path52.basename(file, path52.extname(file));
23313
+ if (basename21 === "index") continue;
23197
23314
  const importers = graph.importedBy.get(file);
23198
23315
  if (!importers || importers.size !== 1) continue;
23199
23316
  const parent = [...importers][0];
@@ -23613,28 +23730,28 @@ ${annotateDiffWithLineNumbers(context.diff.trimEnd())}
23613
23730
 
23614
23731
  // src/commands/review/buildReviewPaths.ts
23615
23732
  import { homedir as homedir21 } from "os";
23616
- import { basename as basename14, join as join57 } from "path";
23733
+ import { basename as basename16, join as join58 } from "path";
23617
23734
  function buildReviewPaths(repoRoot, key) {
23618
- const reviewDir = join57(
23735
+ const reviewDir = join58(
23619
23736
  homedir21(),
23620
23737
  ".assist",
23621
23738
  "reviews",
23622
- basename14(repoRoot),
23739
+ basename16(repoRoot),
23623
23740
  key
23624
23741
  );
23625
23742
  return {
23626
23743
  reviewDir,
23627
- requestPath: join57(reviewDir, "request.md"),
23628
- claudePath: join57(reviewDir, "claude.md"),
23629
- codexPath: join57(reviewDir, "codex.md"),
23630
- synthesisPath: join57(reviewDir, "synthesis.md")
23744
+ requestPath: join58(reviewDir, "request.md"),
23745
+ claudePath: join58(reviewDir, "claude.md"),
23746
+ codexPath: join58(reviewDir, "codex.md"),
23747
+ synthesisPath: join58(reviewDir, "synthesis.md")
23631
23748
  };
23632
23749
  }
23633
23750
 
23634
23751
  // src/commands/review/fetchExistingComments.ts
23635
- import { execSync as execSync54 } from "child_process";
23752
+ import { execSync as execSync55 } from "child_process";
23636
23753
  function fetchRawComments(org, repo, prNumber) {
23637
- const out = execSync54(
23754
+ const out = execSync55(
23638
23755
  `gh api --paginate repos/${org}/${repo}/pulls/${prNumber}/comments`,
23639
23756
  { encoding: "utf8", maxBuffer: 64 * 1024 * 1024 }
23640
23757
  );
@@ -23665,14 +23782,14 @@ function fetchExistingComments() {
23665
23782
  }
23666
23783
 
23667
23784
  // src/commands/review/gatherContext.ts
23668
- import { execSync as execSync57 } from "child_process";
23785
+ import { execSync as execSync58 } from "child_process";
23669
23786
 
23670
23787
  // src/commands/review/fetchPrDiff.ts
23671
- import { execSync as execSync55 } from "child_process";
23788
+ import { execSync as execSync56 } from "child_process";
23672
23789
  function fetchPrDiff(prNumber, baseSha, headSha) {
23673
23790
  const { org, repo } = getRepoInfo();
23674
23791
  try {
23675
- return execSync55(`gh pr diff ${prNumber} -R ${org}/${repo}`, {
23792
+ return execSync56(`gh pr diff ${prNumber} -R ${org}/${repo}`, {
23676
23793
  encoding: "utf8",
23677
23794
  maxBuffer: 256 * 1024 * 1024,
23678
23795
  stdio: ["ignore", "pipe", "pipe"]
@@ -23687,19 +23804,19 @@ function isDiffTooLarge(error) {
23687
23804
  }
23688
23805
  function fetchDiffViaGit(baseSha, headSha) {
23689
23806
  try {
23690
- execSync55(`git fetch origin ${baseSha} ${headSha}`, { stdio: "ignore" });
23807
+ execSync56(`git fetch origin ${baseSha} ${headSha}`, { stdio: "ignore" });
23691
23808
  } catch {
23692
23809
  }
23693
- return execSync55(`git diff ${baseSha}...${headSha}`, {
23810
+ return execSync56(`git diff ${baseSha}...${headSha}`, {
23694
23811
  encoding: "utf8",
23695
23812
  maxBuffer: 256 * 1024 * 1024
23696
23813
  });
23697
23814
  }
23698
23815
 
23699
23816
  // src/commands/review/fetchPrDiffInfo.ts
23700
- import { execSync as execSync56 } from "child_process";
23817
+ import { execSync as execSync57 } from "child_process";
23701
23818
  function getCurrentBranch3() {
23702
- return execSync56("git rev-parse --abbrev-ref HEAD", {
23819
+ return execSync57("git rev-parse --abbrev-ref HEAD", {
23703
23820
  encoding: "utf8"
23704
23821
  }).trim();
23705
23822
  }
@@ -23707,7 +23824,7 @@ function fetchPrDiffInfo() {
23707
23824
  const { org, repo } = getRepoInfo();
23708
23825
  const branch2 = getCurrentBranch3();
23709
23826
  const fields = "number,baseRefName,baseRefOid,headRefName,headRefOid";
23710
- const raw = execSync56(
23827
+ const raw = execSync57(
23711
23828
  `gh pr list --state open --head ${branch2} --json ${fields} -R ${org}/${repo}`,
23712
23829
  {
23713
23830
  encoding: "utf8",
@@ -23732,7 +23849,7 @@ function fetchPrDiffInfo() {
23732
23849
  }
23733
23850
  function fetchPrChangedFiles(prNumber) {
23734
23851
  const { org, repo } = getRepoInfo();
23735
- const out = execSync56(
23852
+ const out = execSync57(
23736
23853
  `gh api repos/${org}/${repo}/pulls/${prNumber}/files --paginate --jq ".[].filename"`,
23737
23854
  {
23738
23855
  encoding: "utf8",
@@ -23744,11 +23861,11 @@ function fetchPrChangedFiles(prNumber) {
23744
23861
 
23745
23862
  // src/commands/review/gatherContext.ts
23746
23863
  function gatherContext() {
23747
- const branch2 = execSync57("git rev-parse --abbrev-ref HEAD", {
23864
+ const branch2 = execSync58("git rev-parse --abbrev-ref HEAD", {
23748
23865
  encoding: "utf8"
23749
23866
  }).trim();
23750
- const sha = execSync57("git rev-parse HEAD", { encoding: "utf8" }).trim();
23751
- const shortSha = execSync57("git rev-parse --short=7 HEAD", {
23867
+ const sha = execSync58("git rev-parse HEAD", { encoding: "utf8" }).trim();
23868
+ const shortSha = execSync58("git rev-parse --short=7 HEAD", {
23752
23869
  encoding: "utf8"
23753
23870
  }).trim();
23754
23871
  const prInfo = fetchPrDiffInfo();
@@ -23769,7 +23886,7 @@ function gatherContext() {
23769
23886
  }
23770
23887
 
23771
23888
  // src/commands/review/postReviewToPr.ts
23772
- import { readFileSync as readFileSync40 } from "fs";
23889
+ import { readFileSync as readFileSync41 } from "fs";
23773
23890
 
23774
23891
  // src/commands/review/parseFindings.ts
23775
23892
  var SEVERITIES = ["blocker", "major", "minor", "nit"];
@@ -23924,9 +24041,9 @@ function postFindings(findings) {
23924
24041
  posted++;
23925
24042
  } catch (error) {
23926
24043
  failed2++;
23927
- const message2 = error instanceof Error ? error.message : String(error);
24044
+ const message3 = error instanceof Error ? error.message : String(error);
23928
24045
  console.error(
23929
- `Failed to post comment on ${finding.file}:${finding.line}: ${message2}`
24046
+ `Failed to post comment on ${finding.file}:${finding.line}: ${message3}`
23930
24047
  );
23931
24048
  }
23932
24049
  }
@@ -23945,8 +24062,8 @@ function submitPendingReview(body) {
23945
24062
  console.error("Error: GitHub CLI (gh) is not installed.");
23946
24063
  return;
23947
24064
  }
23948
- const message2 = error instanceof Error ? error.message : String(error);
23949
- console.error(`Failed to submit review: ${message2}`);
24065
+ const message3 = error instanceof Error ? error.message : String(error);
24066
+ console.error(`Failed to submit review: ${message3}`);
23950
24067
  }
23951
24068
  }
23952
24069
 
@@ -24084,7 +24201,7 @@ async function confirmPost(prNumber, count8, options2) {
24084
24201
  async function postReviewToPr(synthesisPath, options2) {
24085
24202
  const prInfo = fetchPrDiffInfo();
24086
24203
  const prNumber = prInfo.prNumber;
24087
- const markdown = readFileSync40(synthesisPath, "utf8");
24204
+ const markdown = readFileSync41(synthesisPath, "utf8");
24088
24205
  const findings = parseFindings(markdown);
24089
24206
  if (findings.length === 0) {
24090
24207
  console.log("Synthesis contains no findings; nothing to post.");
@@ -24166,10 +24283,10 @@ async function handlePostSynthesis(synthesisPath, options2) {
24166
24283
  }
24167
24284
 
24168
24285
  // src/commands/review/prepareReviewDir.ts
24169
- import { existsSync as existsSync48, mkdirSync as mkdirSync19, unlinkSync as unlinkSync16, writeFileSync as writeFileSync36 } from "fs";
24286
+ import { existsSync as existsSync49, mkdirSync as mkdirSync19, unlinkSync as unlinkSync16, writeFileSync as writeFileSync36 } from "fs";
24170
24287
  function clearReviewFiles(paths) {
24171
24288
  for (const path71 of [paths.claudePath, paths.codexPath, paths.synthesisPath]) {
24172
- if (existsSync48(path71)) unlinkSync16(path71);
24289
+ if (existsSync49(path71)) unlinkSync16(path71);
24173
24290
  }
24174
24291
  }
24175
24292
  function prepareReviewDir(paths, requestBody, force) {
@@ -24237,11 +24354,11 @@ async function runBacklogSession(synthesisPath) {
24237
24354
  }
24238
24355
 
24239
24356
  // src/commands/review/cachedReviewerResult.ts
24240
- import { statSync as statSync7 } from "fs";
24357
+ import { statSync as statSync8 } from "fs";
24241
24358
  function cachedReviewerResult(name, outputPath) {
24242
24359
  let size;
24243
24360
  try {
24244
- size = statSync7(outputPath).size;
24361
+ size = statSync8(outputPath).size;
24245
24362
  } catch {
24246
24363
  return null;
24247
24364
  }
@@ -24454,7 +24571,7 @@ function printReviewerFailures(results) {
24454
24571
  }
24455
24572
 
24456
24573
  // src/commands/review/runAndSynthesise.ts
24457
- import { existsSync as existsSync50, unlinkSync as unlinkSync18 } from "fs";
24574
+ import { existsSync as existsSync51, unlinkSync as unlinkSync18 } from "fs";
24458
24575
 
24459
24576
  // src/commands/review/buildReviewerStdin.ts
24460
24577
  var REVIEW_PROMPT = `You are acting as a reviewer for a proposed code change made by another engineer. The full review request \u2014 branch, base, changed files, and unified diff \u2014 is in the request file whose absolute path is given below.
@@ -24737,10 +24854,10 @@ function messageFor(err, command) {
24737
24854
  return err.message || String(err);
24738
24855
  }
24739
24856
  function handleSpawnError(ctx, err) {
24740
- const message2 = messageFor(err, ctx.command);
24857
+ const message3 = messageFor(err, ctx.command);
24741
24858
  const stderr = ctx.stderr ? `${ctx.stderr}
24742
- ${message2}` : message2;
24743
- if (!ctx.quiet) console.error(`[${ctx.name}] failed: ${message2}`);
24859
+ ${message3}` : message3;
24860
+ if (!ctx.quiet) console.error(`[${ctx.name}] failed: ${message3}`);
24744
24861
  return {
24745
24862
  exitCode: 127,
24746
24863
  stderr,
@@ -24778,12 +24895,12 @@ function onCloseResult(ctx, code) {
24778
24895
  return { ...closed, stderr: ctx.stderr.value, stdout: ctx.stdout.value };
24779
24896
  }
24780
24897
  function waitForChildExit(ctx) {
24781
- return new Promise((resolve20) => {
24898
+ return new Promise((resolve21) => {
24782
24899
  let settled = false;
24783
24900
  const settle = (result) => {
24784
24901
  if (settled) return;
24785
24902
  settled = true;
24786
- resolve20(result);
24903
+ resolve21(result);
24787
24904
  };
24788
24905
  ctx.child.on("error", (err) => settle(onErrorResult(ctx, err)));
24789
24906
  ctx.child.on("close", (code) => settle(onCloseResult(ctx, code)));
@@ -24874,7 +24991,7 @@ function resolveClaude(args) {
24874
24991
  }
24875
24992
 
24876
24993
  // src/commands/review/runCodexReviewer.ts
24877
- import { existsSync as existsSync49, unlinkSync as unlinkSync17 } from "fs";
24994
+ import { existsSync as existsSync50, unlinkSync as unlinkSync17 } from "fs";
24878
24995
 
24879
24996
  // src/commands/review/parseCodexEvent.ts
24880
24997
  function isItemStarted(value) {
@@ -24926,7 +25043,7 @@ async function runCodexReviewer(spec) {
24926
25043
  reportReviewerToolUse(spec.name, event, spinner);
24927
25044
  }
24928
25045
  });
24929
- if (result.exitCode !== 0 && existsSync49(spec.outputPath)) {
25046
+ if (result.exitCode !== 0 && existsSync50(spec.outputPath)) {
24930
25047
  unlinkSync17(spec.outputPath);
24931
25048
  }
24932
25049
  return finaliseReviewerRun({ ...spec, command }, spinner, result);
@@ -24968,7 +25085,7 @@ async function runReviewers(reviewDir, claudePath, codexPath, stdinPrompt, optio
24968
25085
  }
24969
25086
 
24970
25087
  // src/commands/review/synthesise.ts
24971
- import { readFileSync as readFileSync41 } from "fs";
25088
+ import { readFileSync as readFileSync42 } from "fs";
24972
25089
 
24973
25090
  // src/commands/review/buildSynthesisStdin.ts
24974
25091
  var SYNTHESIS_PROMPT = `You are consolidating two independent code reviews of the same change. The original review request is in request.md. The two reviews are in claude.md and codex.md in the current working directory.
@@ -25024,7 +25141,7 @@ Files:
25024
25141
 
25025
25142
  // src/commands/review/synthesise.ts
25026
25143
  function printSummary2(synthesisPath) {
25027
- const markdown = readFileSync41(synthesisPath, "utf8");
25144
+ const markdown = readFileSync42(synthesisPath, "utf8");
25028
25145
  console.log("");
25029
25146
  console.log(buildReviewSummary(markdown));
25030
25147
  console.log("");
@@ -25072,7 +25189,7 @@ async function runAndSynthesise(args) {
25072
25189
  console.error("Both reviewers failed; skipping synthesis.");
25073
25190
  return { ok: false, failures };
25074
25191
  }
25075
- if (anyFresh && existsSync50(paths.synthesisPath)) {
25192
+ if (anyFresh && existsSync51(paths.synthesisPath)) {
25076
25193
  unlinkSync18(paths.synthesisPath);
25077
25194
  }
25078
25195
  const synthesisResult = await synthesise(paths, { multi });
@@ -25883,9 +26000,9 @@ function createReadlineInterface() {
25883
26000
  });
25884
26001
  }
25885
26002
  function askQuestion(rl, question) {
25886
- return new Promise((resolve20) => {
26003
+ return new Promise((resolve21) => {
25887
26004
  rl.question(question, (answer) => {
25888
- resolve20(answer.trim());
26005
+ resolve21(answer.trim());
25889
26006
  });
25890
26007
  });
25891
26008
  }
@@ -25945,27 +26062,27 @@ async function configure() {
25945
26062
  }
25946
26063
 
25947
26064
  // src/commands/transcript/list.ts
25948
- import { existsSync as existsSync51, readdirSync as readdirSync10, statSync as statSync8 } from "fs";
25949
- import { join as join58 } from "path";
26065
+ import { existsSync as existsSync52, readdirSync as readdirSync10, statSync as statSync9 } from "fs";
26066
+ import { join as join59 } from "path";
25950
26067
  function list4() {
25951
26068
  const { vttDir } = getTranscriptConfig();
25952
- if (!existsSync51(vttDir)) return;
26069
+ if (!existsSync52(vttDir)) return;
25953
26070
  for (const entry of readdirSync10(vttDir)) {
25954
26071
  if (!entry.endsWith(".vtt")) continue;
25955
- if (statSync8(join58(vttDir, entry)).isDirectory()) continue;
26072
+ if (statSync9(join59(vttDir, entry)).isDirectory()) continue;
25956
26073
  console.log(entry);
25957
26074
  }
25958
26075
  }
25959
26076
 
25960
26077
  // src/commands/transcript/move.ts
25961
26078
  import {
25962
- existsSync as existsSync52,
26079
+ existsSync as existsSync53,
25963
26080
  mkdirSync as mkdirSync20,
25964
- readFileSync as readFileSync42,
26081
+ readFileSync as readFileSync43,
25965
26082
  renameSync as renameSync2,
25966
26083
  writeFileSync as writeFileSync38
25967
26084
  } from "fs";
25968
- import { basename as basename15, join as join59 } from "path";
26085
+ import { basename as basename17, join as join60 } from "path";
25969
26086
 
25970
26087
  // src/commands/transcript/cleanText.ts
25971
26088
  function cleanText(text17) {
@@ -26173,14 +26290,14 @@ function formatChatLog(messages) {
26173
26290
  // src/commands/transcript/move.ts
26174
26291
  var DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
26175
26292
  function convertVttToMarkdown(inputPath) {
26176
- const cues = parseVtt(readFileSync42(inputPath, "utf8"));
26293
+ const cues = parseVtt(readFileSync43(inputPath, "utf8"));
26177
26294
  const messages = cuesToChatMessages(deduplicateCues(cues));
26178
26295
  return formatChatLog(messages);
26179
26296
  }
26180
26297
  function archiveRawVtt(vttDir, sourcePath, filename) {
26181
- const processedDir = join59(vttDir, "processed");
26298
+ const processedDir = join60(vttDir, "processed");
26182
26299
  mkdirSync20(processedDir, { recursive: true });
26183
- renameSync2(sourcePath, join59(processedDir, filename));
26300
+ renameSync2(sourcePath, join60(processedDir, filename));
26184
26301
  }
26185
26302
  function move(file, options2) {
26186
26303
  const { date, client } = options2;
@@ -26189,20 +26306,20 @@ function move(file, options2) {
26189
26306
  process.exit(1);
26190
26307
  }
26191
26308
  const { vttDir, transcriptsDir, summaryDir } = getTranscriptConfig();
26192
- const filename = basename15(file);
26193
- const sourcePath = join59(vttDir, filename);
26194
- if (!existsSync52(sourcePath)) {
26309
+ const filename = basename17(file);
26310
+ const sourcePath = join60(vttDir, filename);
26311
+ if (!existsSync53(sourcePath)) {
26195
26312
  console.error(`Error: VTT file not found: ${sourcePath}`);
26196
26313
  process.exit(1);
26197
26314
  }
26198
- const base = basename15(filename, ".vtt").replace(/ Transcription$/, "");
26315
+ const base = basename17(filename, ".vtt").replace(/ Transcription$/, "");
26199
26316
  const outputName = `${date} ${base}.md`;
26200
- const formattedDir = join59(transcriptsDir, client);
26317
+ const formattedDir = join60(transcriptsDir, client);
26201
26318
  mkdirSync20(formattedDir, { recursive: true });
26202
- const formattedPath = join59(formattedDir, outputName);
26319
+ const formattedPath = join60(formattedDir, outputName);
26203
26320
  writeFileSync38(formattedPath, convertVttToMarkdown(sourcePath), "utf8");
26204
26321
  archiveRawVtt(vttDir, sourcePath, filename);
26205
- const summaryPath = join59(summaryDir, client, outputName);
26322
+ const summaryPath = join60(summaryDir, client, outputName);
26206
26323
  console.log(`Formatted transcript: ${formattedPath}`);
26207
26324
  console.log(`Summary target: ${summaryPath}`);
26208
26325
  }
@@ -26322,50 +26439,50 @@ function registerVerify(program2) {
26322
26439
 
26323
26440
  // src/commands/voice/devices.ts
26324
26441
  import { spawnSync as spawnSync6 } from "child_process";
26325
- import { join as join61 } from "path";
26442
+ import { join as join62 } from "path";
26326
26443
 
26327
26444
  // src/commands/voice/shared.ts
26328
26445
  import { homedir as homedir22 } from "os";
26329
- import { dirname as dirname29, join as join60 } from "path";
26446
+ import { dirname as dirname30, join as join61 } from "path";
26330
26447
  import { fileURLToPath as fileURLToPath7 } from "url";
26331
- var __dirname5 = dirname29(fileURLToPath7(import.meta.url));
26332
- var VOICE_DIR = join60(homedir22(), ".assist", "voice");
26448
+ var __dirname5 = dirname30(fileURLToPath7(import.meta.url));
26449
+ var VOICE_DIR = join61(homedir22(), ".assist", "voice");
26333
26450
  var voicePaths = {
26334
26451
  dir: VOICE_DIR,
26335
- pid: join60(VOICE_DIR, "voice.pid"),
26336
- log: join60(VOICE_DIR, "voice.log"),
26337
- venv: join60(VOICE_DIR, ".venv"),
26338
- lock: join60(VOICE_DIR, "voice.lock")
26452
+ pid: join61(VOICE_DIR, "voice.pid"),
26453
+ log: join61(VOICE_DIR, "voice.log"),
26454
+ venv: join61(VOICE_DIR, ".venv"),
26455
+ lock: join61(VOICE_DIR, "voice.lock")
26339
26456
  };
26340
26457
  function getPythonDir() {
26341
- return join60(__dirname5, "commands", "voice", "python");
26458
+ return join61(__dirname5, "commands", "voice", "python");
26342
26459
  }
26343
26460
  function getVenvPython() {
26344
- return process.platform === "win32" ? join60(voicePaths.venv, "Scripts", "python.exe") : join60(voicePaths.venv, "bin", "python");
26461
+ return process.platform === "win32" ? join61(voicePaths.venv, "Scripts", "python.exe") : join61(voicePaths.venv, "bin", "python");
26345
26462
  }
26346
26463
  function getLockDir() {
26347
26464
  const config = loadConfig();
26348
26465
  return config.voice?.lockDir ?? VOICE_DIR;
26349
26466
  }
26350
26467
  function getLockFile() {
26351
- return join60(getLockDir(), "voice.lock");
26468
+ return join61(getLockDir(), "voice.lock");
26352
26469
  }
26353
26470
 
26354
26471
  // src/commands/voice/devices.ts
26355
26472
  function devices() {
26356
- const script = join61(getPythonDir(), "list_devices.py");
26473
+ const script = join62(getPythonDir(), "list_devices.py");
26357
26474
  spawnSync6(getVenvPython(), [script], { stdio: "inherit" });
26358
26475
  }
26359
26476
 
26360
26477
  // src/commands/voice/logs.ts
26361
- import { existsSync as existsSync53, readFileSync as readFileSync43 } from "fs";
26478
+ import { existsSync as existsSync54, readFileSync as readFileSync44 } from "fs";
26362
26479
  function logs(options2) {
26363
- if (!existsSync53(voicePaths.log)) {
26480
+ if (!existsSync54(voicePaths.log)) {
26364
26481
  console.log("No voice log file found");
26365
26482
  return;
26366
26483
  }
26367
26484
  const count8 = Number.parseInt(options2.lines ?? "150", 10);
26368
- const content = readFileSync43(voicePaths.log, "utf8").trim();
26485
+ const content = readFileSync44(voicePaths.log, "utf8").trim();
26369
26486
  if (!content) {
26370
26487
  console.log("Voice log is empty");
26371
26488
  return;
@@ -26388,12 +26505,12 @@ function logs(options2) {
26388
26505
  // src/commands/voice/setup.ts
26389
26506
  import { spawnSync as spawnSync7 } from "child_process";
26390
26507
  import { mkdirSync as mkdirSync22 } from "fs";
26391
- import { join as join63 } from "path";
26508
+ import { join as join64 } from "path";
26392
26509
 
26393
26510
  // src/commands/voice/checkLockFile.ts
26394
- import { execSync as execSync58 } from "child_process";
26395
- import { existsSync as existsSync54, mkdirSync as mkdirSync21, readFileSync as readFileSync44, writeFileSync as writeFileSync39 } from "fs";
26396
- import { join as join62 } from "path";
26511
+ import { execSync as execSync59 } from "child_process";
26512
+ import { existsSync as existsSync55, mkdirSync as mkdirSync21, readFileSync as readFileSync45, writeFileSync as writeFileSync39 } from "fs";
26513
+ import { join as join63 } from "path";
26397
26514
  function isProcessAlive2(pid) {
26398
26515
  try {
26399
26516
  process.kill(pid, 0);
@@ -26404,9 +26521,9 @@ function isProcessAlive2(pid) {
26404
26521
  }
26405
26522
  function checkLockFile() {
26406
26523
  const lockFile = getLockFile();
26407
- if (!existsSync54(lockFile)) return;
26524
+ if (!existsSync55(lockFile)) return;
26408
26525
  try {
26409
- const lock2 = JSON.parse(readFileSync44(lockFile, "utf8"));
26526
+ const lock2 = JSON.parse(readFileSync45(lockFile, "utf8"));
26410
26527
  if (lock2.pid && isProcessAlive2(lock2.pid)) {
26411
26528
  console.error(
26412
26529
  `Voice daemon already running (PID ${lock2.pid}, env: ${lock2.env}). Stop it first with: assist voice stop`
@@ -26417,10 +26534,10 @@ function checkLockFile() {
26417
26534
  }
26418
26535
  }
26419
26536
  function bootstrapVenv() {
26420
- if (existsSync54(getVenvPython())) return;
26537
+ if (existsSync55(getVenvPython())) return;
26421
26538
  console.log("Setting up Python environment...");
26422
26539
  const pythonDir = getPythonDir();
26423
- execSync58(
26540
+ execSync59(
26424
26541
  `uv sync --project "${pythonDir}" --extra runtime --no-install-project`,
26425
26542
  {
26426
26543
  stdio: "inherit",
@@ -26430,7 +26547,7 @@ function bootstrapVenv() {
26430
26547
  }
26431
26548
  function writeLockFile(pid) {
26432
26549
  const lockFile = getLockFile();
26433
- mkdirSync21(join62(lockFile, ".."), { recursive: true });
26550
+ mkdirSync21(join63(lockFile, ".."), { recursive: true });
26434
26551
  writeFileSync39(
26435
26552
  lockFile,
26436
26553
  JSON.stringify({
@@ -26446,7 +26563,7 @@ function setup() {
26446
26563
  mkdirSync22(voicePaths.dir, { recursive: true });
26447
26564
  bootstrapVenv();
26448
26565
  console.log("\nDownloading models...\n");
26449
- const script = join63(getPythonDir(), "setup_models.py");
26566
+ const script = join64(getPythonDir(), "setup_models.py");
26450
26567
  const result = spawnSync7(getVenvPython(), [script], {
26451
26568
  stdio: "inherit",
26452
26569
  env: { ...process.env, VOICE_LOG_FILE: voicePaths.log }
@@ -26460,7 +26577,7 @@ function setup() {
26460
26577
  // src/commands/voice/start.ts
26461
26578
  import { spawn as spawn8 } from "child_process";
26462
26579
  import { mkdirSync as mkdirSync23, writeFileSync as writeFileSync40 } from "fs";
26463
- import { join as join64 } from "path";
26580
+ import { join as join65 } from "path";
26464
26581
 
26465
26582
  // src/commands/voice/buildDaemonEnv.ts
26466
26583
  function buildDaemonEnv(options2) {
@@ -26498,7 +26615,7 @@ function start2(options2) {
26498
26615
  bootstrapVenv();
26499
26616
  const debug = options2.debug || options2.foreground || process.platform === "win32";
26500
26617
  const env = buildDaemonEnv({ debug });
26501
- const script = join64(getPythonDir(), "voice_daemon.py");
26618
+ const script = join65(getPythonDir(), "voice_daemon.py");
26502
26619
  const python = getVenvPython();
26503
26620
  if (options2.foreground) {
26504
26621
  spawnForeground(python, script, env);
@@ -26508,7 +26625,7 @@ function start2(options2) {
26508
26625
  }
26509
26626
 
26510
26627
  // src/commands/voice/status.ts
26511
- import { existsSync as existsSync55, readFileSync as readFileSync45 } from "fs";
26628
+ import { existsSync as existsSync56, readFileSync as readFileSync46 } from "fs";
26512
26629
  function isProcessAlive3(pid) {
26513
26630
  try {
26514
26631
  process.kill(pid, 0);
@@ -26518,16 +26635,16 @@ function isProcessAlive3(pid) {
26518
26635
  }
26519
26636
  }
26520
26637
  function readRecentLogs(count8) {
26521
- if (!existsSync55(voicePaths.log)) return [];
26522
- const lines = readFileSync45(voicePaths.log, "utf8").trim().split("\n");
26638
+ if (!existsSync56(voicePaths.log)) return [];
26639
+ const lines = readFileSync46(voicePaths.log, "utf8").trim().split("\n");
26523
26640
  return lines.slice(-count8);
26524
26641
  }
26525
26642
  function status2() {
26526
- if (!existsSync55(voicePaths.pid)) {
26643
+ if (!existsSync56(voicePaths.pid)) {
26527
26644
  console.log("Voice daemon: not running (no PID file)");
26528
26645
  return;
26529
26646
  }
26530
- const pid = Number.parseInt(readFileSync45(voicePaths.pid, "utf8").trim(), 10);
26647
+ const pid = Number.parseInt(readFileSync46(voicePaths.pid, "utf8").trim(), 10);
26531
26648
  const alive = isProcessAlive3(pid);
26532
26649
  console.log(`Voice daemon: ${alive ? "running" : "dead"} (PID ${pid})`);
26533
26650
  const recent = readRecentLogs(5);
@@ -26546,13 +26663,13 @@ function status2() {
26546
26663
  }
26547
26664
 
26548
26665
  // src/commands/voice/stop.ts
26549
- import { existsSync as existsSync56, readFileSync as readFileSync46, unlinkSync as unlinkSync19 } from "fs";
26666
+ import { existsSync as existsSync57, readFileSync as readFileSync47, unlinkSync as unlinkSync19 } from "fs";
26550
26667
  function stop2() {
26551
- if (!existsSync56(voicePaths.pid)) {
26668
+ if (!existsSync57(voicePaths.pid)) {
26552
26669
  console.log("Voice daemon is not running (no PID file)");
26553
26670
  return;
26554
26671
  }
26555
- const pid = Number.parseInt(readFileSync46(voicePaths.pid, "utf8").trim(), 10);
26672
+ const pid = Number.parseInt(readFileSync47(voicePaths.pid, "utf8").trim(), 10);
26556
26673
  try {
26557
26674
  process.kill(pid, "SIGTERM");
26558
26675
  console.log(`Sent SIGTERM to voice daemon (PID ${pid})`);
@@ -26565,7 +26682,7 @@ function stop2() {
26565
26682
  }
26566
26683
  try {
26567
26684
  const lockFile = getLockFile();
26568
- if (existsSync56(lockFile)) unlinkSync19(lockFile);
26685
+ if (existsSync57(lockFile)) unlinkSync19(lockFile);
26569
26686
  } catch {
26570
26687
  }
26571
26688
  console.log("Voice daemon stopped");
@@ -26686,8 +26803,8 @@ function gitFailureReason(error) {
26686
26803
  const text17 = stream == null ? "" : String(stream).trim();
26687
26804
  if (text17) return text17;
26688
26805
  }
26689
- const message2 = error instanceof Error ? error.message : String(error);
26690
- return message2.trim() || "git failed without reporting a reason";
26806
+ const message3 = error instanceof Error ? error.message : String(error);
26807
+ return message3.trim() || "git failed without reporting a reason";
26691
26808
  }
26692
26809
 
26693
26810
  // src/commands/watch/resolveUpstream.ts
@@ -26791,7 +26908,7 @@ function waitForUpstream(options2) {
26791
26908
  return Promise.resolve({ kind: "moved", upstream, ...moved });
26792
26909
  }
26793
26910
  const fetchTimeoutMs = Math.max(intervalMs, MIN_FETCH_TIMEOUT_MS);
26794
- return new Promise((resolve20) => {
26911
+ return new Promise((resolve21) => {
26795
26912
  let settled = false;
26796
26913
  const finish = (outcome) => {
26797
26914
  if (settled) return;
@@ -26799,7 +26916,7 @@ function waitForUpstream(options2) {
26799
26916
  clearInterval(ticker);
26800
26917
  clearTimeout(deadline);
26801
26918
  process.off("SIGINT", onInterrupt);
26802
- resolve20(outcome);
26919
+ resolve21(outcome);
26803
26920
  };
26804
26921
  const onInterrupt = () => finish({ kind: "interrupted" });
26805
26922
  const ticker = setInterval(() => {
@@ -26824,9 +26941,9 @@ function parseOrExit(value) {
26824
26941
  return process.exit(1);
26825
26942
  }
26826
26943
  }
26827
- function report({ exitCode, message: message2 }) {
26828
- if (exitCode === 0) console.log(message2);
26829
- else console.error(message2);
26944
+ function report({ exitCode, message: message3 }) {
26945
+ if (exitCode === 0) console.log(message3);
26946
+ else console.error(message3);
26830
26947
  }
26831
26948
  async function watchWait(options2) {
26832
26949
  const intervalMs = parseOrExit(options2.interval);
@@ -26887,7 +27004,7 @@ function extractCode(url, expectedState) {
26887
27004
  return code;
26888
27005
  }
26889
27006
  function waitForCallback(port, expectedState) {
26890
- return new Promise((resolve20, reject) => {
27007
+ return new Promise((resolve21, reject) => {
26891
27008
  const timeout = setTimeout(() => {
26892
27009
  server.close();
26893
27010
  reject(new Error("Authorization timed out after 120 seconds"));
@@ -26904,7 +27021,7 @@ function waitForCallback(port, expectedState) {
26904
27021
  const code = extractCode(url, expectedState);
26905
27022
  respondHtml(res, 200, "Authorization successful!");
26906
27023
  server.close();
26907
- resolve20(code);
27024
+ resolve21(code);
26908
27025
  } catch (error) {
26909
27026
  respondHtml(res, 400, error.message);
26910
27027
  server.close();
@@ -27025,8 +27142,8 @@ async function auth() {
27025
27142
 
27026
27143
  // src/commands/roam/postRoamActivity.ts
27027
27144
  import { execFileSync as execFileSync12 } from "child_process";
27028
- import { readdirSync as readdirSync11, readFileSync as readFileSync47, statSync as statSync9 } from "fs";
27029
- import { join as join65 } from "path";
27145
+ import { readdirSync as readdirSync11, readFileSync as readFileSync48, statSync as statSync10 } from "fs";
27146
+ import { join as join66 } from "path";
27030
27147
  function findPortFile(roamDir) {
27031
27148
  let entries;
27032
27149
  try {
@@ -27035,9 +27152,9 @@ function findPortFile(roamDir) {
27035
27152
  return void 0;
27036
27153
  }
27037
27154
  const candidates = entries.filter((name) => /^roam-local-api(-[^.]+)?\.port$/.test(name)).map((name) => {
27038
- const path71 = join65(roamDir, name);
27155
+ const path71 = join66(roamDir, name);
27039
27156
  try {
27040
- return { path: path71, mtimeMs: statSync9(path71).mtimeMs };
27157
+ return { path: path71, mtimeMs: statSync10(path71).mtimeMs };
27041
27158
  } catch {
27042
27159
  return void 0;
27043
27160
  }
@@ -27047,11 +27164,11 @@ function findPortFile(roamDir) {
27047
27164
  function postRoamActivity(app, event) {
27048
27165
  const appData = process.env.APPDATA;
27049
27166
  if (!appData) return;
27050
- const portFile = findPortFile(join65(appData, "Roam"));
27167
+ const portFile = findPortFile(join66(appData, "Roam"));
27051
27168
  if (!portFile) return;
27052
27169
  let port;
27053
27170
  try {
27054
- port = readFileSync47(portFile, "utf8").trim();
27171
+ port = readFileSync48(portFile, "utf8").trim();
27055
27172
  } catch {
27056
27173
  return;
27057
27174
  }
@@ -27181,7 +27298,7 @@ var rootConfigHelp = {
27181
27298
  };
27182
27299
 
27183
27300
  // src/commands/run/index.ts
27184
- import { resolve as resolve16 } from "path";
27301
+ import { resolve as resolve17 } from "path";
27185
27302
 
27186
27303
  // src/commands/run/findRunConfig.ts
27187
27304
  function exitNoRunConfigs() {
@@ -27265,11 +27382,11 @@ function resolveParams(params, cliArgs) {
27265
27382
  }
27266
27383
 
27267
27384
  // src/commands/run/runPreCommands.ts
27268
- import { execSync as execSync59 } from "child_process";
27385
+ import { execSync as execSync60 } from "child_process";
27269
27386
  function runPreCommands(pre, cwd) {
27270
27387
  for (const cmd of pre) {
27271
27388
  try {
27272
- execSync59(cmd, { stdio: "inherit", cwd });
27389
+ execSync60(cmd, { stdio: "inherit", cwd });
27273
27390
  } catch (error) {
27274
27391
  const code = error && typeof error === "object" && "status" in error ? error.status : 1;
27275
27392
  process.exit(code);
@@ -27279,15 +27396,15 @@ function runPreCommands(pre, cwd) {
27279
27396
 
27280
27397
  // src/commands/run/spawnRunCommand.ts
27281
27398
  import { execFileSync as execFileSync13, spawn as spawn9 } from "child_process";
27282
- import { existsSync as existsSync57 } from "fs";
27283
- import { dirname as dirname30, join as join66, resolve as resolve15 } from "path";
27399
+ import { existsSync as existsSync58 } from "fs";
27400
+ import { dirname as dirname31, join as join67, resolve as resolve16 } from "path";
27284
27401
  function resolveCommand2(command) {
27285
27402
  if (process.platform !== "win32" || command !== "bash") return command;
27286
27403
  try {
27287
27404
  const gitPath = execFileSync13("where", ["git"], { encoding: "utf8" }).trim().split("\r\n")[0];
27288
- const gitRoot = resolve15(dirname30(gitPath), "..");
27289
- const gitBash = join66(gitRoot, "bin", "bash.exe");
27290
- if (existsSync57(gitBash)) return gitBash;
27405
+ const gitRoot = resolve16(dirname31(gitPath), "..");
27406
+ const gitBash = join67(gitRoot, "bin", "bash.exe");
27407
+ if (existsSync58(gitBash)) return gitBash;
27291
27408
  } catch {
27292
27409
  }
27293
27410
  return command;
@@ -27333,7 +27450,7 @@ function listRunConfigs(verbose) {
27333
27450
  }
27334
27451
  }
27335
27452
  function execRunConfig(config, args) {
27336
- const cwd = config.cwd ? resolve16(getConfigDir(), config.cwd) : void 0;
27453
+ const cwd = config.cwd ? resolve17(getConfigDir(), config.cwd) : void 0;
27337
27454
  if (config.pre) runPreCommands(config.pre, cwd);
27338
27455
  const resolved = resolveParams(config.params, args);
27339
27456
  spawnRunCommand(
@@ -27375,7 +27492,7 @@ async function run3(name, args) {
27375
27492
 
27376
27493
  // src/commands/run/add.ts
27377
27494
  import { mkdirSync as mkdirSync24, writeFileSync as writeFileSync41 } from "fs";
27378
- import { join as join67 } from "path";
27495
+ import { join as join68 } from "path";
27379
27496
 
27380
27497
  // src/commands/run/extractOption.ts
27381
27498
  function extractOption(args, flag) {
@@ -27436,7 +27553,7 @@ function saveNewRunConfig(name, command, args, cwd) {
27436
27553
  saveConfig(config);
27437
27554
  }
27438
27555
  function createCommandFile(name) {
27439
- const dir = join67(".claude", "commands");
27556
+ const dir = join68(".claude", "commands");
27440
27557
  mkdirSync24(dir, { recursive: true });
27441
27558
  const content = `---
27442
27559
  description: Run ${name}
@@ -27444,7 +27561,7 @@ description: Run ${name}
27444
27561
 
27445
27562
  Run \`assist run ${name} $ARGUMENTS 2>&1\`.
27446
27563
  `;
27447
- const filePath = join67(dir, `${name}.md`);
27564
+ const filePath = join68(dir, `${name}.md`);
27448
27565
  writeFileSync41(filePath, content);
27449
27566
  console.log(`Created command file: ${filePath}`);
27450
27567
  }
@@ -27500,8 +27617,8 @@ function link2() {
27500
27617
  }
27501
27618
 
27502
27619
  // src/commands/run/remove.ts
27503
- import { existsSync as existsSync58, unlinkSync as unlinkSync20 } from "fs";
27504
- import { join as join68 } from "path";
27620
+ import { existsSync as existsSync59, unlinkSync as unlinkSync20 } from "fs";
27621
+ import { join as join69 } from "path";
27505
27622
  function findRemoveIndex() {
27506
27623
  const idx = process.argv.indexOf("remove");
27507
27624
  if (idx === -1 || idx + 1 >= process.argv.length) return -1;
@@ -27516,8 +27633,8 @@ function parseRemoveName() {
27516
27633
  return process.argv[idx + 1];
27517
27634
  }
27518
27635
  function deleteCommandFile(name) {
27519
- const filePath = join68(".claude", "commands", `${name}.md`);
27520
- if (existsSync58(filePath)) {
27636
+ const filePath = join69(".claude", "commands", `${name}.md`);
27637
+ if (existsSync59(filePath)) {
27521
27638
  unlinkSync20(filePath);
27522
27639
  console.log(`Deleted command file: ${filePath}`);
27523
27640
  }
@@ -27570,10 +27687,10 @@ function registerRun(program2) {
27570
27687
  }
27571
27688
 
27572
27689
  // src/commands/screenshot/index.ts
27573
- import { execSync as execSync60 } from "child_process";
27574
- import { existsSync as existsSync59, mkdirSync as mkdirSync25, unlinkSync as unlinkSync21, writeFileSync as writeFileSync42 } from "fs";
27690
+ import { execSync as execSync61 } from "child_process";
27691
+ import { existsSync as existsSync60, mkdirSync as mkdirSync25, unlinkSync as unlinkSync21, writeFileSync as writeFileSync42 } from "fs";
27575
27692
  import { tmpdir as tmpdir8 } from "os";
27576
- import { join as join69, resolve as resolve17 } from "path";
27693
+ import { join as join70, resolve as resolve18 } from "path";
27577
27694
  import chalk209 from "chalk";
27578
27695
 
27579
27696
  // src/commands/screenshot/captureWindowPs1.ts
@@ -27703,17 +27820,17 @@ Write-Output $OutputPath
27703
27820
 
27704
27821
  // src/commands/screenshot/index.ts
27705
27822
  function buildOutputPath(outputDir, processName) {
27706
- if (!existsSync59(outputDir)) {
27823
+ if (!existsSync60(outputDir)) {
27707
27824
  mkdirSync25(outputDir, { recursive: true });
27708
27825
  }
27709
27826
  const timestamp6 = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
27710
- return resolve17(outputDir, `${processName}-${timestamp6}.png`);
27827
+ return resolve18(outputDir, `${processName}-${timestamp6}.png`);
27711
27828
  }
27712
27829
  function runPowerShellScript(processName, outputPath) {
27713
- const scriptPath = join69(tmpdir8(), `assist-screenshot-${Date.now()}.ps1`);
27830
+ const scriptPath = join70(tmpdir8(), `assist-screenshot-${Date.now()}.ps1`);
27714
27831
  writeFileSync42(scriptPath, captureWindowPs1, "utf8");
27715
27832
  try {
27716
- execSync60(
27833
+ execSync61(
27717
27834
  `powershell -NoProfile -ExecutionPolicy Bypass -File "${scriptPath}" -ProcessName "${processName}" -OutputPath "${outputPath}"`,
27718
27835
  { stdio: ["ignore", "pipe", "pipe"], encoding: "utf8" }
27719
27836
  );
@@ -27723,7 +27840,7 @@ function runPowerShellScript(processName, outputPath) {
27723
27840
  }
27724
27841
  function screenshot(processName) {
27725
27842
  const config = loadConfig();
27726
- const outputDir = resolve17(config.screenshot.outputDir);
27843
+ const outputDir = resolve18(config.screenshot.outputDir);
27727
27844
  const outputPath = buildOutputPath(outputDir, processName);
27728
27845
  console.log(chalk209.gray(`Capturing window for process "${processName}" ...`));
27729
27846
  try {
@@ -27756,10 +27873,10 @@ var STATUS_TIMEOUT_MS = 5e3;
27756
27873
  function queryDaemon(socket) {
27757
27874
  socket.write(`${JSON.stringify({ type: "ping" })}
27758
27875
  `);
27759
- return new Promise((resolve20) => {
27876
+ return new Promise((resolve21) => {
27760
27877
  const result = { sessions: [] };
27761
27878
  const pending = /* @__PURE__ */ new Set(["sessions", "pong"]);
27762
- const timer = setTimeout(() => resolve20(result), STATUS_TIMEOUT_MS);
27879
+ const timer = setTimeout(() => resolve21(result), STATUS_TIMEOUT_MS);
27763
27880
  const lines = createInterface5({ input: socket });
27764
27881
  lines.on("error", () => {
27765
27882
  });
@@ -27767,7 +27884,7 @@ function queryDaemon(socket) {
27767
27884
  applyLine(result, pending, line);
27768
27885
  if (pending.size === 0) {
27769
27886
  clearTimeout(timer);
27770
- resolve20(result);
27887
+ resolve21(result);
27771
27888
  }
27772
27889
  });
27773
27890
  });
@@ -27787,7 +27904,7 @@ function applyLine(result, pending, line) {
27787
27904
  }
27788
27905
 
27789
27906
  // src/commands/sessions/daemon/reportStolenSocket.ts
27790
- import { readFileSync as readFileSync48 } from "fs";
27907
+ import { readFileSync as readFileSync49 } from "fs";
27791
27908
  function reportStolenSocket(socketPid) {
27792
27909
  if (!socketPid) return;
27793
27910
  const filePid = readPidFile();
@@ -27799,7 +27916,7 @@ function reportStolenSocket(socketPid) {
27799
27916
  function readPidFile() {
27800
27917
  try {
27801
27918
  const pid = Number.parseInt(
27802
- readFileSync48(daemonPaths.pid, "utf8").trim(),
27919
+ readFileSync49(daemonPaths.pid, "utf8").trim(),
27803
27920
  10
27804
27921
  );
27805
27922
  return Number.isInteger(pid) ? pid : void 0;
@@ -27853,11 +27970,11 @@ function clearPersistedSessionsOnDrain() {
27853
27970
 
27854
27971
  // src/commands/sessions/daemon/readDaemonMessage.ts
27855
27972
  function readDaemonMessage(lines, timeoutMs, fallback, match) {
27856
- return new Promise((resolve20) => {
27973
+ return new Promise((resolve21) => {
27857
27974
  const finish = (value) => {
27858
27975
  clearTimeout(timer);
27859
27976
  lines.off("line", onLine);
27860
- resolve20(value);
27977
+ resolve21(value);
27861
27978
  };
27862
27979
  const timer = setTimeout(() => finish(fallback), timeoutMs);
27863
27980
  const onLine = (line) => {
@@ -28195,7 +28312,7 @@ function readDesignSystemPrompt() {
28195
28312
  import * as pty from "node-pty";
28196
28313
 
28197
28314
  // src/commands/sessions/daemon/ensureSpawnHelperExecutable.ts
28198
- import { chmodSync, existsSync as existsSync60, statSync as statSync10 } from "fs";
28315
+ import { chmodSync, existsSync as existsSync61, statSync as statSync11 } from "fs";
28199
28316
  import { createRequire as createRequire3 } from "module";
28200
28317
  import path59 from "path";
28201
28318
  var require4 = createRequire3(import.meta.url);
@@ -28210,8 +28327,8 @@ function ensureSpawnHelperExecutable() {
28210
28327
  `${process.platform}-${process.arch}`,
28211
28328
  "spawn-helper"
28212
28329
  );
28213
- if (!existsSync60(helper)) return;
28214
- const mode = statSync10(helper).mode;
28330
+ if (!existsSync61(helper)) return;
28331
+ const mode = statSync11(helper).mode;
28215
28332
  if ((mode & 73) === 0) chmodSync(helper, mode | 493);
28216
28333
  }
28217
28334
 
@@ -28370,17 +28487,17 @@ function otherTreeHolders(sessions, session) {
28370
28487
  }
28371
28488
 
28372
28489
  // src/commands/sessions/daemon/worktree/reapWorktree.ts
28373
- import { existsSync as existsSync62 } from "fs";
28374
- import { basename as basename16 } from "path";
28490
+ import { existsSync as existsSync63 } from "fs";
28491
+ import { basename as basename18 } from "path";
28375
28492
 
28376
28493
  // src/commands/sessions/daemon/worktree/deleteStrandedTree.ts
28377
- import { existsSync as existsSync61 } from "fs";
28378
- import { join as join72 } from "path";
28494
+ import { existsSync as existsSync62 } from "fs";
28495
+ import { join as join73 } from "path";
28379
28496
 
28380
28497
  // src/commands/sessions/daemon/worktree/deleteTreeDirectly.ts
28381
- import { statSync as statSync11 } from "fs";
28498
+ import { statSync as statSync12 } from "fs";
28382
28499
  import { rm as rm2 } from "fs/promises";
28383
- import { join as join71 } from "path";
28500
+ import { join as join72 } from "path";
28384
28501
  async function deleteTreeDirectly(clone, worktreePath, why) {
28385
28502
  if (holdsAGitDirectoryRatherThanALink(worktreePath)) {
28386
28503
  daemonLog(
@@ -28407,7 +28524,7 @@ async function deleteTreeDirectly(clone, worktreePath, why) {
28407
28524
  return true;
28408
28525
  }
28409
28526
  function holdsAGitDirectoryRatherThanALink(worktreePath) {
28410
- return statSync11(join71(worktreePath, ".git"), {
28527
+ return statSync12(join72(worktreePath, ".git"), {
28411
28528
  throwIfNoEntry: false
28412
28529
  })?.isDirectory() === true;
28413
28530
  }
@@ -28443,7 +28560,7 @@ async function deleteStrandedTree(clone, worktreePath, cause) {
28443
28560
  );
28444
28561
  }
28445
28562
  function strandedReason(worktreePath, cause) {
28446
- if (!existsSync61(join72(worktreePath, ".git")))
28563
+ if (!existsSync62(join73(worktreePath, ".git")))
28447
28564
  return "its .git link is already gone";
28448
28565
  if (/not a working tree|not a git repository/i.test(reason2(cause)))
28449
28566
  return "git no longer recognises it as a working tree";
@@ -28495,7 +28612,7 @@ function reason3(error) {
28495
28612
 
28496
28613
  // src/commands/sessions/daemon/worktree/reapWorktree.ts
28497
28614
  async function reapWorktree(worktreePath, force = false) {
28498
- if (!existsSync62(worktreePath)) {
28615
+ if (!existsSync63(worktreePath)) {
28499
28616
  daemonLog(`worktree ${worktreePath} already gone; skipping reap`);
28500
28617
  return false;
28501
28618
  }
@@ -28509,14 +28626,14 @@ async function reapWorktree(worktreePath, force = false) {
28509
28626
  stopInstall(worktreePath);
28510
28627
  const clone = owningClone(worktreePath);
28511
28628
  if (!await removeTree(clone, worktreePath, force)) return false;
28512
- await deleteWorktreeBranch(clone, basename16(worktreePath));
28629
+ await deleteWorktreeBranch(clone, basename18(worktreePath));
28513
28630
  forgetWorktree(worktreePath);
28514
28631
  daemonLog(`worktree ${worktreePath} reaped${force ? " (forced)" : ""}`);
28515
28632
  return true;
28516
28633
  }
28517
28634
  function owningClone(worktreePath) {
28518
28635
  const recorded = worktreeAttributionIncludingReaped(worktreePath)?.clone;
28519
- if (recorded && existsSync62(recorded)) return recorded;
28636
+ if (recorded && existsSync63(recorded)) return recorded;
28520
28637
  const detected = mainWorktree(worktreePath);
28521
28638
  if (detected) return detected;
28522
28639
  daemonLog(
@@ -28603,12 +28720,12 @@ function setStatus2(session, newStatus) {
28603
28720
  }
28604
28721
 
28605
28722
  // src/commands/sessions/daemon/worktree/watchGitState.ts
28606
- import { existsSync as existsSync63, watch } from "fs";
28723
+ import { existsSync as existsSync64, watch } from "fs";
28607
28724
  var DEBOUNCE_MS = 500;
28608
28725
  var POLL_MS = 3e4;
28609
28726
  function watchGitState(cwd, onChange) {
28610
28727
  const common = gitCommonDir(cwd);
28611
- if (!common || !existsSync63(common)) return void 0;
28728
+ if (!common || !existsSync64(common)) return void 0;
28612
28729
  const watchers = [
28613
28730
  watchGitDir(common, onChange),
28614
28731
  pollGitState(cwd, onChange)
@@ -29012,10 +29129,10 @@ function emitSessionOutput(session, clients, data) {
29012
29129
  }
29013
29130
 
29014
29131
  // src/commands/sessions/daemon/exitReason.ts
29015
- import { existsSync as existsSync64 } from "fs";
29132
+ import { existsSync as existsSync65 } from "fs";
29016
29133
  function exitReason(session, exitCode) {
29017
29134
  const base = `process exited with code ${exitCode}`;
29018
- if (session.cwd && !existsSync64(session.cwd))
29135
+ if (session.cwd && !existsSync65(session.cwd))
29019
29136
  return `${base}: working directory ${session.cwd} no longer exists`;
29020
29137
  return base;
29021
29138
  }
@@ -29033,8 +29150,8 @@ function handleFailedResume(session, exitCode, onStatusChange) {
29033
29150
  }
29034
29151
 
29035
29152
  // src/commands/sessions/daemon/watchActivity.ts
29036
- import { existsSync as existsSync65, mkdirSync as mkdirSync26, watch as watch2 } from "fs";
29037
- import { dirname as dirname32 } from "path";
29153
+ import { existsSync as existsSync66, mkdirSync as mkdirSync26, watch as watch2 } from "fs";
29154
+ import { dirname as dirname33 } from "path";
29038
29155
 
29039
29156
  // src/commands/sessions/daemon/applyReviewPause.ts
29040
29157
  function applyReviewPause(session, activity2) {
@@ -29088,7 +29205,7 @@ var DEBOUNCE_MS2 = 50;
29088
29205
  function watchActivity(session, notify2, onClaudeSessionId) {
29089
29206
  if (session.commandType !== "assist" || !session.cwd) return;
29090
29207
  const path71 = activityPath(session.id);
29091
- const dir = dirname32(path71);
29208
+ const dir = dirname33(path71);
29092
29209
  try {
29093
29210
  mkdirSync26(dir, { recursive: true });
29094
29211
  } catch {
@@ -29114,7 +29231,7 @@ function watchActivity(session, notify2, onClaudeSessionId) {
29114
29231
  if (timer) clearTimeout(timer);
29115
29232
  timer = setTimeout(read, DEBOUNCE_MS2);
29116
29233
  });
29117
- if (existsSync65(path71)) read();
29234
+ if (existsSync66(path71)) read();
29118
29235
  }
29119
29236
  function refreshActivity(session) {
29120
29237
  if (session.commandType !== "assist" || !session.cwd) return;
@@ -29304,9 +29421,9 @@ function normalizeEntry(entry) {
29304
29421
  return null;
29305
29422
  }
29306
29423
  function normalizeAssistant(entry) {
29307
- const message2 = asRecord2(entry.message);
29308
- const stopReason = typeof message2?.stop_reason === "string" ? message2.stop_reason : null;
29309
- const content = message2?.content;
29424
+ const message3 = asRecord2(entry.message);
29425
+ const stopReason = typeof message3?.stop_reason === "string" ? message3.stop_reason : null;
29426
+ const content = message3?.content;
29310
29427
  const toolUses = [];
29311
29428
  if (Array.isArray(content))
29312
29429
  for (const block of content) {
@@ -30203,8 +30320,8 @@ function rearmStoppedSessions(sessions, notify2) {
30203
30320
  }
30204
30321
 
30205
30322
  // src/commands/sessions/daemon/worktree/reconcileWorktreesOnRestore.ts
30206
- import { existsSync as existsSync68 } from "fs";
30207
- import { basename as basename18 } from "path";
30323
+ import { existsSync as existsSync69 } from "fs";
30324
+ import { basename as basename20 } from "path";
30208
30325
 
30209
30326
  // src/commands/sessions/daemon/worktree/accountedTrees.ts
30210
30327
  function accountedTrees(sessions) {
@@ -30273,9 +30390,9 @@ async function changedFiles(path71) {
30273
30390
  };
30274
30391
  }
30275
30392
  async function unpushedCommits(path71, reason4) {
30276
- const log = await gitResult(path71, ["log", "--oneline", "@{upstream}..HEAD"]);
30277
- if (!log.ok) return { summary: reason4, items: [] };
30278
- const lines = nonEmptyLines(log.out);
30393
+ const log2 = await gitResult(path71, ["log", "--oneline", "@{upstream}..HEAD"]);
30394
+ if (!log2.ok) return { summary: reason4, items: [] };
30395
+ const lines = nonEmptyLines(log2.out);
30279
30396
  return {
30280
30397
  summary: `${lines.length} unpushed ${lines.length === 1 ? "commit" : "commits"}`,
30281
30398
  items: capped(lines)
@@ -30293,9 +30410,9 @@ function capped(lines) {
30293
30410
  }
30294
30411
 
30295
30412
  // src/commands/sessions/daemon/worktree/reclaimVanishedWorktrees.ts
30296
- import { existsSync as existsSync67 } from "fs";
30413
+ import { existsSync as existsSync68 } from "fs";
30297
30414
  async function reclaimVanishedWorktrees(clone, paths) {
30298
- if (!existsSync67(clone)) {
30415
+ if (!existsSync68(clone)) {
30299
30416
  for (const { path: path71 } of paths) forgetWorktree(path71);
30300
30417
  daemonLog(
30301
30418
  `clone ${clone} is gone; forgot ${paths.length} worktree record(s) it owned`
@@ -30331,7 +30448,7 @@ async function reclaimBranch(clone, branch2) {
30331
30448
  }
30332
30449
 
30333
30450
  // src/commands/sessions/daemon/worktree/resurfaceOrphanedWorktree.ts
30334
- import { basename as basename17 } from "path";
30451
+ import { basename as basename19 } from "path";
30335
30452
  function resurfaceOrphanedWorktree(sessions, spawnWith, recovered, notify2) {
30336
30453
  const { orphan, reason: reason4, held } = recovered;
30337
30454
  let id;
@@ -30354,7 +30471,7 @@ function orphanedSession(id, recovered) {
30354
30471
  const { orphan, reason: reason4, held } = recovered;
30355
30472
  return {
30356
30473
  ...sessionBase(id, "stopped"),
30357
- name: `recovered ${basename17(orphan.path)}`,
30474
+ name: `recovered ${basename19(orphan.path)}`,
30358
30475
  subtitle: `${held.summary} in ${orphan.path}`,
30359
30476
  commandType: "claude",
30360
30477
  pty: null,
@@ -30388,10 +30505,10 @@ async function recoverOrphanedWorktrees(sessions, spawnWith, notify2) {
30388
30505
  const vanished = /* @__PURE__ */ new Map();
30389
30506
  for (const { path: path71, clone } of readWorktreeRegistry()) {
30390
30507
  if (accounted.has(path71)) continue;
30391
- if (!existsSync68(path71)) {
30508
+ if (!existsSync69(path71)) {
30392
30509
  vanished.set(clone, [
30393
30510
  ...vanished.get(clone) ?? [],
30394
- { path: path71, branch: basename18(path71) }
30511
+ { path: path71, branch: basename20(path71) }
30395
30512
  ]);
30396
30513
  continue;
30397
30514
  }
@@ -30658,7 +30775,7 @@ function windowsDaemonHost() {
30658
30775
  var CONNECT_TIMEOUT_MS = 2e3;
30659
30776
  var KEEPALIVE_PROBE_MS = 1e4;
30660
30777
  function connectToWindowsDaemon() {
30661
- return new Promise((resolve20, reject) => {
30778
+ return new Promise((resolve21, reject) => {
30662
30779
  const socket = net2.connect(windowsDaemonPort(), windowsDaemonHost());
30663
30780
  socket.setTimeout(CONNECT_TIMEOUT_MS);
30664
30781
  socket.once("timeout", () => {
@@ -30668,7 +30785,7 @@ function connectToWindowsDaemon() {
30668
30785
  socket.once("connect", () => {
30669
30786
  socket.setTimeout(0);
30670
30787
  socket.setKeepAlive(true, KEEPALIVE_PROBE_MS);
30671
- resolve20(socket);
30788
+ resolve21(socket);
30672
30789
  });
30673
30790
  socket.once("error", reject);
30674
30791
  });
@@ -30746,7 +30863,7 @@ async function waitForWindowsDaemon() {
30746
30863
  );
30747
30864
  }
30748
30865
  function delay2(ms) {
30749
- return new Promise((resolve20) => setTimeout(resolve20, ms));
30866
+ return new Promise((resolve21) => setTimeout(resolve21, ms));
30750
30867
  }
30751
30868
 
30752
30869
  // src/commands/sessions/daemon/defaultConnect.ts
@@ -30756,19 +30873,19 @@ async function defaultConnect() {
30756
30873
  }
30757
30874
 
30758
30875
  // src/commands/sessions/daemon/hasPersistedWindowsSessions.ts
30759
- import { existsSync as existsSync69, readFileSync as readFileSync50 } from "fs";
30876
+ import { existsSync as existsSync70, readFileSync as readFileSync51 } from "fs";
30760
30877
  import { posix } from "path";
30761
30878
  function hasPersistedWindowsSessions() {
30762
30879
  const sessionsFile = windowsSessionsFileFromWsl();
30763
30880
  if (!sessionsFile) return false;
30764
30881
  try {
30765
- if (!existsSync69(sessionsFile)) return false;
30766
- const data = JSON.parse(readFileSync50(sessionsFile, "utf8"));
30882
+ if (!existsSync70(sessionsFile)) return false;
30883
+ const data = JSON.parse(readFileSync51(sessionsFile, "utf8"));
30767
30884
  return Array.isArray(data) && data.length > 0;
30768
30885
  } catch (error) {
30769
- const message2 = error instanceof Error ? error.message : String(error);
30886
+ const message3 = error instanceof Error ? error.message : String(error);
30770
30887
  daemonLog(
30771
- `windows proxy: could not read windows sessions.json: ${message2}`
30888
+ `windows proxy: could not read windows sessions.json: ${message3}`
30772
30889
  );
30773
30890
  return false;
30774
30891
  }
@@ -30795,8 +30912,8 @@ async function discoverWindowsSessions(conn) {
30795
30912
  try {
30796
30913
  await conn.ensure();
30797
30914
  } catch (error) {
30798
- const message2 = error instanceof Error ? error.message : String(error);
30799
- daemonLog(`windows proxy: discovery failed: ${message2}`);
30915
+ const message3 = error instanceof Error ? error.message : String(error);
30916
+ daemonLog(`windows proxy: discovery failed: ${message3}`);
30800
30917
  }
30801
30918
  }
30802
30919
 
@@ -30834,11 +30951,11 @@ async function forwardWindowsCreate(conn, state, client, data) {
30834
30951
  state.pendingCreators.push({ client, timer });
30835
30952
  conn.write(stripOutboundSessionId(data));
30836
30953
  } catch (error) {
30837
- const message2 = error instanceof Error ? error.message : String(error);
30838
- daemonLog(`windows proxy: forwardCreate failed: ${message2}`);
30954
+ const message3 = error instanceof Error ? error.message : String(error);
30955
+ daemonLog(`windows proxy: forwardCreate failed: ${message3}`);
30839
30956
  sendTo(client, {
30840
30957
  type: "error",
30841
- message: `Windows session unavailable: ${message2}`
30958
+ message: `Windows session unavailable: ${message3}`
30842
30959
  });
30843
30960
  }
30844
30961
  }
@@ -30876,10 +30993,10 @@ function takePendingCreator(state) {
30876
30993
  clearTimeout(pending.timer);
30877
30994
  return pending.client;
30878
30995
  }
30879
- function failPendingCreators(state, message2) {
30996
+ function failPendingCreators(state, message3) {
30880
30997
  for (const { client, timer } of state.pendingCreators) {
30881
30998
  clearTimeout(timer);
30882
- sendTo(client, { type: "error", message: message2 });
30999
+ sendTo(client, { type: "error", message: message3 });
30883
31000
  }
30884
31001
  state.pendingCreators = [];
30885
31002
  }
@@ -31019,9 +31136,9 @@ async function healWindowsDaemon() {
31019
31136
  try {
31020
31137
  await runOnWindowsHost("assist update", UPDATE_TIMEOUT_MS);
31021
31138
  } catch (error) {
31022
- const message2 = error instanceof Error ? error.message : String(error);
31139
+ const message3 = error instanceof Error ? error.message : String(error);
31023
31140
  daemonLog(
31024
- `windows daemon: auto-heal: \`assist update\` failed: ${message2}`
31141
+ `windows daemon: auto-heal: \`assist update\` failed: ${message3}`
31025
31142
  );
31026
31143
  throw error;
31027
31144
  }
@@ -31030,7 +31147,7 @@ async function healWindowsDaemon() {
31030
31147
  daemonLog("windows daemon: auto-heal: stale daemon stopped");
31031
31148
  }
31032
31149
  function runOnWindowsHost(command, timeoutMs) {
31033
- return new Promise((resolve20, reject) => {
31150
+ return new Promise((resolve21, reject) => {
31034
31151
  const child = spawn12("pwsh.exe", ["-Command", command], {
31035
31152
  stdio: ["ignore", "pipe", "pipe"]
31036
31153
  });
@@ -31050,7 +31167,7 @@ function runOnWindowsHost(command, timeoutMs) {
31050
31167
  });
31051
31168
  child.on("exit", (code) => {
31052
31169
  clearTimeout(timer);
31053
- if (code === 0) resolve20();
31170
+ if (code === 0) resolve21();
31054
31171
  else
31055
31172
  reject(
31056
31173
  new Error(
@@ -31188,11 +31305,11 @@ async function autoHealWindowsDaemon(conn, state, heal, version2) {
31188
31305
  daemonLog("windows proxy: heal complete, reconnecting to windows daemon");
31189
31306
  await conn.ensure();
31190
31307
  } catch (error) {
31191
- const message2 = error instanceof Error ? error.message : String(error);
31192
- daemonLog(`windows proxy: auto-heal failed: ${message2}`);
31308
+ const message3 = error instanceof Error ? error.message : String(error);
31309
+ daemonLog(`windows proxy: auto-heal failed: ${message3}`);
31193
31310
  state.broadcast({
31194
31311
  type: "error",
31195
- message: `Windows host auto-update failed: ${message2}`
31312
+ message: `Windows host auto-update failed: ${message3}`
31196
31313
  });
31197
31314
  }
31198
31315
  }
@@ -31787,9 +31904,9 @@ function safeParse2(line) {
31787
31904
  }
31788
31905
 
31789
31906
  // src/commands/sessions/daemon/repoDirExists.ts
31790
- import { existsSync as existsSync70 } from "fs";
31907
+ import { existsSync as existsSync71 } from "fs";
31791
31908
  function repoDirExists(cwd) {
31792
- return existsSync70(toGitCwd(cwd));
31909
+ return existsSync71(toGitCwd(cwd));
31793
31910
  }
31794
31911
 
31795
31912
  // src/commands/sessions/daemon/withRepoGroups.ts
@@ -31981,7 +32098,7 @@ function handleConnection(socket, manager) {
31981
32098
  import { unlinkSync as unlinkSync22, writeFileSync as writeFileSync43 } from "fs";
31982
32099
 
31983
32100
  // src/commands/sessions/daemon/startPidFileWatchdog.ts
31984
- import { readFileSync as readFileSync51 } from "fs";
32101
+ import { readFileSync as readFileSync52 } from "fs";
31985
32102
  var WATCHDOG_INTERVAL_MS = 5e3;
31986
32103
  function startPidFileWatchdog(onLost, intervalMs = WATCHDOG_INTERVAL_MS) {
31987
32104
  const timer = setInterval(() => {
@@ -31992,7 +32109,7 @@ function startPidFileWatchdog(onLost, intervalMs = WATCHDOG_INTERVAL_MS) {
31992
32109
  }
31993
32110
  function ownsPidFile() {
31994
32111
  try {
31995
- return readFileSync51(daemonPaths.pid, "utf8").trim() === String(process.pid);
32112
+ return readFileSync52(daemonPaths.pid, "utf8").trim() === String(process.pid);
31996
32113
  } catch {
31997
32114
  return false;
31998
32115
  }
@@ -32409,13 +32526,13 @@ function buildLimitsSegment(rateLimits) {
32409
32526
  }
32410
32527
 
32411
32528
  // src/commands/readGitBranch.ts
32412
- import { readFileSync as readFileSync53, statSync as statSync13 } from "fs";
32413
- import { isAbsolute as isAbsolute3, join as join74, resolve as resolve18 } from "path";
32529
+ import { readFileSync as readFileSync54, statSync as statSync14 } from "fs";
32530
+ import { isAbsolute as isAbsolute4, join as join75, resolve as resolve19 } from "path";
32414
32531
  function resolveGitDir(cwd) {
32415
- const dotGit = join74(cwd, ".git");
32532
+ const dotGit = join75(cwd, ".git");
32416
32533
  let stat3;
32417
32534
  try {
32418
- stat3 = statSync13(dotGit);
32535
+ stat3 = statSync14(dotGit);
32419
32536
  } catch {
32420
32537
  return null;
32421
32538
  }
@@ -32424,7 +32541,7 @@ function resolveGitDir(cwd) {
32424
32541
  }
32425
32542
  let contents;
32426
32543
  try {
32427
- contents = readFileSync53(dotGit, "utf8");
32544
+ contents = readFileSync54(dotGit, "utf8");
32428
32545
  } catch {
32429
32546
  return null;
32430
32547
  }
@@ -32433,7 +32550,7 @@ function resolveGitDir(cwd) {
32433
32550
  return null;
32434
32551
  }
32435
32552
  const gitDir = match[1].trim();
32436
- return isAbsolute3(gitDir) ? gitDir : resolve18(cwd, gitDir);
32553
+ return isAbsolute4(gitDir) ? gitDir : resolve19(cwd, gitDir);
32437
32554
  }
32438
32555
  function readGitBranch(cwd) {
32439
32556
  const gitDir = resolveGitDir(cwd);
@@ -32442,7 +32559,7 @@ function readGitBranch(cwd) {
32442
32559
  }
32443
32560
  let head;
32444
32561
  try {
32445
- head = readFileSync53(join74(gitDir, "HEAD"), "utf8");
32562
+ head = readFileSync54(join75(gitDir, "HEAD"), "utf8");
32446
32563
  } catch {
32447
32564
  return null;
32448
32565
  }
@@ -32798,7 +32915,7 @@ function syncCommands(claudeDir, targetBase) {
32798
32915
  }
32799
32916
 
32800
32917
  // src/commands/update.ts
32801
- import { execSync as execSync61 } from "child_process";
32918
+ import { execSync as execSync62 } from "child_process";
32802
32919
  import * as path70 from "path";
32803
32920
 
32804
32921
  // src/commands/restartDaemonAfterUpdate.ts
@@ -32822,7 +32939,7 @@ function isGlobalNpmInstall(dir) {
32822
32939
  if (resolved.split(path70.sep).includes("node_modules")) {
32823
32940
  return true;
32824
32941
  }
32825
- const globalPrefix = execSync61("npm prefix -g", { stdio: "pipe" }).toString().trim();
32942
+ const globalPrefix = execSync62("npm prefix -g", { stdio: "pipe" }).toString().trim();
32826
32943
  return resolved.toLowerCase().startsWith(path70.resolve(globalPrefix).toLowerCase());
32827
32944
  } catch {
32828
32945
  return false;
@@ -32833,18 +32950,18 @@ async function update2() {
32833
32950
  console.log(`Assist is installed at: ${installDir}`);
32834
32951
  if (isGitRepo(installDir)) {
32835
32952
  console.log("Detected git repo installation, pulling latest...");
32836
- execSync61("git pull", { cwd: installDir, stdio: "inherit" });
32953
+ execSync62("git pull", { cwd: installDir, stdio: "inherit" });
32837
32954
  console.log("Installing dependencies...");
32838
- execSync61("npm i", { cwd: installDir, stdio: "inherit" });
32955
+ execSync62("npm i", { cwd: installDir, stdio: "inherit" });
32839
32956
  console.log("Building...");
32840
- execSync61("npm run build", { cwd: installDir, stdio: "inherit" });
32957
+ execSync62("npm run build", { cwd: installDir, stdio: "inherit" });
32841
32958
  console.log("Syncing commands...");
32842
- execSync61("assist sync", { stdio: "inherit" });
32959
+ execSync62("assist sync", { stdio: "inherit" });
32843
32960
  } else if (isGlobalNpmInstall(installDir)) {
32844
32961
  console.log("Detected global npm installation, updating...");
32845
- execSync61("npm i -g @staff0rd/assist@latest", { stdio: "inherit" });
32962
+ execSync62("npm i -g @staff0rd/assist@latest", { stdio: "inherit" });
32846
32963
  console.log("Syncing commands...");
32847
- execSync61("assist sync", { stdio: "inherit" });
32964
+ execSync62("assist sync", { stdio: "inherit" });
32848
32965
  } else {
32849
32966
  console.error(
32850
32967
  "Could not determine installation method. Expected a git repo or global npm install."