@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../src/lib/gh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type GitChangeKind = "untracked" | "modified" | "added" | "deleted" | "renamed" | "copied" | "conflict" | "unmodified" | "ignored" | "unknown";
|
|
2
|
+
export type GitChange = {
|
|
3
|
+
path: string;
|
|
4
|
+
index: string;
|
|
5
|
+
worktree: string;
|
|
6
|
+
kind: GitChangeKind;
|
|
7
|
+
};
|
|
8
|
+
export type GitStatus = {
|
|
9
|
+
cwd: string;
|
|
10
|
+
branch: string;
|
|
11
|
+
ahead: number;
|
|
12
|
+
behind: number;
|
|
13
|
+
detached: boolean;
|
|
14
|
+
clean: boolean;
|
|
15
|
+
changes: GitChange[];
|
|
16
|
+
};
|
|
17
|
+
export declare function gitStatus(cwd?: string): Promise<GitStatus>;
|
|
18
|
+
export declare function gitDiff(cwd?: string, staged?: boolean): Promise<string>;
|
|
19
|
+
export declare function gitAdd(paths: string[], cwd?: string): Promise<void>;
|
|
20
|
+
export declare function gitCommit(message: string, cwd?: string): Promise<string>;
|
|
21
|
+
export declare function gitPush(cwd?: string, setUpstream?: boolean): Promise<string>;
|
|
22
|
+
export declare function gitPull(cwd?: string): Promise<string>;
|
|
23
|
+
export declare function gitCheckoutBranch(name: string, create: boolean, cwd?: string): Promise<string>;
|
|
24
|
+
export declare function gitConflictFiles(cwd?: string): Promise<string[]>;
|
|
25
|
+
export declare function gitShowFile(path: string, cwd?: string): Promise<string>;
|
|
26
|
+
export declare function formatStatus(status: GitStatus): string;
|
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { runCommand, runOk } from "./run.js";
|
|
2
|
+
import { workspaceRoot } from "./workspace.js";
|
|
3
|
+
function kindFromCodes(index, worktree) {
|
|
4
|
+
const codes = `${index}${worktree}`;
|
|
5
|
+
if (index === "U" || worktree === "U" || codes === "AA" || codes === "DD")
|
|
6
|
+
return "conflict";
|
|
7
|
+
if (index === "?" || worktree === "?")
|
|
8
|
+
return "untracked";
|
|
9
|
+
if (index === "!" || worktree === "!")
|
|
10
|
+
return "ignored";
|
|
11
|
+
if (index === "A" || worktree === "A")
|
|
12
|
+
return "added";
|
|
13
|
+
if (index === "D" || worktree === "D")
|
|
14
|
+
return "deleted";
|
|
15
|
+
if (index === "R" || worktree === "R")
|
|
16
|
+
return "renamed";
|
|
17
|
+
if (index === "C" || worktree === "C")
|
|
18
|
+
return "copied";
|
|
19
|
+
if (index === "M" || worktree === "M")
|
|
20
|
+
return "modified";
|
|
21
|
+
if (index === " " && worktree === " ")
|
|
22
|
+
return "unmodified";
|
|
23
|
+
return "unknown";
|
|
24
|
+
}
|
|
25
|
+
function parsePorcelain(output) {
|
|
26
|
+
let branch = "HEAD";
|
|
27
|
+
let ahead = 0;
|
|
28
|
+
let behind = 0;
|
|
29
|
+
let detached = false;
|
|
30
|
+
const changes = [];
|
|
31
|
+
for (const line of output.split("\n")) {
|
|
32
|
+
if (!line)
|
|
33
|
+
continue;
|
|
34
|
+
if (line.startsWith("## ")) {
|
|
35
|
+
const header = line.slice(3);
|
|
36
|
+
detached = header.startsWith("HEAD");
|
|
37
|
+
const aheadMatch = header.match(/ahead (\d+)/);
|
|
38
|
+
const behindMatch = header.match(/behind (\d+)/);
|
|
39
|
+
ahead = aheadMatch ? Number(aheadMatch[1]) : 0;
|
|
40
|
+
behind = behindMatch ? Number(behindMatch[1]) : 0;
|
|
41
|
+
const name = header.split("...")[0]?.split(" ")[0] ?? "HEAD";
|
|
42
|
+
branch = name;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const index = line[0] ?? " ";
|
|
46
|
+
const worktree = line[1] ?? " ";
|
|
47
|
+
const rest = line.slice(3);
|
|
48
|
+
const path = rest.includes(" -> ") ? rest.split(" -> ").at(-1) ?? rest : rest;
|
|
49
|
+
changes.push({
|
|
50
|
+
path,
|
|
51
|
+
index,
|
|
52
|
+
worktree,
|
|
53
|
+
kind: kindFromCodes(index, worktree),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return { branch, ahead, behind, detached, changes };
|
|
57
|
+
}
|
|
58
|
+
export async function gitStatus(cwd) {
|
|
59
|
+
const root = workspaceRoot(cwd);
|
|
60
|
+
const result = await runOk("git", ["status", "--porcelain=v1", "-b"], { cwd: root });
|
|
61
|
+
const parsed = parsePorcelain(result.stdout);
|
|
62
|
+
return {
|
|
63
|
+
cwd: root,
|
|
64
|
+
...parsed,
|
|
65
|
+
clean: parsed.changes.length === 0,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export async function gitDiff(cwd, staged = false) {
|
|
69
|
+
const root = workspaceRoot(cwd);
|
|
70
|
+
const args = staged ? ["diff", "--cached"] : ["diff"];
|
|
71
|
+
const result = await runOk("git", args, { cwd: root });
|
|
72
|
+
return result.stdout;
|
|
73
|
+
}
|
|
74
|
+
export async function gitAdd(paths, cwd) {
|
|
75
|
+
const root = workspaceRoot(cwd);
|
|
76
|
+
const targets = paths.length > 0 ? paths : ["."];
|
|
77
|
+
await runOk("git", ["add", "--", ...targets], { cwd: root });
|
|
78
|
+
}
|
|
79
|
+
export async function gitCommit(message, cwd) {
|
|
80
|
+
const root = workspaceRoot(cwd);
|
|
81
|
+
const result = await runOk("git", ["commit", "-F", "-"], { cwd: root, input: message });
|
|
82
|
+
return result.stdout.trim();
|
|
83
|
+
}
|
|
84
|
+
export async function gitPush(cwd, setUpstream = false) {
|
|
85
|
+
const root = workspaceRoot(cwd);
|
|
86
|
+
const args = setUpstream ? ["push", "-u", "origin", "HEAD"] : ["push"];
|
|
87
|
+
const result = await runOk("git", args, { cwd: root });
|
|
88
|
+
return (result.stdout + result.stderr).trim();
|
|
89
|
+
}
|
|
90
|
+
export async function gitPull(cwd) {
|
|
91
|
+
const root = workspaceRoot(cwd);
|
|
92
|
+
const result = await runOk("git", ["pull", "--ff-only"], { cwd: root });
|
|
93
|
+
return (result.stdout + result.stderr).trim();
|
|
94
|
+
}
|
|
95
|
+
export async function gitCheckoutBranch(name, create, cwd) {
|
|
96
|
+
const root = workspaceRoot(cwd);
|
|
97
|
+
const args = create ? ["checkout", "-b", name] : ["checkout", name];
|
|
98
|
+
const result = await runOk("git", args, { cwd: root });
|
|
99
|
+
return (result.stdout + result.stderr).trim();
|
|
100
|
+
}
|
|
101
|
+
export async function gitConflictFiles(cwd) {
|
|
102
|
+
const status = await gitStatus(cwd);
|
|
103
|
+
return status.changes.filter((change) => change.kind === "conflict").map((change) => change.path);
|
|
104
|
+
}
|
|
105
|
+
export async function gitShowFile(path, cwd) {
|
|
106
|
+
const root = workspaceRoot(cwd);
|
|
107
|
+
const result = await runCommand("git", ["show", `:${path}`], { cwd: root });
|
|
108
|
+
if (result.code !== 0) {
|
|
109
|
+
return result.stderr;
|
|
110
|
+
}
|
|
111
|
+
return result.stdout;
|
|
112
|
+
}
|
|
113
|
+
export function formatStatus(status) {
|
|
114
|
+
const tracking = status.ahead || status.behind
|
|
115
|
+
? ` [ahead ${status.ahead}, behind ${status.behind}]`
|
|
116
|
+
: "";
|
|
117
|
+
const lines = [
|
|
118
|
+
`Repo: ${status.cwd}`,
|
|
119
|
+
`Branch: ${status.branch}${status.detached ? " (detached)" : ""}${tracking}`,
|
|
120
|
+
];
|
|
121
|
+
if (status.clean) {
|
|
122
|
+
lines.push("Working tree is clean.");
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
lines.push(`${status.changes.length} change(s):`);
|
|
126
|
+
for (const change of status.changes) {
|
|
127
|
+
lines.push(` ${change.kind.padEnd(10)} ${change.path}`);
|
|
128
|
+
}
|
|
129
|
+
return lines.join("\n");
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAqB/C,SAAS,aAAa,CAAC,KAAa,EAAE,QAAgB;IACpD,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC;IACpC,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAC7F,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IAC1D,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IACtD,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC;IACvD,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,UAAU,CAAC;IACzD,IAAI,KAAK,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,YAAY,CAAC;IAC3D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IAOpC,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACjD,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;YAC7D,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,KAAK;YACL,QAAQ;YACR,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY;IAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,GAAG,EAAE,IAAI;QACT,GAAG,MAAM;QACT,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY,EAAE,MAAM,GAAG,KAAK;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAe,EAAE,GAAY;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,GAAY;IAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACxF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY,EAAE,WAAW,GAAG,KAAK;IAC7D,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAY;IACxC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAe,EAAE,GAAY;IACjF,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY;IACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,GAAY;IAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC5C,MAAM,QAAQ,GACZ,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM;QAC3B,CAAC,CAAC,WAAW,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,MAAM,GAAG;QACrD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,KAAK,GAAG;QACZ,SAAS,MAAM,CAAC,GAAG,EAAE;QACrB,WAAW,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE;KAC7E,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function gatewayModel(cwd?: string): string;
|
|
2
|
+
export declare function generateCommitMessage(cwd?: string): Promise<string>;
|
|
3
|
+
export declare function suggestConflictResolution(files: string[], cwd?: string): Promise<string>;
|
|
4
|
+
export declare function draftGithubBody(kind: "pr" | "issue", title: string, context: string, cwd?: string): Promise<string>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { generateText } from "ai";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { gitDiff, gitStatus } from "./git.js";
|
|
4
|
+
export function gatewayModel(cwd) {
|
|
5
|
+
return loadConfig(cwd).model;
|
|
6
|
+
}
|
|
7
|
+
export async function generateCommitMessage(cwd) {
|
|
8
|
+
const config = loadConfig(cwd);
|
|
9
|
+
const status = await gitStatus(cwd);
|
|
10
|
+
const diff = await gitDiff(cwd);
|
|
11
|
+
const staged = await gitDiff(cwd, true);
|
|
12
|
+
const payload = [
|
|
13
|
+
`Branch: ${status.branch}`,
|
|
14
|
+
"Status:",
|
|
15
|
+
...status.changes.map((change) => `${change.kind} ${change.path}`),
|
|
16
|
+
"Staged diff:",
|
|
17
|
+
staged || "(none)",
|
|
18
|
+
"Unstaged diff:",
|
|
19
|
+
diff || "(none)",
|
|
20
|
+
].join("\n");
|
|
21
|
+
const { text } = await generateText({
|
|
22
|
+
model: gatewayModel(cwd),
|
|
23
|
+
prompt: [
|
|
24
|
+
"Write a conventional git commit message for these changes.",
|
|
25
|
+
"Return only the commit message: a short subject line, optional blank line, optional body.",
|
|
26
|
+
"Do not wrap the message in quotes or markdown fences.",
|
|
27
|
+
config.commitPrefix ? `Prefix the subject with: ${config.commitPrefix}` : "",
|
|
28
|
+
payload,
|
|
29
|
+
]
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.join("\n\n"),
|
|
32
|
+
});
|
|
33
|
+
return text.trim();
|
|
34
|
+
}
|
|
35
|
+
export async function suggestConflictResolution(files, cwd) {
|
|
36
|
+
const { text } = await generateText({
|
|
37
|
+
model: gatewayModel(cwd),
|
|
38
|
+
prompt: [
|
|
39
|
+
"These git paths have merge conflicts.",
|
|
40
|
+
"Explain how to resolve them using git and gh, without inventing file contents.",
|
|
41
|
+
"Never recommend force-push or skipping hooks.",
|
|
42
|
+
files.map((file) => `- ${file}`).join("\n"),
|
|
43
|
+
].join("\n\n"),
|
|
44
|
+
});
|
|
45
|
+
return text.trim();
|
|
46
|
+
}
|
|
47
|
+
export async function draftGithubBody(kind, title, context, cwd) {
|
|
48
|
+
const { text } = await generateText({
|
|
49
|
+
model: gatewayModel(cwd),
|
|
50
|
+
prompt: [
|
|
51
|
+
`Draft a concise GitHub ${kind} body in markdown.`,
|
|
52
|
+
`Title: ${title}`,
|
|
53
|
+
"Context:",
|
|
54
|
+
context,
|
|
55
|
+
"Return only the body.",
|
|
56
|
+
].join("\n\n"),
|
|
57
|
+
});
|
|
58
|
+
return text.trim();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/lib/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAY;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG;QACd,WAAW,MAAM,CAAC,MAAM,EAAE;QAC1B,SAAS;QACT,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAClE,cAAc;QACd,MAAM,IAAI,QAAQ;QAClB,gBAAgB;QAChB,IAAI,IAAI,QAAQ;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;QACxB,MAAM,EAAE;YACN,4DAA4D;YAC5D,2FAA2F;YAC3F,uDAAuD;YACvD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,4BAA4B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;YAC5E,OAAO;SACR;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAAe,EAAE,GAAY;IAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;QACxB,MAAM,EAAE;YACN,uCAAuC;YACvC,gFAAgF;YAChF,+CAA+C;YAC/C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5C,CAAC,IAAI,CAAC,MAAM,CAAC;KACf,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAoB,EACpB,KAAa,EACb,OAAe,EACf,GAAY;IAEZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;QACxB,MAAM,EAAE;YACN,0BAA0B,IAAI,oBAAoB;YAClD,UAAU,KAAK,EAAE;YACjB,UAAU;YACV,OAAO;YACP,uBAAuB;SACxB,CAAC,IAAI,CAAC,MAAM,CAAC;KACf,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function ollamaModel(cwd?: string): import("@ai-sdk/provider").LanguageModelV4;
|
|
2
|
+
export declare function generateCommitMessage(cwd?: string): Promise<string>;
|
|
3
|
+
export declare function suggestConflictResolution(files: string[], cwd?: string): Promise<string>;
|
|
4
|
+
export declare function draftGithubBody(kind: "pr" | "issue", title: string, context: string, cwd?: string): Promise<string>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { generateText } from "ai";
|
|
2
|
+
import { createOllama } from "ollama-ai-provider-v2";
|
|
3
|
+
import { loadConfig } from "./config.js";
|
|
4
|
+
import { gitDiff, gitStatus } from "./git.js";
|
|
5
|
+
export function ollamaModel(cwd) {
|
|
6
|
+
const config = loadConfig(cwd);
|
|
7
|
+
const ollama = createOllama({
|
|
8
|
+
baseURL: `${config.ollamaHost.replace(/\/$/, "")}/api`,
|
|
9
|
+
});
|
|
10
|
+
return ollama(config.model);
|
|
11
|
+
}
|
|
12
|
+
export async function generateCommitMessage(cwd) {
|
|
13
|
+
const config = loadConfig(cwd);
|
|
14
|
+
const status = await gitStatus(cwd);
|
|
15
|
+
const diff = await gitDiff(cwd);
|
|
16
|
+
const staged = await gitDiff(cwd, true);
|
|
17
|
+
const payload = [
|
|
18
|
+
`Branch: ${status.branch}`,
|
|
19
|
+
"Status:",
|
|
20
|
+
...status.changes.map((change) => `${change.kind} ${change.path}`),
|
|
21
|
+
"Staged diff:",
|
|
22
|
+
staged || "(none)",
|
|
23
|
+
"Unstaged diff:",
|
|
24
|
+
diff || "(none)",
|
|
25
|
+
].join("\n");
|
|
26
|
+
const { text } = await generateText({
|
|
27
|
+
model: ollamaModel(cwd),
|
|
28
|
+
prompt: [
|
|
29
|
+
"Write a conventional git commit message for these changes.",
|
|
30
|
+
"Return only the commit message: a short subject line, optional blank line, optional body.",
|
|
31
|
+
"Do not wrap the message in quotes or markdown fences.",
|
|
32
|
+
config.commitPrefix ? `Prefix the subject with: ${config.commitPrefix}` : "",
|
|
33
|
+
payload,
|
|
34
|
+
]
|
|
35
|
+
.filter(Boolean)
|
|
36
|
+
.join("\n\n"),
|
|
37
|
+
});
|
|
38
|
+
return text.trim();
|
|
39
|
+
}
|
|
40
|
+
export async function suggestConflictResolution(files, cwd) {
|
|
41
|
+
const { text } = await generateText({
|
|
42
|
+
model: ollamaModel(cwd),
|
|
43
|
+
prompt: [
|
|
44
|
+
"These git paths have merge conflicts.",
|
|
45
|
+
"Explain how to resolve them using git and gh, without inventing file contents.",
|
|
46
|
+
"Never recommend force-push or skipping hooks.",
|
|
47
|
+
files.map((file) => `- ${file}`).join("\n"),
|
|
48
|
+
].join("\n\n"),
|
|
49
|
+
});
|
|
50
|
+
return text.trim();
|
|
51
|
+
}
|
|
52
|
+
export async function draftGithubBody(kind, title, context, cwd) {
|
|
53
|
+
const { text } = await generateText({
|
|
54
|
+
model: ollamaModel(cwd),
|
|
55
|
+
prompt: [
|
|
56
|
+
`Draft a concise GitHub ${kind} body in markdown.`,
|
|
57
|
+
`Title: ${title}`,
|
|
58
|
+
"Context:",
|
|
59
|
+
context,
|
|
60
|
+
"Return only the body.",
|
|
61
|
+
].join("\n\n"),
|
|
62
|
+
});
|
|
63
|
+
return text.trim();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/lib/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM;KACvD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAY;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG;QACd,WAAW,MAAM,CAAC,MAAM,EAAE;QAC1B,SAAS;QACT,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAClE,cAAc;QACd,MAAM,IAAI,QAAQ;QAClB,gBAAgB;QAChB,IAAI,IAAI,QAAQ;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;QACvB,MAAM,EAAE;YACN,4DAA4D;YAC5D,2FAA2F;YAC3F,uDAAuD;YACvD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,4BAA4B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;YAC5E,OAAO;SACR;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAAe,EAAE,GAAY;IAC3E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;QACvB,MAAM,EAAE;YACN,uCAAuC;YACvC,gFAAgF;YAChF,+CAA+C;YAC/C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5C,CAAC,IAAI,CAAC,MAAM,CAAC;KACf,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAoB,EAAE,KAAa,EAAE,OAAe,EAAE,GAAY;IACtG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;QACvB,MAAM,EAAE;YACN,0BAA0B,IAAI,oBAAoB;YAClD,UAAU,KAAK,EAAE;YACjB,UAAU;YACV,OAAO;YACP,uBAAuB;SACxB,CAAC,IAAI,CAAC,MAAM,CAAC;KACf,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export function packageRoot() {
|
|
4
|
+
return join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
5
|
+
}
|
|
6
|
+
export function templatesRoot() {
|
|
7
|
+
return join(packageRoot(), "templates");
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type CommandResult = {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
code: number;
|
|
5
|
+
stdout: string;
|
|
6
|
+
stderr: string;
|
|
7
|
+
};
|
|
8
|
+
export declare class CommandError extends Error {
|
|
9
|
+
readonly result: CommandResult;
|
|
10
|
+
constructor(result: CommandResult);
|
|
11
|
+
}
|
|
12
|
+
export declare function runCommand(command: string, args: string[], options?: {
|
|
13
|
+
cwd?: string;
|
|
14
|
+
input?: string;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}): Promise<CommandResult>;
|
|
17
|
+
export declare function runOk(command: string, args: string[], options?: {
|
|
18
|
+
cwd?: string;
|
|
19
|
+
input?: string;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
}): Promise<CommandResult>;
|
package/dist/lib/run.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export class CommandError extends Error {
|
|
3
|
+
result;
|
|
4
|
+
constructor(result) {
|
|
5
|
+
const detail = result.stderr.trim() || result.stdout.trim() || `exit ${result.code}`;
|
|
6
|
+
super(`${result.command} ${result.args.join(" ")} failed: ${detail}`);
|
|
7
|
+
this.name = "CommandError";
|
|
8
|
+
this.result = result;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function runCommand(command, args, options = {}) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const child = spawn(command, args, {
|
|
14
|
+
cwd: options.cwd,
|
|
15
|
+
env: process.env,
|
|
16
|
+
shell: false,
|
|
17
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
18
|
+
windowsHide: true,
|
|
19
|
+
});
|
|
20
|
+
let stdout = "";
|
|
21
|
+
let stderr = "";
|
|
22
|
+
let settled = false;
|
|
23
|
+
const timer = options.timeoutMs === undefined
|
|
24
|
+
? undefined
|
|
25
|
+
: setTimeout(() => {
|
|
26
|
+
child.kill();
|
|
27
|
+
if (!settled) {
|
|
28
|
+
settled = true;
|
|
29
|
+
reject(new Error(`${command} timed out after ${options.timeoutMs}ms`));
|
|
30
|
+
}
|
|
31
|
+
}, options.timeoutMs);
|
|
32
|
+
child.stdout.setEncoding("utf8");
|
|
33
|
+
child.stderr.setEncoding("utf8");
|
|
34
|
+
child.stdout.on("data", (chunk) => {
|
|
35
|
+
stdout += chunk;
|
|
36
|
+
});
|
|
37
|
+
child.stderr.on("data", (chunk) => {
|
|
38
|
+
stderr += chunk;
|
|
39
|
+
});
|
|
40
|
+
child.on("error", (error) => {
|
|
41
|
+
if (timer)
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
if (!settled) {
|
|
44
|
+
settled = true;
|
|
45
|
+
reject(error);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
child.on("close", (code) => {
|
|
49
|
+
if (timer)
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
if (settled)
|
|
52
|
+
return;
|
|
53
|
+
settled = true;
|
|
54
|
+
resolve({
|
|
55
|
+
command,
|
|
56
|
+
args,
|
|
57
|
+
code: code ?? 1,
|
|
58
|
+
stdout,
|
|
59
|
+
stderr,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
if (options.input) {
|
|
63
|
+
child.stdin.write(options.input);
|
|
64
|
+
}
|
|
65
|
+
child.stdin.end();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export async function runOk(command, args, options = {}) {
|
|
69
|
+
const result = await runCommand(command, args, options);
|
|
70
|
+
if (result.code !== 0) {
|
|
71
|
+
throw new CommandError(result);
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/lib/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const RUN_ACTIONS: readonly ["status", "pull", "sync", "checks", "actions-list"];
|
|
3
|
+
export type RunAction = (typeof RUN_ACTIONS)[number];
|
|
4
|
+
declare const gatedRunSchema: z.ZodObject<{
|
|
5
|
+
apiVersion: z.ZodLiteral<"deckhand/v1">;
|
|
6
|
+
kind: z.ZodLiteral<"GatedRun">;
|
|
7
|
+
metadata: z.ZodObject<{
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
description: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
spec: z.ZodObject<{
|
|
12
|
+
schedule: z.ZodObject<{
|
|
13
|
+
cron: z.ZodString;
|
|
14
|
+
timezone: z.ZodDefault<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
action: z.ZodEnum<{
|
|
17
|
+
status: "status";
|
|
18
|
+
pull: "pull";
|
|
19
|
+
checks: "checks";
|
|
20
|
+
sync: "sync";
|
|
21
|
+
"actions-list": "actions-list";
|
|
22
|
+
}>;
|
|
23
|
+
workspace: z.ZodDefault<z.ZodString>;
|
|
24
|
+
gate: z.ZodDefault<z.ZodObject<{
|
|
25
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
26
|
+
environment: z.ZodDefault<z.ZodString>;
|
|
27
|
+
requireCleanTree: z.ZodDefault<z.ZodBoolean>;
|
|
28
|
+
requireChecks: z.ZodDefault<z.ZodBoolean>;
|
|
29
|
+
}, z.core.$strip>>;
|
|
30
|
+
sync: z.ZodOptional<z.ZodObject<{
|
|
31
|
+
push: z.ZodDefault<z.ZodBoolean>;
|
|
32
|
+
message: z.ZodOptional<z.ZodString>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export type GatedRun = z.infer<typeof gatedRunSchema>;
|
|
37
|
+
export type LoadedRun = {
|
|
38
|
+
path: string;
|
|
39
|
+
run: GatedRun;
|
|
40
|
+
};
|
|
41
|
+
export declare function userRunsDir(cwd?: string): string;
|
|
42
|
+
export declare function packagedRunTemplatesDir(): string;
|
|
43
|
+
export declare function packagedWorkflowTemplatesDir(): string;
|
|
44
|
+
export declare function parseGatedRun(raw: string, source: string): GatedRun;
|
|
45
|
+
export declare function loadRunFile(path: string): LoadedRun;
|
|
46
|
+
export declare function listTemplateRuns(): LoadedRun[];
|
|
47
|
+
export declare function listUserRuns(cwd?: string): LoadedRun[];
|
|
48
|
+
export declare function findRun(name: string, cwd?: string): LoadedRun;
|
|
49
|
+
export declare function initRunTemplate(name: string, cwd?: string): string;
|
|
50
|
+
export declare function installWorkflowTemplate(name: string, cwd?: string): string;
|
|
51
|
+
export declare function applyRun(loaded: LoadedRun, options: {
|
|
52
|
+
approve?: boolean;
|
|
53
|
+
cwd?: string;
|
|
54
|
+
}): Promise<string>;
|
|
55
|
+
export {};
|