@ipul-labs/forge 1.16.7 → 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 +58 -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 +17 -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 -153
  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 -105
  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 -1026
@@ -0,0 +1,288 @@
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 { existsSync } from "node:fs";
10
+ import fs from "node:fs/promises";
11
+ import os from "node:os";
12
+ import path from "node:path";
13
+ import { randomBytes } from "node:crypto";
14
+ import React, { useEffect, useState } from "react";
15
+ import TextInput from "ink-text-input";
16
+ import SelectInput from "ink-select-input";
17
+ import { h, Box, Text, useApp, runApp } from "./ink.js";
18
+ import { projectRoot } from "./utils.js";
19
+ const SCM_OPTIONS = [
20
+ { label: "gitlab", value: "gitlab" },
21
+ { label: "github", value: "github" },
22
+ { label: "azuredevops", value: "azuredevops" },
23
+ ];
24
+ const YESNO = [
25
+ { label: "no, abort", value: "no" },
26
+ { label: "yes, overwrite", value: "yes" },
27
+ ];
28
+ const ADD_REPO_YESNO = [
29
+ { label: "no, that's all", value: "no" },
30
+ { label: "yes, add another", value: "yes" },
31
+ ];
32
+ function Field({ label, hint, children }) {
33
+ return h `<${Box} flexDirection="column" marginBottom=${1}>
34
+ <${Box}>
35
+ <${Text} color="cyan">? </>
36
+ <${Text}>${label}</>
37
+ ${hint ? h `<${Text} dimColor> (${hint})</>` : null}
38
+ </>
39
+ <${Box} marginLeft=${2}>${children}</>
40
+ </>`;
41
+ }
42
+ function Summary({ field, value }) {
43
+ return h `<${Box}>
44
+ <${Text} color="green">✓ </>
45
+ <${Text}>${field}: </>
46
+ <${Text} dimColor>${value}</>
47
+ </>`;
48
+ }
49
+ function InitWizard({ envPath, hasExisting, force, onDone }) {
50
+ const { exit } = useApp();
51
+ const generatedToken = React.useMemo(() => randomBytes(24).toString("hex"), []);
52
+ const [step, setStep] = useState(hasExisting && !force ? "overwrite" : "token");
53
+ const [data, setData] = useState({
54
+ token: "",
55
+ port: "",
56
+ scm: "gitlab",
57
+ repos: [],
58
+ scmToken: "",
59
+ });
60
+ const [input, setInput] = useState("");
61
+ const [savedPaths, setSavedPaths] = useState(null);
62
+ const [error, setError] = useState(null);
63
+ useEffect(() => {
64
+ if (step === "abort") {
65
+ onDone({ aborted: true });
66
+ exit();
67
+ }
68
+ else if (step === "done") {
69
+ onDone({ ok: true, savedPaths });
70
+ exit();
71
+ }
72
+ else if (step === "error") {
73
+ onDone({ error });
74
+ exit(error);
75
+ }
76
+ }, [step]);
77
+ useEffect(() => {
78
+ if (step !== "save")
79
+ return;
80
+ (async () => {
81
+ try {
82
+ await fs.writeFile(envPath, `FORGE_TOKEN=${data.token}\nPORT=${data.port}\nNODE_ENV=production\n`, "utf8");
83
+ const { patch } = await import(__rewriteRelativeImportExtension(path.join(projectRoot, "server/forge/core/configStore.ts")));
84
+ await patch({
85
+ repos: data.repos.map((id) => ({ id, label: id })),
86
+ connections: { [data.scm]: { token: data.scmToken } },
87
+ });
88
+ const cfgPath = process.env.FORGE_CONFIG_PATH ??
89
+ path.join(os.homedir(), ".forge", "config.json");
90
+ setSavedPaths({ envPath, cfgPath });
91
+ setStep("done");
92
+ }
93
+ catch (err) {
94
+ setError(err);
95
+ setStep("error");
96
+ }
97
+ })();
98
+ }, [step]);
99
+ if (step === "overwrite") {
100
+ return h `<${Box} flexDirection="column">
101
+ <${Text}>forge init</>
102
+ <${Box} marginTop=${1}>
103
+ <${Text} color="yellow">! </>
104
+ <${Text}>${envPath} exists — overwrite?</>
105
+ </>
106
+ <${Box} marginLeft=${2}>
107
+ <${SelectInput}
108
+ items=${YESNO}
109
+ onSelect=${(item) => {
110
+ if (item.value === "yes")
111
+ setStep("token");
112
+ else
113
+ setStep("abort");
114
+ }} />
115
+ </>
116
+ </>`;
117
+ }
118
+ if (step === "token") {
119
+ return h `<${Box} flexDirection="column">
120
+ <${Text}>forge init</>
121
+ <${Box} marginTop=${1}/>
122
+ <${Field} label="FORGE_TOKEN" hint="press Enter to use generated">
123
+ <${TextInput}
124
+ value=${input}
125
+ placeholder=${generatedToken}
126
+ onChange=${setInput}
127
+ onSubmit=${(v) => {
128
+ const value = v || generatedToken;
129
+ setData((d) => ({ ...d, token: value }));
130
+ setInput("");
131
+ setStep("port");
132
+ }} />
133
+ </>
134
+ </>`;
135
+ }
136
+ if (step === "port") {
137
+ return h `<${Box} flexDirection="column">
138
+ <${Summary} field="FORGE_TOKEN" value=${maskToken(data.token)} />
139
+ <${Field} label="PORT" hint="default 5001">
140
+ <${TextInput}
141
+ value=${input}
142
+ placeholder="5001"
143
+ onChange=${setInput}
144
+ onSubmit=${(v) => {
145
+ const value = v || "5001";
146
+ setData((d) => ({ ...d, port: value }));
147
+ setInput("");
148
+ setStep("scm");
149
+ }} />
150
+ </>
151
+ </>`;
152
+ }
153
+ if (step === "scm") {
154
+ return h `<${Box} flexDirection="column">
155
+ <${Summary} field="FORGE_TOKEN" value=${maskToken(data.token)} />
156
+ <${Summary} field="PORT" value=${data.port} />
157
+ <${Field} label="SCM provider" hint="↑/↓ to choose">
158
+ <${SelectInput}
159
+ items=${SCM_OPTIONS}
160
+ onSelect=${(item) => {
161
+ setData((d) => ({ ...d, scm: item.value }));
162
+ setStep("repo");
163
+ }} />
164
+ </>
165
+ </>`;
166
+ }
167
+ if (step === "repo") {
168
+ const isFirst = data.repos.length === 0;
169
+ const label = isFirst ? "Primary repo" : `Additional repo #${data.repos.length + 1}`;
170
+ const hint = isFirst
171
+ ? "group/repo (this becomes the default)"
172
+ : "group/repo for cross-repo fixes";
173
+ return h `<${Box} flexDirection="column">
174
+ <${Summary} field="FORGE_TOKEN" value=${maskToken(data.token)} />
175
+ <${Summary} field="PORT" value=${data.port} />
176
+ <${Summary} field="SCM provider" value=${data.scm} />
177
+ ${data.repos.map((r, i) => h `<${Summary} key=${i} field=${i === 0 ? "Primary repo" : `Repo #${i + 1}`} value=${r} />`)}
178
+ <${Field} label=${label} hint=${hint}>
179
+ <${TextInput}
180
+ value=${input}
181
+ onChange=${setInput}
182
+ onSubmit=${(v) => {
183
+ const trimmed = v.trim();
184
+ if (!trimmed) {
185
+ if (isFirst)
186
+ return; // primary required, stay on step
187
+ setStep("scmToken");
188
+ return;
189
+ }
190
+ setData((d) => ({ ...d, repos: [...d.repos, trimmed] }));
191
+ setInput("");
192
+ setStep("repoMore");
193
+ }} />
194
+ </>
195
+ </>`;
196
+ }
197
+ if (step === "repoMore") {
198
+ return h `<${Box} flexDirection="column">
199
+ <${Summary} field="FORGE_TOKEN" value=${maskToken(data.token)} />
200
+ <${Summary} field="PORT" value=${data.port} />
201
+ <${Summary} field="SCM provider" value=${data.scm} />
202
+ ${data.repos.map((r, i) => h `<${Summary} key=${i} field=${i === 0 ? "Primary repo" : `Repo #${i + 1}`} value=${r} />`)}
203
+ <${Field} label="Add another repo?" hint="enables cross-repo fixes (e.g. web-app + api)">
204
+ <${SelectInput}
205
+ items=${ADD_REPO_YESNO}
206
+ onSelect=${(item) => {
207
+ if (item.value === "yes")
208
+ setStep("repo");
209
+ else
210
+ setStep("scmToken");
211
+ }} />
212
+ </>
213
+ </>`;
214
+ }
215
+ if (step === "scmToken") {
216
+ return h `<${Box} flexDirection="column">
217
+ <${Summary} field="FORGE_TOKEN" value=${maskToken(data.token)} />
218
+ <${Summary} field="PORT" value=${data.port} />
219
+ <${Summary} field="SCM provider" value=${data.scm} />
220
+ ${data.repos.map((r, i) => h `<${Summary} key=${i} field=${i === 0 ? "Primary repo" : `Repo #${i + 1}`} value=${r} />`)}
221
+ <${Field} label=${`${data.scm} token`}>
222
+ <${TextInput}
223
+ value=${input}
224
+ onChange=${setInput}
225
+ mask="*"
226
+ onSubmit=${(v) => {
227
+ setData((d) => ({ ...d, scmToken: v }));
228
+ setInput("");
229
+ setStep("save");
230
+ }} />
231
+ </>
232
+ </>`;
233
+ }
234
+ if (step === "save") {
235
+ return h `<${Box}>
236
+ <${Text} color="cyan">… </>
237
+ <${Text}>Writing config…</>
238
+ </>`;
239
+ }
240
+ if (step === "done") {
241
+ return h `<${Box} flexDirection="column">
242
+ <${Box}>
243
+ <${Text} color="green">✓ </>
244
+ <${Text}>Wrote ${savedPaths?.envPath}</>
245
+ </>
246
+ <${Box}>
247
+ <${Text} color="green">✓ </>
248
+ <${Text}>Wrote ${savedPaths?.cfgPath}</>
249
+ </>
250
+ <${Box} marginTop=${1}>
251
+ <${Text} dimColor>${`Configured ${data.repos.length} repo${data.repos.length === 1 ? "" : "s"} (primary: ${data.repos[0] ?? "none"}).`}</>
252
+ </>
253
+ <${Box}>
254
+ <${Text} dimColor>${"Next: forge doctor | forge issues | forge start"}</>
255
+ </>
256
+ </>`;
257
+ }
258
+ if (step === "abort") {
259
+ return h `<${Text} dimColor>Aborted.</>`;
260
+ }
261
+ if (step === "error") {
262
+ return h `<${Box}>
263
+ <${Text} color="red">✘ </>
264
+ <${Text}>${error?.message || String(error)}</>
265
+ </>`;
266
+ }
267
+ return null;
268
+ }
269
+ function maskToken(t) {
270
+ if (!t)
271
+ return "";
272
+ if (t.length <= 8)
273
+ return "*".repeat(t.length);
274
+ return `${t.slice(0, 4)}…${t.slice(-4)}`;
275
+ }
276
+ export async function cmdInit({ force }) {
277
+ const envPath = path.join(process.cwd(), ".env");
278
+ const hasExisting = existsSync(envPath);
279
+ let outcome = { ok: false };
280
+ await runApp(h `<${InitWizard}
281
+ envPath=${envPath}
282
+ hasExisting=${hasExisting}
283
+ force=${force}
284
+ onDone=${(o) => (outcome = o)} />`);
285
+ if (outcome.error)
286
+ process.exit(1);
287
+ }
288
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../bin/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { Box, Text, Newline, render, useApp, useInput } from "ink";
3
+ export declare const h: any;
4
+ export { Box, Text, Newline, render, useApp, useInput, React };
5
+ /**
6
+ * Render an Ink component, resolve when it exits via useApp().exit().
7
+ * If the component calls exit(err), the promise rejects with that error.
8
+ */
9
+ export declare function runApp(element: React.ReactElement): Promise<void>;
10
+ /**
11
+ * Yes/no confirmation prompt. Defaults to "no" (cursor on the safe option).
12
+ * Calls onSelect(true) on yes, onSelect(false) on no.
13
+ *
14
+ * Bypass it programmatically by setting `bypassYes={true}` — fires onSelect(true)
15
+ * once on mount, doesn't render an interactive picker. Lets `--yes` callers
16
+ * reuse the same component.
17
+ */
18
+ export declare function Confirm({ message, onSelect, bypassYes }: {
19
+ message: string;
20
+ onSelect: (yes: boolean) => void;
21
+ bypassYes?: boolean;
22
+ }): any;
23
+ //# sourceMappingURL=ink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink.d.ts","sourceRoot":"","sources":["../../../bin/cli/ink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAGzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEnE,eAAO,MAAM,CAAC,KAA4H,CAAC;AAC3I,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAE/D;;;GAGG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,iBAOvD;AAOD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAiB,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,OAsB3I"}
@@ -2,28 +2,25 @@ import React, { useEffect } from "react";
2
2
  import htm from "htm";
3
3
  import SelectInput from "ink-select-input";
4
4
  import { Box, Text, Newline, render, useApp, useInput } from "ink";
5
-
6
5
  export const h = htm.bind(React.createElement);
7
6
  export { Box, Text, Newline, render, useApp, useInput, React };
8
-
9
7
  /**
10
8
  * Render an Ink component, resolve when it exits via useApp().exit().
11
9
  * If the component calls exit(err), the promise rejects with that error.
12
10
  */
13
11
  export async function runApp(element) {
14
- const instance = render(element);
15
- try {
16
- await instance.waitUntilExit();
17
- } finally {
18
- instance.unmount();
19
- }
12
+ const instance = render(element);
13
+ try {
14
+ await instance.waitUntilExit();
15
+ }
16
+ finally {
17
+ instance.unmount();
18
+ }
20
19
  }
21
-
22
20
  const CONFIRM_ITEMS = [
23
- { label: "no", value: "no" },
24
- { label: "yes", value: "yes" },
21
+ { label: "no", value: "no" },
22
+ { label: "yes", value: "yes" },
25
23
  ];
26
-
27
24
  /**
28
25
  * Yes/no confirmation prompt. Defaults to "no" (cursor on the safe option).
29
26
  * Calls onSelect(true) on yes, onSelect(false) on no.
@@ -33,17 +30,18 @@ const CONFIRM_ITEMS = [
33
30
  * reuse the same component.
34
31
  */
35
32
  export function Confirm({ message, onSelect, bypassYes = false }) {
36
- useEffect(() => {
37
- if (bypassYes) onSelect(true);
38
- }, [bypassYes]);
39
- if (bypassYes) {
40
- return h`<${Box}>
33
+ useEffect(() => {
34
+ if (bypassYes)
35
+ onSelect(true);
36
+ }, [bypassYes]);
37
+ if (bypassYes) {
38
+ return h `<${Box}>
41
39
  <${Text} color="green">✓ </>
42
40
  <${Text}>${message}</>
43
41
  <${Text} dimColor> (--yes)</>
44
42
  </>`;
45
- }
46
- return h`<${Box} flexDirection="column" marginTop=${1}>
43
+ }
44
+ return h `<${Box} flexDirection="column" marginTop=${1}>
47
45
  <${Box}>
48
46
  <${Text} color="yellow">? </>
49
47
  <${Text}>${message}</>
@@ -55,3 +53,4 @@ export function Confirm({ message, onSelect, bypassYes = false }) {
55
53
  </>
56
54
  </>`;
57
55
  }
56
+ //# sourceMappingURL=ink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ink.js","sourceRoot":"","sources":["../../../bin/cli/ink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEnE,MAAM,CAAC,MAAM,CAAC,GAAI,GAA8F,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC3I,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA2B;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC;QACJ,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACV,QAAQ,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;AACF,CAAC;AAED,MAAM,aAAa,GAAG;IACrB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAC5B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;CAC9B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,GAAG,KAAK,EAA8E;IAC3I,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAChB,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,CAAA,IAAI,GAAG;MACX,IAAI;MACJ,IAAI,IAAI,OAAO;MACf,IAAI;MACJ,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAA,IAAI,GAAG,qCAAqC,CAAC;KACjD,GAAG;MACF,IAAI;MACJ,IAAI,IAAI,OAAO;;KAEhB,GAAG,eAAe,CAAC;MAClB,WAAW;YACL,aAAa;eACV,CAAC,IAAsC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;;KAEpF,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdIssue(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../bin/cli/issue.ts"],"names":[],"mappings":"AAmGA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,iBAiC5C"}
@@ -0,0 +1,114 @@
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 { projectRoot, resolvePrimaryRepo } from "./utils.js";
14
+ function IssueDetail({ issue, repo }) {
15
+ const labels = (issue.labels ?? []).join(", ");
16
+ return h `<${Box} flexDirection="column">
17
+ <${Box}>
18
+ <${Text} color="yellow">#${issue.iid} </>
19
+ <${Text} bold>${issue.title}</>
20
+ </>
21
+ <${Box}>
22
+ <${Text} dimColor>${`${repo} · ${issue.author?.name ?? "unknown"} · ${issue.created_at ?? ""}`}</>
23
+ </>
24
+ ${labels
25
+ ? h `<${Box}>
26
+ <${Text} dimColor>labels: </>
27
+ <${Text}>${labels}</>
28
+ </>`
29
+ : null}
30
+ ${issue.web_url
31
+ ? h `<${Box}>
32
+ <${Text} dimColor>${issue.web_url}</>
33
+ </>`
34
+ : null}
35
+ <${Box} marginTop=${1}>
36
+ <${Text} dimColor>${"─── description ───"}</>
37
+ </>
38
+ <${Box} marginTop=${1}>
39
+ <${Text}>${issue.description ?? "(no description)"}</>
40
+ </>
41
+ <${Box} marginTop=${1}>
42
+ <${Text} dimColor>${`Next: forge ship ${issue.iid}`}</>
43
+ </>
44
+ </>`;
45
+ }
46
+ function IssueView({ iid, repo, onDone }) {
47
+ const { exit } = useApp();
48
+ const [issue, setIssue] = useState(null);
49
+ const [error, setError] = useState(null);
50
+ const [done, setDone] = useState(null);
51
+ useEffect(() => {
52
+ if (!done)
53
+ return;
54
+ onDone(done);
55
+ exit();
56
+ }, [done]);
57
+ useEffect(() => {
58
+ (async () => {
59
+ try {
60
+ const { createProvider } = await import(__rewriteRelativeImportExtension(path.join(projectRoot, "server/forge/core/providers/index.ts")));
61
+ const provider = createProvider(repo);
62
+ const i = await provider.getIssue(iid);
63
+ setIssue(i);
64
+ setDone({ ok: true });
65
+ }
66
+ catch (err) {
67
+ setError(err);
68
+ setDone({ ok: false, error: err });
69
+ }
70
+ })();
71
+ }, []);
72
+ if (error) {
73
+ return h `<${Box}>
74
+ <${Text} color="red">${`✘ ${error.message ?? String(error)}`}</>
75
+ </>`;
76
+ }
77
+ if (!issue) {
78
+ return h `<${Box}>
79
+ <${Text} color="cyan"><${Spinner} type="dots"/></>
80
+ <${Text}>${` Fetching issue #${iid} from ${repo}…`}</>
81
+ </>`;
82
+ }
83
+ return h `<${IssueDetail} issue=${issue} repo=${repo} />`;
84
+ }
85
+ export async function cmdIssue(argv) {
86
+ const iid = Number(argv[1]);
87
+ if (!Number.isInteger(iid) || iid <= 0) {
88
+ console.error("Usage: forge issue <iid> [--repo <id>]");
89
+ process.exit(1);
90
+ }
91
+ const repo = (await resolvePrimaryRepo(argv)) ?? null;
92
+ if (!repo) {
93
+ console.error("No repo. Pass --repo <group/repo>, set FORGE_GITLAB_PROJECT, or run `forge init`.");
94
+ process.exit(1);
95
+ }
96
+ const json = argv.includes("--json");
97
+ if (json) {
98
+ const { createProvider } = await import(__rewriteRelativeImportExtension(path.join(projectRoot, "server/forge/core/providers/index.ts")));
99
+ try {
100
+ const i = await createProvider(repo).getIssue(iid);
101
+ process.stdout.write(`${JSON.stringify(i, null, 2)}\n`);
102
+ }
103
+ catch (err) {
104
+ process.stdout.write(`${JSON.stringify({ error: err.message })}\n`);
105
+ process.exit(2);
106
+ }
107
+ return;
108
+ }
109
+ let outcome = { ok: false };
110
+ await runApp(h `<${IssueView} iid=${iid} repo=${repo} onDone=${(o) => (outcome = o)} />`);
111
+ if (!outcome.ok)
112
+ process.exit(2);
113
+ }
114
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../bin/cli/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdIssues(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../../bin/cli/issues.ts"],"names":[],"mappings":"AA2HA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBA8C7C"}