@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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/agent/agent.ts +5 -0
  4. package/agent/instructions.md +23 -0
  5. package/agent/schedules/workspace_scan.md +5 -0
  6. package/agent/skills/conflict-triage.md +7 -0
  7. package/agent/skills/git-sync.md +11 -0
  8. package/agent/skills/github-entities.md +7 -0
  9. package/agent/tools/draft_commit_message.ts +12 -0
  10. package/agent/tools/gh_actions_list.ts +12 -0
  11. package/agent/tools/gh_actions_run.ts +17 -0
  12. package/agent/tools/gh_actions_watch.ts +14 -0
  13. package/agent/tools/gh_checks.ts +12 -0
  14. package/agent/tools/gh_issue_create.ts +16 -0
  15. package/agent/tools/gh_pr_create.ts +17 -0
  16. package/agent/tools/gh_project_create.ts +15 -0
  17. package/agent/tools/gh_repo_create.ts +18 -0
  18. package/agent/tools/git_add.ts +15 -0
  19. package/agent/tools/git_branch.ts +15 -0
  20. package/agent/tools/git_commit.ts +14 -0
  21. package/agent/tools/git_conflicts.ts +15 -0
  22. package/agent/tools/git_pull.ts +12 -0
  23. package/agent/tools/git_push.ts +16 -0
  24. package/agent/tools/git_status.ts +13 -0
  25. package/dist/cli.d.ts +2 -0
  26. package/dist/cli.js +262 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/commands/runs.d.ts +2 -0
  29. package/dist/commands/runs.js +80 -0
  30. package/dist/commands/runs.js.map +1 -0
  31. package/dist/eve-dev.d.ts +1 -0
  32. package/dist/eve-dev.js +41 -0
  33. package/dist/eve-dev.js.map +1 -0
  34. package/dist/lib/config.d.ts +8 -0
  35. package/dist/lib/config.js +28 -0
  36. package/dist/lib/config.js.map +1 -0
  37. package/dist/lib/doctor.d.ts +6 -0
  38. package/dist/lib/doctor.js +42 -0
  39. package/dist/lib/doctor.js.map +1 -0
  40. package/dist/lib/env.d.ts +5 -0
  41. package/dist/lib/env.js +26 -0
  42. package/dist/lib/env.js.map +1 -0
  43. package/dist/lib/gh.d.ts +34 -0
  44. package/dist/lib/gh.js +52 -0
  45. package/dist/lib/gh.js.map +1 -0
  46. package/dist/lib/git.d.ts +26 -0
  47. package/dist/lib/git.js +131 -0
  48. package/dist/lib/git.js.map +1 -0
  49. package/dist/lib/model.d.ts +4 -0
  50. package/dist/lib/model.js +60 -0
  51. package/dist/lib/model.js.map +1 -0
  52. package/dist/lib/ollama.d.ts +4 -0
  53. package/dist/lib/ollama.js +65 -0
  54. package/dist/lib/ollama.js.map +1 -0
  55. package/dist/lib/paths.d.ts +2 -0
  56. package/dist/lib/paths.js +9 -0
  57. package/dist/lib/paths.js.map +1 -0
  58. package/dist/lib/run.d.ts +21 -0
  59. package/dist/lib/run.js +75 -0
  60. package/dist/lib/run.js.map +1 -0
  61. package/dist/lib/runs.d.ts +55 -0
  62. package/dist/lib/runs.js +168 -0
  63. package/dist/lib/runs.js.map +1 -0
  64. package/dist/lib/watch.d.ts +12 -0
  65. package/dist/lib/watch.js +38 -0
  66. package/dist/lib/watch.js.map +1 -0
  67. package/dist/lib/workspace.d.ts +1 -0
  68. package/dist/lib/workspace.js +5 -0
  69. package/dist/lib/workspace.js.map +1 -0
  70. package/dist/ui/format.d.ts +16 -0
  71. package/dist/ui/format.js +82 -0
  72. package/dist/ui/format.js.map +1 -0
  73. package/dist/ui/help.d.ts +7 -0
  74. package/dist/ui/help.js +197 -0
  75. package/dist/ui/help.js.map +1 -0
  76. package/dist/ui/table.d.ts +4 -0
  77. package/dist/ui/table.js +39 -0
  78. package/dist/ui/table.js.map +1 -0
  79. package/dist/ui/theme.d.ts +14 -0
  80. package/dist/ui/theme.js +22 -0
  81. package/dist/ui/theme.js.map +1 -0
  82. package/package.json +55 -0
  83. package/templates/github-actions/gated-sync.yml +35 -0
  84. package/templates/github-actions/morning-pull.yml +42 -0
  85. package/templates/github-actions/nightly-checks.yml +33 -0
  86. package/templates/github-actions/weekday-status.yml +17 -0
  87. package/templates/runs/gated-sync.yaml +19 -0
  88. package/templates/runs/morning-pull.yaml +17 -0
  89. package/templates/runs/nightly-checks.yaml +17 -0
  90. package/templates/runs/weekday-status.yaml +17 -0
  91. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerRunsCommand(program: Command): void;
@@ -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":"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"}
@@ -0,0 +1 @@
1
+ export declare function startEveDev(): Promise<number>;
@@ -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,8 @@
1
+ export declare const DEFAULT_GATEWAY_MODEL = "openai/gpt-5.6-luna-fast";
2
+ export type DeckhandConfig = {
3
+ workspaces: string[];
4
+ model: string;
5
+ autoSync: boolean;
6
+ commitPrefix: string;
7
+ };
8
+ export declare function loadConfig(cwd?: string): DeckhandConfig;
@@ -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,6 @@
1
+ export type DoctorCheck = {
2
+ name: string;
3
+ ok: boolean;
4
+ detail: string;
5
+ };
6
+ export declare function runDoctor(cwd?: string): Promise<DoctorCheck[]>;
@@ -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"}
@@ -0,0 +1,5 @@
1
+ export declare function loadEnvFiles(cwd?: string): void;
2
+ export declare function gatewayCredentialDetail(): {
3
+ ok: boolean;
4
+ detail: string;
5
+ };
@@ -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"}
@@ -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