@ipul-labs/forge 1.22.0 → 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 (294) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -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 +43 -1
  151. package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -1
  152. package/lib/server/forge/core/ForgeAgent.js +209 -61
  153. package/lib/server/forge/core/ForgeAgent.js.map +1 -1
  154. package/lib/server/forge/core/agentClient.d.ts +7 -23
  155. package/lib/server/forge/core/agentClient.d.ts.map +1 -1
  156. package/lib/server/forge/core/agentClient.js +10 -25
  157. package/lib/server/forge/core/agentClient.js.map +1 -1
  158. package/lib/server/forge/core/claudeClient.d.ts +24 -1
  159. package/lib/server/forge/core/claudeClient.d.ts.map +1 -1
  160. package/lib/server/forge/core/claudeClient.js +25 -7
  161. package/lib/server/forge/core/claudeClient.js.map +1 -1
  162. package/lib/server/forge/core/configStore.d.ts +11 -1
  163. package/lib/server/forge/core/configStore.d.ts.map +1 -1
  164. package/lib/server/forge/core/configStore.js +33 -2
  165. package/lib/server/forge/core/configStore.js.map +1 -1
  166. package/lib/server/forge/core/dependencyPaths.d.ts +19 -0
  167. package/lib/server/forge/core/dependencyPaths.d.ts.map +1 -0
  168. package/lib/server/forge/core/dependencyPaths.js +32 -0
  169. package/lib/server/forge/core/dependencyPaths.js.map +1 -0
  170. package/lib/server/forge/core/evidence.d.ts +43 -0
  171. package/lib/server/forge/core/evidence.d.ts.map +1 -0
  172. package/lib/server/forge/core/evidence.js +108 -0
  173. package/lib/server/forge/core/evidence.js.map +1 -0
  174. package/lib/server/forge/core/jobs.d.ts +2 -0
  175. package/lib/server/forge/core/jobs.d.ts.map +1 -1
  176. package/lib/server/forge/core/jobs.js +8 -0
  177. package/lib/server/forge/core/jobs.js.map +1 -1
  178. package/lib/server/forge/core/localRepo.d.ts +31 -10
  179. package/lib/server/forge/core/localRepo.d.ts.map +1 -1
  180. package/lib/server/forge/core/localRepo.js +48 -82
  181. package/lib/server/forge/core/localRepo.js.map +1 -1
  182. package/lib/server/forge/core/prompts.d.ts +3 -1
  183. package/lib/server/forge/core/prompts.d.ts.map +1 -1
  184. package/lib/server/forge/core/prompts.js +14 -5
  185. package/lib/server/forge/core/prompts.js.map +1 -1
  186. package/lib/server/forge/core/providers/azuredevops.d.ts +4 -2
  187. package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -1
  188. package/lib/server/forge/core/providers/azuredevops.js +12 -2
  189. package/lib/server/forge/core/providers/azuredevops.js.map +1 -1
  190. package/lib/server/forge/core/providers/base.d.ts +29 -4
  191. package/lib/server/forge/core/providers/base.d.ts.map +1 -1
  192. package/lib/server/forge/core/providers/base.js +21 -3
  193. package/lib/server/forge/core/providers/base.js.map +1 -1
  194. package/lib/server/forge/core/providers/github.d.ts +7 -7
  195. package/lib/server/forge/core/providers/github.d.ts.map +1 -1
  196. package/lib/server/forge/core/providers/github.js +13 -4
  197. package/lib/server/forge/core/providers/github.js.map +1 -1
  198. package/lib/server/forge/core/providers/gitlab.d.ts +20 -3
  199. package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -1
  200. package/lib/server/forge/core/providers/gitlab.js +65 -5
  201. package/lib/server/forge/core/providers/gitlab.js.map +1 -1
  202. package/lib/server/forge/core/providers/types.d.ts +20 -0
  203. package/lib/server/forge/core/providers/types.d.ts.map +1 -1
  204. package/lib/server/forge/core/secretBox.d.ts +17 -0
  205. package/lib/server/forge/core/secretBox.d.ts.map +1 -0
  206. package/lib/server/forge/core/secretBox.js +74 -0
  207. package/lib/server/forge/core/secretBox.js.map +1 -0
  208. package/lib/server/forge/core/types.d.ts +7 -1
  209. package/lib/server/forge/core/types.d.ts.map +1 -1
  210. package/lib/server/forge/core/validator/clone.d.ts +5 -4
  211. package/lib/server/forge/core/validator/clone.d.ts.map +1 -1
  212. package/lib/server/forge/core/validator/clone.js +6 -86
  213. package/lib/server/forge/core/validator/clone.js.map +1 -1
  214. package/lib/server/forge/core/validator/cmd.d.ts.map +1 -1
  215. package/lib/server/forge/core/validator/cmd.js +4 -1
  216. package/lib/server/forge/core/validator/cmd.js.map +1 -1
  217. package/lib/server/forge/core/validator/projectType.d.ts.map +1 -1
  218. package/lib/server/forge/core/validator/projectType.js +2 -1
  219. package/lib/server/forge/core/validator/projectType.js.map +1 -1
  220. package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -1
  221. package/lib/server/forge/core/validator/runners/node.js +6 -2
  222. package/lib/server/forge/core/validator/runners/node.js.map +1 -1
  223. package/lib/server/forge/core/validator.d.ts.map +1 -1
  224. package/lib/server/forge/core/validator.js +28 -22
  225. package/lib/server/forge/core/validator.js.map +1 -1
  226. package/lib/server/forge/core/workspaces.d.ts +70 -0
  227. package/lib/server/forge/core/workspaces.d.ts.map +1 -0
  228. package/lib/server/forge/core/workspaces.js +348 -0
  229. package/lib/server/forge/core/workspaces.js.map +1 -0
  230. package/lib/server/forge/db/database.d.ts +22 -0
  231. package/lib/server/forge/db/database.d.ts.map +1 -0
  232. package/lib/server/forge/db/database.js +71 -0
  233. package/lib/server/forge/db/database.js.map +1 -0
  234. package/lib/server/forge/db/migrations.d.ts +11 -0
  235. package/lib/server/forge/db/migrations.d.ts.map +1 -0
  236. package/lib/server/forge/db/migrations.js +87 -0
  237. package/lib/server/forge/db/migrations.js.map +1 -0
  238. package/lib/server/forge/routes.d.ts.map +1 -1
  239. package/lib/server/forge/routes.js +413 -163
  240. package/lib/server/forge/routes.js.map +1 -1
  241. package/lib/server/forge/sse.d.ts +10 -0
  242. package/lib/server/forge/sse.d.ts.map +1 -0
  243. package/lib/server/forge/sse.js +22 -0
  244. package/lib/server/forge/sse.js.map +1 -0
  245. package/lib/server/spa.d.ts +12 -0
  246. package/lib/server/spa.d.ts.map +1 -0
  247. package/lib/server/spa.js +23 -0
  248. package/lib/server/spa.js.map +1 -0
  249. package/lib/server.js +9 -24
  250. package/lib/server.js.map +1 -1
  251. package/lib/shared/events.d.ts +3 -0
  252. package/lib/shared/events.d.ts.map +1 -1
  253. package/lib/shared/events.js +3 -0
  254. package/lib/shared/events.js.map +1 -1
  255. package/lib/shared/packageRoot.d.ts +11 -0
  256. package/lib/shared/packageRoot.d.ts.map +1 -0
  257. package/lib/shared/packageRoot.js +23 -0
  258. package/lib/shared/packageRoot.js.map +1 -0
  259. package/lib/shared/project.d.ts +3 -0
  260. package/lib/shared/project.d.ts.map +1 -0
  261. package/lib/shared/project.js +3 -0
  262. package/lib/shared/project.js.map +1 -0
  263. package/package.json +24 -9
  264. package/lib/bin/cli/improve.d.ts +0 -2
  265. package/lib/bin/cli/improve.d.ts.map +0 -1
  266. package/lib/bin/cli/improve.js +0 -189
  267. package/lib/bin/cli/improve.js.map +0 -1
  268. package/lib/bin/cli/stats.d.ts +0 -2
  269. package/lib/bin/cli/stats.d.ts.map +0 -1
  270. package/lib/bin/cli/stats.js +0 -78
  271. package/lib/bin/cli/stats.js.map +0 -1
  272. package/lib/server/forge/core/k8s.d.ts +0 -18
  273. package/lib/server/forge/core/k8s.d.ts.map +0 -1
  274. package/lib/server/forge/core/k8s.js +0 -49
  275. package/lib/server/forge/core/k8s.js.map +0 -1
  276. package/lib/server/forge/core/openclawClient.d.ts +0 -61
  277. package/lib/server/forge/core/openclawClient.d.ts.map +0 -1
  278. package/lib/server/forge/core/openclawClient.js +0 -111
  279. package/lib/server/forge/core/openclawClient.js.map +0 -1
  280. package/lib/server/forge/core/quotaClient.d.ts +0 -48
  281. package/lib/server/forge/core/quotaClient.d.ts.map +0 -1
  282. package/lib/server/forge/core/quotaClient.js +0 -88
  283. package/lib/server/forge/core/quotaClient.js.map +0 -1
  284. package/lib/server/forge/core/selfImprove.d.ts +0 -43
  285. package/lib/server/forge/core/selfImprove.d.ts.map +0 -1
  286. package/lib/server/forge/core/selfImprove.js +0 -372
  287. package/lib/server/forge/core/selfImprove.js.map +0 -1
  288. package/lib/server/forge/core/telemetry.d.ts +0 -100
  289. package/lib/server/forge/core/telemetry.d.ts.map +0 -1
  290. package/lib/server/forge/core/telemetry.js +0 -273
  291. package/lib/server/forge/core/telemetry.js.map +0 -1
  292. package/scripts/fix-shebang.cjs +0 -11
  293. package/scripts/inject-readme.cjs +0 -23
  294. package/scripts/local-rollout.sh +0 -134
@@ -15,6 +15,7 @@ import fs from "node:fs/promises";
15
15
  import os from "node:os";
16
16
  import path from "node:path";
17
17
  import { AGENT_MODE } from "./agentMode.js";
18
+ import { createSecretBox, defaultKeyPath, loadOrCreateKey } from "./secretBox.js";
18
19
  /** @typedef {{ id: string, label: string, projectType?: "auto" | "node" | "go" }} ForgeRepo */
19
20
  /**
20
21
  * @typedef {{ baseUrl: string, token: string }} GitLabConnection
@@ -72,8 +73,24 @@ const DEFAULT_CONFIG = {
72
73
  gitlab: { baseUrl: BUILTIN_BASE_URLS.gitlab, token: "" },
73
74
  github: { token: "", owner: "", repo: "", baseBranch: "main" },
74
75
  azuredevops: { token: "", org: "", project: "", repo: "", baseBranch: "main" },
76
+ // Workspace Anthropic key. When set, Claude runs on this account's API
77
+ // credits instead of the host's Claude Code subscription.
78
+ anthropic: { token: "" },
75
79
  },
76
80
  };
81
+ // Connection secrets are sealed with AES-256-GCM on disk and held in plaintext
82
+ // only in memory. The key comes from FORGE_ENCRYPTION_KEY or ~/.forge/master.key.
83
+ const secretBox = createSecretBox(loadOrCreateKey({ envKey: process.env.FORGE_ENCRYPTION_KEY, keyPath: defaultKeyPath() }));
84
+ const SEALED_CONNECTIONS = ["gitlab", "github", "azuredevops", "anthropic"];
85
+ function mapTokens(cfg, fn) {
86
+ const out = structuredClone(cfg);
87
+ for (const name of SEALED_CONNECTIONS) {
88
+ const conn = out.connections?.[name];
89
+ if (conn?.token)
90
+ conn.token = fn(conn.token);
91
+ }
92
+ return out;
93
+ }
77
94
  function configPath() {
78
95
  return process.env.FORGE_CONFIG_PATH ?? path.join(os.homedir(), ".forge", "config.json");
79
96
  }
@@ -88,7 +105,8 @@ function loadSync() {
88
105
  try {
89
106
  const raw = fsSync.readFileSync(p, "utf8");
90
107
  const parsed = JSON.parse(raw);
91
- return mergeDeep(DEFAULT_CONFIG, parsed);
108
+ const merged = mergeDeep(DEFAULT_CONFIG, parsed);
109
+ return mapTokens(merged, secretBox.open);
92
110
  }
93
111
  catch (err) {
94
112
  const e = err;
@@ -105,7 +123,7 @@ async function writeToDisk(cfg) {
105
123
  const p = configPath();
106
124
  await fs.mkdir(path.dirname(p), { recursive: true });
107
125
  const tmp = `${p}.${process.pid}.${Date.now()}.tmp`;
108
- await fs.writeFile(tmp, JSON.stringify(cfg, null, 2), "utf8");
126
+ await fs.writeFile(tmp, JSON.stringify(mapTokens(cfg, secretBox.seal), null, 2), "utf8");
109
127
  // 0600 — owner read/write only. Belt-and-suspenders for when tokens land here.
110
128
  await fs.chmod(tmp, 0o600);
111
129
  await fs.rename(tmp, p);
@@ -182,6 +200,14 @@ export function getConnection(provider) {
182
200
  token: fromCfg.token || envToken,
183
201
  };
184
202
  }
203
+ /**
204
+ * Workspace Anthropic key from Settings, or "" when none is saved. Config only:
205
+ * ANTHROPIC_API_KEY in the env feeds the model list and quota check, and must
206
+ * never switch Claude itself onto API billing.
207
+ */
208
+ export function getAnthropicKey() {
209
+ return cache.connections?.anthropic?.token ?? "";
210
+ }
185
211
  function maskToken(t) {
186
212
  if (!t)
187
213
  return "";
@@ -216,6 +242,11 @@ export function getPublic() {
216
242
  tokenHint: maskToken(conn.azuredevops?.token || process.env.AZURE_DEVOPS_TOKEN || ""),
217
243
  tokenSource: conn.azuredevops?.token ? "config" : process.env.AZURE_DEVOPS_TOKEN ? "env" : "none",
218
244
  },
245
+ anthropic: {
246
+ hasToken: Boolean(getAnthropicKey()),
247
+ tokenHint: maskToken(getAnthropicKey()),
248
+ tokenSource: getAnthropicKey() ? "config" : "none",
249
+ },
219
250
  },
220
251
  };
221
252
  }
@@ -1 +1 @@
1
- {"version":3,"file":"configStore.js","sourceRoot":"","sources":["../../../../server/forge/core/configStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configStore.js","sourceRoot":"","sources":["../../../../server/forge/core/configStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * server/forge/core/dependencyPaths.ts
3
+ *
4
+ * Installed-dependency folders. Forge never captures or commits anything
5
+ * inside them, whatever the target repo's .gitignore says. A `node_modules/`
6
+ * rule (trailing slash) only matches directories, so a node_modules
7
+ * *symlink* would otherwise slip through `git add -A`.
8
+ */
9
+ export declare const DEPENDENCY_DIRS: readonly string[];
10
+ /** True when `name` (a single path segment) is a dependency folder. */
11
+ export declare function isDependencyDir(name: string): boolean;
12
+ /** True when any "/"-separated segment of a repo-relative path is a dependency folder. */
13
+ export declare function isDependencyPath(file: string): boolean;
14
+ /**
15
+ * Git pathspecs that keep dependency folders (and symlinks named like them)
16
+ * out of `git add`, at any depth. Pass after `-- .`.
17
+ */
18
+ export declare function dependencyExcludePathspecs(): string[];
19
+ //# sourceMappingURL=dependencyPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyPaths.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/dependencyPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAM5C,CAAC;AAIF,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * server/forge/core/dependencyPaths.ts
3
+ *
4
+ * Installed-dependency folders. Forge never captures or commits anything
5
+ * inside them, whatever the target repo's .gitignore says. A `node_modules/`
6
+ * rule (trailing slash) only matches directories, so a node_modules
7
+ * *symlink* would otherwise slip through `git add -A`.
8
+ */
9
+ export const DEPENDENCY_DIRS = [
10
+ "node_modules",
11
+ "bower_components",
12
+ "jspm_packages",
13
+ ".venv",
14
+ "__pycache__",
15
+ ];
16
+ const DEPENDENCY_DIR_SET = new Set(DEPENDENCY_DIRS);
17
+ /** True when `name` (a single path segment) is a dependency folder. */
18
+ export function isDependencyDir(name) {
19
+ return DEPENDENCY_DIR_SET.has(name);
20
+ }
21
+ /** True when any "/"-separated segment of a repo-relative path is a dependency folder. */
22
+ export function isDependencyPath(file) {
23
+ return file.split("/").some(isDependencyDir);
24
+ }
25
+ /**
26
+ * Git pathspecs that keep dependency folders (and symlinks named like them)
27
+ * out of `git add`, at any depth. Pass after `-- .`.
28
+ */
29
+ export function dependencyExcludePathspecs() {
30
+ return DEPENDENCY_DIRS.flatMap((dir) => [`:(exclude,glob)**/${dir}`, `:(exclude,glob)**/${dir}/**`]);
31
+ }
32
+ //# sourceMappingURL=dependencyPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyPaths.js","sourceRoot":"","sources":["../../../../server/forge/core/dependencyPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,cAAc;IACd,kBAAkB;IAClB,eAAe;IACf,OAAO;IACP,aAAa;CACb,CAAC;AAEF,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;AAEzE,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACzC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,qBAAqB,GAAG,EAAE,EAAE,qBAAqB,GAAG,KAAK,CAAC,CAAC,CAAC;AACtG,CAAC"}
@@ -0,0 +1,43 @@
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
+ export declare const EVIDENCE_DIR = ".forge-evidence";
13
+ export declare const EVIDENCE_NOTES_FILE = "EVIDENCE.md";
14
+ export declare const EVIDENCE_LIMITS: {
15
+ maxImages: number;
16
+ maxImageBytes: number;
17
+ };
18
+ export interface EvidenceImage {
19
+ /** Path relative to EVIDENCE_DIR, "/"-separated. */
20
+ name: string;
21
+ data: Buffer;
22
+ }
23
+ export interface EvidenceUpload {
24
+ name: string;
25
+ url: string;
26
+ }
27
+ /** Empties the evidence folder (it survives `git clean`) and keeps it out of git. */
28
+ export declare function prepareEvidenceDir(dir: string): Promise<string>;
29
+ /** Reads what the agent left in the evidence folder. `skipped` lists images over the limits. */
30
+ export declare function collectEvidence(dir: string): Promise<{
31
+ notes: string | null;
32
+ images: EvidenceImage[];
33
+ skipped: string[];
34
+ }>;
35
+ /**
36
+ * Builds the markdown for the MR: the notes with image links pointed at the
37
+ * uploads, then any uploaded image the notes didn't mention. Null when empty.
38
+ */
39
+ export declare function renderEvidence({ notes, uploads }: {
40
+ notes: string | null;
41
+ uploads: EvidenceUpload[];
42
+ }): string | null;
43
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../../../server/forge/core/evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,eAAO,MAAM,eAAe;;;CAG3B,CAAC;AAKF,MAAM,WAAW,aAAa;IAC7B,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACZ;AAeD,qFAAqF;AACrF,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAarE;AAaD,gGAAgG;AAChG,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBhI;AAOD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAerH"}
@@ -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,24 +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";
36
53
  /**
37
54
  * Captures the working-tree changes in `dir` as a ForgeChange[] — the agentic-mode
38
55
  * counterpart to overlayChanges. Where structured mode parses proposed file
39
56
  * contents out of a JSON response, agentic mode lets Claude edit the checkout
40
57
  * directly and then reads the result straight from git:
41
58
  *
42
- * git add -A (stage edits, creates, and deletes)
43
- * git diff --cached --name-status -z (NUL-framed, robust to spaces/renames)
59
+ * git add -A -- . <dependency excludes> (stage edits, creates, and deletes)
60
+ * git diff --cached --name-status -z (NUL-framed, robust to spaces/renames)
44
61
  *
45
62
  * Each entry carries the new content (`proposed`), the HEAD baseline (`original`,
46
63
  * for the diff viewer), and the `repo` tag the downstream apply pipeline expects.
47
64
  * A rename is surfaced as a delete of the old path plus a create of the new one.
48
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
+ *
49
69
  * Staging is harmless: the clone under ~/.forge/cache is throwaway and the real
50
70
  * commit happens later through the SCM provider API, not this working tree.
51
71
  */
52
- export declare function captureChanges({ dir, repo }: {
72
+ export declare function captureChanges({ dir, repo, onSkip }: {
53
73
  dir: string;
54
74
  repo: string;
75
+ onSkip?: (file: string, reason: CaptureSkipReason) => void;
55
76
  }): Promise<ForgeChange[]>;
56
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;AA4F5D,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;AA4BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAyBzG"}
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"}