@agentteams/runner 0.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/api-client.d.ts +22 -0
  2. package/dist/api-client.js +201 -0
  3. package/dist/api-client.js.map +1 -0
  4. package/dist/api-client.test.d.ts +1 -0
  5. package/dist/api-client.test.js +118 -0
  6. package/dist/api-client.test.js.map +1 -0
  7. package/dist/autostart.d.ts +19 -0
  8. package/dist/autostart.js +359 -0
  9. package/dist/autostart.js.map +1 -0
  10. package/dist/autostart.test.d.ts +1 -0
  11. package/dist/autostart.test.js +42 -0
  12. package/dist/autostart.test.js.map +1 -0
  13. package/dist/commands/cleanup.d.ts +1 -0
  14. package/dist/commands/cleanup.js +12 -0
  15. package/dist/commands/cleanup.js.map +1 -0
  16. package/dist/commands/init.d.ts +1 -0
  17. package/dist/commands/init.js +57 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/restart.d.ts +1 -0
  20. package/dist/commands/restart.js +7 -0
  21. package/dist/commands/restart.js.map +1 -0
  22. package/dist/commands/start.d.ts +1 -0
  23. package/dist/commands/start.js +34 -0
  24. package/dist/commands/start.js.map +1 -0
  25. package/dist/commands/status.d.ts +1 -0
  26. package/dist/commands/status.js +20 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +1 -0
  29. package/dist/commands/stop.js +21 -0
  30. package/dist/commands/stop.js.map +1 -0
  31. package/dist/commands/uninstall.d.ts +1 -0
  32. package/dist/commands/uninstall.js +21 -0
  33. package/dist/commands/uninstall.js.map +1 -0
  34. package/dist/commands/update.d.ts +10 -0
  35. package/dist/commands/update.js +58 -0
  36. package/dist/commands/update.js.map +1 -0
  37. package/dist/commands/update.test.d.ts +1 -0
  38. package/dist/commands/update.test.js +104 -0
  39. package/dist/commands/update.test.js.map +1 -0
  40. package/dist/config.d.ts +6 -0
  41. package/dist/config.js +69 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/config.test.d.ts +1 -0
  44. package/dist/config.test.js +133 -0
  45. package/dist/config.test.js.map +1 -0
  46. package/dist/daemon-control.d.ts +21 -0
  47. package/dist/daemon-control.js +58 -0
  48. package/dist/daemon-control.js.map +1 -0
  49. package/dist/daemon-control.test.d.ts +1 -0
  50. package/dist/daemon-control.test.js +48 -0
  51. package/dist/daemon-control.test.js.map +1 -0
  52. package/dist/executable.d.ts +25 -0
  53. package/dist/executable.js +141 -0
  54. package/dist/executable.js.map +1 -0
  55. package/dist/executable.test.d.ts +1 -0
  56. package/dist/executable.test.js +57 -0
  57. package/dist/executable.test.js.map +1 -0
  58. package/dist/handlers/trigger-handler.d.ts +25 -0
  59. package/dist/handlers/trigger-handler.js +308 -0
  60. package/dist/handlers/trigger-handler.js.map +1 -0
  61. package/dist/handlers/trigger-handler.test.d.ts +1 -0
  62. package/dist/handlers/trigger-handler.test.js +496 -0
  63. package/dist/handlers/trigger-handler.test.js.map +1 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.js +82 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/logger.d.ts +5 -0
  68. package/dist/logger.js +25 -0
  69. package/dist/logger.js.map +1 -0
  70. package/dist/pid.d.ts +8 -0
  71. package/dist/pid.js +49 -0
  72. package/dist/pid.js.map +1 -0
  73. package/dist/poller.d.ts +20 -0
  74. package/dist/poller.js +214 -0
  75. package/dist/poller.js.map +1 -0
  76. package/dist/poller.test.d.ts +1 -0
  77. package/dist/poller.test.js +382 -0
  78. package/dist/poller.test.js.map +1 -0
  79. package/dist/runners/amp.d.ts +5 -0
  80. package/dist/runners/amp.js +316 -0
  81. package/dist/runners/amp.js.map +1 -0
  82. package/dist/runners/claude-code.d.ts +6 -0
  83. package/dist/runners/claude-code.js +340 -0
  84. package/dist/runners/claude-code.js.map +1 -0
  85. package/dist/runners/claude-code.test.d.ts +1 -0
  86. package/dist/runners/claude-code.test.js +39 -0
  87. package/dist/runners/claude-code.test.js.map +1 -0
  88. package/dist/runners/codex.d.ts +6 -0
  89. package/dist/runners/codex.js +324 -0
  90. package/dist/runners/codex.js.map +1 -0
  91. package/dist/runners/codex.test.d.ts +1 -0
  92. package/dist/runners/codex.test.js +66 -0
  93. package/dist/runners/codex.test.js.map +1 -0
  94. package/dist/runners/gemini.d.ts +5 -0
  95. package/dist/runners/gemini.js +304 -0
  96. package/dist/runners/gemini.js.map +1 -0
  97. package/dist/runners/gemini.test.d.ts +1 -0
  98. package/dist/runners/gemini.test.js +16 -0
  99. package/dist/runners/gemini.test.js.map +1 -0
  100. package/dist/runners/index.d.ts +2 -0
  101. package/dist/runners/index.js +27 -0
  102. package/dist/runners/index.js.map +1 -0
  103. package/dist/runners/index.test.d.ts +1 -0
  104. package/dist/runners/index.test.js +19 -0
  105. package/dist/runners/index.test.js.map +1 -0
  106. package/dist/runners/log-reporter.d.ts +18 -0
  107. package/dist/runners/log-reporter.js +127 -0
  108. package/dist/runners/log-reporter.js.map +1 -0
  109. package/dist/runners/log-reporter.test.d.ts +1 -0
  110. package/dist/runners/log-reporter.test.js +152 -0
  111. package/dist/runners/log-reporter.test.js.map +1 -0
  112. package/dist/runners/opencode.d.ts +6 -0
  113. package/dist/runners/opencode.js +304 -0
  114. package/dist/runners/opencode.js.map +1 -0
  115. package/dist/runners/stream-json-parser.d.ts +17 -0
  116. package/dist/runners/stream-json-parser.js +116 -0
  117. package/dist/runners/stream-json-parser.js.map +1 -0
  118. package/dist/runners/types.d.ts +26 -0
  119. package/dist/runners/types.js +2 -0
  120. package/dist/runners/types.js.map +1 -0
  121. package/dist/types.d.ts +69 -0
  122. package/dist/types.js +2 -0
  123. package/dist/types.js.map +1 -0
  124. package/dist/utils/auth-path-store.d.ts +3 -0
  125. package/dist/utils/auth-path-store.js +37 -0
  126. package/dist/utils/auth-path-store.js.map +1 -0
  127. package/dist/utils/auth-path-store.test.d.ts +1 -0
  128. package/dist/utils/auth-path-store.test.js +70 -0
  129. package/dist/utils/auth-path-store.test.js.map +1 -0
  130. package/dist/utils/convention-sync.d.ts +8 -0
  131. package/dist/utils/convention-sync.js +41 -0
  132. package/dist/utils/convention-sync.js.map +1 -0
  133. package/dist/utils/convention-sync.test.d.ts +1 -0
  134. package/dist/utils/convention-sync.test.js +75 -0
  135. package/dist/utils/convention-sync.test.js.map +1 -0
  136. package/dist/utils/git-worktree.d.ts +9 -0
  137. package/dist/utils/git-worktree.js +150 -0
  138. package/dist/utils/git-worktree.js.map +1 -0
  139. package/dist/utils/git-worktree.test.d.ts +1 -0
  140. package/dist/utils/git-worktree.test.js +294 -0
  141. package/dist/utils/git-worktree.test.js.map +1 -0
  142. package/dist/utils/origin-issue-safeguard.d.ts +16 -0
  143. package/dist/utils/origin-issue-safeguard.js +198 -0
  144. package/dist/utils/origin-issue-safeguard.js.map +1 -0
  145. package/dist/utils/runner-cleanup.d.ts +10 -0
  146. package/dist/utils/runner-cleanup.js +59 -0
  147. package/dist/utils/runner-cleanup.js.map +1 -0
  148. package/dist/utils/runner-cleanup.test.d.ts +1 -0
  149. package/dist/utils/runner-cleanup.test.js +93 -0
  150. package/dist/utils/runner-cleanup.test.js.map +1 -0
  151. package/dist/utils/runner-history.d.ts +6 -0
  152. package/dist/utils/runner-history.js +13 -0
  153. package/dist/utils/runner-history.js.map +1 -0
  154. package/dist/utils/runner-history.test.d.ts +1 -0
  155. package/dist/utils/runner-history.test.js +25 -0
  156. package/dist/utils/runner-history.test.js.map +1 -0
  157. package/package.json +50 -0
  158. package/readme.md +188 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runners/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ export type OsType = "MACOS" | "LINUX" | "WINDOWS";
2
+ export type RuntimeConfig = {
3
+ daemonToken: string;
4
+ apiUrl: string;
5
+ pollingIntervalMs: number;
6
+ timeoutMs: number;
7
+ idleTimeoutMs: number;
8
+ runnerCmd: string;
9
+ };
10
+ export type DaemonConfigFile = {
11
+ daemonToken: string;
12
+ apiUrl: string;
13
+ };
14
+ export type DaemonInfo = {
15
+ id: string;
16
+ memberId: string;
17
+ label: string | null;
18
+ osType: OsType | null;
19
+ supportedEngines: string[];
20
+ lastSeenAt: string | null;
21
+ createdAt: string;
22
+ updatedAt: string;
23
+ };
24
+ export type DaemonTrigger = {
25
+ id: string;
26
+ prompt: string | Record<string, unknown>;
27
+ runnerType: string;
28
+ model: string | null;
29
+ status: string;
30
+ agentConfigId: string;
31
+ startedAt: string | null;
32
+ errorMessage: string | null;
33
+ worktreeError: string | null;
34
+ lastHeartbeatAt: string | null;
35
+ conversationId: string | null;
36
+ parentTriggerId: string | null;
37
+ createdByMemberId: string;
38
+ targetDaemonId: string | null;
39
+ planMode: boolean;
40
+ claimedByDaemonId: string | null;
41
+ useWorktree: boolean;
42
+ baseBranch: string | null;
43
+ worktreeId: string | null;
44
+ worktreeStatus: string | null;
45
+ createdAt: string;
46
+ updatedAt: string;
47
+ };
48
+ export type TriggerFinalStatus = "DONE" | "CANCELLED" | "FAILED" | "REJECTED";
49
+ export type ClaimResult = {
50
+ ok: boolean;
51
+ conflict: boolean;
52
+ };
53
+ export type TriggerRuntime = {
54
+ triggerId: string;
55
+ agentConfigId: string;
56
+ authPath: string | null;
57
+ apiKey: string;
58
+ teamId: string;
59
+ projectId: string;
60
+ parentHistoryMarkdown: string | null;
61
+ useWorktree: boolean;
62
+ baseBranch: string | null;
63
+ worktreeId: string | null;
64
+ };
65
+ export type TriggerLogLevel = "INFO" | "WARN" | "ERROR";
66
+ export type TriggerLogInput = {
67
+ level: TriggerLogLevel;
68
+ message: string;
69
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare const getAuthPathStorePath: () => string;
2
+ export declare const loadAuthPaths: (filePath?: string) => string[];
3
+ export declare const saveAuthPath: (authPath: string, filePath?: string) => string;
@@ -0,0 +1,37 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ const normalizeAuthPaths = (value) => {
5
+ if (!Array.isArray(value)) {
6
+ return [];
7
+ }
8
+ return [...new Set(value.filter((entry) => typeof entry === "string" && entry.length > 0))];
9
+ };
10
+ export const getAuthPathStorePath = () => {
11
+ return join(homedir(), ".agentteams", "auth-paths.json");
12
+ };
13
+ export const loadAuthPaths = (filePath = getAuthPathStorePath()) => {
14
+ if (!existsSync(filePath)) {
15
+ return [];
16
+ }
17
+ try {
18
+ const parsed = JSON.parse(readFileSync(filePath, "utf8"));
19
+ if (Array.isArray(parsed)) {
20
+ return normalizeAuthPaths(parsed);
21
+ }
22
+ return normalizeAuthPaths(parsed.authPaths);
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ };
28
+ export const saveAuthPath = (authPath, filePath = getAuthPathStorePath()) => {
29
+ const authPaths = loadAuthPaths(filePath);
30
+ if (authPaths.includes(authPath)) {
31
+ return filePath;
32
+ }
33
+ mkdirSync(dirname(filePath), { recursive: true });
34
+ writeFileSync(filePath, JSON.stringify({ authPaths: [...authPaths, authPath] }, null, 2), "utf8");
35
+ return filePath;
36
+ };
37
+ //# sourceMappingURL=auth-path-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-path-store.js","sourceRoot":"","sources":["../../src/utils/auth-path-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAM1C,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAY,EAAE;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAW,EAAE;IAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,WAAmB,oBAAoB,EAAE,EAAY,EAAE;IACnF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAA6B,CAAC;QACtF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,WAAmB,oBAAoB,EAAE,EAAU,EAAE;IAClG,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAClG,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import test from "node:test";
6
+ import { getAuthPathStorePath, loadAuthPaths, saveAuthPath } from "./auth-path-store.js";
7
+ const envKeys = [
8
+ "HOME",
9
+ "USERPROFILE",
10
+ "HOMEDRIVE",
11
+ "HOMEPATH",
12
+ ];
13
+ const withTempHome = async (run) => {
14
+ const previousEnv = new Map();
15
+ for (const key of envKeys) {
16
+ previousEnv.set(key, process.env[key]);
17
+ delete process.env[key];
18
+ }
19
+ const homeDir = await mkdtemp(join(tmpdir(), "auth-path-store-test-"));
20
+ process.env.HOME = homeDir;
21
+ process.env.USERPROFILE = homeDir;
22
+ process.env.HOMEDRIVE = "";
23
+ process.env.HOMEPATH = "";
24
+ try {
25
+ await run(homeDir);
26
+ }
27
+ finally {
28
+ await rm(homeDir, { recursive: true, force: true });
29
+ for (const key of envKeys) {
30
+ const value = previousEnv.get(key);
31
+ if (value === undefined) {
32
+ delete process.env[key];
33
+ }
34
+ else {
35
+ process.env[key] = value;
36
+ }
37
+ }
38
+ }
39
+ };
40
+ test("loadAuthPaths returns an empty array when the store does not exist", async () => {
41
+ await withTempHome(async () => {
42
+ assert.deepEqual(loadAuthPaths(), []);
43
+ });
44
+ });
45
+ test("saveAuthPath persists unique auth paths in the daemon home directory", async () => {
46
+ await withTempHome(async (homeDir) => {
47
+ const expectedPath = join(homeDir, ".agentteams", "auth-paths.json");
48
+ const savedPath = saveAuthPath("/repo/one");
49
+ saveAuthPath("/repo/one");
50
+ saveAuthPath("/repo/two");
51
+ assert.equal(savedPath, expectedPath);
52
+ assert.equal(getAuthPathStorePath(), expectedPath);
53
+ assert.deepEqual(loadAuthPaths(), ["/repo/one", "/repo/two"]);
54
+ const content = JSON.parse(await readFile(expectedPath, "utf8"));
55
+ assert.deepEqual(content, {
56
+ authPaths: ["/repo/one", "/repo/two"]
57
+ });
58
+ });
59
+ });
60
+ test("loadAuthPaths tolerates invalid or legacy store formats", async () => {
61
+ await withTempHome(async () => {
62
+ const filePath = getAuthPathStorePath();
63
+ await mkdir(join(filePath, ".."), { recursive: true });
64
+ await writeFile(filePath, "{invalid", "utf8");
65
+ assert.deepEqual(loadAuthPaths(), []);
66
+ await writeFile(filePath, JSON.stringify(["/repo/one", "/repo/one", 123]), "utf8");
67
+ assert.deepEqual(loadAuthPaths(), ["/repo/one"]);
68
+ });
69
+ });
70
+ //# sourceMappingURL=auth-path-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-path-store.test.js","sourceRoot":"","sources":["../../src/utils/auth-path-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { spawn } from "node:child_process";
2
+ import { logger } from "../logger.js";
3
+ type ConventionSyncDeps = {
4
+ spawn?: typeof spawn;
5
+ logger?: Pick<typeof logger, "info" | "warn">;
6
+ };
7
+ export declare const runConventionSync: (authPath: string, deps?: ConventionSyncDeps) => Promise<void>;
8
+ export {};
@@ -0,0 +1,41 @@
1
+ import { spawn } from "node:child_process";
2
+ import { logger } from "../logger.js";
3
+ export const runConventionSync = async (authPath, deps = {}) => {
4
+ const log = deps.logger ?? logger;
5
+ const spawnFn = deps.spawn ?? spawn;
6
+ try {
7
+ const exitCode = await new Promise((resolve) => {
8
+ const child = spawnFn("agentteams", ["convention", "download"], {
9
+ cwd: authPath,
10
+ shell: true,
11
+ stdio: "ignore",
12
+ });
13
+ child.on("error", (err) => {
14
+ log.warn("Convention sync spawn error", {
15
+ authPath,
16
+ error: err.message,
17
+ });
18
+ resolve(null);
19
+ });
20
+ child.on("close", (code) => {
21
+ resolve(code);
22
+ });
23
+ });
24
+ if (exitCode === 0) {
25
+ log.info("Convention sync completed", { authPath });
26
+ }
27
+ else if (exitCode !== null) {
28
+ log.warn("Convention sync exited with non-zero code", {
29
+ authPath,
30
+ exitCode,
31
+ });
32
+ }
33
+ }
34
+ catch (error) {
35
+ log.warn("Convention sync failed", {
36
+ authPath,
37
+ error: error instanceof Error ? error.message : String(error),
38
+ });
39
+ }
40
+ };
41
+ //# sourceMappingURL=convention-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convention-sync.js","sourceRoot":"","sources":["../../src/utils/convention-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAgB,EAAE,OAA2B,EAAE,EAAiB,EAAE;IACxG,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;YAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE;gBAC9D,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;oBACtC,QAAQ;oBACR,KAAK,EAAE,GAAG,CAAC,OAAO;iBACnB,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,2CAA2C,EAAE;gBACpD,QAAQ;gBACR,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACjC,QAAQ;YACR,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ import assert from "node:assert/strict";
2
+ import test, { mock } from "node:test";
3
+ import { EventEmitter } from "node:events";
4
+ import { runConventionSync } from "./convention-sync.js";
5
+ const createFakeSpawn = (exitCode, error) => {
6
+ return (_cmd, _args, _opts) => {
7
+ const child = new EventEmitter();
8
+ process.nextTick(() => {
9
+ if (error) {
10
+ child.emit("error", error);
11
+ }
12
+ else {
13
+ child.emit("close", exitCode);
14
+ }
15
+ });
16
+ return child;
17
+ };
18
+ };
19
+ test.afterEach(() => {
20
+ mock.restoreAll();
21
+ });
22
+ test("runConventionSync logs info on exit code 0", async () => {
23
+ const logs = [];
24
+ const fakeLogger = {
25
+ info: (message, meta) => { logs.push({ level: "info", message, meta }); },
26
+ warn: (message, meta) => { logs.push({ level: "warn", message, meta }); },
27
+ };
28
+ await runConventionSync("/fake/path", {
29
+ spawn: createFakeSpawn(0),
30
+ logger: fakeLogger,
31
+ });
32
+ assert.equal(logs.length, 1);
33
+ assert.equal(logs[0].level, "info");
34
+ assert.match(logs[0].message, /completed/i);
35
+ });
36
+ test("runConventionSync logs warn on non-zero exit code", async () => {
37
+ const logs = [];
38
+ const fakeLogger = {
39
+ info: (message, meta) => { logs.push({ level: "info", message, meta }); },
40
+ warn: (message, meta) => { logs.push({ level: "warn", message, meta }); },
41
+ };
42
+ await runConventionSync("/fake/path", {
43
+ spawn: createFakeSpawn(1),
44
+ logger: fakeLogger,
45
+ });
46
+ assert.equal(logs.length, 1);
47
+ assert.equal(logs[0].level, "warn");
48
+ assert.match(logs[0].message, /non-zero/i);
49
+ });
50
+ test("runConventionSync logs warn on spawn error", async () => {
51
+ const logs = [];
52
+ const fakeLogger = {
53
+ info: (message, meta) => { logs.push({ level: "info", message, meta }); },
54
+ warn: (message, meta) => { logs.push({ level: "warn", message, meta }); },
55
+ };
56
+ await runConventionSync("/fake/path", {
57
+ spawn: createFakeSpawn(null, new Error("ENOENT")),
58
+ logger: fakeLogger,
59
+ });
60
+ assert.equal(logs.length, 1);
61
+ assert.equal(logs[0].level, "warn");
62
+ assert.match(logs[0].message, /spawn error/i);
63
+ });
64
+ test("runConventionSync never throws", async () => {
65
+ const fakeLogger = {
66
+ info: () => { },
67
+ warn: () => { },
68
+ };
69
+ const throwingSpawn = () => { throw new Error("unexpected"); };
70
+ await assert.doesNotReject(runConventionSync("/fake/path", {
71
+ spawn: throwingSpawn,
72
+ logger: fakeLogger,
73
+ }));
74
+ });
75
+ //# sourceMappingURL=convention-sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convention-sync.test.js","sourceRoot":"","sources":["../../src/utils/convention-sync.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function isGitRepo(dirPath: string): boolean;
2
+ export declare function resolveWorktreePath(authPath: string, worktreeId: string): string;
3
+ export declare function normalizeClaudeSandboxPath(authPath: string): string;
4
+ export declare function healWorktreeConfig(authPath: string, worktreePath: string): void;
5
+ export declare function createWorktree(authPath: string, options: {
6
+ worktreeId: string;
7
+ baseBranch?: string | null;
8
+ }): string;
9
+ export declare function removeWorktree(authPath: string, worktreePath: string, worktreeId: string): void;
@@ -0,0 +1,150 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, rmSync, symlinkSync } from "node:fs";
3
+ import path from "node:path";
4
+ export function isGitRepo(dirPath) {
5
+ try {
6
+ execFileSync("git", ["rev-parse", "--is-inside-work-tree"], {
7
+ cwd: dirPath,
8
+ stdio: "pipe"
9
+ });
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export function resolveWorktreePath(authPath, worktreeId) {
17
+ if (/[\/\\]|\.\./.test(worktreeId)) {
18
+ throw new Error('Invalid worktreeId: path traversal characters detected');
19
+ }
20
+ const repoName = path.basename(authPath);
21
+ return path.join(path.dirname(authPath), `.${repoName}-worktrees`, `wt-${worktreeId}`);
22
+ }
23
+ export function normalizeClaudeSandboxPath(authPath) {
24
+ return authPath;
25
+ }
26
+ export function healWorktreeConfig(authPath, worktreePath) {
27
+ // Ensure .agentteams/ symlink exists
28
+ const sourceAgentteams = path.join(authPath, ".agentteams");
29
+ const targetAgentteams = path.join(worktreePath, ".agentteams");
30
+ if (existsSync(sourceAgentteams) && !existsSync(targetAgentteams)) {
31
+ try {
32
+ symlinkSync(sourceAgentteams, targetAgentteams, "dir");
33
+ }
34
+ catch {
35
+ // Non-critical: agent can still work without conventions
36
+ }
37
+ }
38
+ // Claude Code runner uses --dangerously-skip-permissions, so no sandbox
39
+ // or permission settings are needed in settings.local.json.
40
+ }
41
+ export function createWorktree(authPath, options) {
42
+ const { worktreeId, baseBranch } = options;
43
+ const worktreePath = resolveWorktreePath(authPath, worktreeId);
44
+ const branchName = `worktree/${worktreeId}`;
45
+ if (!isGitRepo(authPath)) {
46
+ throw new Error(`Not a git repository: ${authPath}`);
47
+ }
48
+ // Reuse existing worktree (continue trigger case)
49
+ if (existsSync(worktreePath) && isGitRepo(worktreePath)) {
50
+ healWorktreeConfig(authPath, worktreePath);
51
+ return worktreePath;
52
+ }
53
+ const parentDir = path.dirname(worktreePath);
54
+ if (!existsSync(parentDir)) {
55
+ mkdirSync(parentDir, { recursive: true });
56
+ }
57
+ try {
58
+ const args = ["worktree", "add", "-b", branchName, worktreePath];
59
+ if (baseBranch) {
60
+ args.push(baseBranch);
61
+ }
62
+ execFileSync("git", args, { cwd: authPath, stdio: "pipe" });
63
+ }
64
+ catch (error) {
65
+ throw new Error(`Failed to create git worktree for worktreeId ${worktreeId}: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ healWorktreeConfig(authPath, worktreePath);
68
+ // Copy gitignored .env* files (root + workspace subdirs)
69
+ // Uses copy instead of symlink to avoid Prisma symlink resolution issues
70
+ try {
71
+ const copyEnvFiles = (dir, prefix = "") => {
72
+ try {
73
+ for (const entry of readdirSync(dir)) {
74
+ if (!entry.startsWith(".env"))
75
+ continue;
76
+ const relPath = prefix ? path.join(prefix, entry) : entry;
77
+ const absPath = path.join(authPath, relPath);
78
+ const wtPath = path.join(worktreePath, relPath);
79
+ // Git-tracked files (e.g. .env.example) already exist in worktree — skip them
80
+ if (existsSync(absPath) && !existsSync(wtPath)) {
81
+ copyFileSync(absPath, wtPath);
82
+ }
83
+ }
84
+ }
85
+ catch { /* ignore read errors */ }
86
+ };
87
+ // Root level
88
+ copyEnvFiles(authPath);
89
+ // First-level subdirectories (workspace level)
90
+ for (const entry of readdirSync(authPath, { withFileTypes: true })) {
91
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
92
+ copyEnvFiles(path.join(authPath, entry.name), entry.name);
93
+ }
94
+ }
95
+ }
96
+ catch {
97
+ // Non-critical: worktree can still work without env files
98
+ }
99
+ return worktreePath;
100
+ }
101
+ export function removeWorktree(authPath, worktreePath, worktreeId) {
102
+ const branchName = `worktree/${worktreeId}`;
103
+ if (!existsSync(worktreePath)) {
104
+ throw new Error(`Worktree path does not exist: ${worktreePath}`);
105
+ }
106
+ try {
107
+ execFileSync("git", ["worktree", "remove", worktreePath, "--force"], {
108
+ cwd: authPath,
109
+ stdio: "pipe"
110
+ });
111
+ }
112
+ catch {
113
+ // If worktree removal via git fails, try to clean up manually
114
+ if (existsSync(worktreePath)) {
115
+ rmSync(worktreePath, { recursive: true, force: true });
116
+ }
117
+ try {
118
+ execFileSync("git", ["worktree", "prune"], { cwd: authPath, stdio: "pipe" });
119
+ }
120
+ catch {
121
+ // Ignore prune errors
122
+ }
123
+ }
124
+ if (existsSync(worktreePath)) {
125
+ throw new Error(`Worktree directory still exists after removal: ${worktreePath}`);
126
+ }
127
+ try {
128
+ execFileSync("git", ["branch", "-D", branchName], {
129
+ cwd: authPath,
130
+ stdio: "pipe"
131
+ });
132
+ }
133
+ catch {
134
+ // Branch may not exist or already deleted; ignore
135
+ }
136
+ try {
137
+ execFileSync("git", ["ls-remote", "--exit-code", "origin", `refs/heads/${branchName}`], {
138
+ cwd: authPath,
139
+ stdio: "pipe"
140
+ });
141
+ execFileSync("git", ["push", "origin", "--delete", branchName], {
142
+ cwd: authPath,
143
+ stdio: "pipe"
144
+ });
145
+ }
146
+ catch {
147
+ // Remote branch may not exist or deletion may fail; ignore
148
+ }
149
+ }
150
+ //# sourceMappingURL=git-worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../../src/utils/git-worktree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};