larkway 0.3.61 → 0.3.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  You @ the bot in a Feishu thread. It runs on your machine — reading your real codebase, executing commands, opening MRs — and posts the result back. You define what the agent knows and what it can do. Larkway just carries the messages.
10
10
 
11
- **Current release: v0.3.61**
11
+ **Current release: v0.3.62**
12
12
 
13
13
  ---
14
14
 
package/README.zh.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  你在飞书话题里 @ bot,它在你的机器上运行——读真实代码库、执行命令、开 MR——把结果贴回飞书。你定义 agent 知道什么、能做什么。Larkway 只负责传递消息。
10
10
 
11
- **当前版本:v0.3.61**
11
+ **当前版本:v0.3.62**
12
12
 
13
13
  ---
14
14
 
package/dist/cli/index.js CHANGED
@@ -126890,7 +126890,25 @@ async function ensureRelativeSymlink(linkPath, target) {
126890
126890
  await fs.rm(linkPath, { force: true });
126891
126891
  } catch {
126892
126892
  }
126893
- await fs.symlink(target, linkPath, process.platform === "win32" ? "junction" : null);
126893
+ if (process.platform === "win32") {
126894
+ const resolved = path7.resolve(path7.dirname(linkPath), target);
126895
+ let isDir = false;
126896
+ try {
126897
+ isDir = (await fs.stat(resolved)).isDirectory();
126898
+ } catch {
126899
+ }
126900
+ if (isDir) {
126901
+ await fs.symlink(target, linkPath, "junction");
126902
+ return;
126903
+ }
126904
+ try {
126905
+ await fs.symlink(target, linkPath, "file");
126906
+ } catch {
126907
+ await fs.copyFile(resolved, linkPath);
126908
+ }
126909
+ return;
126910
+ }
126911
+ await fs.symlink(target, linkPath);
126894
126912
  }
126895
126913
  async function readTextIfExists(filePath) {
126896
126914
  try {
@@ -129299,8 +129317,9 @@ import { spawn as nodeSpawn, spawnSync as nodeSpawnSync } from "node:child_proce
129299
129317
  import { accessSync, constants as fsConstants } from "node:fs";
129300
129318
  import path12 from "node:path";
129301
129319
  import process2 from "node:process";
129302
- var doSpawn = ((...args) => (process2.platform === "win32" ? import_cross_spawn.default : nodeSpawn)(...args));
129303
- var doSpawnSync = ((...args) => (process2.platform === "win32" ? import_cross_spawn.default.sync : nodeSpawnSync)(
129320
+ var useCrossSpawn = () => process2.platform === "win32" && process2.env["VITEST"] === void 0;
129321
+ var doSpawn = ((...args) => (useCrossSpawn() ? import_cross_spawn.default : nodeSpawn)(...args));
129322
+ var doSpawnSync = ((...args) => (useCrossSpawn() ? import_cross_spawn.default.sync : nodeSpawnSync)(
129304
129323
  ...args
129305
129324
  ));
129306
129325
  function spawnProcess(command, args = [], options = {}) {
package/dist/main.js CHANGED
@@ -119842,12 +119842,13 @@ function renderTranscriptEntry(input) {
119842
119842
  async function ensureSessionArtifacts(input) {
119843
119843
  await fs.mkdir(input.sessionPath, { recursive: true });
119844
119844
  await writeIfMissing(path4.join(input.sessionPath, "summary.md"), renderSummaryPlaceholder());
119845
- await fs.appendFile(
119846
- path4.join(input.sessionPath, "transcript.md"),
119847
- `${renderTranscriptEntry(input)}
119848
- `,
119849
- "utf8"
119850
- );
119845
+ const transcriptPath = path4.join(input.sessionPath, "transcript.md");
119846
+ try {
119847
+ await fs.appendFile(transcriptPath, `${renderTranscriptEntry(input)}
119848
+ `, "utf8");
119849
+ } catch (e) {
119850
+ throw new Error(`failed to write ${transcriptPath}: ${e instanceof Error ? e.message : String(e)}`);
119851
+ }
119851
119852
  }
119852
119853
  var TRANSCRIPT_ANSWER_MAX_CHARS = 1500;
119853
119854
  var SEED_SUMMARY_MAX_CHARS = 2e3;
@@ -120248,7 +120249,7 @@ var KNOWLEDGE_DIFFSTAT_MAX_LINES = 4;
120248
120249
  function renderMemoryVisibilityTail(input) {
120249
120250
  const lines = [];
120250
120251
  if (input.changedWorkspaceFiles.length > 0) {
120251
- lines.push(`\u{1F4DD} \u672C\u8F6E\u671F\u95F4\u53D8\u66F4\u4E86 ${input.changedWorkspaceFiles.join("\u3001")}`);
120252
+ lines.push(`\u{1F4DD} \u672C\u8F6E\u671F\u95F4\u53D8\u66F4\u4E86 ${input.changedWorkspaceFiles.map((f) => f.replaceAll("\\", "/")).join("\u3001")}`);
120252
120253
  }
120253
120254
  if (input.knowledgeDiffstat && input.knowledgeDiffstat.trim() !== "") {
120254
120255
  const statLines = input.knowledgeDiffstat.trim().split("\n");
@@ -120326,7 +120327,25 @@ async function ensureRelativeSymlink(linkPath, target) {
120326
120327
  await fs4.rm(linkPath, { force: true });
120327
120328
  } catch {
120328
120329
  }
120329
- await fs4.symlink(target, linkPath, process.platform === "win32" ? "junction" : null);
120330
+ if (process.platform === "win32") {
120331
+ const resolved = path7.resolve(path7.dirname(linkPath), target);
120332
+ let isDir = false;
120333
+ try {
120334
+ isDir = (await fs4.stat(resolved)).isDirectory();
120335
+ } catch {
120336
+ }
120337
+ if (isDir) {
120338
+ await fs4.symlink(target, linkPath, "junction");
120339
+ return;
120340
+ }
120341
+ try {
120342
+ await fs4.symlink(target, linkPath, "file");
120343
+ } catch {
120344
+ await fs4.copyFile(resolved, linkPath);
120345
+ }
120346
+ return;
120347
+ }
120348
+ await fs4.symlink(target, linkPath);
120330
120349
  }
120331
120350
  function renderAgentsMd(input) {
120332
120351
  return [
@@ -129601,8 +129620,9 @@ import { spawn as nodeSpawn, spawnSync as nodeSpawnSync } from "node:child_proce
129601
129620
  import { accessSync, constants as fsConstants } from "node:fs";
129602
129621
  import path20 from "node:path";
129603
129622
  import process3 from "node:process";
129604
- var doSpawn = ((...args) => (process3.platform === "win32" ? import_cross_spawn.default : nodeSpawn)(...args));
129605
- var doSpawnSync = ((...args) => (process3.platform === "win32" ? import_cross_spawn.default.sync : nodeSpawnSync)(
129623
+ var useCrossSpawn = () => process3.platform === "win32" && process3.env["VITEST"] === void 0;
129624
+ var doSpawn = ((...args) => (useCrossSpawn() ? import_cross_spawn.default : nodeSpawn)(...args));
129625
+ var doSpawnSync = ((...args) => (useCrossSpawn() ? import_cross_spawn.default.sync : nodeSpawnSync)(
129606
129626
  ...args
129607
129627
  ));
129608
129628
  function spawnPiped(command, args = [], options = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkway",
3
- "version": "0.3.61",
3
+ "version": "0.3.62",
4
4
  "description": "Thin bridge: Feishu thread to local Claude Code CLI",
5
5
  "license": "MIT",
6
6
  "author": "Chuck Wu (chuckwu0)",