@ipul-labs/forge 1.21.2 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -78
  3. package/dist/apple-touch-icon.png +0 -0
  4. package/dist/assets/index-BmEuPeOG.js +27 -0
  5. package/dist/assets/index-CSH1OQYQ.css +1 -0
  6. package/dist/boot-check.js +98 -0
  7. package/dist/favicon.svg +8 -0
  8. package/dist/icon-192.png +0 -0
  9. package/dist/icon-512.png +0 -0
  10. package/dist/icon.svg +12 -0
  11. package/dist/index.html +33 -0
  12. package/dist/manifest.webmanifest +18 -0
  13. package/dist/theme-init.js +11 -0
  14. package/lib/bin/cli/analyze.d.ts.map +1 -1
  15. package/lib/bin/cli/analyze.js +3 -44
  16. package/lib/bin/cli/analyze.js.map +1 -1
  17. package/lib/bin/cli/apply.d.ts.map +1 -1
  18. package/lib/bin/cli/apply.js +2 -20
  19. package/lib/bin/cli/apply.js.map +1 -1
  20. package/lib/bin/cli/cifix.d.ts.map +1 -1
  21. package/lib/bin/cli/cifix.js +4 -28
  22. package/lib/bin/cli/cifix.js.map +1 -1
  23. package/lib/bin/cli/close.d.ts.map +1 -1
  24. package/lib/bin/cli/close.js +2 -33
  25. package/lib/bin/cli/close.js.map +1 -1
  26. package/lib/bin/cli/createIssue.d.ts.map +1 -1
  27. package/lib/bin/cli/createIssue.js +3 -12
  28. package/lib/bin/cli/createIssue.js.map +1 -1
  29. package/lib/bin/cli/doctor.d.ts.map +1 -1
  30. package/lib/bin/cli/doctor.js +3 -4
  31. package/lib/bin/cli/doctor.js.map +1 -1
  32. package/lib/bin/cli/init.js +1 -10
  33. package/lib/bin/cli/init.js.map +1 -1
  34. package/lib/bin/cli/issue.d.ts.map +1 -1
  35. package/lib/bin/cli/issue.js +3 -12
  36. package/lib/bin/cli/issue.js.map +1 -1
  37. package/lib/bin/cli/issues.d.ts.map +1 -1
  38. package/lib/bin/cli/issues.js +3 -12
  39. package/lib/bin/cli/issues.js.map +1 -1
  40. package/lib/bin/cli/merge.d.ts.map +1 -1
  41. package/lib/bin/cli/merge.js +4 -20
  42. package/lib/bin/cli/merge.js.map +1 -1
  43. package/lib/bin/cli/refine.d.ts.map +1 -1
  44. package/lib/bin/cli/refine.js +2 -26
  45. package/lib/bin/cli/refine.js.map +1 -1
  46. package/lib/bin/cli/repl.d.ts.map +1 -1
  47. package/lib/bin/cli/repl.js +4 -13
  48. package/lib/bin/cli/repl.js.map +1 -1
  49. package/lib/bin/cli/repos.d.ts.map +1 -1
  50. package/lib/bin/cli/repos.js +1 -11
  51. package/lib/bin/cli/repos.js.map +1 -1
  52. package/lib/bin/cli/resetPassword.d.ts +21 -0
  53. package/lib/bin/cli/resetPassword.d.ts.map +1 -0
  54. package/lib/bin/cli/resetPassword.js +69 -0
  55. package/lib/bin/cli/resetPassword.js.map +1 -0
  56. package/lib/bin/cli/resolution.d.ts.map +1 -1
  57. package/lib/bin/cli/resolution.js +2 -19
  58. package/lib/bin/cli/resolution.js.map +1 -1
  59. package/lib/bin/cli/serverClient.d.ts +2 -0
  60. package/lib/bin/cli/serverClient.d.ts.map +1 -1
  61. package/lib/bin/cli/serverClient.js +8 -4
  62. package/lib/bin/cli/serverClient.js.map +1 -1
  63. package/lib/bin/cli/session.d.ts.map +1 -1
  64. package/lib/bin/cli/session.js.map +1 -1
  65. package/lib/bin/cli/sessionStore.d.ts +1 -1
  66. package/lib/bin/cli/sessionStore.js +2 -2
  67. package/lib/bin/cli/sessionStore.js.map +1 -1
  68. package/lib/bin/cli/ship.d.ts.map +1 -1
  69. package/lib/bin/cli/ship.js +15 -23
  70. package/lib/bin/cli/ship.js.map +1 -1
  71. package/lib/bin/cli/update.d.ts.map +1 -1
  72. package/lib/bin/cli/update.js +34 -28
  73. package/lib/bin/cli/update.js.map +1 -1
  74. package/lib/bin/cli/updatePlan.d.ts +30 -0
  75. package/lib/bin/cli/updatePlan.d.ts.map +1 -0
  76. package/lib/bin/cli/updatePlan.js +50 -0
  77. package/lib/bin/cli/updatePlan.js.map +1 -0
  78. package/lib/bin/cli/utils.d.ts +3 -0
  79. package/lib/bin/cli/utils.d.ts.map +1 -1
  80. package/lib/bin/cli/utils.js +7 -23
  81. package/lib/bin/cli/utils.js.map +1 -1
  82. package/lib/bin/cli/validate.d.ts.map +1 -1
  83. package/lib/bin/cli/validate.js +3 -25
  84. package/lib/bin/cli/validate.js.map +1 -1
  85. package/lib/bin/cli/watch.d.ts.map +1 -1
  86. package/lib/bin/cli/watch.js +3 -12
  87. package/lib/bin/cli/watch.js.map +1 -1
  88. package/lib/bin/forge-agent.js +10 -22
  89. package/lib/bin/forge-agent.js.map +1 -1
  90. package/lib/server/app.d.ts +24 -0
  91. package/lib/server/app.d.ts.map +1 -0
  92. package/lib/server/app.js +58 -0
  93. package/lib/server/app.js.map +1 -0
  94. package/lib/server/forge/analyses/analysisStore.d.ts +53 -0
  95. package/lib/server/forge/analyses/analysisStore.d.ts.map +1 -0
  96. package/lib/server/forge/analyses/analysisStore.js +77 -0
  97. package/lib/server/forge/analyses/analysisStore.js.map +1 -0
  98. package/lib/server/forge/auth/apiTokens.d.ts +34 -0
  99. package/lib/server/forge/auth/apiTokens.d.ts.map +1 -0
  100. package/lib/server/forge/auth/apiTokens.js +44 -0
  101. package/lib/server/forge/auth/apiTokens.js.map +1 -0
  102. package/lib/server/forge/auth/auditLog.d.ts +36 -0
  103. package/lib/server/forge/auth/auditLog.d.ts.map +1 -0
  104. package/lib/server/forge/auth/auditLog.js +56 -0
  105. package/lib/server/forge/auth/auditLog.js.map +1 -0
  106. package/lib/server/forge/auth/authConfig.d.ts +13 -0
  107. package/lib/server/forge/auth/authConfig.d.ts.map +1 -0
  108. package/lib/server/forge/auth/authConfig.js +37 -0
  109. package/lib/server/forge/auth/authConfig.js.map +1 -0
  110. package/lib/server/forge/auth/createAuth.d.ts +130 -0
  111. package/lib/server/forge/auth/createAuth.d.ts.map +1 -0
  112. package/lib/server/forge/auth/createAuth.js +387 -0
  113. package/lib/server/forge/auth/createAuth.js.map +1 -0
  114. package/lib/server/forge/auth/middleware.d.ts +10 -0
  115. package/lib/server/forge/auth/middleware.d.ts.map +1 -0
  116. package/lib/server/forge/auth/middleware.js +22 -0
  117. package/lib/server/forge/auth/middleware.js.map +1 -0
  118. package/lib/server/forge/auth/oidc.d.ts +38 -0
  119. package/lib/server/forge/auth/oidc.d.ts.map +1 -0
  120. package/lib/server/forge/auth/oidc.js +63 -0
  121. package/lib/server/forge/auth/oidc.js.map +1 -0
  122. package/lib/server/forge/auth/passwords.d.ts +7 -0
  123. package/lib/server/forge/auth/passwords.d.ts.map +1 -0
  124. package/lib/server/forge/auth/passwords.js +28 -0
  125. package/lib/server/forge/auth/passwords.js.map +1 -0
  126. package/lib/server/forge/auth/resetPassword.d.ts +14 -0
  127. package/lib/server/forge/auth/resetPassword.d.ts.map +1 -0
  128. package/lib/server/forge/auth/resetPassword.js +29 -0
  129. package/lib/server/forge/auth/resetPassword.js.map +1 -0
  130. package/lib/server/forge/auth/roles.d.ts +7 -0
  131. package/lib/server/forge/auth/roles.d.ts.map +1 -0
  132. package/lib/server/forge/auth/roles.js +15 -0
  133. package/lib/server/forge/auth/roles.js.map +1 -0
  134. package/lib/server/forge/auth/sessions.d.ts +27 -0
  135. package/lib/server/forge/auth/sessions.d.ts.map +1 -0
  136. package/lib/server/forge/auth/sessions.js +37 -0
  137. package/lib/server/forge/auth/sessions.js.map +1 -0
  138. package/lib/server/forge/auth/testHarness.d.ts +104 -0
  139. package/lib/server/forge/auth/testHarness.d.ts.map +1 -0
  140. package/lib/server/forge/auth/testHarness.js +53 -0
  141. package/lib/server/forge/auth/testHarness.js.map +1 -0
  142. package/lib/server/forge/auth/tokenHash.d.ts +3 -0
  143. package/lib/server/forge/auth/tokenHash.d.ts.map +1 -0
  144. package/lib/server/forge/auth/tokenHash.js +4 -0
  145. package/lib/server/forge/auth/tokenHash.js.map +1 -0
  146. package/lib/server/forge/auth/users.d.ts +51 -0
  147. package/lib/server/forge/auth/users.d.ts.map +1 -0
  148. package/lib/server/forge/auth/users.js +118 -0
  149. package/lib/server/forge/auth/users.js.map +1 -0
  150. package/lib/server/forge/core/ForgeAgent.d.ts +58 -1
  151. package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -1
  152. package/lib/server/forge/core/ForgeAgent.js +280 -32
  153. package/lib/server/forge/core/ForgeAgent.js.map +1 -1
  154. package/lib/server/forge/core/agentClient.d.ts +7 -5
  155. package/lib/server/forge/core/agentClient.d.ts.map +1 -1
  156. package/lib/server/forge/core/agentClient.js +11 -15
  157. package/lib/server/forge/core/agentClient.js.map +1 -1
  158. package/lib/server/forge/core/agentMode.d.ts +38 -0
  159. package/lib/server/forge/core/agentMode.d.ts.map +1 -0
  160. package/lib/server/forge/core/agentMode.js +43 -0
  161. package/lib/server/forge/core/agentMode.js.map +1 -0
  162. package/lib/server/forge/core/claudeClient.d.ts +63 -0
  163. package/lib/server/forge/core/claudeClient.d.ts.map +1 -1
  164. package/lib/server/forge/core/claudeClient.js +142 -50
  165. package/lib/server/forge/core/claudeClient.js.map +1 -1
  166. package/lib/server/forge/core/configStore.d.ts +12 -1
  167. package/lib/server/forge/core/configStore.d.ts.map +1 -1
  168. package/lib/server/forge/core/configStore.js +39 -2
  169. package/lib/server/forge/core/configStore.js.map +1 -1
  170. package/lib/server/forge/core/dependencyPaths.d.ts +19 -0
  171. package/lib/server/forge/core/dependencyPaths.d.ts.map +1 -0
  172. package/lib/server/forge/core/dependencyPaths.js +32 -0
  173. package/lib/server/forge/core/dependencyPaths.js.map +1 -0
  174. package/lib/server/forge/core/evidence.d.ts +43 -0
  175. package/lib/server/forge/core/evidence.d.ts.map +1 -0
  176. package/lib/server/forge/core/evidence.js +108 -0
  177. package/lib/server/forge/core/evidence.js.map +1 -0
  178. package/lib/server/forge/core/jobs.d.ts +2 -0
  179. package/lib/server/forge/core/jobs.d.ts.map +1 -1
  180. package/lib/server/forge/core/jobs.js +8 -0
  181. package/lib/server/forge/core/jobs.js.map +1 -1
  182. package/lib/server/forge/core/localRepo.d.ts +48 -7
  183. package/lib/server/forge/core/localRepo.d.ts.map +1 -1
  184. package/lib/server/forge/core/localRepo.js +123 -69
  185. package/lib/server/forge/core/localRepo.js.map +1 -1
  186. package/lib/server/forge/core/prompts.d.ts +20 -0
  187. package/lib/server/forge/core/prompts.d.ts.map +1 -1
  188. package/lib/server/forge/core/prompts.js +59 -0
  189. package/lib/server/forge/core/prompts.js.map +1 -1
  190. package/lib/server/forge/core/providers/azuredevops.d.ts +4 -2
  191. package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -1
  192. package/lib/server/forge/core/providers/azuredevops.js +12 -2
  193. package/lib/server/forge/core/providers/azuredevops.js.map +1 -1
  194. package/lib/server/forge/core/providers/base.d.ts +29 -4
  195. package/lib/server/forge/core/providers/base.d.ts.map +1 -1
  196. package/lib/server/forge/core/providers/base.js +21 -3
  197. package/lib/server/forge/core/providers/base.js.map +1 -1
  198. package/lib/server/forge/core/providers/github.d.ts +7 -7
  199. package/lib/server/forge/core/providers/github.d.ts.map +1 -1
  200. package/lib/server/forge/core/providers/github.js +13 -4
  201. package/lib/server/forge/core/providers/github.js.map +1 -1
  202. package/lib/server/forge/core/providers/gitlab.d.ts +20 -3
  203. package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -1
  204. package/lib/server/forge/core/providers/gitlab.js +65 -5
  205. package/lib/server/forge/core/providers/gitlab.js.map +1 -1
  206. package/lib/server/forge/core/providers/types.d.ts +20 -0
  207. package/lib/server/forge/core/providers/types.d.ts.map +1 -1
  208. package/lib/server/forge/core/secretBox.d.ts +17 -0
  209. package/lib/server/forge/core/secretBox.d.ts.map +1 -0
  210. package/lib/server/forge/core/secretBox.js +74 -0
  211. package/lib/server/forge/core/secretBox.js.map +1 -0
  212. package/lib/server/forge/core/types.d.ts +8 -1
  213. package/lib/server/forge/core/types.d.ts.map +1 -1
  214. package/lib/server/forge/core/validator/clone.d.ts +5 -4
  215. package/lib/server/forge/core/validator/clone.d.ts.map +1 -1
  216. package/lib/server/forge/core/validator/clone.js +6 -86
  217. package/lib/server/forge/core/validator/clone.js.map +1 -1
  218. package/lib/server/forge/core/validator/cmd.d.ts.map +1 -1
  219. package/lib/server/forge/core/validator/cmd.js +4 -1
  220. package/lib/server/forge/core/validator/cmd.js.map +1 -1
  221. package/lib/server/forge/core/validator/projectType.d.ts.map +1 -1
  222. package/lib/server/forge/core/validator/projectType.js +2 -1
  223. package/lib/server/forge/core/validator/projectType.js.map +1 -1
  224. package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -1
  225. package/lib/server/forge/core/validator/runners/node.js +6 -2
  226. package/lib/server/forge/core/validator/runners/node.js.map +1 -1
  227. package/lib/server/forge/core/validator.d.ts.map +1 -1
  228. package/lib/server/forge/core/validator.js +28 -22
  229. package/lib/server/forge/core/validator.js.map +1 -1
  230. package/lib/server/forge/core/workspaces.d.ts +70 -0
  231. package/lib/server/forge/core/workspaces.d.ts.map +1 -0
  232. package/lib/server/forge/core/workspaces.js +348 -0
  233. package/lib/server/forge/core/workspaces.js.map +1 -0
  234. package/lib/server/forge/db/database.d.ts +22 -0
  235. package/lib/server/forge/db/database.d.ts.map +1 -0
  236. package/lib/server/forge/db/database.js +71 -0
  237. package/lib/server/forge/db/database.js.map +1 -0
  238. package/lib/server/forge/db/migrations.d.ts +11 -0
  239. package/lib/server/forge/db/migrations.d.ts.map +1 -0
  240. package/lib/server/forge/db/migrations.js +87 -0
  241. package/lib/server/forge/db/migrations.js.map +1 -0
  242. package/lib/server/forge/routes.d.ts.map +1 -1
  243. package/lib/server/forge/routes.js +413 -163
  244. package/lib/server/forge/routes.js.map +1 -1
  245. package/lib/server/forge/sse.d.ts +10 -0
  246. package/lib/server/forge/sse.d.ts.map +1 -0
  247. package/lib/server/forge/sse.js +22 -0
  248. package/lib/server/forge/sse.js.map +1 -0
  249. package/lib/server/spa.d.ts +12 -0
  250. package/lib/server/spa.d.ts.map +1 -0
  251. package/lib/server/spa.js +23 -0
  252. package/lib/server/spa.js.map +1 -0
  253. package/lib/server.js +9 -24
  254. package/lib/server.js.map +1 -1
  255. package/lib/shared/events.d.ts +3 -0
  256. package/lib/shared/events.d.ts.map +1 -1
  257. package/lib/shared/events.js +3 -0
  258. package/lib/shared/events.js.map +1 -1
  259. package/lib/shared/packageRoot.d.ts +11 -0
  260. package/lib/shared/packageRoot.d.ts.map +1 -0
  261. package/lib/shared/packageRoot.js +23 -0
  262. package/lib/shared/packageRoot.js.map +1 -0
  263. package/lib/shared/project.d.ts +3 -0
  264. package/lib/shared/project.d.ts.map +1 -0
  265. package/lib/shared/project.js +3 -0
  266. package/lib/shared/project.js.map +1 -0
  267. package/package.json +24 -9
  268. package/lib/bin/cli/improve.d.ts +0 -2
  269. package/lib/bin/cli/improve.d.ts.map +0 -1
  270. package/lib/bin/cli/improve.js +0 -189
  271. package/lib/bin/cli/improve.js.map +0 -1
  272. package/lib/bin/cli/stats.d.ts +0 -2
  273. package/lib/bin/cli/stats.d.ts.map +0 -1
  274. package/lib/bin/cli/stats.js +0 -78
  275. package/lib/bin/cli/stats.js.map +0 -1
  276. package/lib/server/forge/core/k8s.d.ts +0 -18
  277. package/lib/server/forge/core/k8s.d.ts.map +0 -1
  278. package/lib/server/forge/core/k8s.js +0 -49
  279. package/lib/server/forge/core/k8s.js.map +0 -1
  280. package/lib/server/forge/core/openclawClient.d.ts +0 -61
  281. package/lib/server/forge/core/openclawClient.d.ts.map +0 -1
  282. package/lib/server/forge/core/openclawClient.js +0 -111
  283. package/lib/server/forge/core/openclawClient.js.map +0 -1
  284. package/lib/server/forge/core/quotaClient.d.ts +0 -48
  285. package/lib/server/forge/core/quotaClient.d.ts.map +0 -1
  286. package/lib/server/forge/core/quotaClient.js +0 -88
  287. package/lib/server/forge/core/quotaClient.js.map +0 -1
  288. package/lib/server/forge/core/selfImprove.d.ts +0 -43
  289. package/lib/server/forge/core/selfImprove.d.ts.map +0 -1
  290. package/lib/server/forge/core/selfImprove.js +0 -372
  291. package/lib/server/forge/core/selfImprove.js.map +0 -1
  292. package/lib/server/forge/core/telemetry.d.ts +0 -100
  293. package/lib/server/forge/core/telemetry.d.ts.map +0 -1
  294. package/lib/server/forge/core/telemetry.js +0 -273
  295. package/lib/server/forge/core/telemetry.js.map +0 -1
  296. package/scripts/fix-shebang.cjs +0 -11
  297. package/scripts/inject-readme.cjs +0 -23
  298. package/scripts/local-rollout.sh +0 -134
@@ -0,0 +1,108 @@
1
+ /**
2
+ * server/forge/core/evidence.ts
3
+ *
4
+ * Evidence an agentic run gathers to prove its change — a write-up plus
5
+ * screenshots — so Forge can attach it to the merge request. Forge doesn't
6
+ * capture anything itself: the agent runs whatever it needs (Playwright, the
7
+ * test suite, …) and drops the results in EVIDENCE_DIR at the checkout root.
8
+ *
9
+ * The folder is listed in the clone's .git/info/exclude, so captureChanges
10
+ * never picks it up and nothing in it is committed.
11
+ */
12
+ import { execFile } from "node:child_process";
13
+ import fs from "node:fs/promises";
14
+ import path from "node:path";
15
+ export const EVIDENCE_DIR = ".forge-evidence";
16
+ export const EVIDENCE_NOTES_FILE = "EVIDENCE.md";
17
+ export const EVIDENCE_LIMITS = {
18
+ maxImages: 10,
19
+ maxImageBytes: 10 * 1024 * 1024,
20
+ };
21
+ const IMAGE_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp"]);
22
+ const EXCLUDE_LINE = `/${EVIDENCE_DIR}/`;
23
+ /**
24
+ * The repo's info/exclude file. In a linked worktree `.git` is a file, and the
25
+ * exclude lives in the shared git dir — so ask git rather than build the path.
26
+ */
27
+ function gitExcludePath(dir) {
28
+ return new Promise((resolve, reject) => {
29
+ execFile("git", ["rev-parse", "--path-format=absolute", "--git-path", "info/exclude"], { cwd: dir }, (err, stdout) => {
30
+ if (err)
31
+ reject(new Error(`Can't locate the git dir for ${dir}: ${err.message}`));
32
+ else
33
+ resolve(stdout.trim());
34
+ });
35
+ });
36
+ }
37
+ /** Empties the evidence folder (it survives `git clean`) and keeps it out of git. */
38
+ export async function prepareEvidenceDir(dir) {
39
+ const evidence = path.join(dir, EVIDENCE_DIR);
40
+ await fs.rm(evidence, { recursive: true, force: true });
41
+ await fs.mkdir(evidence, { recursive: true });
42
+ const excludePath = await gitExcludePath(dir);
43
+ const current = await fs.readFile(excludePath, "utf8").catch(() => "");
44
+ if (!current.split("\n").includes(EXCLUDE_LINE)) {
45
+ await fs.mkdir(path.dirname(excludePath), { recursive: true });
46
+ const sep = current && !current.endsWith("\n") ? "\n" : "";
47
+ await fs.writeFile(excludePath, `${current}${sep}${EXCLUDE_LINE}\n`);
48
+ }
49
+ return evidence;
50
+ }
51
+ async function listFiles(root, rel = "") {
52
+ const entries = await fs.readdir(path.join(root, rel), { withFileTypes: true }).catch(() => []);
53
+ const out = [];
54
+ for (const e of entries) {
55
+ const child = rel ? `${rel}/${e.name}` : e.name;
56
+ if (e.isDirectory())
57
+ out.push(...(await listFiles(root, child)));
58
+ else if (e.isFile())
59
+ out.push(child);
60
+ }
61
+ return out;
62
+ }
63
+ /** Reads what the agent left in the evidence folder. `skipped` lists images over the limits. */
64
+ export async function collectEvidence(dir) {
65
+ const root = path.join(dir, EVIDENCE_DIR);
66
+ const files = (await listFiles(root)).sort();
67
+ const notes = files.includes(EVIDENCE_NOTES_FILE)
68
+ ? (await fs.readFile(path.join(root, EVIDENCE_NOTES_FILE), "utf8")).trim() || null
69
+ : null;
70
+ const images = [];
71
+ const skipped = [];
72
+ for (const name of files) {
73
+ if (!IMAGE_EXTENSIONS.has(path.extname(name).toLowerCase()))
74
+ continue;
75
+ const full = path.join(root, name);
76
+ const { size } = await fs.stat(full);
77
+ if (size > EVIDENCE_LIMITS.maxImageBytes || images.length >= EVIDENCE_LIMITS.maxImages) {
78
+ skipped.push(name);
79
+ continue;
80
+ }
81
+ images.push({ name, data: await fs.readFile(full) });
82
+ }
83
+ return { notes, images, skipped };
84
+ }
85
+ /** Normalises a link target from the notes to an evidence-relative name. */
86
+ function evidenceName(target) {
87
+ return target.replace(/^\.\//, "").replace(new RegExp(`^${EVIDENCE_DIR.replace(".", "\\.")}/`), "");
88
+ }
89
+ /**
90
+ * Builds the markdown for the MR: the notes with image links pointed at the
91
+ * uploads, then any uploaded image the notes didn't mention. Null when empty.
92
+ */
93
+ export function renderEvidence({ notes, uploads }) {
94
+ const byName = new Map(uploads.map((u) => [u.name, u.url]));
95
+ const referenced = new Set();
96
+ const body = notes?.replace(/\]\(([^)\s]+)\)/g, (match, target) => {
97
+ const name = evidenceName(target);
98
+ const url = byName.get(name);
99
+ if (!url)
100
+ return match;
101
+ referenced.add(name);
102
+ return `](${url})`;
103
+ });
104
+ const rest = uploads.filter((u) => !referenced.has(u.name)).map((u) => `![${u.name}](${u.url})`);
105
+ const parts = [body, rest.join("\n")].filter((p) => Boolean(p));
106
+ return parts.length ? parts.join("\n\n") : null;
107
+ }
108
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../../server/forge/core/evidence.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,8 @@ export declare function createJob(type: string, runner: (send: (event: ForgeEven
46
46
  * terminal or doesn't exist — returns whether a cancel was actually issued.
47
47
  */
48
48
  export declare function cancelJob(id: string): boolean;
49
+ /** Jobs still working; a restart would kill them. */
50
+ export declare function countRunning(): number;
49
51
  export declare function getJob(id: string): JobRecord;
50
52
  /**
51
53
  * Replay buffered events to `handler`, then subscribe for live events until
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAyBrE;;;;;;;;;;GAUG;AACH,UAAU,gBAAgB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,wBAAgB,SAAS,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,EACpF,EAAE,QAAe,EAAE,UAAU,EAAE,IAAI,EAAE,GAAE,gBAAqB,UAuD5D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,WAiBnC;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,aAEhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,cAczE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAavD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,eAO3D"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAyBrE;;;;;;;;;;GAUG;AACH,UAAU,gBAAgB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,wBAAgB,SAAS,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,EACpF,EAAE,QAAe,EAAE,UAAU,EAAE,IAAI,EAAE,GAAE,gBAAqB,UAuD5D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,WAiBnC;AAED,qDAAqD;AACrD,wBAAgB,YAAY,WAI3B;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,aAEhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,cAczE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAavD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,eAO3D"}
@@ -127,6 +127,14 @@ export function cancelJob(id) {
127
127
  job.expiresAt = job.finishedAt + TTL_MS;
128
128
  return true;
129
129
  }
130
+ /** Jobs still working; a restart would kill them. */
131
+ export function countRunning() {
132
+ let n = 0;
133
+ for (const job of jobs.values())
134
+ if (job.status === "running")
135
+ n++;
136
+ return n;
137
+ }
130
138
  export function getJob(id) {
131
139
  return jobs.get(id) ?? null;
132
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../../server/forge/core/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../../server/forge/core/jobs.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * server/forge/core/localRepo.js
3
3
  *
4
- * Shared helpers for maintaining a shallow working clone of a repo under
5
- * ~/.forge/cache/<repo>/ and overlaying proposed file changes onto it.
4
+ * Shared helpers for leasing a per-issue worktree of a repo under
5
+ * ~/.forge/cache/ (see workspaces.ts) and overlaying proposed file changes onto it.
6
6
  *
7
7
  * Used by:
8
8
  * - validator.js → run lint/typecheck/test against the overlaid tree
@@ -13,17 +13,32 @@
13
13
  * raise a clear "not supported yet" error so the caller can fall back cleanly.
14
14
  */
15
15
  import type { ForgeChange } from "./types.ts";
16
- export declare function cachePathFor(repo: string): string;
16
+ import { type WorkspaceLease } from "./workspaces.ts";
17
17
  /**
18
- * Ensures the repo is cloned and reset to a clean branch at the remote HEAD.
19
- * Reuses any existing clone under ~/.forge/cache/<repo>/.
18
+ * Every checkout Forge works in — base clones plus one worktree per issue
19
+ * under the cache root. See workspaces.ts.
20
+ */
21
+ export declare const workspaces: {
22
+ acquire: (repo: string, branchName: string, onLog?: (line: string) => void) => Promise<WorkspaceLease>;
23
+ list: () => Promise<import("./workspaces.ts").WorkspaceEntry[]>;
24
+ remove: (id: string) => Promise<void>;
25
+ purge: ({ includeBases }?: {
26
+ includeBases?: boolean;
27
+ }) => Promise<{
28
+ removed: string[];
29
+ skipped: string[];
30
+ freedBytes: number;
31
+ }>;
32
+ };
33
+ /**
34
+ * Leases the issue's worktree, reset to the remote HEAD on `branchName`.
35
+ * Call `release()` when the job is done with it so it can be cleaned up.
20
36
  *
21
37
  * @param {string} repo Repo id (may carry a "gitlab:" prefix)
22
38
  * @param {string} branchName Workspace branch to check out
23
39
  * @param {(msg: string) => void} [onLog]
24
- * @returns {Promise<string>} Absolute path to the working tree
25
40
  */
26
- export declare function ensureWorkingTree(repo: string, branchName: string, onLog?: (msg: string) => void): Promise<string>;
41
+ export declare function acquireWorkingTree(repo: string, branchName: string, onLog?: (msg: string) => void): Promise<WorkspaceLease>;
27
42
  /**
28
43
  * Writes proposed file contents into the working tree (or deletes files for
29
44
  * action="delete"). Refuses paths that escape the clone directory.
@@ -33,4 +48,30 @@ export declare function ensureWorkingTree(repo: string, branchName: string, onLo
33
48
  * @param {(msg: string) => void} [onLog]
34
49
  */
35
50
  export declare function overlayChanges(dir: string, changes: ForgeChange[], onLog?: (msg: string) => void): Promise<void>;
51
+ /** Why captureChanges left a path out. */
52
+ export type CaptureSkipReason = "symlink" | "dependency";
53
+ /**
54
+ * Captures the working-tree changes in `dir` as a ForgeChange[] — the agentic-mode
55
+ * counterpart to overlayChanges. Where structured mode parses proposed file
56
+ * contents out of a JSON response, agentic mode lets Claude edit the checkout
57
+ * directly and then reads the result straight from git:
58
+ *
59
+ * git add -A -- . <dependency excludes> (stage edits, creates, and deletes)
60
+ * git diff --cached --name-status -z (NUL-framed, robust to spaces/renames)
61
+ *
62
+ * Each entry carries the new content (`proposed`), the HEAD baseline (`original`,
63
+ * for the diff viewer), and the `repo` tag the downstream apply pipeline expects.
64
+ * A rename is surfaced as a delete of the old path plus a create of the new one.
65
+ *
66
+ * Dependency folders (see dependencyPaths.ts) and new or changed symlinks are
67
+ * never captured, whatever the repo's .gitignore says; `onSkip` hears about each.
68
+ *
69
+ * Staging is harmless: the clone under ~/.forge/cache is throwaway and the real
70
+ * commit happens later through the SCM provider API, not this working tree.
71
+ */
72
+ export declare function captureChanges({ dir, repo, onSkip }: {
73
+ dir: string;
74
+ repo: string;
75
+ onSkip?: (file: string, reason: CaptureSkipReason) => void;
76
+ }): Promise<ForgeChange[]>;
36
77
  //# sourceMappingURL=localRepo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localRepo.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/localRepo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAuE5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,UAExC;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,mBA+BtG;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,iBAgBtG"}
1
+ {"version":3,"file":"localRepo.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/localRepo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA6DxE;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;oBA2I+5G,CAAC;;;;;;CA3In0G,CAAC;AAErH;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAE3H;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,iBAgBtG;AAgBD,0CAA0C;AAC1C,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC;AA0BzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC3D,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAkCzB"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * server/forge/core/localRepo.js
3
3
  *
4
- * Shared helpers for maintaining a shallow working clone of a repo under
5
- * ~/.forge/cache/<repo>/ and overlaying proposed file changes onto it.
4
+ * Shared helpers for leasing a per-issue worktree of a repo under
5
+ * ~/.forge/cache/ (see workspaces.ts) and overlaying proposed file changes onto it.
6
6
  *
7
7
  * Used by:
8
8
  * - validator.js → run lint/typecheck/test against the overlaid tree
@@ -18,43 +18,30 @@ import fs from "fs/promises";
18
18
  import os from "os";
19
19
  import path from "path";
20
20
  import { getConnection } from "./configStore.js";
21
+ import { dependencyExcludePathspecs, isDependencyPath } from "./dependencyPaths.js";
22
+ import { createWorkspaces } from "./workspaces.js";
21
23
  const CACHE_ROOT = process.env.FORGE_VALIDATE_CACHE
22
24
  ?? path.join(os.homedir(), ".forge", "cache");
23
- function runGit(args, opts = {}, onLog) {
25
+ /**
26
+ * Runs git and returns raw stdout/stderr as single strings instead of
27
+ * splitting on newlines. Needed for NUL-delimited (`-z`) output and for
28
+ * reading file blobs (`git show`) whose content must survive verbatim.
29
+ */
30
+ function runGitRaw(args, cwd) {
24
31
  return new Promise((resolve) => {
25
32
  const proc = spawn("git", args, {
26
- ...opts,
27
- env: { ...process.env, ...(opts.env ?? {}), FORCE_COLOR: "0", NO_COLOR: "1", TERM: "dumb" },
33
+ cwd,
34
+ env: { ...process.env, FORCE_COLOR: "0", NO_COLOR: "1", TERM: "dumb" },
28
35
  stdio: ["ignore", "pipe", "pipe"],
29
36
  });
30
- const lines = [];
31
- const collect = (buf) => {
32
- for (const raw of buf.toString().split("\n")) {
33
- const line = raw.replace(/\r$/, "");
34
- if (!line)
35
- continue;
36
- lines.push(line);
37
- onLog?.(line);
38
- }
39
- };
40
- proc.stdout.on("data", collect);
41
- proc.stderr.on("data", collect);
42
- proc.on("error", (err) => resolve({ code: -1, output: lines.join("\n"), error: err.message }));
43
- proc.on("close", (code) => resolve({ code: code ?? -1, output: lines.join("\n"), error: null }));
37
+ let stdout = "";
38
+ let stderr = "";
39
+ proc.stdout.on("data", (d) => { stdout += d.toString("utf8"); });
40
+ proc.stderr.on("data", (d) => { stderr += d.toString("utf8"); });
41
+ proc.on("error", (err) => resolve({ code: -1, stdout, stderr: err.message }));
42
+ proc.on("close", (code) => resolve({ code: code ?? -1, stdout, stderr }));
44
43
  });
45
44
  }
46
- async function exists(p) {
47
- try {
48
- await fs.access(p);
49
- return true;
50
- }
51
- catch {
52
- return false;
53
- }
54
- }
55
- function sanitizeRepo(repo) {
56
- return repo.replace(/[^a-zA-Z0-9_./-]/g, "_");
57
- }
58
45
  function gitlabCloneUrl(project) {
59
46
  return `https://gitlab.com/${project}.git`;
60
47
  }
@@ -91,50 +78,21 @@ function resolveCloneUrl(repoInput) {
91
78
  }
92
79
  return gitlabCloneUrl(repoInput);
93
80
  }
94
- export function cachePathFor(repo) {
95
- return path.join(CACHE_ROOT, sanitizeRepo(repo));
96
- }
97
81
  /**
98
- * Ensures the repo is cloned and reset to a clean branch at the remote HEAD.
99
- * Reuses any existing clone under ~/.forge/cache/<repo>/.
82
+ * Every checkout Forge works in — base clones plus one worktree per issue
83
+ * under the cache root. See workspaces.ts.
84
+ */
85
+ export const workspaces = createWorkspaces({ root: CACHE_ROOT, cloneUrl: resolveCloneUrl, gitEnv: gitEnvWithToken });
86
+ /**
87
+ * Leases the issue's worktree, reset to the remote HEAD on `branchName`.
88
+ * Call `release()` when the job is done with it so it can be cleaned up.
100
89
  *
101
90
  * @param {string} repo Repo id (may carry a "gitlab:" prefix)
102
91
  * @param {string} branchName Workspace branch to check out
103
92
  * @param {(msg: string) => void} [onLog]
104
- * @returns {Promise<string>} Absolute path to the working tree
105
93
  */
106
- export async function ensureWorkingTree(repo, branchName, onLog) {
107
- const dir = cachePathFor(repo);
108
- const hasRepo = await exists(path.join(dir, ".git"));
109
- const log = (m) => onLog?.(m);
110
- const { env: gitEnv, cleanup } = gitEnvWithToken();
111
- const envOpts = { env: { ...process.env, ...gitEnv } };
112
- try {
113
- if (!hasRepo) {
114
- log(`Cloning ${repo} → ${dir}`);
115
- await fs.mkdir(dir, { recursive: true });
116
- const clone = await runGit(["clone", "--depth=1", resolveCloneUrl(repo), dir], envOpts, onLog);
117
- if (clone.code !== 0)
118
- throw new Error(`git clone failed (code ${clone.code})`);
119
- }
120
- else {
121
- log(`Reusing clone at ${dir}`);
122
- }
123
- const fetch = await runGit(["fetch", "--depth=1", "origin", "HEAD"], { cwd: dir, ...envOpts }, onLog);
124
- if (fetch.code !== 0)
125
- throw new Error(`git fetch failed (code ${fetch.code})`);
126
- const reset = await runGit(["reset", "--hard", "FETCH_HEAD"], { cwd: dir }, onLog);
127
- if (reset.code !== 0)
128
- throw new Error(`git reset failed (code ${reset.code})`);
129
- await runGit(["clean", "-fd"], { cwd: dir }, onLog);
130
- const checkout = await runGit(["checkout", "-B", branchName], { cwd: dir }, onLog);
131
- if (checkout.code !== 0)
132
- throw new Error(`git checkout ${branchName} failed (code ${checkout.code})`);
133
- return dir;
134
- }
135
- finally {
136
- cleanup();
137
- }
94
+ export function acquireWorkingTree(repo, branchName, onLog) {
95
+ return workspaces.acquire(repo, branchName, onLog);
138
96
  }
139
97
  /**
140
98
  * Writes proposed file contents into the working tree (or deletes files for
@@ -162,4 +120,100 @@ export async function overlayChanges(dir, changes, onLog) {
162
120
  }
163
121
  }
164
122
  }
123
+ /** Maps a git name-status letter to a ForgeChange action. */
124
+ function actionForStatus(status) {
125
+ const code = status[0];
126
+ if (code === "A" || code === "C")
127
+ return "create";
128
+ if (code === "D")
129
+ return "delete";
130
+ return "modify"; // M, T (type change), and anything else we treat as a modify
131
+ }
132
+ /** Reads the HEAD (pre-change) blob for a path, or null if it didn't exist. */
133
+ async function headBlob(dir, file) {
134
+ const res = await runGitRaw(["show", `HEAD:${file}`], dir);
135
+ return res.code === 0 ? res.stdout : null;
136
+ }
137
+ async function isSymlink(dir, file) {
138
+ const stat = await fs.lstat(path.join(dir, file)).catch(() => null);
139
+ return stat?.isSymbolicLink() ?? false;
140
+ }
141
+ /**
142
+ * Builds the ForgeChange for one staged path, or returns why it is skipped.
143
+ * Symlinks are never captured: reading one follows it, so its target's content
144
+ * (possibly outside the checkout) would be committed as an ordinary file.
145
+ */
146
+ async function buildChange(dir, repo, status, file, prevFile) {
147
+ if (isDependencyPath(file))
148
+ return "dependency";
149
+ const action = actionForStatus(status);
150
+ if (action === "delete") {
151
+ return { repo, file, action, proposed: "", original: await headBlob(dir, file), summary: "delete" };
152
+ }
153
+ if (await isSymlink(dir, file))
154
+ return "symlink";
155
+ const proposed = await fs.readFile(path.join(dir, file), "utf8");
156
+ // For a create the file is new (no HEAD blob); for a modify/rename the
157
+ // baseline lives under the previous path (renames change the path).
158
+ const original = status[0] === "A" ? null : await headBlob(dir, prevFile ?? file);
159
+ return { repo, file, action, proposed, original, summary: action };
160
+ }
161
+ /**
162
+ * Captures the working-tree changes in `dir` as a ForgeChange[] — the agentic-mode
163
+ * counterpart to overlayChanges. Where structured mode parses proposed file
164
+ * contents out of a JSON response, agentic mode lets Claude edit the checkout
165
+ * directly and then reads the result straight from git:
166
+ *
167
+ * git add -A -- . <dependency excludes> (stage edits, creates, and deletes)
168
+ * git diff --cached --name-status -z (NUL-framed, robust to spaces/renames)
169
+ *
170
+ * Each entry carries the new content (`proposed`), the HEAD baseline (`original`,
171
+ * for the diff viewer), and the `repo` tag the downstream apply pipeline expects.
172
+ * A rename is surfaced as a delete of the old path plus a create of the new one.
173
+ *
174
+ * Dependency folders (see dependencyPaths.ts) and new or changed symlinks are
175
+ * never captured, whatever the repo's .gitignore says; `onSkip` hears about each.
176
+ *
177
+ * Staging is harmless: the clone under ~/.forge/cache is throwaway and the real
178
+ * commit happens later through the SCM provider API, not this working tree.
179
+ */
180
+ export async function captureChanges({ dir, repo, onSkip }) {
181
+ const staged = await runGitRaw(["add", "-A", "--", ".", ...dependencyExcludePathspecs()], dir);
182
+ if (staged.code !== 0)
183
+ throw new Error(`git add failed while capturing changes: ${staged.stderr.trim()}`);
184
+ const diff = await runGitRaw(["diff", "--cached", "--name-status", "-z"], dir);
185
+ if (diff.code !== 0)
186
+ throw new Error(`git diff failed while capturing changes: ${diff.stderr.trim()}`);
187
+ const tokens = diff.stdout.split("\0").filter((t) => t.length > 0);
188
+ const changes = [];
189
+ const kept = (file, built) => {
190
+ if (typeof built !== "string")
191
+ return true;
192
+ onSkip?.(file, built);
193
+ return false;
194
+ };
195
+ for (let i = 0; i < tokens.length; i++) {
196
+ const status = tokens[i];
197
+ if (status[0] === "R" || status[0] === "C") {
198
+ // Rename/copy records carry two paths: <status>\0<old>\0<new>.
199
+ const oldPath = tokens[++i];
200
+ const newPath = tokens[++i];
201
+ const created = await buildChange(dir, repo, "A", newPath);
202
+ // When the new path is skipped, keep the old one too, so nothing is lost.
203
+ if (!kept(newPath, created))
204
+ continue;
205
+ if (status[0] === "R") {
206
+ changes.push({ repo, file: oldPath, action: "delete", proposed: "", original: await headBlob(dir, oldPath), summary: "delete" });
207
+ }
208
+ changes.push(created);
209
+ }
210
+ else {
211
+ const file = tokens[++i];
212
+ const built = await buildChange(dir, repo, status, file);
213
+ if (kept(file, built))
214
+ changes.push(built);
215
+ }
216
+ }
217
+ return changes;
218
+ }
165
219
  //# sourceMappingURL=localRepo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"localRepo.js","sourceRoot":"","sources":["../../../../server/forge/core/localRepo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"localRepo.js","sourceRoot":"","sources":["../../../../server/forge/core/localRepo.ts"],"names":[],"mappings":"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"}
@@ -77,6 +77,26 @@ export declare const RESOLUTION_CHECK_SCHEMA: string;
77
77
  export declare function classifyIssue(issue: IssueInput): "feature" | "fix" | "chore" | "refactor";
78
78
  export declare function buildIdentifyFilesPrompt(issue: IssueInput, repoTrees: RepoTree[] | string[]): string;
79
79
  export declare function buildProposeFixPrompt(issue: IssueInput, fileContents: FileContent[], options?: ProposeFixOptions): string;
80
+ interface AgenticFixOptions {
81
+ promptRules?: string;
82
+ userPrompt?: string;
83
+ ciContext?: string;
84
+ /** A reviewer's follow-up on a change already in the working tree (refine). */
85
+ feedback?: string;
86
+ }
87
+ /**
88
+ * System prompt appended (via --append-system-prompt) on top of the real Claude
89
+ * Code agent prompt in agentic mode. It does NOT replace the harness — it adds
90
+ * Forge's guardrails while letting Claude behave like the interactive agent.
91
+ */
92
+ export declare const AGENTIC_SYSTEM_PROMPT = "You are Forge, an autonomous code agent working inside a checkout of a production codebase. You have real tools \u2014 read, search, edit, and run commands against the working tree.\n\nWork like a careful engineer:\n- Read the relevant code before changing it; follow the repo's existing conventions and any CLAUDE.md guidance you find.\n- Make the smallest change that fully resolves the issue. Fix the root cause, not the symptom.\n- Do not reorganise, reformat, or \"improve\" code the issue did not ask you to touch.\n- If the project has a logger, use it instead of console.*. Add comments only where the logic is non-obvious.\n- You may run lint/typecheck/tests to verify your change, and install what they need (dependencies, Playwright and its browsers). Never push, commit, open MRs, or change anything on remote services \u2014 Forge handles that after review.\n- Make all edits directly to files in the working tree. Forge reads your changes from git, so there is no JSON to emit.\n\nEvidence: when the issue or the custom rules ask you to prove the change (screenshots, test results), put it in `.forge-evidence/` at the repo root. Write what you ran and what you saw in `.forge-evidence/EVIDENCE.md`, save screenshots (PNG/JPEG) next to it, and reference them from the write-up by file name, e.g. `![home page](home.png)`. Forge attaches it to the merge request; the folder is never committed.";
93
+ /**
94
+ * Builds the natural-language task prompt for agentic mode. Unlike the
95
+ * structured builders, it does NOT ask for JSON — Claude edits the checkout
96
+ * directly and Forge captures the diff. The only structured ask is a final
97
+ * `TITLE:` line so Forge can derive a conventional-commit MR title.
98
+ */
99
+ export declare function buildAgenticFixPrompt(issue: IssueInput, options?: AgenticFixOptions): string;
80
100
  /**
81
101
  * Single-prompt conversational refine: the model auto-classifies the user's
82
102
  * message as a question about state or a directive to change code, then
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/prompts.ts"],"names":[],"mappings":"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"}