@ipul-labs/forge 1.16.8 → 1.17.1
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.
- package/README.md +39 -21
- package/lib/bin/cli/analyze.d.ts +9 -0
- package/lib/bin/cli/analyze.d.ts.map +1 -0
- package/lib/bin/cli/analyze.js +491 -0
- package/lib/bin/cli/analyze.js.map +1 -0
- package/lib/bin/cli/apply.d.ts +2 -0
- package/lib/bin/cli/apply.d.ts.map +1 -0
- package/lib/bin/cli/apply.js +262 -0
- package/lib/bin/cli/apply.js.map +1 -0
- package/lib/bin/cli/cifix.d.ts +2 -0
- package/lib/bin/cli/cifix.d.ts.map +1 -0
- package/lib/bin/cli/cifix.js +310 -0
- package/lib/bin/cli/cifix.js.map +1 -0
- package/lib/bin/cli/close.d.ts +2 -0
- package/lib/bin/cli/close.d.ts.map +1 -0
- package/lib/bin/cli/close.js +113 -0
- package/lib/bin/cli/close.js.map +1 -0
- package/lib/bin/cli/createIssue.d.ts +2 -0
- package/lib/bin/cli/createIssue.d.ts.map +1 -0
- package/lib/bin/cli/createIssue.js +108 -0
- package/lib/bin/cli/createIssue.js.map +1 -0
- package/lib/bin/cli/doctor.d.ts +2 -0
- package/lib/bin/cli/doctor.d.ts.map +1 -0
- package/lib/bin/cli/doctor.js +145 -0
- package/lib/bin/cli/doctor.js.map +1 -0
- package/lib/bin/cli/init.d.ts +4 -0
- package/lib/bin/cli/init.d.ts.map +1 -0
- package/lib/bin/cli/init.js +288 -0
- package/lib/bin/cli/init.js.map +1 -0
- package/lib/bin/cli/ink.d.ts +23 -0
- package/lib/bin/cli/ink.d.ts.map +1 -0
- package/{bin → lib/bin}/cli/ink.js +18 -19
- package/lib/bin/cli/ink.js.map +1 -0
- package/lib/bin/cli/issue.d.ts +2 -0
- package/lib/bin/cli/issue.d.ts.map +1 -0
- package/lib/bin/cli/issue.js +114 -0
- package/lib/bin/cli/issue.js.map +1 -0
- package/lib/bin/cli/issues.d.ts +2 -0
- package/lib/bin/cli/issues.d.ts.map +1 -0
- package/lib/bin/cli/issues.js +149 -0
- package/lib/bin/cli/issues.js.map +1 -0
- package/lib/bin/cli/merge.d.ts +2 -0
- package/lib/bin/cli/merge.d.ts.map +1 -0
- package/lib/bin/cli/merge.js +162 -0
- package/lib/bin/cli/merge.js.map +1 -0
- package/lib/bin/cli/refine.d.ts +2 -0
- package/lib/bin/cli/refine.d.ts.map +1 -0
- package/lib/bin/cli/refine.js +249 -0
- package/lib/bin/cli/refine.js.map +1 -0
- package/lib/bin/cli/repl.d.ts +2 -0
- package/lib/bin/cli/repl.d.ts.map +1 -0
- package/lib/bin/cli/repl.js +309 -0
- package/lib/bin/cli/repl.js.map +1 -0
- package/lib/bin/cli/repos.d.ts +2 -0
- package/lib/bin/cli/repos.d.ts.map +1 -0
- package/lib/bin/cli/repos.js +86 -0
- package/lib/bin/cli/repos.js.map +1 -0
- package/lib/bin/cli/resolution.d.ts +2 -0
- package/lib/bin/cli/resolution.d.ts.map +1 -0
- package/lib/bin/cli/resolution.js +139 -0
- package/lib/bin/cli/resolution.js.map +1 -0
- package/lib/bin/cli/serverClient.d.ts +26 -0
- package/lib/bin/cli/serverClient.d.ts.map +1 -0
- package/lib/bin/cli/serverClient.js +111 -0
- package/lib/bin/cli/serverClient.js.map +1 -0
- package/lib/bin/cli/session.d.ts +8 -0
- package/lib/bin/cli/session.d.ts.map +1 -0
- package/lib/bin/cli/session.js +212 -0
- package/lib/bin/cli/session.js.map +1 -0
- package/lib/bin/cli/sessionStore.d.ts +69 -0
- package/lib/bin/cli/sessionStore.d.ts.map +1 -0
- package/lib/bin/cli/sessionStore.js +196 -0
- package/lib/bin/cli/sessionStore.js.map +1 -0
- package/lib/bin/cli/ship.d.ts +33 -0
- package/lib/bin/cli/ship.d.ts.map +1 -0
- package/lib/bin/cli/ship.js +737 -0
- package/lib/bin/cli/ship.js.map +1 -0
- package/lib/bin/cli/types.d.ts +59 -0
- package/lib/bin/cli/types.d.ts.map +1 -0
- package/lib/bin/cli/types.js +2 -0
- package/lib/bin/cli/types.js.map +1 -0
- package/lib/bin/cli/update.d.ts +2 -0
- package/lib/bin/cli/update.d.ts.map +1 -0
- package/lib/bin/cli/update.js +87 -0
- package/lib/bin/cli/update.js.map +1 -0
- package/lib/bin/cli/utils.d.ts +43 -0
- package/lib/bin/cli/utils.d.ts.map +1 -0
- package/lib/bin/cli/utils.js +181 -0
- package/lib/bin/cli/utils.js.map +1 -0
- package/lib/bin/cli/validate.d.ts +2 -0
- package/lib/bin/cli/validate.d.ts.map +1 -0
- package/lib/bin/cli/validate.js +283 -0
- package/lib/bin/cli/validate.js.map +1 -0
- package/lib/bin/cli/watch.d.ts +5 -0
- package/lib/bin/cli/watch.d.ts.map +1 -0
- package/lib/bin/cli/watch.js +263 -0
- package/lib/bin/cli/watch.js.map +1 -0
- package/lib/bin/forge-agent.d.ts +3 -0
- package/lib/bin/forge-agent.d.ts.map +1 -0
- package/{bin → lib/bin}/forge-agent.js +104 -105
- package/lib/bin/forge-agent.js.map +1 -0
- package/lib/server/forge/core/ForgeAgent.d.ts +260 -0
- package/lib/server/forge/core/ForgeAgent.d.ts.map +1 -0
- package/lib/server/forge/core/ForgeAgent.js +995 -0
- package/lib/server/forge/core/ForgeAgent.js.map +1 -0
- package/lib/server/forge/core/agentClient.d.ts +39 -0
- package/lib/server/forge/core/agentClient.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/agentClient.js +7 -12
- package/lib/server/forge/core/agentClient.js.map +1 -0
- package/lib/server/forge/core/branchName.d.ts +20 -0
- package/lib/server/forge/core/branchName.d.ts.map +1 -0
- package/lib/server/forge/core/branchName.js +39 -0
- package/lib/server/forge/core/branchName.js.map +1 -0
- package/lib/server/forge/core/claudeClient.d.ts +60 -0
- package/lib/server/forge/core/claudeClient.d.ts.map +1 -0
- package/lib/server/forge/core/claudeClient.js +347 -0
- package/lib/server/forge/core/claudeClient.js.map +1 -0
- package/lib/server/forge/core/configStore.d.ts +76 -0
- package/lib/server/forge/core/configStore.d.ts.map +1 -0
- package/lib/server/forge/core/configStore.js +213 -0
- package/lib/server/forge/core/configStore.js.map +1 -0
- package/lib/server/forge/core/gitlabClient.d.ts +144 -0
- package/lib/server/forge/core/gitlabClient.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/gitlabClient.js +98 -180
- package/lib/server/forge/core/gitlabClient.js.map +1 -0
- package/lib/server/forge/core/jobs.d.ts +67 -0
- package/lib/server/forge/core/jobs.d.ts.map +1 -0
- package/lib/server/forge/core/jobs.js +185 -0
- package/lib/server/forge/core/jobs.js.map +1 -0
- package/lib/server/forge/core/k8s.d.ts +18 -0
- package/lib/server/forge/core/k8s.d.ts.map +1 -0
- package/lib/server/forge/core/k8s.js +49 -0
- package/lib/server/forge/core/k8s.js.map +1 -0
- package/lib/server/forge/core/localRepo.d.ts +36 -0
- package/lib/server/forge/core/localRepo.d.ts.map +1 -0
- package/lib/server/forge/core/localRepo.js +165 -0
- package/lib/server/forge/core/localRepo.js.map +1 -0
- package/lib/server/forge/core/openclawClient.d.ts +61 -0
- package/lib/server/forge/core/openclawClient.d.ts.map +1 -0
- package/lib/server/forge/core/openclawClient.js +111 -0
- package/lib/server/forge/core/openclawClient.js.map +1 -0
- package/lib/server/forge/core/prompts.d.ts +96 -0
- package/lib/server/forge/core/prompts.d.ts.map +1 -0
- package/lib/server/forge/core/prompts.js +450 -0
- package/lib/server/forge/core/prompts.js.map +1 -0
- package/lib/server/forge/core/providers/azuredevops.d.ts +134 -0
- package/lib/server/forge/core/providers/azuredevops.d.ts.map +1 -0
- package/lib/server/forge/core/providers/azuredevops.js +360 -0
- package/lib/server/forge/core/providers/azuredevops.js.map +1 -0
- package/lib/server/forge/core/providers/base.d.ts +114 -0
- package/lib/server/forge/core/providers/base.d.ts.map +1 -0
- package/lib/server/forge/core/providers/base.js +98 -0
- package/lib/server/forge/core/providers/base.js.map +1 -0
- package/lib/server/forge/core/providers/github.d.ts +133 -0
- package/lib/server/forge/core/providers/github.d.ts.map +1 -0
- package/lib/server/forge/core/providers/github.js +307 -0
- package/lib/server/forge/core/providers/github.js.map +1 -0
- package/lib/server/forge/core/providers/gitlab.d.ts +144 -0
- package/lib/server/forge/core/providers/gitlab.d.ts.map +1 -0
- package/lib/server/forge/core/providers/gitlab.js +407 -0
- package/lib/server/forge/core/providers/gitlab.js.map +1 -0
- package/lib/server/forge/core/providers/index.d.ts +21 -0
- package/lib/server/forge/core/providers/index.d.ts.map +1 -0
- package/lib/server/forge/core/providers/index.js +43 -0
- package/lib/server/forge/core/providers/index.js.map +1 -0
- package/lib/server/forge/core/providers/types.d.ts +80 -0
- package/lib/server/forge/core/providers/types.d.ts.map +1 -0
- package/lib/server/forge/core/providers/types.js +2 -0
- package/lib/server/forge/core/providers/types.js.map +1 -0
- package/lib/server/forge/core/quotaClient.d.ts +48 -0
- package/lib/server/forge/core/quotaClient.d.ts.map +1 -0
- package/lib/server/forge/core/quotaClient.js +88 -0
- package/lib/server/forge/core/quotaClient.js.map +1 -0
- package/lib/server/forge/core/types.d.ts +160 -0
- package/lib/server/forge/core/types.d.ts.map +1 -0
- package/lib/server/forge/core/types.js +2 -0
- package/lib/server/forge/core/types.js.map +1 -0
- package/lib/server/forge/core/validator/attribute.d.ts +31 -0
- package/lib/server/forge/core/validator/attribute.d.ts.map +1 -0
- package/lib/server/forge/core/validator/attribute.js +82 -0
- package/lib/server/forge/core/validator/attribute.js.map +1 -0
- package/lib/server/forge/core/validator/clone.d.ts +14 -0
- package/lib/server/forge/core/validator/clone.d.ts.map +1 -0
- package/lib/server/forge/core/validator/clone.js +99 -0
- package/lib/server/forge/core/validator/clone.js.map +1 -0
- package/lib/server/forge/core/validator/cmd.d.ts +23 -0
- package/lib/server/forge/core/validator/cmd.d.ts.map +1 -0
- package/lib/server/forge/core/validator/cmd.js +87 -0
- package/lib/server/forge/core/validator/cmd.js.map +1 -0
- package/lib/server/forge/core/validator/fs.d.ts +5 -0
- package/lib/server/forge/core/validator/fs.d.ts.map +1 -0
- package/{server → lib/server}/forge/core/validator/fs.js +8 -3
- package/lib/server/forge/core/validator/fs.js.map +1 -0
- package/lib/server/forge/core/validator/overlay.d.ts +13 -0
- package/lib/server/forge/core/validator/overlay.d.ts.map +1 -0
- package/lib/server/forge/core/validator/overlay.js +53 -0
- package/lib/server/forge/core/validator/overlay.js.map +1 -0
- package/lib/server/forge/core/validator/projectType.d.ts +20 -0
- package/lib/server/forge/core/validator/projectType.d.ts.map +1 -0
- package/lib/server/forge/core/validator/projectType.js +94 -0
- package/lib/server/forge/core/validator/projectType.js.map +1 -0
- package/lib/server/forge/core/validator/runners/go.d.ts +21 -0
- package/lib/server/forge/core/validator/runners/go.d.ts.map +1 -0
- package/lib/server/forge/core/validator/runners/go.js +99 -0
- package/lib/server/forge/core/validator/runners/go.js.map +1 -0
- package/lib/server/forge/core/validator/runners/node.d.ts +12 -0
- package/lib/server/forge/core/validator/runners/node.d.ts.map +1 -0
- package/lib/server/forge/core/validator/runners/node.js +75 -0
- package/lib/server/forge/core/validator/runners/node.js.map +1 -0
- package/lib/server/forge/core/validator/tdd.d.ts +30 -0
- package/lib/server/forge/core/validator/tdd.d.ts.map +1 -0
- package/lib/server/forge/core/validator/tdd.js +96 -0
- package/lib/server/forge/core/validator/tdd.js.map +1 -0
- package/lib/server/forge/core/validator.d.ts +58 -0
- package/lib/server/forge/core/validator.d.ts.map +1 -0
- package/lib/server/forge/core/validator.js +150 -0
- package/lib/server/forge/core/validator.js.map +1 -0
- package/lib/server/forge/routes.d.ts +22 -0
- package/lib/server/forge/routes.d.ts.map +1 -0
- package/lib/server/forge/routes.js +984 -0
- package/lib/server/forge/routes.js.map +1 -0
- package/lib/server.d.ts +2 -0
- package/lib/server.d.ts.map +1 -0
- package/lib/server.js +52 -0
- package/lib/server.js.map +1 -0
- package/lib/shared/events.d.ts +12 -0
- package/lib/shared/events.d.ts.map +1 -0
- package/lib/shared/events.js +12 -0
- package/lib/shared/events.js.map +1 -0
- package/package.json +15 -13
- package/scripts/fix-shebang.cjs +11 -0
- package/bin/cli/analyze.js +0 -516
- package/bin/cli/apply.js +0 -264
- package/bin/cli/cifix.js +0 -300
- package/bin/cli/close.js +0 -125
- package/bin/cli/createIssue.js +0 -112
- package/bin/cli/doctor.js +0 -161
- package/bin/cli/init.js +0 -306
- package/bin/cli/issue.js +0 -116
- package/bin/cli/issues.js +0 -155
- package/bin/cli/merge.js +0 -175
- package/bin/cli/refine.js +0 -253
- package/bin/cli/repl.js +0 -301
- package/bin/cli/repos.js +0 -91
- package/bin/cli/resolution.js +0 -126
- package/bin/cli/session.js +0 -230
- package/bin/cli/sessionStore.js +0 -211
- package/bin/cli/ship.js +0 -762
- package/bin/cli/update.js +0 -95
- package/bin/cli/utils.js +0 -145
- package/bin/cli/validate.js +0 -280
- package/bin/cli/watch.js +0 -274
- package/server/forge/core/ForgeAgent.js +0 -1179
- package/server/forge/core/ForgeAgent.test.js +0 -179
- package/server/forge/core/branchName.js +0 -41
- package/server/forge/core/claudeClient.js +0 -378
- package/server/forge/core/configStore.js +0 -229
- package/server/forge/core/configStore.test.js +0 -89
- package/server/forge/core/jobs.js +0 -180
- package/server/forge/core/k8s.js +0 -54
- package/server/forge/core/localRepo.js +0 -163
- package/server/forge/core/openclawClient.js +0 -125
- package/server/forge/core/prompts.js +0 -483
- package/server/forge/core/prompts.test.js +0 -219
- package/server/forge/core/providers/azuredevops.js +0 -409
- package/server/forge/core/providers/base.js +0 -208
- package/server/forge/core/providers/github.js +0 -348
- package/server/forge/core/providers/gitlab.js +0 -529
- package/server/forge/core/providers/index.js +0 -47
- package/server/forge/core/quotaClient.js +0 -101
- package/server/forge/core/validator/attribute.js +0 -84
- package/server/forge/core/validator/clone.js +0 -116
- package/server/forge/core/validator/cmd.js +0 -98
- package/server/forge/core/validator/overlay.js +0 -52
- package/server/forge/core/validator/projectType.js +0 -87
- package/server/forge/core/validator/runners/go.js +0 -107
- package/server/forge/core/validator/runners/node.js +0 -84
- package/server/forge/core/validator/tdd.js +0 -105
- package/server/forge/core/validator.js +0 -167
- 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 @@
|
|
|
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 @@
|
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQtC,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAiB;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAA,IAAI,GAAG;MACX,IAAI,mBAAmB,KAAK;MAC5B,IAAI;MACJ,CAAC;IACN,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAA,IAAI,GAAG;MACX,IAAI,kBAAkB,OAAO;MAC7B,IAAI,KAAK,KAAK;MACd,IAAI;MACJ,CAAC;IACN,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,CAAA,IAAI,GAAG;MACX,IAAI;MACJ,IAAI,KAAK,KAAK;MACd,IAAI,aAAa,OAAO,IAAI,EAAE;MAC9B,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAA,IAAI,GAAG;KACX,IAAI;KACJ,IAAI,KAAK,KAAK;KACd,IAAI,gBAAgB,OAAO,IAAI,EAAE;KACjC,CAAC;AACN,CAAC;AAkBD,SAAS,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAe;IAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,GAAG,EAAE,CAClD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAClF,CAAC;IACF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAA4B,IAAI,CAAC,CAAC;IAElE,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC,KAAK,IAAI,EAAE;YACX,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,IAAI,SAAS;oBAAE,OAAO;gBACtB,OAAO,CAAC,CAAC,CAAc,EAAE,EAAE,CAC1B,CAAC,CAAC,GAAG,CAAC,CAAC,GAAc,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CACzF,CAAC;gBACF,IAAI,CAAC;oBACJ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACjC,IAAI,SAAS;wBAAE,OAAO;oBACtB,OAAO,CAAC,CAAC,CAAc,EAAE,EAAE,CAC1B,CAAC,CAAC,GAAG,CAAC,CAAC,GAAc,EAAE,GAAW,EAAE,EAAE,CACrC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAC1D,CACD,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,IAAI,SAAS;wBAAE,OAAO;oBACtB,OAAO,CAAC,CAAC,CAAc,EAAE,EAAE,CAC1B,CAAC,CAAC,GAAG,CAAC,CAAC,GAAc,EAAE,GAAW,EAAE,EAAE,CACrC,GAAG,KAAK,CAAC;wBACR,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;wBAC5E,CAAC,CAAC,GAAG,CACN,CACD,CAAC;oBACF,MAAM,IAAI,CAAC,CAAC;gBACb,CAAC;YACF,CAAC;YACD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE;YACX,SAAS,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,IAAI,EAAE,CAAC;IACR,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,CAAC,CAAA,IAAI,GAAG;IACZ,IAAI,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,CAAS,EAAE,EAAE,CACtC,CAAC,CAAA,IAAI,QAAQ,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,OAAO,KAAK,CAClF;KACE,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC9B,MAAM,MAAM,GAAG;QACd;YACC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,GAAG,EAAE;gBACR,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChE,IAAI,KAAK,GAAG,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC9B,CAAC;SACD;QACD;YACC,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;gBACzD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;SACD;QACD;YACC,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;SACD;QACD;YACC,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,GAAG,EAAE;gBACR,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC3E,OAAO,KAAK,CAAC;YACd,CAAC;SACD;QACD;YACC,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,CAAC,GACN,OAAO,CAAC,GAAG,CAAC,iBAAiB;oBAC7B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;gBAClD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACrD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;gBACjC,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAChD,CAAC;SACD;QACD;YACC,IAAI,EAAE,gBAAgB;YACtB,EAAE,EAAE,GAAG,EAAE;gBACR,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;gBACzD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC5E,OAAO,OAAO,CAAC;YAChB,CAAC;SACD;KACD,CAAC;IAEF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,CACX,CAAC,CAAA,IAAI,MAAM,WAAW,MAAM,WAAW,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CACvE,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC"}
|
|
@@ -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"}
|