git-codex 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 +249 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +146 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +20 -0
- package/dist/commands/add.js +250 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.js +64 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/open.d.ts +7 -0
- package/dist/commands/open.js +41 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/prompt.d.ts +7 -0
- package/dist/commands/prompt.js +41 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/rm.d.ts +6 -0
- package/dist/commands/rm.js +99 -0
- package/dist/commands/rm.js.map +1 -0
- package/dist/lib/add-strategy.d.ts +9 -0
- package/dist/lib/add-strategy.js +18 -0
- package/dist/lib/add-strategy.js.map +1 -0
- package/dist/lib/clipboard.d.ts +1 -0
- package/dist/lib/clipboard.js +45 -0
- package/dist/lib/clipboard.js.map +1 -0
- package/dist/lib/config.d.ts +52 -0
- package/dist/lib/config.js +238 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env-files.d.ts +18 -0
- package/dist/lib/env-files.js +196 -0
- package/dist/lib/env-files.js.map +1 -0
- package/dist/lib/env-scope.d.ts +3 -0
- package/dist/lib/env-scope.js +15 -0
- package/dist/lib/env-scope.js.map +1 -0
- package/dist/lib/errors.d.ts +2 -0
- package/dist/lib/errors.js +26 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fs-utils.d.ts +1 -0
- package/dist/lib/fs-utils.js +11 -0
- package/dist/lib/fs-utils.js.map +1 -0
- package/dist/lib/git.d.ts +20 -0
- package/dist/lib/git.js +82 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/output.d.ts +18 -0
- package/dist/lib/output.js +78 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompt.d.ts +8 -0
- package/dist/lib/prompt.js +14 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/repo.d.ts +8 -0
- package/dist/lib/repo.js +24 -0
- package/dist/lib/repo.js.map +1 -0
- package/dist/lib/task-utils.d.ts +3 -0
- package/dist/lib/task-utils.js +24 -0
- package/dist/lib/task-utils.js.map +1 -0
- package/dist/lib/template.d.ts +22 -0
- package/dist/lib/template.js +111 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/lib/vscode.d.ts +1 -0
- package/dist/lib/vscode.js +8 -0
- package/dist/lib/vscode.js.map +1 -0
- package/dist/lib/worktrees.d.ts +11 -0
- package/dist/lib/worktrees.js +59 -0
- package/dist/lib/worktrees.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/lib/fs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function runGitCapture(args: string[], cwd: string): Promise<string>;
|
|
2
|
+
export declare function runGitStream(args: string[], cwd: string): Promise<void>;
|
|
3
|
+
export interface RunGitStreamOptions {
|
|
4
|
+
quiet?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function runGitStreamWithOptions(args: string[], cwd: string, options: RunGitStreamOptions): Promise<void>;
|
|
7
|
+
export interface GitStatusResult {
|
|
8
|
+
exitCode: number;
|
|
9
|
+
stdout: string;
|
|
10
|
+
stderr: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function runGitStatus(args: string[], cwd: string): Promise<GitStatusResult>;
|
|
13
|
+
export declare function doesLocalBranchExist(cwd: string, branchName: string): Promise<boolean>;
|
|
14
|
+
export declare function doesRemoteBranchExist(cwd: string, branchName: string, remote?: string): Promise<boolean>;
|
|
15
|
+
export interface RemoteBranchState {
|
|
16
|
+
trackingRefExists: boolean;
|
|
17
|
+
exists: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function getRemoteBranchState(cwd: string, branchName: string, remote?: string): Promise<RemoteBranchState>;
|
|
20
|
+
export declare function fetchRemoteTrackingBranch(cwd: string, branchName: string, remote: string, options: RunGitStreamOptions): Promise<void>;
|
package/dist/lib/git.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
export async function runGitCapture(args, cwd) {
|
|
3
|
+
const result = await execa("git", args, { cwd });
|
|
4
|
+
return result.stdout.trimEnd();
|
|
5
|
+
}
|
|
6
|
+
export async function runGitStream(args, cwd) {
|
|
7
|
+
await runGitStreamWithOptions(args, cwd, {
|
|
8
|
+
quiet: false,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export async function runGitStreamWithOptions(args, cwd, options) {
|
|
12
|
+
if (options.quiet) {
|
|
13
|
+
const result = await execa("git", args, {
|
|
14
|
+
cwd,
|
|
15
|
+
reject: false,
|
|
16
|
+
});
|
|
17
|
+
if (result.exitCode === 0) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const detail = [result.stderr, result.stdout]
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
.join("\n")
|
|
23
|
+
.trim();
|
|
24
|
+
throw new Error(detail
|
|
25
|
+
? `Command failed: git ${args.join(" ")}\n${detail}`
|
|
26
|
+
: `Command failed: git ${args.join(" ")}`);
|
|
27
|
+
}
|
|
28
|
+
await execa("git", args, {
|
|
29
|
+
cwd,
|
|
30
|
+
stdio: "inherit",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function runGitStatus(args, cwd) {
|
|
34
|
+
const result = await execa("git", args, {
|
|
35
|
+
cwd,
|
|
36
|
+
reject: false,
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
exitCode: result.exitCode ?? -1,
|
|
40
|
+
stdout: result.stdout,
|
|
41
|
+
stderr: result.stderr,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function doesLocalBranchExist(cwd, branchName) {
|
|
45
|
+
const result = await execa("git", ["show-ref", "--verify", "--quiet", `refs/heads/${branchName}`], {
|
|
46
|
+
cwd,
|
|
47
|
+
reject: false,
|
|
48
|
+
});
|
|
49
|
+
return result.exitCode === 0;
|
|
50
|
+
}
|
|
51
|
+
export async function doesRemoteBranchExist(cwd, branchName, remote = "origin") {
|
|
52
|
+
const state = await getRemoteBranchState(cwd, branchName, remote);
|
|
53
|
+
return state.exists;
|
|
54
|
+
}
|
|
55
|
+
export async function getRemoteBranchState(cwd, branchName, remote = "origin") {
|
|
56
|
+
const localRefResult = await execa("git", ["show-ref", "--verify", "--quiet", `refs/remotes/${remote}/${branchName}`], {
|
|
57
|
+
cwd,
|
|
58
|
+
reject: false,
|
|
59
|
+
});
|
|
60
|
+
if (localRefResult.exitCode === 0) {
|
|
61
|
+
return {
|
|
62
|
+
trackingRefExists: true,
|
|
63
|
+
exists: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const remoteResult = await execa("git", ["ls-remote", "--exit-code", "--heads", remote, branchName], {
|
|
67
|
+
cwd,
|
|
68
|
+
reject: false,
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
trackingRefExists: false,
|
|
72
|
+
exists: remoteResult.exitCode === 0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export async function fetchRemoteTrackingBranch(cwd, branchName, remote, options) {
|
|
76
|
+
await runGitStreamWithOptions([
|
|
77
|
+
"fetch",
|
|
78
|
+
remote,
|
|
79
|
+
`+refs/heads/${branchName}:refs/remotes/${remote}/${branchName}`,
|
|
80
|
+
], cwd, options);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAc,EACd,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,GAAW;IAC5D,MAAM,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE;QACvC,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAc,EACd,GAAW,EACX,OAA4B;IAE5B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YACtC,GAAG;YACH,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;aAC1C,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM;YACJ,CAAC,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE;YACpD,CAAC,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;QACvB,GAAG;QACH,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAc,EACd,GAAW;IAEX,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;QACtC,GAAG;QACH,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW,EACX,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,KAAK,CACxB,KAAK,EACL,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,UAAU,EAAE,CAAC,EAC/D;QACE,GAAG;QACH,MAAM,EAAE,KAAK;KACd,CACF,CAAC;IAEF,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAW,EACX,UAAkB,EAClB,MAAM,GAAG,QAAQ;IAEjB,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW,EACX,UAAkB,EAClB,MAAM,GAAG,QAAQ;IAEjB,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,KAAK,EACL,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,MAAM,IAAI,UAAU,EAAE,CAAC,EAC3E;QACE,GAAG;QACH,MAAM,EAAE,KAAK;KACd,CACF,CAAC;IAEF,IAAI,cAAc,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,iBAAiB,EAAE,IAAI;YACvB,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAC9B,KAAK,EACL,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAC3D;QACE,GAAG;QACH,MAAM,EAAE,KAAK;KACd,CACF,CAAC;IAEF,OAAO;QACL,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,YAAY,CAAC,QAAQ,KAAK,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,GAAW,EACX,UAAkB,EAClB,MAAc,EACd,OAA4B;IAE5B,MAAM,uBAAuB,CAC3B;QACE,OAAO;QACP,MAAM;QACN,eAAe,UAAU,iBAAiB,MAAM,IAAI,UAAU,EAAE;KACjE,EACD,GAAG,EACH,OAAO,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface OutputOptions {
|
|
2
|
+
quiet?: boolean;
|
|
3
|
+
json?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface OutputSink {
|
|
6
|
+
stdout: (chunk: string) => void;
|
|
7
|
+
stderr: (chunk: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface Output {
|
|
10
|
+
quiet: boolean;
|
|
11
|
+
json: boolean;
|
|
12
|
+
info: (message: string, fields?: Record<string, unknown>) => void;
|
|
13
|
+
warn: (message: string, fields?: Record<string, unknown>) => void;
|
|
14
|
+
error: (message: string, fields?: Record<string, unknown>) => void;
|
|
15
|
+
print: (message: string) => void;
|
|
16
|
+
event: (event: string, fields?: Record<string, unknown>) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function createOutput(options?: OutputOptions, sink?: OutputSink): Output;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const defaultSink = {
|
|
2
|
+
stdout: (chunk) => {
|
|
3
|
+
process.stdout.write(chunk);
|
|
4
|
+
},
|
|
5
|
+
stderr: (chunk) => {
|
|
6
|
+
process.stderr.write(chunk);
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
export function createOutput(options = {}, sink = defaultSink) {
|
|
10
|
+
const json = Boolean(options.json);
|
|
11
|
+
const quiet = json ? false : Boolean(options.quiet);
|
|
12
|
+
const writeStructured = (channel, payload) => {
|
|
13
|
+
sink[channel](`${JSON.stringify(payload)}\n`);
|
|
14
|
+
};
|
|
15
|
+
const writeText = (channel, message) => {
|
|
16
|
+
sink[channel](`${message}\n`);
|
|
17
|
+
};
|
|
18
|
+
const log = (level, message, fields) => {
|
|
19
|
+
const alwaysEmit = level === "error";
|
|
20
|
+
if (!alwaysEmit && quiet) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (json) {
|
|
24
|
+
writeStructured(level === "error" ? "stderr" : "stdout", {
|
|
25
|
+
level,
|
|
26
|
+
message,
|
|
27
|
+
...(fields ?? {}),
|
|
28
|
+
});
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
writeText(level === "error" ? "stderr" : "stdout", message);
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
quiet,
|
|
35
|
+
json,
|
|
36
|
+
info(message, fields) {
|
|
37
|
+
log("info", message, fields);
|
|
38
|
+
},
|
|
39
|
+
warn(message, fields) {
|
|
40
|
+
log("warn", message, fields);
|
|
41
|
+
},
|
|
42
|
+
error(message, fields) {
|
|
43
|
+
log("error", message, fields);
|
|
44
|
+
},
|
|
45
|
+
print(message) {
|
|
46
|
+
if (quiet) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (json) {
|
|
50
|
+
writeStructured("stdout", {
|
|
51
|
+
level: "info",
|
|
52
|
+
message,
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
writeText("stdout", message);
|
|
57
|
+
},
|
|
58
|
+
event(event, fields) {
|
|
59
|
+
if (quiet && !json) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (json) {
|
|
63
|
+
writeStructured("stdout", {
|
|
64
|
+
event,
|
|
65
|
+
...(fields ?? {}),
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (fields && Object.keys(fields).length > 0) {
|
|
70
|
+
writeText("stdout", `${event}: ${JSON.stringify(fields)}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
writeText("stdout", event);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function buildTaskPrompt(input) {
|
|
2
|
+
const normalizedMessage = input.message.trim();
|
|
3
|
+
const body = normalizedMessage.length > 0 ? normalizedMessage : "(no message)";
|
|
4
|
+
return [
|
|
5
|
+
`Task: ${input.task}`,
|
|
6
|
+
`Task Slug: ${input.taskSlug}`,
|
|
7
|
+
`Branch: ${input.branch}`,
|
|
8
|
+
`Worktree: ${input.worktreePath}`,
|
|
9
|
+
"",
|
|
10
|
+
"Prompt:",
|
|
11
|
+
body,
|
|
12
|
+
].join("\n");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,IAAI,GACR,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC;IAEpE,OAAO;QACL,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,cAAc,KAAK,CAAC,QAAQ,EAAE;QAC9B,WAAW,KAAK,CAAC,MAAM,EAAE;QACzB,aAAa,KAAK,CAAC,YAAY,EAAE;QACjC,EAAE;QACF,SAAS;QACT,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RepoContext {
|
|
2
|
+
repoRoot: string;
|
|
3
|
+
repoName: string;
|
|
4
|
+
parentDir: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function resolveRepoContext(cwd?: string): Promise<RepoContext>;
|
|
7
|
+
export declare function resolveWorktreeParentDir(repoRoot: string, dirOverride?: string): string;
|
|
8
|
+
export declare function resolveWorktreePath(repoRoot: string, repoName: string, taskSlug: string, dirOverride?: string): string;
|
package/dist/lib/repo.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { runGitCapture } from "./git.js";
|
|
3
|
+
export async function resolveRepoContext(cwd = process.cwd()) {
|
|
4
|
+
const repoRootRaw = await runGitCapture(["rev-parse", "--show-toplevel"], cwd);
|
|
5
|
+
const repoRoot = path.resolve(repoRootRaw.trim());
|
|
6
|
+
return {
|
|
7
|
+
repoRoot,
|
|
8
|
+
repoName: path.basename(repoRoot),
|
|
9
|
+
parentDir: path.dirname(repoRoot),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function resolveWorktreeParentDir(repoRoot, dirOverride) {
|
|
13
|
+
if (!dirOverride) {
|
|
14
|
+
return path.dirname(repoRoot);
|
|
15
|
+
}
|
|
16
|
+
return path.isAbsolute(dirOverride)
|
|
17
|
+
? path.resolve(dirOverride)
|
|
18
|
+
: path.resolve(repoRoot, dirOverride);
|
|
19
|
+
}
|
|
20
|
+
export function resolveWorktreePath(repoRoot, repoName, taskSlug, dirOverride) {
|
|
21
|
+
const parentDir = resolveWorktreeParentDir(repoRoot, dirOverride);
|
|
22
|
+
return path.resolve(parentDir, `${repoName}-${taskSlug}`);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/lib/repo.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQzC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,MAAM,WAAW,GAAG,MAAM,aAAa,CACrC,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAChC,GAAG,CACJ,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,WAAoB;IAEpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,WAAoB;IAEpB,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const UNSAFE_TASK_CHARACTERS = /[^a-zA-Z0-9._-]+/g;
|
|
2
|
+
export function toTaskSlug(task) {
|
|
3
|
+
const normalized = task
|
|
4
|
+
.trim()
|
|
5
|
+
.toLowerCase()
|
|
6
|
+
.replace(UNSAFE_TASK_CHARACTERS, "-")
|
|
7
|
+
.replace(/-+/g, "-")
|
|
8
|
+
.replace(/^[.-]+|[.-]+$/g, "");
|
|
9
|
+
if (!normalized) {
|
|
10
|
+
throw new Error("Task cannot be empty");
|
|
11
|
+
}
|
|
12
|
+
return normalized;
|
|
13
|
+
}
|
|
14
|
+
export function normalizeBranchPrefix(prefix) {
|
|
15
|
+
const trimmed = prefix.trim();
|
|
16
|
+
if (!trimmed) {
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
return trimmed.endsWith("/") ? trimmed : `${trimmed}/`;
|
|
20
|
+
}
|
|
21
|
+
export function buildBranchName(prefix, taskSlug) {
|
|
22
|
+
return `${normalizeBranchPrefix(prefix)}${taskSlug}`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=task-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-utils.js","sourceRoot":"","sources":["../../src/lib/task-utils.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAEnD,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,UAAU,GAAG,IAAI;SACpB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAEjC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,QAAgB;IAC9D,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type TaskTemplateType = "default" | "bugfix" | "feature";
|
|
2
|
+
export interface TaskTemplateVariables {
|
|
3
|
+
task: string;
|
|
4
|
+
taskSlug: string;
|
|
5
|
+
branch: string;
|
|
6
|
+
worktreePath: string;
|
|
7
|
+
}
|
|
8
|
+
export interface WriteTaskTemplateOptions {
|
|
9
|
+
worktreePath: string;
|
|
10
|
+
variables: TaskTemplateVariables;
|
|
11
|
+
templateType: TaskTemplateType;
|
|
12
|
+
templateSource?: string;
|
|
13
|
+
overwrite: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface WriteTaskTemplateResult {
|
|
16
|
+
templatePath: string;
|
|
17
|
+
created: boolean;
|
|
18
|
+
overwritten: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function normalizeTemplateType(type: string | undefined): TaskTemplateType;
|
|
21
|
+
export declare function renderTaskTemplate(variables: TaskTemplateVariables, templateSource?: string, templateType?: TaskTemplateType): string;
|
|
22
|
+
export declare function writeTaskTemplate(options: WriteTaskTemplateOptions): Promise<WriteTaskTemplateResult>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathExists } from "./fs-utils.js";
|
|
4
|
+
const DEFAULT_TASK_TEMPLATE = `# Codex Task Instructions
|
|
5
|
+
|
|
6
|
+
Task: {{task}}
|
|
7
|
+
Task Slug: {{taskSlug}}
|
|
8
|
+
Branch: {{branch}}
|
|
9
|
+
Worktree: {{worktreePath}}
|
|
10
|
+
|
|
11
|
+
## Goals
|
|
12
|
+
- Clarify scope and assumptions before coding.
|
|
13
|
+
- Implement the smallest safe change first.
|
|
14
|
+
- Validate with focused tests before completion.
|
|
15
|
+
|
|
16
|
+
## Notes
|
|
17
|
+
- Capture key decisions and tradeoffs here as you work.
|
|
18
|
+
`;
|
|
19
|
+
const BUGFIX_TASK_TEMPLATE = `# Codex Bugfix Instructions
|
|
20
|
+
|
|
21
|
+
Task: {{task}}
|
|
22
|
+
Task Slug: {{taskSlug}}
|
|
23
|
+
Branch: {{branch}}
|
|
24
|
+
Worktree: {{worktreePath}}
|
|
25
|
+
|
|
26
|
+
## Reproduction
|
|
27
|
+
- Document exact failing behavior and where it occurs.
|
|
28
|
+
- Capture error messages, stack traces, and triggering inputs.
|
|
29
|
+
|
|
30
|
+
## Root Cause
|
|
31
|
+
- Identify the precise source of the bug (not just symptom).
|
|
32
|
+
- Note why existing checks/tests missed it.
|
|
33
|
+
|
|
34
|
+
## Fix Plan
|
|
35
|
+
- Implement the smallest safe fix at the source.
|
|
36
|
+
- Add regression coverage for this exact failure mode.
|
|
37
|
+
|
|
38
|
+
## Validation
|
|
39
|
+
- Run focused tests first, then broader suite.
|
|
40
|
+
- Confirm no behavioral regressions in adjacent paths.
|
|
41
|
+
`;
|
|
42
|
+
const FEATURE_TASK_TEMPLATE = `# Codex Feature Instructions
|
|
43
|
+
|
|
44
|
+
Task: {{task}}
|
|
45
|
+
Task Slug: {{taskSlug}}
|
|
46
|
+
Branch: {{branch}}
|
|
47
|
+
Worktree: {{worktreePath}}
|
|
48
|
+
|
|
49
|
+
## Feature Scope
|
|
50
|
+
- Define explicit in-scope and out-of-scope behavior.
|
|
51
|
+
- List required interfaces, UX/API changes, and data impacts.
|
|
52
|
+
|
|
53
|
+
## Implementation Plan
|
|
54
|
+
- Break implementation into small, testable increments.
|
|
55
|
+
- Favor backward-compatible changes when possible.
|
|
56
|
+
|
|
57
|
+
## Validation
|
|
58
|
+
- Add/extend tests for happy path and edge cases.
|
|
59
|
+
- Verify error handling and observability paths.
|
|
60
|
+
|
|
61
|
+
## Rollout Notes
|
|
62
|
+
- Document migration, flags, or release sequencing needs.
|
|
63
|
+
`;
|
|
64
|
+
const BUILT_IN_TEMPLATES = {
|
|
65
|
+
default: DEFAULT_TASK_TEMPLATE,
|
|
66
|
+
bugfix: BUGFIX_TASK_TEMPLATE,
|
|
67
|
+
feature: FEATURE_TASK_TEMPLATE,
|
|
68
|
+
};
|
|
69
|
+
export function normalizeTemplateType(type) {
|
|
70
|
+
const candidate = (type ?? "default").trim().toLowerCase();
|
|
71
|
+
if (candidate === "default" ||
|
|
72
|
+
candidate === "bugfix" ||
|
|
73
|
+
candidate === "feature") {
|
|
74
|
+
return candidate;
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`Invalid template type "${type}". Expected one of: default, bugfix, feature.`);
|
|
77
|
+
}
|
|
78
|
+
export function renderTaskTemplate(variables, templateSource, templateType = "default") {
|
|
79
|
+
const source = templateSource ?? BUILT_IN_TEMPLATES[templateType];
|
|
80
|
+
const replacements = {
|
|
81
|
+
task: variables.task,
|
|
82
|
+
taskSlug: variables.taskSlug,
|
|
83
|
+
branch: variables.branch,
|
|
84
|
+
worktreePath: variables.worktreePath,
|
|
85
|
+
};
|
|
86
|
+
return source.replace(/\{\{\s*(task|taskSlug|branch|worktreePath)\s*\}\}/g, (_, key) => {
|
|
87
|
+
const value = replacements[key];
|
|
88
|
+
return value ?? "";
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export async function writeTaskTemplate(options) {
|
|
92
|
+
const codexDir = path.join(options.worktreePath, ".codex");
|
|
93
|
+
const templatePath = path.join(codexDir, "INSTRUCTIONS.md");
|
|
94
|
+
const exists = await pathExists(templatePath);
|
|
95
|
+
if (exists && !options.overwrite) {
|
|
96
|
+
return {
|
|
97
|
+
templatePath,
|
|
98
|
+
created: false,
|
|
99
|
+
overwritten: false,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
await mkdir(codexDir, { recursive: true });
|
|
103
|
+
const rendered = renderTaskTemplate(options.variables, options.templateSource, options.templateType);
|
|
104
|
+
await writeFile(templatePath, rendered, "utf8");
|
|
105
|
+
return {
|
|
106
|
+
templatePath,
|
|
107
|
+
created: true,
|
|
108
|
+
overwritten: exists,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/lib/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAyB3C,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;CAc7B,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsB5B,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAC;AAEF,MAAM,kBAAkB,GAAqC;IAC3D,OAAO,EAAE,qBAAqB;IAC9B,MAAM,EAAE,oBAAoB;IAC5B,OAAO,EAAE,qBAAqB;CAC/B,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,IAAwB;IAExB,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3D,IACE,SAAS,KAAK,SAAS;QACvB,SAAS,KAAK,QAAQ;QACtB,SAAS,KAAK,SAAS,EACvB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,+CAA+C,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAgC,EAChC,cAAuB,EACvB,eAAiC,SAAS;IAE1C,MAAM,MAAM,GAAG,cAAc,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAClE,MAAM,YAAY,GAA2B;QAC3C,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,YAAY,EAAE,SAAS,CAAC,YAAY;KACrC,CAAC;IAEF,OAAO,MAAM,CAAC,OAAO,CACnB,oDAAoD,EACpD,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACT,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;IAE9C,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO;YACL,YAAY;YACZ,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,kBAAkB,CACjC,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,YAAY,CACrB,CAAC;IACF,MAAM,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhD,OAAO;QACL,YAAY;QACZ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,MAAM;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function openInVSCode(worktreePath: string): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../src/lib/vscode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB;IACrD,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;QACxC,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface WorktreeEntry {
|
|
2
|
+
worktree: string;
|
|
3
|
+
head?: string;
|
|
4
|
+
branch?: string;
|
|
5
|
+
detached: boolean;
|
|
6
|
+
bare: boolean;
|
|
7
|
+
locked: boolean;
|
|
8
|
+
prunable?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseWorktreeListPorcelain(output: string): WorktreeEntry[];
|
|
11
|
+
export declare function stripHeadsRef(branchRef: string): string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function parseWorktreeListPorcelain(output) {
|
|
2
|
+
const entries = [];
|
|
3
|
+
let current;
|
|
4
|
+
const pushCurrent = () => {
|
|
5
|
+
if (current) {
|
|
6
|
+
entries.push(current);
|
|
7
|
+
current = undefined;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
for (const line of output.split(/\r?\n/)) {
|
|
11
|
+
if (!line.trim()) {
|
|
12
|
+
pushCurrent();
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const [rawKey, ...rest] = line.split(" ");
|
|
16
|
+
const value = rest.join(" ");
|
|
17
|
+
if (rawKey === "worktree") {
|
|
18
|
+
pushCurrent();
|
|
19
|
+
current = {
|
|
20
|
+
worktree: value,
|
|
21
|
+
detached: false,
|
|
22
|
+
bare: false,
|
|
23
|
+
locked: false,
|
|
24
|
+
};
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (!current) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
switch (rawKey) {
|
|
31
|
+
case "HEAD":
|
|
32
|
+
current.head = value;
|
|
33
|
+
break;
|
|
34
|
+
case "branch":
|
|
35
|
+
current.branch = value;
|
|
36
|
+
break;
|
|
37
|
+
case "detached":
|
|
38
|
+
current.detached = true;
|
|
39
|
+
break;
|
|
40
|
+
case "bare":
|
|
41
|
+
current.bare = true;
|
|
42
|
+
break;
|
|
43
|
+
case "locked":
|
|
44
|
+
current.locked = true;
|
|
45
|
+
break;
|
|
46
|
+
case "prunable":
|
|
47
|
+
current.prunable = value;
|
|
48
|
+
break;
|
|
49
|
+
default:
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
pushCurrent();
|
|
54
|
+
return entries;
|
|
55
|
+
}
|
|
56
|
+
export function stripHeadsRef(branchRef) {
|
|
57
|
+
return branchRef.replace(/^refs\/heads\//, "");
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=worktrees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../../src/lib/worktrees.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,0BAA0B,CAAC,MAAc;IACvD,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,IAAI,OAAkC,CAAC;IAEvC,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,WAAW,EAAE,CAAC;YACd,OAAO,GAAG;gBACR,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;aACd,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;gBACvB,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACxB,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACzB,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,WAAW,EAAE,CAAC;IACd,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "git-codex",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Git subcommand for task-oriented worktrees and multi-agent parallel workflows.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"codex-wt": "dist/cli.js",
|
|
9
|
+
"git-codex": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"commander": "^14.0.1",
|
|
16
|
+
"execa": "^9.6.0",
|
|
17
|
+
"fast-glob": "^3.3.3"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@changesets/cli": "^2.29.8",
|
|
21
|
+
"@types/node": "^24.6.0",
|
|
22
|
+
"eslint": "^9.39.2",
|
|
23
|
+
"prettier": "3.8.1",
|
|
24
|
+
"prettier-plugin-organize-imports": "4.3.0",
|
|
25
|
+
"prettier-plugin-packagejson": "3.0.0",
|
|
26
|
+
"tsx": "^4.20.6",
|
|
27
|
+
"typescript": "^5.9.3",
|
|
28
|
+
"typescript-eslint": "^8.54.0",
|
|
29
|
+
"vitest": "^3.2.4"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=20.0.0"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.json",
|
|
39
|
+
"changeset": "changeset",
|
|
40
|
+
"clean": "node -e \"import('node:fs/promises').then(fs=>fs.rm('dist',{recursive:true,force:true}))\"",
|
|
41
|
+
"dev": "tsx src/cli.ts",
|
|
42
|
+
"lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
43
|
+
"pack:dry-run": "pnpm pack --dry-run",
|
|
44
|
+
"release": "pnpm build && changeset publish",
|
|
45
|
+
"release:check": "pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack --dry-run",
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"test:watch": "vitest",
|
|
48
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
49
|
+
"version-packages": "changeset version"
|
|
50
|
+
}
|
|
51
|
+
}
|