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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +146 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/add.d.ts +20 -0
  7. package/dist/commands/add.js +250 -0
  8. package/dist/commands/add.js.map +1 -0
  9. package/dist/commands/list.d.ts +6 -0
  10. package/dist/commands/list.js +64 -0
  11. package/dist/commands/list.js.map +1 -0
  12. package/dist/commands/open.d.ts +7 -0
  13. package/dist/commands/open.js +41 -0
  14. package/dist/commands/open.js.map +1 -0
  15. package/dist/commands/prompt.d.ts +7 -0
  16. package/dist/commands/prompt.js +41 -0
  17. package/dist/commands/prompt.js.map +1 -0
  18. package/dist/commands/rm.d.ts +6 -0
  19. package/dist/commands/rm.js +99 -0
  20. package/dist/commands/rm.js.map +1 -0
  21. package/dist/lib/add-strategy.d.ts +9 -0
  22. package/dist/lib/add-strategy.js +18 -0
  23. package/dist/lib/add-strategy.js.map +1 -0
  24. package/dist/lib/clipboard.d.ts +1 -0
  25. package/dist/lib/clipboard.js +45 -0
  26. package/dist/lib/clipboard.js.map +1 -0
  27. package/dist/lib/config.d.ts +52 -0
  28. package/dist/lib/config.js +238 -0
  29. package/dist/lib/config.js.map +1 -0
  30. package/dist/lib/env-files.d.ts +18 -0
  31. package/dist/lib/env-files.js +196 -0
  32. package/dist/lib/env-files.js.map +1 -0
  33. package/dist/lib/env-scope.d.ts +3 -0
  34. package/dist/lib/env-scope.js +15 -0
  35. package/dist/lib/env-scope.js.map +1 -0
  36. package/dist/lib/errors.d.ts +2 -0
  37. package/dist/lib/errors.js +26 -0
  38. package/dist/lib/errors.js.map +1 -0
  39. package/dist/lib/fs-utils.d.ts +1 -0
  40. package/dist/lib/fs-utils.js +11 -0
  41. package/dist/lib/fs-utils.js.map +1 -0
  42. package/dist/lib/git.d.ts +20 -0
  43. package/dist/lib/git.js +82 -0
  44. package/dist/lib/git.js.map +1 -0
  45. package/dist/lib/output.d.ts +18 -0
  46. package/dist/lib/output.js +78 -0
  47. package/dist/lib/output.js.map +1 -0
  48. package/dist/lib/prompt.d.ts +8 -0
  49. package/dist/lib/prompt.js +14 -0
  50. package/dist/lib/prompt.js.map +1 -0
  51. package/dist/lib/repo.d.ts +8 -0
  52. package/dist/lib/repo.js +24 -0
  53. package/dist/lib/repo.js.map +1 -0
  54. package/dist/lib/task-utils.d.ts +3 -0
  55. package/dist/lib/task-utils.js +24 -0
  56. package/dist/lib/task-utils.js.map +1 -0
  57. package/dist/lib/template.d.ts +22 -0
  58. package/dist/lib/template.js +111 -0
  59. package/dist/lib/template.js.map +1 -0
  60. package/dist/lib/vscode.d.ts +1 -0
  61. package/dist/lib/vscode.js +8 -0
  62. package/dist/lib/vscode.js.map +1 -0
  63. package/dist/lib/worktrees.d.ts +11 -0
  64. package/dist/lib/worktrees.js +59 -0
  65. package/dist/lib/worktrees.js.map +1 -0
  66. 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>;
@@ -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,8 @@
1
+ export interface TaskPromptInput {
2
+ task: string;
3
+ taskSlug: string;
4
+ branch: string;
5
+ worktreePath: string;
6
+ message: string;
7
+ }
8
+ export declare function buildTaskPrompt(input: TaskPromptInput): string;
@@ -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;
@@ -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,3 @@
1
+ export declare function toTaskSlug(task: string): string;
2
+ export declare function normalizeBranchPrefix(prefix: string): string;
3
+ export declare function buildBranchName(prefix: string, taskSlug: string): string;
@@ -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,8 @@
1
+ import { execa } from "execa";
2
+ export async function openInVSCode(worktreePath) {
3
+ await execa("code", ["-n", worktreePath], {
4
+ stdio: "ignore",
5
+ windowsHide: true,
6
+ });
7
+ }
8
+ //# sourceMappingURL=vscode.js.map
@@ -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
+ }