@ipul-labs/forge 1.16.8 → 1.17.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 (280) hide show
  1. package/README.md +39 -21
  2. package/lib/bin/cli/analyze.d.ts +9 -0
  3. package/lib/bin/cli/analyze.d.ts.map +1 -0
  4. package/lib/bin/cli/analyze.js +491 -0
  5. package/lib/bin/cli/analyze.js.map +1 -0
  6. package/lib/bin/cli/apply.d.ts +2 -0
  7. package/lib/bin/cli/apply.d.ts.map +1 -0
  8. package/lib/bin/cli/apply.js +262 -0
  9. package/lib/bin/cli/apply.js.map +1 -0
  10. package/lib/bin/cli/cifix.d.ts +2 -0
  11. package/lib/bin/cli/cifix.d.ts.map +1 -0
  12. package/lib/bin/cli/cifix.js +310 -0
  13. package/lib/bin/cli/cifix.js.map +1 -0
  14. package/lib/bin/cli/close.d.ts +2 -0
  15. package/lib/bin/cli/close.d.ts.map +1 -0
  16. package/lib/bin/cli/close.js +113 -0
  17. package/lib/bin/cli/close.js.map +1 -0
  18. package/lib/bin/cli/createIssue.d.ts +2 -0
  19. package/lib/bin/cli/createIssue.d.ts.map +1 -0
  20. package/lib/bin/cli/createIssue.js +108 -0
  21. package/lib/bin/cli/createIssue.js.map +1 -0
  22. package/lib/bin/cli/doctor.d.ts +2 -0
  23. package/lib/bin/cli/doctor.d.ts.map +1 -0
  24. package/lib/bin/cli/doctor.js +145 -0
  25. package/lib/bin/cli/doctor.js.map +1 -0
  26. package/lib/bin/cli/init.d.ts +4 -0
  27. package/lib/bin/cli/init.d.ts.map +1 -0
  28. package/lib/bin/cli/init.js +288 -0
  29. package/lib/bin/cli/init.js.map +1 -0
  30. package/lib/bin/cli/ink.d.ts +23 -0
  31. package/lib/bin/cli/ink.d.ts.map +1 -0
  32. package/{bin → lib/bin}/cli/ink.js +18 -19
  33. package/lib/bin/cli/ink.js.map +1 -0
  34. package/lib/bin/cli/issue.d.ts +2 -0
  35. package/lib/bin/cli/issue.d.ts.map +1 -0
  36. package/lib/bin/cli/issue.js +114 -0
  37. package/lib/bin/cli/issue.js.map +1 -0
  38. package/lib/bin/cli/issues.d.ts +2 -0
  39. package/lib/bin/cli/issues.d.ts.map +1 -0
  40. package/lib/bin/cli/issues.js +149 -0
  41. package/lib/bin/cli/issues.js.map +1 -0
  42. package/lib/bin/cli/merge.d.ts +2 -0
  43. package/lib/bin/cli/merge.d.ts.map +1 -0
  44. package/lib/bin/cli/merge.js +162 -0
  45. package/lib/bin/cli/merge.js.map +1 -0
  46. package/lib/bin/cli/refine.d.ts +2 -0
  47. package/lib/bin/cli/refine.d.ts.map +1 -0
  48. package/lib/bin/cli/refine.js +249 -0
  49. package/lib/bin/cli/refine.js.map +1 -0
  50. package/lib/bin/cli/repl.d.ts +2 -0
  51. package/lib/bin/cli/repl.d.ts.map +1 -0
  52. package/lib/bin/cli/repl.js +309 -0
  53. package/lib/bin/cli/repl.js.map +1 -0
  54. package/lib/bin/cli/repos.d.ts +2 -0
  55. package/lib/bin/cli/repos.d.ts.map +1 -0
  56. package/lib/bin/cli/repos.js +86 -0
  57. package/lib/bin/cli/repos.js.map +1 -0
  58. package/lib/bin/cli/resolution.d.ts +2 -0
  59. package/lib/bin/cli/resolution.d.ts.map +1 -0
  60. package/lib/bin/cli/resolution.js +139 -0
  61. package/lib/bin/cli/resolution.js.map +1 -0
  62. package/lib/bin/cli/serverClient.d.ts +26 -0
  63. package/lib/bin/cli/serverClient.d.ts.map +1 -0
  64. package/lib/bin/cli/serverClient.js +111 -0
  65. package/lib/bin/cli/serverClient.js.map +1 -0
  66. package/lib/bin/cli/session.d.ts +8 -0
  67. package/lib/bin/cli/session.d.ts.map +1 -0
  68. package/lib/bin/cli/session.js +212 -0
  69. package/lib/bin/cli/session.js.map +1 -0
  70. package/lib/bin/cli/sessionStore.d.ts +69 -0
  71. package/lib/bin/cli/sessionStore.d.ts.map +1 -0
  72. package/lib/bin/cli/sessionStore.js +196 -0
  73. package/lib/bin/cli/sessionStore.js.map +1 -0
  74. package/lib/bin/cli/ship.d.ts +33 -0
  75. package/lib/bin/cli/ship.d.ts.map +1 -0
  76. package/lib/bin/cli/ship.js +737 -0
  77. package/lib/bin/cli/ship.js.map +1 -0
  78. package/lib/bin/cli/types.d.ts +59 -0
  79. package/lib/bin/cli/types.d.ts.map +1 -0
  80. package/lib/bin/cli/types.js +2 -0
  81. package/lib/bin/cli/types.js.map +1 -0
  82. package/lib/bin/cli/update.d.ts +2 -0
  83. package/lib/bin/cli/update.d.ts.map +1 -0
  84. package/lib/bin/cli/update.js +87 -0
  85. package/lib/bin/cli/update.js.map +1 -0
  86. package/lib/bin/cli/utils.d.ts +43 -0
  87. package/lib/bin/cli/utils.d.ts.map +1 -0
  88. package/lib/bin/cli/utils.js +171 -0
  89. package/lib/bin/cli/utils.js.map +1 -0
  90. package/lib/bin/cli/validate.d.ts +2 -0
  91. package/lib/bin/cli/validate.d.ts.map +1 -0
  92. package/lib/bin/cli/validate.js +283 -0
  93. package/lib/bin/cli/validate.js.map +1 -0
  94. package/lib/bin/cli/watch.d.ts +5 -0
  95. package/lib/bin/cli/watch.d.ts.map +1 -0
  96. package/lib/bin/cli/watch.js +263 -0
  97. package/lib/bin/cli/watch.js.map +1 -0
  98. package/lib/bin/forge-agent.d.ts +3 -0
  99. package/lib/bin/forge-agent.d.ts.map +1 -0
  100. package/{bin → lib/bin}/forge-agent.js +104 -105
  101. package/lib/bin/forge-agent.js.map +1 -0
  102. package/lib/server/forge/core/ForgeAgent.d.ts +260 -0
  103. package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -0
  104. package/lib/server/forge/core/ForgeAgent.js +995 -0
  105. package/lib/server/forge/core/ForgeAgent.js.map +1 -0
  106. package/lib/server/forge/core/agentClient.d.ts +39 -0
  107. package/lib/server/forge/core/agentClient.d.ts.map +1 -0
  108. package/{server → lib/server}/forge/core/agentClient.js +7 -12
  109. package/lib/server/forge/core/agentClient.js.map +1 -0
  110. package/lib/server/forge/core/branchName.d.ts +20 -0
  111. package/lib/server/forge/core/branchName.d.ts.map +1 -0
  112. package/lib/server/forge/core/branchName.js +39 -0
  113. package/lib/server/forge/core/branchName.js.map +1 -0
  114. package/lib/server/forge/core/claudeClient.d.ts +60 -0
  115. package/lib/server/forge/core/claudeClient.d.ts.map +1 -0
  116. package/lib/server/forge/core/claudeClient.js +347 -0
  117. package/lib/server/forge/core/claudeClient.js.map +1 -0
  118. package/lib/server/forge/core/configStore.d.ts +76 -0
  119. package/lib/server/forge/core/configStore.d.ts.map +1 -0
  120. package/lib/server/forge/core/configStore.js +213 -0
  121. package/lib/server/forge/core/configStore.js.map +1 -0
  122. package/lib/server/forge/core/gitlabClient.d.ts +144 -0
  123. package/lib/server/forge/core/gitlabClient.d.ts.map +1 -0
  124. package/{server → lib/server}/forge/core/gitlabClient.js +98 -180
  125. package/lib/server/forge/core/gitlabClient.js.map +1 -0
  126. package/lib/server/forge/core/jobs.d.ts +67 -0
  127. package/lib/server/forge/core/jobs.d.ts.map +1 -0
  128. package/lib/server/forge/core/jobs.js +185 -0
  129. package/lib/server/forge/core/jobs.js.map +1 -0
  130. package/lib/server/forge/core/k8s.d.ts +18 -0
  131. package/lib/server/forge/core/k8s.d.ts.map +1 -0
  132. package/lib/server/forge/core/k8s.js +49 -0
  133. package/lib/server/forge/core/k8s.js.map +1 -0
  134. package/lib/server/forge/core/localRepo.d.ts +36 -0
  135. package/lib/server/forge/core/localRepo.d.ts.map +1 -0
  136. package/lib/server/forge/core/localRepo.js +165 -0
  137. package/lib/server/forge/core/localRepo.js.map +1 -0
  138. package/lib/server/forge/core/openclawClient.d.ts +61 -0
  139. package/lib/server/forge/core/openclawClient.d.ts.map +1 -0
  140. package/lib/server/forge/core/openclawClient.js +111 -0
  141. package/lib/server/forge/core/openclawClient.js.map +1 -0
  142. package/lib/server/forge/core/prompts.d.ts +96 -0
  143. package/lib/server/forge/core/prompts.d.ts.map +1 -0
  144. package/lib/server/forge/core/prompts.js +450 -0
  145. package/lib/server/forge/core/prompts.js.map +1 -0
  146. package/lib/server/forge/core/providers/azuredevops.d.ts +134 -0
  147. package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -0
  148. package/lib/server/forge/core/providers/azuredevops.js +360 -0
  149. package/lib/server/forge/core/providers/azuredevops.js.map +1 -0
  150. package/lib/server/forge/core/providers/base.d.ts +114 -0
  151. package/lib/server/forge/core/providers/base.d.ts.map +1 -0
  152. package/lib/server/forge/core/providers/base.js +98 -0
  153. package/lib/server/forge/core/providers/base.js.map +1 -0
  154. package/lib/server/forge/core/providers/github.d.ts +133 -0
  155. package/lib/server/forge/core/providers/github.d.ts.map +1 -0
  156. package/lib/server/forge/core/providers/github.js +307 -0
  157. package/lib/server/forge/core/providers/github.js.map +1 -0
  158. package/lib/server/forge/core/providers/gitlab.d.ts +144 -0
  159. package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -0
  160. package/lib/server/forge/core/providers/gitlab.js +407 -0
  161. package/lib/server/forge/core/providers/gitlab.js.map +1 -0
  162. package/lib/server/forge/core/providers/index.d.ts +21 -0
  163. package/lib/server/forge/core/providers/index.d.ts.map +1 -0
  164. package/lib/server/forge/core/providers/index.js +43 -0
  165. package/lib/server/forge/core/providers/index.js.map +1 -0
  166. package/lib/server/forge/core/providers/types.d.ts +80 -0
  167. package/lib/server/forge/core/providers/types.d.ts.map +1 -0
  168. package/lib/server/forge/core/providers/types.js +2 -0
  169. package/lib/server/forge/core/providers/types.js.map +1 -0
  170. package/lib/server/forge/core/quotaClient.d.ts +48 -0
  171. package/lib/server/forge/core/quotaClient.d.ts.map +1 -0
  172. package/lib/server/forge/core/quotaClient.js +88 -0
  173. package/lib/server/forge/core/quotaClient.js.map +1 -0
  174. package/lib/server/forge/core/types.d.ts +160 -0
  175. package/lib/server/forge/core/types.d.ts.map +1 -0
  176. package/lib/server/forge/core/types.js +2 -0
  177. package/lib/server/forge/core/types.js.map +1 -0
  178. package/lib/server/forge/core/validator/attribute.d.ts +31 -0
  179. package/lib/server/forge/core/validator/attribute.d.ts.map +1 -0
  180. package/lib/server/forge/core/validator/attribute.js +82 -0
  181. package/lib/server/forge/core/validator/attribute.js.map +1 -0
  182. package/lib/server/forge/core/validator/clone.d.ts +14 -0
  183. package/lib/server/forge/core/validator/clone.d.ts.map +1 -0
  184. package/lib/server/forge/core/validator/clone.js +99 -0
  185. package/lib/server/forge/core/validator/clone.js.map +1 -0
  186. package/lib/server/forge/core/validator/cmd.d.ts +23 -0
  187. package/lib/server/forge/core/validator/cmd.d.ts.map +1 -0
  188. package/lib/server/forge/core/validator/cmd.js +87 -0
  189. package/lib/server/forge/core/validator/cmd.js.map +1 -0
  190. package/lib/server/forge/core/validator/fs.d.ts +5 -0
  191. package/lib/server/forge/core/validator/fs.d.ts.map +1 -0
  192. package/{server → lib/server}/forge/core/validator/fs.js +8 -3
  193. package/lib/server/forge/core/validator/fs.js.map +1 -0
  194. package/lib/server/forge/core/validator/overlay.d.ts +13 -0
  195. package/lib/server/forge/core/validator/overlay.d.ts.map +1 -0
  196. package/lib/server/forge/core/validator/overlay.js +53 -0
  197. package/lib/server/forge/core/validator/overlay.js.map +1 -0
  198. package/lib/server/forge/core/validator/projectType.d.ts +20 -0
  199. package/lib/server/forge/core/validator/projectType.d.ts.map +1 -0
  200. package/lib/server/forge/core/validator/projectType.js +94 -0
  201. package/lib/server/forge/core/validator/projectType.js.map +1 -0
  202. package/lib/server/forge/core/validator/runners/go.d.ts +21 -0
  203. package/lib/server/forge/core/validator/runners/go.d.ts.map +1 -0
  204. package/lib/server/forge/core/validator/runners/go.js +99 -0
  205. package/lib/server/forge/core/validator/runners/go.js.map +1 -0
  206. package/lib/server/forge/core/validator/runners/node.d.ts +12 -0
  207. package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -0
  208. package/lib/server/forge/core/validator/runners/node.js +75 -0
  209. package/lib/server/forge/core/validator/runners/node.js.map +1 -0
  210. package/lib/server/forge/core/validator/tdd.d.ts +30 -0
  211. package/lib/server/forge/core/validator/tdd.d.ts.map +1 -0
  212. package/lib/server/forge/core/validator/tdd.js +96 -0
  213. package/lib/server/forge/core/validator/tdd.js.map +1 -0
  214. package/lib/server/forge/core/validator.d.ts +58 -0
  215. package/lib/server/forge/core/validator.d.ts.map +1 -0
  216. package/lib/server/forge/core/validator.js +150 -0
  217. package/lib/server/forge/core/validator.js.map +1 -0
  218. package/lib/server/forge/routes.d.ts +22 -0
  219. package/lib/server/forge/routes.d.ts.map +1 -0
  220. package/lib/server/forge/routes.js +984 -0
  221. package/lib/server/forge/routes.js.map +1 -0
  222. package/lib/server.d.ts +2 -0
  223. package/lib/server.d.ts.map +1 -0
  224. package/lib/server.js +52 -0
  225. package/lib/server.js.map +1 -0
  226. package/lib/shared/events.d.ts +12 -0
  227. package/lib/shared/events.d.ts.map +1 -0
  228. package/lib/shared/events.js +12 -0
  229. package/lib/shared/events.js.map +1 -0
  230. package/package.json +15 -13
  231. package/scripts/fix-shebang.cjs +10 -0
  232. package/bin/cli/analyze.js +0 -516
  233. package/bin/cli/apply.js +0 -264
  234. package/bin/cli/cifix.js +0 -300
  235. package/bin/cli/close.js +0 -125
  236. package/bin/cli/createIssue.js +0 -112
  237. package/bin/cli/doctor.js +0 -161
  238. package/bin/cli/init.js +0 -306
  239. package/bin/cli/issue.js +0 -116
  240. package/bin/cli/issues.js +0 -155
  241. package/bin/cli/merge.js +0 -175
  242. package/bin/cli/refine.js +0 -253
  243. package/bin/cli/repl.js +0 -301
  244. package/bin/cli/repos.js +0 -91
  245. package/bin/cli/resolution.js +0 -126
  246. package/bin/cli/session.js +0 -230
  247. package/bin/cli/sessionStore.js +0 -211
  248. package/bin/cli/ship.js +0 -762
  249. package/bin/cli/update.js +0 -95
  250. package/bin/cli/utils.js +0 -145
  251. package/bin/cli/validate.js +0 -280
  252. package/bin/cli/watch.js +0 -274
  253. package/server/forge/core/ForgeAgent.js +0 -1179
  254. package/server/forge/core/ForgeAgent.test.js +0 -179
  255. package/server/forge/core/branchName.js +0 -41
  256. package/server/forge/core/claudeClient.js +0 -378
  257. package/server/forge/core/configStore.js +0 -229
  258. package/server/forge/core/configStore.test.js +0 -89
  259. package/server/forge/core/jobs.js +0 -180
  260. package/server/forge/core/k8s.js +0 -54
  261. package/server/forge/core/localRepo.js +0 -163
  262. package/server/forge/core/openclawClient.js +0 -125
  263. package/server/forge/core/prompts.js +0 -483
  264. package/server/forge/core/prompts.test.js +0 -219
  265. package/server/forge/core/providers/azuredevops.js +0 -409
  266. package/server/forge/core/providers/base.js +0 -208
  267. package/server/forge/core/providers/github.js +0 -348
  268. package/server/forge/core/providers/gitlab.js +0 -529
  269. package/server/forge/core/providers/index.js +0 -47
  270. package/server/forge/core/quotaClient.js +0 -101
  271. package/server/forge/core/validator/attribute.js +0 -84
  272. package/server/forge/core/validator/clone.js +0 -116
  273. package/server/forge/core/validator/cmd.js +0 -98
  274. package/server/forge/core/validator/overlay.js +0 -52
  275. package/server/forge/core/validator/projectType.js +0 -87
  276. package/server/forge/core/validator/runners/go.js +0 -107
  277. package/server/forge/core/validator/runners/node.js +0 -84
  278. package/server/forge/core/validator/tdd.js +0 -105
  279. package/server/forge/core/validator.js +0 -167
  280. package/server/forge/routes.js +0 -1027
@@ -0,0 +1,113 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import path from "node:path";
10
+ import { useEffect, useState } from "react";
11
+ import Spinner from "ink-spinner";
12
+ import { h, Box, Text, useApp, runApp, Confirm } from "./ink.js";
13
+ import { getFlag, notifyServer, projectRoot } from "./utils.js";
14
+ import { PHASES, appendEvent, readState, resolveSessionTarget, updateState, } from "./sessionStore.js";
15
+ function CloseView({ repo, iid, bypassYes, onDone }) {
16
+ const { exit } = useApp();
17
+ const [phase, setPhase] = useState("review");
18
+ const [error, setError] = useState(null);
19
+ useEffect(() => {
20
+ if (phase === "done" || phase === "aborted" || phase === "error") {
21
+ onDone({ phase, error });
22
+ exit();
23
+ }
24
+ }, [phase]);
25
+ useEffect(() => {
26
+ if (phase !== "closing")
27
+ return;
28
+ let cancelled = false;
29
+ (async () => {
30
+ try {
31
+ const { createProvider } = await import(__rewriteRelativeImportExtension(path.join(projectRoot, "server/forge/core/providers/index.ts")));
32
+ const provider = createProvider(repo);
33
+ if (typeof provider.closeIssue !== "function") {
34
+ throw new Error(`${provider.name ?? "provider"} does not support closeIssue.`);
35
+ }
36
+ await provider.closeIssue(iid);
37
+ if (cancelled)
38
+ return;
39
+ setPhase("done");
40
+ }
41
+ catch (err) {
42
+ if (cancelled)
43
+ return;
44
+ setError(err);
45
+ setPhase("error");
46
+ }
47
+ })();
48
+ return () => {
49
+ cancelled = true;
50
+ };
51
+ }, [phase]);
52
+ if (phase === "review" || phase === "confirm") {
53
+ return h `<${Box} flexDirection="column">
54
+ <${Box}>
55
+ <${Text} color="yellow">Issue </>
56
+ <${Text}>${repo} #${iid}</>
57
+ </>
58
+ <${Confirm}
59
+ message="Close this issue?"
60
+ bypassYes=${bypassYes}
61
+ onSelect=${(yes) => setPhase(yes ? "closing" : "aborted")} />
62
+ </>`;
63
+ }
64
+ if (phase === "closing") {
65
+ return h `<${Box}>
66
+ <${Text} color="cyan"><${Spinner} type="dots"/></>
67
+ <${Text}> Closing issue…</>
68
+ </>`;
69
+ }
70
+ if (phase === "done") {
71
+ return h `<${Text} color="green">${`✓ Closed #${iid}`}</>`;
72
+ }
73
+ if (phase === "aborted") {
74
+ return h `<${Text} dimColor>Aborted — issue still open.</>`;
75
+ }
76
+ return h `<${Box}>
77
+ <${Text} color="red">${`✘ ${error?.message ?? String(error)}`}</>
78
+ </>`;
79
+ }
80
+ export async function cmdClose(argv) {
81
+ const explicitIid = Number(argv[1]);
82
+ const explicitRepo = getFlag(argv, "--repo");
83
+ const bypassYes = argv.includes("--yes") || process.env.FORGE_YES === "1";
84
+ const target = await resolveSessionTarget({
85
+ explicitIid: Number.isInteger(explicitIid) && explicitIid > 0 ? explicitIid : null,
86
+ explicitRepo,
87
+ });
88
+ if (!target?.repo || !target?.iid) {
89
+ console.error("No session target. Pass an <iid>, set --repo, or run analyze first.");
90
+ process.exit(1);
91
+ }
92
+ const state = await readState(target.repo, target.iid);
93
+ const repo = state?.primary ?? target.repo;
94
+ let outcome = { phase: "pending", error: null };
95
+ await runApp(h `<${CloseView}
96
+ repo=${repo}
97
+ iid=${target.iid}
98
+ bypassYes=${bypassYes}
99
+ onDone=${(o) => (outcome = o)} />`);
100
+ if (outcome.phase === "done") {
101
+ await updateState(target.repo, target.iid, {
102
+ phase: PHASES.CLOSED,
103
+ closedAt: new Date().toISOString(),
104
+ }).catch(() => { });
105
+ await appendEvent(target.repo, target.iid, { type: "session:closed" }).catch(() => { });
106
+ const { FORGE_EVENTS } = await import("../../shared/events.js");
107
+ await notifyServer({ type: FORGE_EVENTS.ISSUE_CLOSED, iid: target.iid });
108
+ return;
109
+ }
110
+ if (outcome.phase === "error")
111
+ process.exit(2);
112
+ }
113
+ //# sourceMappingURL=close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../bin/cli/close.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdCreateIssue(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=createIssue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIssue.d.ts","sourceRoot":"","sources":["../../../bin/cli/createIssue.ts"],"names":[],"mappings":"AAqFA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,iBAwClD"}
@@ -0,0 +1,108 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import path from "node:path";
10
+ import { useEffect, useState } from "react";
11
+ import Spinner from "ink-spinner";
12
+ import { h, Box, Text, useApp, runApp } from "./ink.js";
13
+ import { getFlag, projectRoot, resolvePrimaryRepo } from "./utils.js";
14
+ function CreateIssueView({ repo, title, description, onDone }) {
15
+ const { exit } = useApp();
16
+ const [phase, setPhase] = useState("creating");
17
+ const [issue, setIssue] = useState(null);
18
+ const [error, setError] = useState(null);
19
+ useEffect(() => {
20
+ if (phase === "done" || phase === "error") {
21
+ onDone({ phase, issue, error });
22
+ exit();
23
+ }
24
+ }, [phase]);
25
+ useEffect(() => {
26
+ let cancelled = false;
27
+ (async () => {
28
+ try {
29
+ const { createProvider } = await import(__rewriteRelativeImportExtension(path.join(projectRoot, "server/forge/core/providers/index.ts")));
30
+ const provider = createProvider(repo);
31
+ const created = await provider.createIssue(title, description);
32
+ if (cancelled)
33
+ return;
34
+ setIssue(created);
35
+ setPhase("done");
36
+ }
37
+ catch (err) {
38
+ if (cancelled)
39
+ return;
40
+ setError(err);
41
+ setPhase("error");
42
+ }
43
+ })();
44
+ return () => {
45
+ cancelled = true;
46
+ };
47
+ }, []);
48
+ if (phase === "creating") {
49
+ return h `<${Box}>
50
+ <${Text} color="cyan"><${Spinner} type="dots"/></>
51
+ <${Text}> Creating issue in ${repo}…</>
52
+ </>`;
53
+ }
54
+ if (phase === "done") {
55
+ return h `<${Box} flexDirection="column">
56
+ <${Box}>
57
+ <${Text} color="green">✓ </>
58
+ <${Text}>Created </>
59
+ <${Text} color="yellow">#${issue.iid}</>
60
+ <${Text}> — ${issue.title}</>
61
+ </>
62
+ ${issue.web_url
63
+ ? h `<${Box}><${Text} dimColor>${issue.web_url}</></>`
64
+ : null}
65
+ <${Box} marginTop=${1}>
66
+ <${Text} dimColor>${`Next: forge ship ${issue.iid}`}</>
67
+ </>
68
+ </>`;
69
+ }
70
+ return h `<${Box}>
71
+ <${Text} color="red">${`✘ ${error?.message ?? String(error)}`}</>
72
+ </>`;
73
+ }
74
+ export async function cmdCreateIssue(argv) {
75
+ const title = getFlag(argv, "--title") ?? argv.slice(1).find((a) => !a.startsWith("-"));
76
+ if (!title) {
77
+ console.error("Usage: forge create-issue --title \"Bug: widget broken\" [--description \"...\"] [--repo <id>] [--json]");
78
+ process.exit(1);
79
+ }
80
+ const description = getFlag(argv, "--description") ?? "";
81
+ const repo = await resolvePrimaryRepo(argv);
82
+ if (!repo) {
83
+ console.error("No repo. Pass --repo <group/repo>, set FORGE_GITLAB_PROJECT, or run `forge init`.");
84
+ process.exit(1);
85
+ }
86
+ const json = argv.includes("--json");
87
+ if (json) {
88
+ const { createProvider } = await import(__rewriteRelativeImportExtension(path.join(projectRoot, "server/forge/core/providers/index.ts")));
89
+ try {
90
+ const issue = await createProvider(repo).createIssue(title, description);
91
+ process.stdout.write(`${JSON.stringify(issue, null, 2)}\n`);
92
+ }
93
+ catch (err) {
94
+ process.stdout.write(`${JSON.stringify({ error: err.message })}\n`);
95
+ process.exit(2);
96
+ }
97
+ return;
98
+ }
99
+ let outcome = { phase: "pending", issue: null, error: null };
100
+ await runApp(h `<${CreateIssueView}
101
+ repo=${repo}
102
+ title=${title}
103
+ description=${description}
104
+ onDone=${(o) => (outcome = o)} />`);
105
+ if (outcome.phase === "error")
106
+ process.exit(2);
107
+ }
108
+ //# sourceMappingURL=createIssue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createIssue.js","sourceRoot":"","sources":["../../../bin/cli/createIssue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdDoctor(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../bin/cli/doctor.ts"],"names":[],"mappings":"AAwHA,wBAAsB,SAAS,kBA8D9B"}
@@ -0,0 +1,145 @@
1
+ import { existsSync } from "node:fs";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { execFile } from "node:child_process";
6
+ import { promisify } from "node:util";
7
+ import { useEffect, useState } from "react";
8
+ import Spinner from "ink-spinner";
9
+ import { h, Box, Text, useApp, runApp } from "./ink.js";
10
+ import { projectRoot } from "./utils.js";
11
+ const execFileP = promisify(execFile);
12
+ function CheckRow({ name, status, message }) {
13
+ const label = name.padEnd(18);
14
+ if (status === "pending") {
15
+ return h `<${Box}>
16
+ <${Text} color="gray">○ ${label} </>
17
+ <${Text} dimColor>queued</>
18
+ </>`;
19
+ }
20
+ if (status === "running") {
21
+ return h `<${Box}>
22
+ <${Text} color="cyan"><${Spinner} type="dots"/></>
23
+ <${Text}> ${label} </>
24
+ <${Text} dimColor>checking…</>
25
+ </>`;
26
+ }
27
+ if (status === "pass") {
28
+ return h `<${Box}>
29
+ <${Text} color="green">✓</>
30
+ <${Text}> ${label} </>
31
+ <${Text} dimColor>${message ?? ""}</>
32
+ </>`;
33
+ }
34
+ return h `<${Box}>
35
+ <${Text} color="red">✘</>
36
+ <${Text}> ${label} </>
37
+ <${Text} color="red">${message ?? ""}</>
38
+ </>`;
39
+ }
40
+ function Doctor({ checks, onDone }) {
41
+ const { exit } = useApp();
42
+ const [rows, setRows] = useState(() => checks.map((c) => ({ name: c.name, status: "pending", message: "" })));
43
+ const [done, setDone] = useState(null);
44
+ useEffect(() => {
45
+ let cancelled = false;
46
+ (async () => {
47
+ let failed = 0;
48
+ for (let i = 0; i < checks.length; i++) {
49
+ if (cancelled)
50
+ return;
51
+ setRows((s) => s.map((row, idx) => (idx === i ? { ...row, status: "running" } : row)));
52
+ try {
53
+ const msg = await checks[i].fn();
54
+ if (cancelled)
55
+ return;
56
+ setRows((s) => s.map((row, idx) => idx === i ? { ...row, status: "pass", message: msg } : row));
57
+ }
58
+ catch (err) {
59
+ if (cancelled)
60
+ return;
61
+ setRows((s) => s.map((row, idx) => idx === i
62
+ ? { ...row, status: "fail", message: err.message || String(err) }
63
+ : row));
64
+ failed += 1;
65
+ }
66
+ }
67
+ setDone({ failed });
68
+ })();
69
+ return () => {
70
+ cancelled = true;
71
+ };
72
+ }, []);
73
+ useEffect(() => {
74
+ if (!done)
75
+ return;
76
+ onDone(done.failed);
77
+ exit();
78
+ }, [done]);
79
+ return h `<${Box} flexDirection="column">
80
+ ${rows.map((r, i) => h `<${CheckRow} key=${i} name=${r.name} status=${r.status} message=${r.message} />`)}
81
+ </>`;
82
+ }
83
+ export async function cmdDoctor() {
84
+ const checks = [
85
+ {
86
+ name: "node >= 20",
87
+ fn: () => {
88
+ const major = parseInt(process.versions.node.split(".")[0], 10);
89
+ if (major < 20)
90
+ throw new Error(`found ${process.versions.node}`);
91
+ return process.versions.node;
92
+ },
93
+ },
94
+ {
95
+ name: "git",
96
+ fn: async () => {
97
+ const { stdout } = await execFileP("git", ["--version"]);
98
+ return stdout.trim();
99
+ },
100
+ },
101
+ {
102
+ name: "claude CLI",
103
+ fn: async () => {
104
+ const { stdout } = await execFileP("claude", ["--version"]);
105
+ return stdout.trim();
106
+ },
107
+ },
108
+ {
109
+ name: "FORGE_TOKEN",
110
+ fn: () => {
111
+ if (!process.env.FORGE_TOKEN)
112
+ throw new Error("not set (run: forge init)");
113
+ return "set";
114
+ },
115
+ },
116
+ {
117
+ name: "config file",
118
+ fn: async () => {
119
+ const p = process.env.FORGE_CONFIG_PATH ??
120
+ path.join(os.homedir(), ".forge", "config.json");
121
+ if (!existsSync(p))
122
+ throw new Error(`missing at ${p}`);
123
+ const cfg = JSON.parse(await fs.readFile(p, "utf8"));
124
+ const n = cfg.repos?.length ?? 0;
125
+ return `${p} (${n} repo${n === 1 ? "" : "s"})`;
126
+ },
127
+ },
128
+ {
129
+ name: "frontend build",
130
+ fn: () => {
131
+ const spa = path.join(projectRoot, "dist", "index.html");
132
+ if (!existsSync(spa))
133
+ throw new Error("not built (run: npm run build:app)");
134
+ return "dist/";
135
+ },
136
+ },
137
+ ];
138
+ let failed = 0;
139
+ await runApp(h `<${Doctor} checks=${checks} onDone=${(n) => (failed = n)} />`);
140
+ if (failed) {
141
+ process.stderr.write(`\n${failed} check${failed === 1 ? "" : "s"} failed.\n`);
142
+ process.exit(1);
143
+ }
144
+ }
145
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../bin/cli/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function cmdInit({ force }: {
2
+ force: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../bin/cli/init.ts"],"names":[],"mappings":"AA6TA,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,iBAa1D"}