@genoventures-labs/deckhand 0.1.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.
- package/LICENSE +21 -0
- package/README.md +152 -0
- package/agent/agent.ts +5 -0
- package/agent/instructions.md +23 -0
- package/agent/schedules/workspace_scan.md +5 -0
- package/agent/skills/conflict-triage.md +7 -0
- package/agent/skills/git-sync.md +11 -0
- package/agent/skills/github-entities.md +7 -0
- package/agent/tools/draft_commit_message.ts +12 -0
- package/agent/tools/gh_actions_list.ts +12 -0
- package/agent/tools/gh_actions_run.ts +17 -0
- package/agent/tools/gh_actions_watch.ts +14 -0
- package/agent/tools/gh_checks.ts +12 -0
- package/agent/tools/gh_issue_create.ts +16 -0
- package/agent/tools/gh_pr_create.ts +17 -0
- package/agent/tools/gh_project_create.ts +15 -0
- package/agent/tools/gh_repo_create.ts +18 -0
- package/agent/tools/git_add.ts +15 -0
- package/agent/tools/git_branch.ts +15 -0
- package/agent/tools/git_commit.ts +14 -0
- package/agent/tools/git_conflicts.ts +15 -0
- package/agent/tools/git_pull.ts +12 -0
- package/agent/tools/git_push.ts +16 -0
- package/agent/tools/git_status.ts +13 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +262 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/runs.d.ts +2 -0
- package/dist/commands/runs.js +80 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/eve-dev.d.ts +1 -0
- package/dist/eve-dev.js +41 -0
- package/dist/eve-dev.js.map +1 -0
- package/dist/lib/config.d.ts +8 -0
- package/dist/lib/config.js +28 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/doctor.d.ts +6 -0
- package/dist/lib/doctor.js +42 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/env.d.ts +5 -0
- package/dist/lib/env.js +26 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/gh.d.ts +34 -0
- package/dist/lib/gh.js +52 -0
- package/dist/lib/gh.js.map +1 -0
- package/dist/lib/git.d.ts +26 -0
- package/dist/lib/git.js +131 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/model.d.ts +4 -0
- package/dist/lib/model.js +60 -0
- package/dist/lib/model.js.map +1 -0
- package/dist/lib/ollama.d.ts +4 -0
- package/dist/lib/ollama.js +65 -0
- package/dist/lib/ollama.js.map +1 -0
- package/dist/lib/paths.d.ts +2 -0
- package/dist/lib/paths.js +9 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/run.d.ts +21 -0
- package/dist/lib/run.js +75 -0
- package/dist/lib/run.js.map +1 -0
- package/dist/lib/runs.d.ts +55 -0
- package/dist/lib/runs.js +168 -0
- package/dist/lib/runs.js.map +1 -0
- package/dist/lib/watch.d.ts +12 -0
- package/dist/lib/watch.js +38 -0
- package/dist/lib/watch.js.map +1 -0
- package/dist/lib/workspace.d.ts +1 -0
- package/dist/lib/workspace.js +5 -0
- package/dist/lib/workspace.js.map +1 -0
- package/dist/ui/format.d.ts +16 -0
- package/dist/ui/format.js +82 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/help.d.ts +7 -0
- package/dist/ui/help.js +197 -0
- package/dist/ui/help.js.map +1 -0
- package/dist/ui/table.d.ts +4 -0
- package/dist/ui/table.js +39 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +14 -0
- package/dist/ui/theme.js +22 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +55 -0
- package/templates/github-actions/gated-sync.yml +35 -0
- package/templates/github-actions/morning-pull.yml +42 -0
- package/templates/github-actions/nightly-checks.yml +33 -0
- package/templates/github-actions/weekday-status.yml +17 -0
- package/templates/runs/gated-sync.yaml +19 -0
- package/templates/runs/morning-pull.yaml +17 -0
- package/templates/runs/nightly-checks.yaml +17 -0
- package/templates/runs/weekday-status.yaml +17 -0
- package/templates/schema/gated-run.v1.json +67 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { loadConfig } from "./lib/config.js";
|
|
4
|
+
import { loadEnvFiles } from "./lib/env.js";
|
|
5
|
+
import { runDoctor } from "./lib/doctor.js";
|
|
6
|
+
import { formatStatus, gitAdd, gitCheckoutBranch, gitCommit, gitConflictFiles, gitPull, gitPush, gitStatus, } from "./lib/git.js";
|
|
7
|
+
import { createIssue, createProject, createPullRequest, createRepo, listChecks, listRuns, triggerWorkflow, watchRun, } from "./lib/gh.js";
|
|
8
|
+
import { draftGithubBody, generateCommitMessage, suggestConflictResolution, } from "./lib/model.js";
|
|
9
|
+
import { watchWorkspace } from "./lib/watch.js";
|
|
10
|
+
import { startEveDev } from "./eve-dev.js";
|
|
11
|
+
import { registerRunsCommand } from "./commands/runs.js";
|
|
12
|
+
import { workspaceRoot } from "./lib/workspace.js";
|
|
13
|
+
import { doctorTable, kvTable, notice, print, printError, section, statusTables } from "./ui/format.js";
|
|
14
|
+
import { printRootHelp, showHelpTopicOrCommand } from "./ui/help.js";
|
|
15
|
+
import { renderTable } from "./ui/table.js";
|
|
16
|
+
import { theme } from "./ui/theme.js";
|
|
17
|
+
loadEnvFiles();
|
|
18
|
+
const program = new Command();
|
|
19
|
+
program
|
|
20
|
+
.name("deckhand")
|
|
21
|
+
.description("Git, GitHub, and gated runs — via Eve and AI Gateway")
|
|
22
|
+
.version("0.1.0")
|
|
23
|
+
.addHelpCommand(false)
|
|
24
|
+
.showHelpAfterError("Try deckhand help, or deckhand help topics.");
|
|
25
|
+
program
|
|
26
|
+
.command("help")
|
|
27
|
+
.description("Show the help system (overview, topics, or a command)")
|
|
28
|
+
.argument("[topic]", "topic name, or a command (doctor, runs, git, …)")
|
|
29
|
+
.action((topic) => {
|
|
30
|
+
showHelpTopicOrCommand(program, topic);
|
|
31
|
+
});
|
|
32
|
+
program
|
|
33
|
+
.command("doctor")
|
|
34
|
+
.description("Check git, gh, AI Gateway credentials, and Node")
|
|
35
|
+
.addHelpText("after", "\nExample:\n $ deckhand doctor\n")
|
|
36
|
+
.action(async () => {
|
|
37
|
+
const checks = await runDoctor();
|
|
38
|
+
print(doctorTable(checks));
|
|
39
|
+
const failed = checks.filter((check) => !check.ok);
|
|
40
|
+
if (failed.length > 0) {
|
|
41
|
+
print("");
|
|
42
|
+
print(notice("fail", `${failed.length} check(s) need attention. See: deckhand help getting-started`));
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
print("");
|
|
47
|
+
print(notice("ok", "All checks passed."));
|
|
48
|
+
});
|
|
49
|
+
program
|
|
50
|
+
.command("status")
|
|
51
|
+
.description("Report git status for the current workspace")
|
|
52
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
53
|
+
.addHelpText("after", "\nExample:\n $ deckhand status\n $ deckhand status -C ../other-repo\n")
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
print(statusTables(await gitStatus(options.cwd)));
|
|
56
|
+
});
|
|
57
|
+
program
|
|
58
|
+
.command("watch")
|
|
59
|
+
.description("Watch configured workspaces and print status on changes")
|
|
60
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
61
|
+
.action(async (options) => {
|
|
62
|
+
print(notice("info", `Watching ${workspaceRoot(options.cwd)}. Press Ctrl+C to stop.`));
|
|
63
|
+
const handle = await watchWorkspace(options.cwd, (event) => {
|
|
64
|
+
print(`\n${theme.muted(new Date().toISOString())}`);
|
|
65
|
+
if (event.ok)
|
|
66
|
+
print(statusTables(event.status));
|
|
67
|
+
else
|
|
68
|
+
print(notice("fail", event.error));
|
|
69
|
+
});
|
|
70
|
+
const stop = () => {
|
|
71
|
+
handle.close();
|
|
72
|
+
process.exit(0);
|
|
73
|
+
};
|
|
74
|
+
process.on("SIGINT", stop);
|
|
75
|
+
process.on("SIGTERM", stop);
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command("sync")
|
|
79
|
+
.description("Stage, commit with an AI Gateway message, and push")
|
|
80
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
81
|
+
.option("-m, --message <message>", "commit message (skips the model)")
|
|
82
|
+
.option("--no-push", "commit without pushing")
|
|
83
|
+
.addHelpText("after", "\nExamples:\n $ deckhand sync\n $ deckhand sync --no-push\n $ deckhand sync -m \"chore: bump lockfile\"\n")
|
|
84
|
+
.action(async (options) => {
|
|
85
|
+
const status = await gitStatus(options.cwd);
|
|
86
|
+
if (status.clean) {
|
|
87
|
+
print(statusTables(status));
|
|
88
|
+
print(notice("ok", "Nothing to sync."));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
print(statusTables(status));
|
|
92
|
+
await gitAdd(["."], options.cwd);
|
|
93
|
+
const message = options.message ?? (await generateCommitMessage(options.cwd));
|
|
94
|
+
print("");
|
|
95
|
+
print(section("Commit"));
|
|
96
|
+
print(message);
|
|
97
|
+
print(await gitCommit(message, options.cwd));
|
|
98
|
+
if (options.push !== false) {
|
|
99
|
+
try {
|
|
100
|
+
print(await gitPush(options.cwd));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
print(await gitPush(options.cwd, true));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
print(notice("ok", "Sync complete."));
|
|
107
|
+
});
|
|
108
|
+
program
|
|
109
|
+
.command("pull")
|
|
110
|
+
.description("Fast-forward pull")
|
|
111
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
112
|
+
.action(async (options) => {
|
|
113
|
+
print(await gitPull(options.cwd));
|
|
114
|
+
});
|
|
115
|
+
program
|
|
116
|
+
.command("branch")
|
|
117
|
+
.description("Create or switch a branch")
|
|
118
|
+
.argument("<name>", "branch name")
|
|
119
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
120
|
+
.option("--create", "create the branch", true)
|
|
121
|
+
.action(async (name, options) => {
|
|
122
|
+
print(await gitCheckoutBranch(name, options.create !== false, options.cwd));
|
|
123
|
+
});
|
|
124
|
+
program
|
|
125
|
+
.command("conflicts")
|
|
126
|
+
.description("List conflicted files and ask the gateway model for resolution help")
|
|
127
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
128
|
+
.action(async (options) => {
|
|
129
|
+
const files = await gitConflictFiles(options.cwd);
|
|
130
|
+
if (files.length === 0) {
|
|
131
|
+
print(notice("ok", "No merge conflicts."));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
print(section("Conflicts"));
|
|
135
|
+
print(renderTable(["Path"], files.map((file) => [file])));
|
|
136
|
+
print("");
|
|
137
|
+
print(section("Guidance"));
|
|
138
|
+
print(await suggestConflictResolution(files, options.cwd));
|
|
139
|
+
});
|
|
140
|
+
const pr = program.command("pr").description("Pull request commands");
|
|
141
|
+
pr.command("create")
|
|
142
|
+
.description("Create a pull request with gh")
|
|
143
|
+
.requiredOption("-t, --title <title>", "PR title")
|
|
144
|
+
.option("-b, --body <body>", "PR body")
|
|
145
|
+
.option("--base <branch>", "base branch")
|
|
146
|
+
.option("--draft", "open as draft")
|
|
147
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
148
|
+
.action(async (options) => {
|
|
149
|
+
const status = await gitStatus(options.cwd);
|
|
150
|
+
const body = options.body ??
|
|
151
|
+
(await draftGithubBody("pr", options.title, formatStatus(status), options.cwd));
|
|
152
|
+
print(await createPullRequest({
|
|
153
|
+
title: options.title,
|
|
154
|
+
body,
|
|
155
|
+
base: options.base,
|
|
156
|
+
draft: options.draft,
|
|
157
|
+
cwd: options.cwd,
|
|
158
|
+
}));
|
|
159
|
+
});
|
|
160
|
+
const issue = program.command("issue").description("Issue commands");
|
|
161
|
+
issue
|
|
162
|
+
.command("create")
|
|
163
|
+
.description("Create a GitHub issue with gh")
|
|
164
|
+
.requiredOption("-t, --title <title>", "issue title")
|
|
165
|
+
.option("-b, --body <body>", "issue body")
|
|
166
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
167
|
+
.action(async (options) => {
|
|
168
|
+
const body = options.body ?? (await draftGithubBody("issue", options.title, "User-requested issue", options.cwd));
|
|
169
|
+
print(await createIssue({ title: options.title, body, cwd: options.cwd }));
|
|
170
|
+
});
|
|
171
|
+
const repo = program.command("repo").description("Repository commands");
|
|
172
|
+
repo
|
|
173
|
+
.command("create")
|
|
174
|
+
.description("Create a GitHub repository from the current directory")
|
|
175
|
+
.argument("<name>", "repository name")
|
|
176
|
+
.option("-d, --description <text>", "description")
|
|
177
|
+
.option("--private", "create as private")
|
|
178
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
179
|
+
.action(async (name, options) => {
|
|
180
|
+
print(await createRepo({
|
|
181
|
+
name,
|
|
182
|
+
description: options.description,
|
|
183
|
+
privateRepo: options.private,
|
|
184
|
+
cwd: options.cwd,
|
|
185
|
+
}));
|
|
186
|
+
});
|
|
187
|
+
const project = program.command("project").description("GitHub Projects commands");
|
|
188
|
+
project
|
|
189
|
+
.command("create")
|
|
190
|
+
.description("Create a GitHub Project")
|
|
191
|
+
.requiredOption("-t, --title <title>", "project title")
|
|
192
|
+
.requiredOption("-o, --owner <login>", "user or org login")
|
|
193
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
194
|
+
.action(async (options) => {
|
|
195
|
+
print(await createProject({ title: options.title, owner: options.owner, cwd: options.cwd }));
|
|
196
|
+
});
|
|
197
|
+
const actions = program.command("actions").description("GitHub Actions commands");
|
|
198
|
+
actions
|
|
199
|
+
.command("list")
|
|
200
|
+
.description("List recent workflow runs")
|
|
201
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
202
|
+
.action(async (options) => {
|
|
203
|
+
print(await listRuns(options.cwd));
|
|
204
|
+
});
|
|
205
|
+
actions
|
|
206
|
+
.command("watch")
|
|
207
|
+
.description("Watch a workflow run")
|
|
208
|
+
.argument("[runId]", "run id (latest if omitted)")
|
|
209
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
210
|
+
.action(async (runId, options) => {
|
|
211
|
+
print(await watchRun(runId, options.cwd));
|
|
212
|
+
});
|
|
213
|
+
actions
|
|
214
|
+
.command("run")
|
|
215
|
+
.description("Trigger a workflow")
|
|
216
|
+
.argument("<workflow>", "workflow file or name")
|
|
217
|
+
.option("--ref <ref>", "git ref")
|
|
218
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
219
|
+
.action(async (workflow, options) => {
|
|
220
|
+
print(await triggerWorkflow({ workflow, ref: options.ref, cwd: options.cwd }));
|
|
221
|
+
});
|
|
222
|
+
program
|
|
223
|
+
.command("checks")
|
|
224
|
+
.description("Show pull request status checks")
|
|
225
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
226
|
+
.action(async (options) => {
|
|
227
|
+
print(await listChecks(options.cwd));
|
|
228
|
+
});
|
|
229
|
+
program
|
|
230
|
+
.command("agent")
|
|
231
|
+
.alias("eve")
|
|
232
|
+
.description("Start the Eve agent (AI Gateway) in the terminal")
|
|
233
|
+
.action(async () => {
|
|
234
|
+
const code = await startEveDev();
|
|
235
|
+
process.exit(code);
|
|
236
|
+
});
|
|
237
|
+
registerRunsCommand(program);
|
|
238
|
+
program
|
|
239
|
+
.command("config")
|
|
240
|
+
.description("Print resolved Deckhand config")
|
|
241
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
242
|
+
.action((options) => {
|
|
243
|
+
const config = loadConfig(options.cwd);
|
|
244
|
+
print(kvTable("Config", {
|
|
245
|
+
workspaces: config.workspaces.join(", "),
|
|
246
|
+
model: config.model,
|
|
247
|
+
autoSync: String(config.autoSync),
|
|
248
|
+
commitPrefix: config.commitPrefix || "(none)",
|
|
249
|
+
}));
|
|
250
|
+
});
|
|
251
|
+
const argv = process.argv.slice(2);
|
|
252
|
+
if (argv.length === 0 || (argv.length === 1 && (argv[0] === "-h" || argv[0] === "--help"))) {
|
|
253
|
+
printRootHelp(program);
|
|
254
|
+
process.exit(0);
|
|
255
|
+
}
|
|
256
|
+
program.parseAsync(process.argv).catch((error) => {
|
|
257
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
258
|
+
printError(message);
|
|
259
|
+
print(theme.muted("deckhand help · deckhand help topics"));
|
|
260
|
+
process.exit(1);
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { applyRun, findRun, initRunTemplate, installWorkflowTemplate, listTemplateRuns, listUserRuns, } from "../lib/runs.js";
|
|
2
|
+
import { notice, print, runsTables, section } from "../ui/format.js";
|
|
3
|
+
import { renderTable } from "../ui/table.js";
|
|
4
|
+
import { theme } from "../ui/theme.js";
|
|
5
|
+
export function registerRunsCommand(program) {
|
|
6
|
+
const runs = program
|
|
7
|
+
.command("runs")
|
|
8
|
+
.description("Gated cron-style Deckhand runs (YAML templates)")
|
|
9
|
+
.addHelpText("after", [
|
|
10
|
+
"",
|
|
11
|
+
"Examples:",
|
|
12
|
+
" $ deckhand runs list",
|
|
13
|
+
" $ deckhand runs init morning-pull",
|
|
14
|
+
" $ deckhand runs install-workflow morning-pull",
|
|
15
|
+
" $ deckhand runs apply morning-pull --approve",
|
|
16
|
+
"",
|
|
17
|
+
"More: deckhand help runs",
|
|
18
|
+
].join("\n"));
|
|
19
|
+
runs
|
|
20
|
+
.command("list")
|
|
21
|
+
.description("List packaged templates and local .deckhand/runs files")
|
|
22
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
23
|
+
.action((options) => {
|
|
24
|
+
print(runsTables(listTemplateRuns(), listUserRuns(options.cwd)));
|
|
25
|
+
});
|
|
26
|
+
runs
|
|
27
|
+
.command("validate")
|
|
28
|
+
.description("Parse and validate local and template run YAML")
|
|
29
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
30
|
+
.action((options) => {
|
|
31
|
+
const templates = listTemplateRuns();
|
|
32
|
+
const local = listUserRuns(options.cwd);
|
|
33
|
+
const all = [
|
|
34
|
+
...templates.map((entry) => ({ ...entry, source: "template" })),
|
|
35
|
+
...local.map((entry) => ({ ...entry, source: "local" })),
|
|
36
|
+
];
|
|
37
|
+
print(section("Validate"));
|
|
38
|
+
if (all.length === 0) {
|
|
39
|
+
print(notice("warn", "No run YAML found."));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
print(renderTable(["Status", "Name", "Source", "Path"], all.map((entry) => [theme.ok("ok"), entry.run.metadata.name, entry.source, entry.path])));
|
|
43
|
+
});
|
|
44
|
+
runs
|
|
45
|
+
.command("init")
|
|
46
|
+
.description("Copy a packaged run template into .deckhand/runs")
|
|
47
|
+
.argument("<name>", "template name (e.g. morning-pull)")
|
|
48
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
49
|
+
.action((name, options) => {
|
|
50
|
+
const dest = initRunTemplate(name, options.cwd);
|
|
51
|
+
print(notice("ok", `Wrote ${dest}`));
|
|
52
|
+
print(theme.muted("Edit the YAML, then: deckhand runs apply " + name + " --approve"));
|
|
53
|
+
});
|
|
54
|
+
runs
|
|
55
|
+
.command("install-workflow")
|
|
56
|
+
.description("Copy a GitHub Actions workflow template into .github/workflows")
|
|
57
|
+
.argument("<name>", "workflow template name (e.g. morning-pull)")
|
|
58
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
59
|
+
.action((name, options) => {
|
|
60
|
+
const dest = installWorkflowTemplate(name, options.cwd);
|
|
61
|
+
print(notice("ok", `Wrote ${dest}`));
|
|
62
|
+
print(theme.muted("Add required reviewers on GitHub Environment deckhand-gate."));
|
|
63
|
+
});
|
|
64
|
+
runs
|
|
65
|
+
.command("apply")
|
|
66
|
+
.description("Execute a gated run YAML (requires --approve when gated)")
|
|
67
|
+
.argument("<name>", "run metadata.name")
|
|
68
|
+
.option("-C, --cwd <path>", "workspace directory")
|
|
69
|
+
.option("--approve", "pass the local gate after human review")
|
|
70
|
+
.action(async (name, options) => {
|
|
71
|
+
const loaded = findRun(name, options.cwd);
|
|
72
|
+
print(section(`Run ${loaded.run.metadata.name}`));
|
|
73
|
+
print(theme.muted(`${loaded.run.spec.action} · ${loaded.run.spec.schedule.cron} · ${loaded.path}`));
|
|
74
|
+
print("");
|
|
75
|
+
print(await applyRun(loaded, options));
|
|
76
|
+
print("");
|
|
77
|
+
print(notice("ok", "Run finished."));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/commands/runs.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,OAAO,EACP,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,WAAW,CACV,OAAO,EACP;QACE,EAAE;QACF,WAAW;QACX,wBAAwB;QACxB,qCAAqC;QACrC,iDAAiD;QACjD,gDAAgD;QAChD,EAAE;QACF,0BAA0B;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEJ,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACjD,MAAM,CAAC,CAAC,OAAyB,EAAE,EAAE;QACpC,KAAK,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACjD,MAAM,CAAC,CAAC,OAAyB,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG;YACV,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/D,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;SACzD,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QACD,KAAK,CACH,WAAW,CACT,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EACpC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CACxF,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,QAAQ,EAAE,mCAAmC,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACjD,MAAM,CAAC,CAAC,IAAY,EAAE,OAAyB,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,2CAA2C,GAAG,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,gEAAgE,CAAC;SAC7E,QAAQ,CAAC,QAAQ,EAAE,4CAA4C,CAAC;SAChE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACjD,MAAM,CAAC,CAAC,IAAY,EAAE,OAAyB,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACxD,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACjD,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA4C,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxG,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,KAAK,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startEveDev(): Promise<number>;
|
package/dist/eve-dev.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { workspaceRoot } from "./lib/workspace.js";
|
|
7
|
+
function packageRoot() {
|
|
8
|
+
return join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
9
|
+
}
|
|
10
|
+
function eveBin() {
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const evePackage = dirname(require.resolve("eve/package.json"));
|
|
13
|
+
const candidates = [
|
|
14
|
+
join(evePackage, "bin", "eve.js"),
|
|
15
|
+
join(evePackage, "bin", "eve.mjs"),
|
|
16
|
+
join(evePackage, "dist", "bin", "eve.js"),
|
|
17
|
+
];
|
|
18
|
+
for (const candidate of candidates) {
|
|
19
|
+
if (existsSync(candidate))
|
|
20
|
+
return candidate;
|
|
21
|
+
}
|
|
22
|
+
return "eve";
|
|
23
|
+
}
|
|
24
|
+
export function startEveDev() {
|
|
25
|
+
const root = packageRoot();
|
|
26
|
+
const cwd = workspaceRoot();
|
|
27
|
+
const child = spawn(process.execPath, [eveBin(), "dev"], {
|
|
28
|
+
cwd: existsSync(join(root, "agent")) ? root : cwd,
|
|
29
|
+
env: {
|
|
30
|
+
...process.env,
|
|
31
|
+
DECKHAND_CWD: cwd,
|
|
32
|
+
},
|
|
33
|
+
stdio: "inherit",
|
|
34
|
+
windowsHide: false,
|
|
35
|
+
});
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
child.on("error", reject);
|
|
38
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=eve-dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eve-dev.js","sourceRoot":"","sources":["../src/eve-dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,MAAM;IACb,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;KAC1C,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE;QACvD,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;QACjD,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,YAAY,EAAE,GAAG;SAClB;QACD,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { workspaceRoot } from "./workspace.js";
|
|
4
|
+
export const DEFAULT_GATEWAY_MODEL = "openai/gpt-5.6-luna-fast";
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
workspaces: ["."],
|
|
7
|
+
model: process.env.DECKHAND_MODEL ?? DEFAULT_GATEWAY_MODEL,
|
|
8
|
+
autoSync: false,
|
|
9
|
+
commitPrefix: "",
|
|
10
|
+
};
|
|
11
|
+
const CONFIG_NAMES = ["deckhand.json", ".deckhand.json"];
|
|
12
|
+
export function loadConfig(cwd) {
|
|
13
|
+
const root = workspaceRoot(cwd);
|
|
14
|
+
for (const name of CONFIG_NAMES) {
|
|
15
|
+
const path = join(root, name);
|
|
16
|
+
if (!existsSync(path))
|
|
17
|
+
continue;
|
|
18
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
19
|
+
return {
|
|
20
|
+
workspaces: parsed.workspaces?.length ? parsed.workspaces : DEFAULTS.workspaces,
|
|
21
|
+
model: parsed.model ?? DEFAULTS.model,
|
|
22
|
+
autoSync: parsed.autoSync ?? DEFAULTS.autoSync,
|
|
23
|
+
commitPrefix: parsed.commitPrefix ?? DEFAULTS.commitPrefix,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return { ...DEFAULTS };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAShE,MAAM,QAAQ,GAAmB;IAC/B,UAAU,EAAE,CAAC,GAAG,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,qBAAqB;IAC1D,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,EAAE;CACjB,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAU,CAAC;AAElE,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;QACjF,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU;YAC/E,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;YACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;YAC9C,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;SAC3D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { runCommand } from "./run.js";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { gatewayCredentialDetail, loadEnvFiles } from "./env.js";
|
|
4
|
+
import { workspaceRoot } from "./workspace.js";
|
|
5
|
+
export async function runDoctor(cwd) {
|
|
6
|
+
loadEnvFiles(cwd);
|
|
7
|
+
const root = workspaceRoot(cwd);
|
|
8
|
+
const config = loadConfig(root);
|
|
9
|
+
const checks = [];
|
|
10
|
+
const git = await runCommand("git", ["--version"], { cwd: root });
|
|
11
|
+
checks.push({
|
|
12
|
+
name: "git",
|
|
13
|
+
ok: git.code === 0,
|
|
14
|
+
detail: git.code === 0 ? git.stdout.trim() : "git is not on PATH",
|
|
15
|
+
});
|
|
16
|
+
const gh = await runCommand("gh", ["--version"], { cwd: root });
|
|
17
|
+
checks.push({
|
|
18
|
+
name: "gh",
|
|
19
|
+
ok: gh.code === 0,
|
|
20
|
+
detail: gh.code === 0 ? gh.stdout.split("\n")[0] ?? "ok" : "GitHub CLI is not on PATH",
|
|
21
|
+
});
|
|
22
|
+
const auth = await runCommand("gh", ["auth", "status"], { cwd: root });
|
|
23
|
+
checks.push({
|
|
24
|
+
name: "gh auth",
|
|
25
|
+
ok: auth.code === 0,
|
|
26
|
+
detail: auth.code === 0 ? "authenticated" : auth.stderr.trim() || "run gh auth login",
|
|
27
|
+
});
|
|
28
|
+
const creds = gatewayCredentialDetail();
|
|
29
|
+
checks.push({
|
|
30
|
+
name: "ai gateway",
|
|
31
|
+
ok: creds.ok,
|
|
32
|
+
detail: creds.ok ? `${creds.detail}; model ${config.model}` : creds.detail,
|
|
33
|
+
});
|
|
34
|
+
const nodeMajor = Number(process.versions.node.split(".")[0]);
|
|
35
|
+
checks.push({
|
|
36
|
+
name: "node",
|
|
37
|
+
ok: nodeMajor >= 20,
|
|
38
|
+
detail: `v${process.versions.node}${nodeMajor >= 24 ? " (Eve-ready)" : " (CLI ok; Eve wants Node 24+)"}`,
|
|
39
|
+
});
|
|
40
|
+
return checks;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQ/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY;IAC1C,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,KAAK;QACX,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC;QAClB,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB;KAClE,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,IAAI;QACV,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC;QACjB,MAAM,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,2BAA2B;KACvF,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC;QACnB,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,mBAAmB;KACtF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;KAC3E,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,SAAS,IAAI,EAAE;QACnB,MAAM,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,+BAA+B,EAAE;KACzG,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/lib/env.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { workspaceRoot } from "./workspace.js";
|
|
4
|
+
export function loadEnvFiles(cwd) {
|
|
5
|
+
const root = workspaceRoot(cwd);
|
|
6
|
+
// loadEnvFile does not overwrite existing vars, so load the override file first.
|
|
7
|
+
for (const name of [".env.local", ".env"]) {
|
|
8
|
+
const path = join(root, name);
|
|
9
|
+
if (!existsSync(path))
|
|
10
|
+
continue;
|
|
11
|
+
process.loadEnvFile(path);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function gatewayCredentialDetail() {
|
|
15
|
+
if (process.env.AI_GATEWAY_API_KEY?.trim()) {
|
|
16
|
+
return { ok: true, detail: "AI_GATEWAY_API_KEY is set" };
|
|
17
|
+
}
|
|
18
|
+
if (process.env.VERCEL_OIDC_TOKEN?.trim()) {
|
|
19
|
+
return { ok: true, detail: "VERCEL_OIDC_TOKEN is set" };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
detail: "set AI_GATEWAY_API_KEY, or run vercel link && vercel env pull .env.local",
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,iFAAiF;IACjF,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,CAAU,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,0EAA0E;KACnF,CAAC;AACJ,CAAC"}
|
package/dist/lib/gh.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare function gh(args: string[], cwd?: string): Promise<string>;
|
|
2
|
+
export declare function ghAuthStatus(cwd?: string): Promise<string>;
|
|
3
|
+
export declare function createPullRequest(input: {
|
|
4
|
+
title: string;
|
|
5
|
+
body: string;
|
|
6
|
+
base?: string;
|
|
7
|
+
draft?: boolean;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}): Promise<string>;
|
|
10
|
+
export declare function createIssue(input: {
|
|
11
|
+
title: string;
|
|
12
|
+
body: string;
|
|
13
|
+
labels?: string[];
|
|
14
|
+
cwd?: string;
|
|
15
|
+
}): Promise<string>;
|
|
16
|
+
export declare function createRepo(input: {
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
privateRepo?: boolean;
|
|
20
|
+
cwd?: string;
|
|
21
|
+
}): Promise<string>;
|
|
22
|
+
export declare function createProject(input: {
|
|
23
|
+
title: string;
|
|
24
|
+
owner: string;
|
|
25
|
+
cwd?: string;
|
|
26
|
+
}): Promise<string>;
|
|
27
|
+
export declare function listChecks(cwd?: string): Promise<string>;
|
|
28
|
+
export declare function listRuns(cwd?: string): Promise<string>;
|
|
29
|
+
export declare function watchRun(runId: string | undefined, cwd?: string): Promise<string>;
|
|
30
|
+
export declare function triggerWorkflow(input: {
|
|
31
|
+
workflow: string;
|
|
32
|
+
ref?: string;
|
|
33
|
+
cwd?: string;
|
|
34
|
+
}): Promise<string>;
|
package/dist/lib/gh.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { runOk } from "./run.js";
|
|
2
|
+
import { workspaceRoot } from "./workspace.js";
|
|
3
|
+
export async function gh(args, cwd) {
|
|
4
|
+
const root = workspaceRoot(cwd);
|
|
5
|
+
const result = await runOk("gh", args, { cwd: root });
|
|
6
|
+
return (result.stdout + result.stderr).trim();
|
|
7
|
+
}
|
|
8
|
+
export async function ghAuthStatus(cwd) {
|
|
9
|
+
return gh(["auth", "status"], cwd);
|
|
10
|
+
}
|
|
11
|
+
export async function createPullRequest(input) {
|
|
12
|
+
const args = ["pr", "create", "--title", input.title, "--body", input.body];
|
|
13
|
+
if (input.base)
|
|
14
|
+
args.push("--base", input.base);
|
|
15
|
+
if (input.draft)
|
|
16
|
+
args.push("--draft");
|
|
17
|
+
return gh(args, input.cwd);
|
|
18
|
+
}
|
|
19
|
+
export async function createIssue(input) {
|
|
20
|
+
const args = ["issue", "create", "--title", input.title, "--body", input.body];
|
|
21
|
+
for (const label of input.labels ?? []) {
|
|
22
|
+
args.push("--label", label);
|
|
23
|
+
}
|
|
24
|
+
return gh(args, input.cwd);
|
|
25
|
+
}
|
|
26
|
+
export async function createRepo(input) {
|
|
27
|
+
const args = ["repo", "create", input.name, "--source", ".", "--remote", "origin"];
|
|
28
|
+
args.push(input.privateRepo ? "--private" : "--public");
|
|
29
|
+
if (input.description)
|
|
30
|
+
args.push("--description", input.description);
|
|
31
|
+
return gh(args, input.cwd);
|
|
32
|
+
}
|
|
33
|
+
export async function createProject(input) {
|
|
34
|
+
return gh(["project", "create", "--title", input.title, "--owner", input.owner], input.cwd);
|
|
35
|
+
}
|
|
36
|
+
export async function listChecks(cwd) {
|
|
37
|
+
return gh(["pr", "checks"], cwd);
|
|
38
|
+
}
|
|
39
|
+
export async function listRuns(cwd) {
|
|
40
|
+
return gh(["run", "list", "--limit", "10"], cwd);
|
|
41
|
+
}
|
|
42
|
+
export async function watchRun(runId, cwd) {
|
|
43
|
+
const args = runId ? ["run", "watch", runId] : ["run", "watch"];
|
|
44
|
+
return gh(args, cwd);
|
|
45
|
+
}
|
|
46
|
+
export async function triggerWorkflow(input) {
|
|
47
|
+
const args = ["workflow", "run", input.workflow];
|
|
48
|
+
if (input.ref)
|
|
49
|
+
args.push("--ref", input.ref);
|
|
50
|
+
return gh(args, input.cwd);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=gh.js.map
|