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,45 @@
1
+ import process from "node:process";
2
+ import { execa } from "execa";
3
+ export async function copyToClipboard(text) {
4
+ const platform = process.platform;
5
+ if (platform === "win32") {
6
+ await runClipboardCommand("clip", [], text);
7
+ return;
8
+ }
9
+ if (platform === "darwin") {
10
+ await runClipboardCommand("pbcopy", [], text);
11
+ return;
12
+ }
13
+ const linuxCandidates = [
14
+ ["wl-copy", []],
15
+ ["xclip", ["-selection", "clipboard"]],
16
+ ["xsel", ["--clipboard", "--input"]],
17
+ ];
18
+ for (const [binary, args] of linuxCandidates) {
19
+ try {
20
+ await runClipboardCommand(binary, args, text);
21
+ return;
22
+ }
23
+ catch (error) {
24
+ if (isMissingBinaryError(error)) {
25
+ continue;
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ throw new Error("No clipboard utility found. Install wl-copy, xclip, or xsel to use --copy.");
31
+ }
32
+ async function runClipboardCommand(binary, args, text) {
33
+ await execa(binary, args, {
34
+ input: text,
35
+ reject: true,
36
+ });
37
+ }
38
+ function isMissingBinaryError(error) {
39
+ if (typeof error !== "object" || error === null) {
40
+ return false;
41
+ }
42
+ const maybeError = error;
43
+ return maybeError.code === "ENOENT";
44
+ }
45
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/lib/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,mBAAmB,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,mBAAmB,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAA8B;QACjD,CAAC,SAAS,EAAE,EAAE,CAAC;QACf,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;KACrC,CAAC;IAEF,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,SAAS;YACX,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAc,EACd,IAAc,EACd,IAAY;IAEZ,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;QACxB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,KAA0B,CAAC;IAC9C,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC;AACtC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { type EnvScope } from "./env-scope.js";
2
+ export interface CodexConfigValues {
3
+ base: string;
4
+ branchPrefix: string;
5
+ dir?: string;
6
+ copyEnv: boolean;
7
+ envGlobs: string;
8
+ envScope: EnvScope;
9
+ overwriteEnv: boolean;
10
+ template: boolean;
11
+ templateFile?: string;
12
+ templateType: string;
13
+ overwriteTemplate: boolean;
14
+ fetch: boolean;
15
+ open: boolean;
16
+ }
17
+ export type CodexConfigOverrides = Partial<CodexConfigValues>;
18
+ export declare const addDefaults: CodexConfigValues;
19
+ export declare function mergeAddConfigLayers(...layers: CodexConfigOverrides[]): CodexConfigValues;
20
+ export declare function parseBooleanLike(value: string): boolean | undefined;
21
+ export declare function parseGitConfigMap(entries: ReadonlyMap<string, string>): CodexConfigOverrides;
22
+ export declare function resolveAddConfig(repoRoot: string, cliOverrides: CodexConfigOverrides): Promise<CodexConfigValues>;
23
+ export declare function resolveRmConfig(repoRoot: string, cliOverrides: {
24
+ dir?: string;
25
+ forceDelete?: boolean;
26
+ }): Promise<{
27
+ dir?: string;
28
+ forceDelete: boolean;
29
+ }>;
30
+ export declare function resolveListConfig(repoRoot: string, cliOverrides: {
31
+ branchPrefix?: string;
32
+ pretty?: boolean;
33
+ }): Promise<{
34
+ branchPrefix: string;
35
+ pretty: boolean;
36
+ }>;
37
+ export declare function resolveOpenConfig(repoRoot: string, cliOverrides: {
38
+ dir?: string;
39
+ branchPrefix?: string;
40
+ open?: boolean;
41
+ }): Promise<{
42
+ dir?: string;
43
+ branchPrefix: string;
44
+ open: boolean;
45
+ }>;
46
+ export declare function resolvePromptConfig(repoRoot: string, cliOverrides: {
47
+ dir?: string;
48
+ branchPrefix?: string;
49
+ }): Promise<{
50
+ dir?: string;
51
+ branchPrefix: string;
52
+ }>;
@@ -0,0 +1,238 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { execa } from "execa";
5
+ import { parseOptionalEnvScope } from "./env-scope.js";
6
+ import { pathExists } from "./fs-utils.js";
7
+ export const addDefaults = {
8
+ base: "origin/main",
9
+ branchPrefix: "codex/",
10
+ dir: undefined,
11
+ copyEnv: true,
12
+ envGlobs: ".env,.env.*",
13
+ envScope: "root",
14
+ overwriteEnv: false,
15
+ template: false,
16
+ templateFile: undefined,
17
+ templateType: "default",
18
+ overwriteTemplate: false,
19
+ fetch: true,
20
+ open: true,
21
+ };
22
+ export function mergeAddConfigLayers(...layers) {
23
+ const merged = {};
24
+ for (const layer of layers) {
25
+ for (const [rawKey, value] of Object.entries(layer)) {
26
+ if (value !== undefined) {
27
+ const key = rawKey;
28
+ merged[key] = value;
29
+ }
30
+ }
31
+ }
32
+ return {
33
+ ...addDefaults,
34
+ ...merged,
35
+ };
36
+ }
37
+ export function parseBooleanLike(value) {
38
+ const normalized = value.trim().toLowerCase();
39
+ if (["true", "1", "yes", "on"].includes(normalized)) {
40
+ return true;
41
+ }
42
+ if (["false", "0", "no", "off"].includes(normalized)) {
43
+ return false;
44
+ }
45
+ return undefined;
46
+ }
47
+ export function parseGitConfigMap(entries) {
48
+ const normalizedEntries = new Map();
49
+ for (const [key, value] of entries.entries()) {
50
+ normalizedEntries.set(key.toLowerCase(), value);
51
+ }
52
+ const get = (key) => normalizedEntries.get(key.toLowerCase());
53
+ const copyEnv = getBooleanFromString(get("codex.copyenv"));
54
+ const overwriteEnv = getBooleanFromString(get("codex.overwriteenv"));
55
+ const envScope = parseOptionalEnvScope(get("codex.envscope"), "codex.envScope");
56
+ const template = getBooleanFromString(get("codex.template"));
57
+ const overwriteTemplate = getBooleanFromString(get("codex.overwritetemplate"));
58
+ const templateType = get("codex.templatetype");
59
+ const fetch = getBooleanFromString(get("codex.fetch"));
60
+ const open = getBooleanFromString(get("codex.open")) ??
61
+ getBooleanFromString(get("codex.openvscodebydefault"));
62
+ const overrides = {};
63
+ assignIfDefined(overrides, "base", get("codex.base"));
64
+ assignIfDefined(overrides, "branchPrefix", get("codex.branchprefix"));
65
+ assignIfDefined(overrides, "dir", get("codex.dir"));
66
+ assignIfDefined(overrides, "envGlobs", get("codex.envglobs"));
67
+ assignIfDefined(overrides, "envScope", envScope);
68
+ assignIfDefined(overrides, "copyEnv", copyEnv);
69
+ assignIfDefined(overrides, "overwriteEnv", overwriteEnv);
70
+ assignIfDefined(overrides, "template", template);
71
+ assignIfDefined(overrides, "templateFile", get("codex.templatefile"));
72
+ assignIfDefined(overrides, "templateType", templateType);
73
+ assignIfDefined(overrides, "overwriteTemplate", overwriteTemplate);
74
+ assignIfDefined(overrides, "fetch", fetch);
75
+ assignIfDefined(overrides, "open", open);
76
+ return overrides;
77
+ }
78
+ export async function resolveAddConfig(repoRoot, cliOverrides) {
79
+ const layers = await loadConfigLayers(repoRoot);
80
+ return mergeAddConfigLayers(addDefaults, ...layers, cliOverrides);
81
+ }
82
+ export async function resolveRmConfig(repoRoot, cliOverrides) {
83
+ const addConfig = await resolveAddConfig(repoRoot, {});
84
+ return {
85
+ dir: cliOverrides.dir ?? addConfig.dir,
86
+ forceDelete: cliOverrides.forceDelete ?? false,
87
+ };
88
+ }
89
+ export async function resolveListConfig(repoRoot, cliOverrides) {
90
+ const addConfig = await resolveAddConfig(repoRoot, {});
91
+ return {
92
+ branchPrefix: cliOverrides.branchPrefix ?? addConfig.branchPrefix,
93
+ pretty: cliOverrides.pretty ?? false,
94
+ };
95
+ }
96
+ export async function resolveOpenConfig(repoRoot, cliOverrides) {
97
+ const addConfig = await resolveAddConfig(repoRoot, {});
98
+ return {
99
+ dir: cliOverrides.dir ?? addConfig.dir,
100
+ branchPrefix: cliOverrides.branchPrefix ?? addConfig.branchPrefix,
101
+ open: cliOverrides.open ?? true,
102
+ };
103
+ }
104
+ export async function resolvePromptConfig(repoRoot, cliOverrides) {
105
+ const addConfig = await resolveAddConfig(repoRoot, {});
106
+ return {
107
+ dir: cliOverrides.dir ?? addConfig.dir,
108
+ branchPrefix: cliOverrides.branchPrefix ?? addConfig.branchPrefix,
109
+ };
110
+ }
111
+ async function loadConfigLayers(repoRoot) {
112
+ const globalGit = await readGitConfig("global", repoRoot);
113
+ const globalFile = await readJsonConfig(path.join(os.homedir(), ".config", "git-codex", "config.json"));
114
+ const repoGit = await readGitConfig("local", repoRoot);
115
+ const repoFile = await readJsonConfig(path.join(repoRoot, ".git-codexrc.json"));
116
+ return [globalGit, globalFile, repoGit, repoFile];
117
+ }
118
+ async function readGitConfig(scope, repoRoot) {
119
+ const args = scope === "global"
120
+ ? ["config", "--global", "--get-regexp", "^codex\\."]
121
+ : ["config", "--get-regexp", "^codex\\."];
122
+ const result = await execa("git", args, {
123
+ cwd: repoRoot,
124
+ reject: false,
125
+ });
126
+ if (result.exitCode !== 0) {
127
+ return {};
128
+ }
129
+ const map = new Map();
130
+ for (const line of result.stdout.split(/\r?\n/)) {
131
+ const trimmed = line.trim();
132
+ if (!trimmed) {
133
+ continue;
134
+ }
135
+ const firstSpace = trimmed.indexOf(" ");
136
+ if (firstSpace <= 0) {
137
+ continue;
138
+ }
139
+ const key = trimmed.slice(0, firstSpace).trim().toLowerCase();
140
+ const value = trimmed.slice(firstSpace + 1).trim();
141
+ map.set(key, value);
142
+ }
143
+ return parseGitConfigMap(map);
144
+ }
145
+ async function readJsonConfig(configPath) {
146
+ if (!(await pathExists(configPath))) {
147
+ return {};
148
+ }
149
+ const raw = await readFile(configPath, "utf8");
150
+ let parsed;
151
+ try {
152
+ parsed = JSON.parse(raw);
153
+ }
154
+ catch (error) {
155
+ throw new Error(`Invalid JSON in ${configPath}: ${error.message || "Unable to parse"}`);
156
+ }
157
+ return parseJsonConfigObject(parsed, configPath);
158
+ }
159
+ function parseJsonConfigObject(raw, sourcePath) {
160
+ if (!isRecord(raw)) {
161
+ throw new Error(`${sourcePath} must contain a JSON object.`);
162
+ }
163
+ const config = raw;
164
+ const envGlobs = normalizeEnvGlobs(config.envGlobs, sourcePath);
165
+ const envScope = parseOptionalEnvScope(readString(config.envScope, "envScope", sourcePath), `${sourcePath}: "envScope"`);
166
+ const open = readBoolean(config.open, "open", sourcePath) ??
167
+ readBoolean(config.openVsCodeByDefault, "openVsCodeByDefault", sourcePath);
168
+ return {
169
+ base: readString(config.base, "base", sourcePath),
170
+ branchPrefix: readString(config.branchPrefix, "branchPrefix", sourcePath),
171
+ dir: readString(config.dir, "dir", sourcePath),
172
+ envGlobs,
173
+ envScope,
174
+ copyEnv: readBoolean(config.copyEnv, "copyEnv", sourcePath),
175
+ overwriteEnv: readBoolean(config.overwriteEnv, "overwriteEnv", sourcePath),
176
+ template: readBoolean(config.template, "template", sourcePath),
177
+ templateFile: readString(config.templateFile, "templateFile", sourcePath),
178
+ templateType: readString(config.templateType, "templateType", sourcePath),
179
+ overwriteTemplate: readBoolean(config.overwriteTemplate, "overwriteTemplate", sourcePath),
180
+ fetch: readBoolean(config.fetch, "fetch", sourcePath),
181
+ open,
182
+ };
183
+ }
184
+ function readString(value, fieldName, sourcePath) {
185
+ if (value === undefined) {
186
+ return undefined;
187
+ }
188
+ if (typeof value !== "string") {
189
+ throw new Error(`${sourcePath}: "${fieldName}" must be a string.`);
190
+ }
191
+ const trimmed = value.trim();
192
+ return trimmed || undefined;
193
+ }
194
+ function readBoolean(value, fieldName, sourcePath) {
195
+ if (value === undefined) {
196
+ return undefined;
197
+ }
198
+ if (typeof value !== "boolean") {
199
+ throw new Error(`${sourcePath}: "${fieldName}" must be a boolean.`);
200
+ }
201
+ return value;
202
+ }
203
+ function normalizeEnvGlobs(value, sourcePath) {
204
+ if (value === undefined) {
205
+ return undefined;
206
+ }
207
+ if (typeof value === "string") {
208
+ const trimmed = value.trim();
209
+ return trimmed || undefined;
210
+ }
211
+ if (Array.isArray(value)) {
212
+ const normalized = value
213
+ .map((entry) => {
214
+ if (typeof entry !== "string") {
215
+ throw new Error(`${sourcePath}: "envGlobs" array entries must all be strings.`);
216
+ }
217
+ return entry.trim();
218
+ })
219
+ .filter(Boolean);
220
+ return normalized.length > 0 ? normalized.join(",") : undefined;
221
+ }
222
+ throw new Error(`${sourcePath}: "envGlobs" must be a string or string array.`);
223
+ }
224
+ function isRecord(value) {
225
+ return typeof value === "object" && value !== null && !Array.isArray(value);
226
+ }
227
+ function getBooleanFromString(value) {
228
+ if (value === undefined) {
229
+ return undefined;
230
+ }
231
+ return parseBooleanLike(value);
232
+ }
233
+ function assignIfDefined(target, key, value) {
234
+ if (value !== undefined) {
235
+ target[key] = value;
236
+ }
237
+ }
238
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type EnvScope } from "./env-scope.js";
2
+ export interface CopyEnvLikeFilesOptions {
3
+ repoRoot: string;
4
+ worktreePath: string;
5
+ globs: string[];
6
+ overwrite: boolean;
7
+ scope: EnvScope;
8
+ }
9
+ export interface CopyEnvLikeFilesResult {
10
+ scope: EnvScope;
11
+ matched: string[];
12
+ copied: string[];
13
+ skipped: string[];
14
+ }
15
+ export declare function parseEnvGlobs(globsInput: string): string[];
16
+ export declare function copyEnvLikeFiles(options: CopyEnvLikeFilesOptions): Promise<CopyEnvLikeFilesResult>;
17
+ export declare function readPnpmWorkspacePackagePatterns(repoRoot: string): Promise<string[]>;
18
+ export declare function parsePnpmWorkspacePackagePatterns(workspaceRaw: string): string[];
@@ -0,0 +1,196 @@
1
+ import { copyFile, mkdir, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import fg from "fast-glob";
4
+ import { pathExists } from "./fs-utils.js";
5
+ export function parseEnvGlobs(globsInput) {
6
+ const unique = new Set(globsInput
7
+ .split(",")
8
+ .map((entry) => entry.trim())
9
+ .filter(Boolean));
10
+ return [...unique];
11
+ }
12
+ export async function copyEnvLikeFiles(options) {
13
+ const matched = await findEnvLikeFiles(options);
14
+ const copied = [];
15
+ const skipped = [];
16
+ for (const relativePath of matched) {
17
+ const sourcePath = path.resolve(options.repoRoot, relativePath);
18
+ const destinationPath = path.resolve(options.worktreePath, relativePath);
19
+ if (!options.overwrite && (await pathExists(destinationPath))) {
20
+ skipped.push(relativePath);
21
+ continue;
22
+ }
23
+ await mkdir(path.dirname(destinationPath), { recursive: true });
24
+ await copyFile(sourcePath, destinationPath);
25
+ copied.push(relativePath);
26
+ }
27
+ return {
28
+ scope: options.scope,
29
+ matched,
30
+ copied,
31
+ skipped,
32
+ };
33
+ }
34
+ async function findEnvLikeFiles(options) {
35
+ switch (options.scope) {
36
+ case "root":
37
+ return findRootEnvLikeFiles(options.repoRoot, options.globs);
38
+ case "all":
39
+ return findAllEnvLikeFiles(options.repoRoot, options.worktreePath, options.globs);
40
+ case "packages":
41
+ return findPackagesEnvLikeFiles(options.repoRoot, options.worktreePath, options.globs);
42
+ default:
43
+ return [];
44
+ }
45
+ }
46
+ async function findRootEnvLikeFiles(repoRoot, globs) {
47
+ const matches = await fg(globs, {
48
+ cwd: repoRoot,
49
+ dot: true,
50
+ onlyFiles: true,
51
+ unique: true,
52
+ followSymbolicLinks: false,
53
+ suppressErrors: true,
54
+ });
55
+ return sortPaths(matches.filter((match) => !toPosixPath(match).includes("/")));
56
+ }
57
+ async function findAllEnvLikeFiles(repoRoot, worktreePath, globs) {
58
+ const recursiveGlobs = toRecursiveGlobs(globs);
59
+ const matches = await fg(recursiveGlobs, {
60
+ cwd: repoRoot,
61
+ dot: true,
62
+ onlyFiles: true,
63
+ unique: true,
64
+ followSymbolicLinks: false,
65
+ suppressErrors: true,
66
+ ignore: buildEnvIgnoreGlobs(repoRoot, worktreePath),
67
+ });
68
+ return sortPaths(matches);
69
+ }
70
+ async function findPackagesEnvLikeFiles(repoRoot, worktreePath, globs) {
71
+ const packageRoots = await resolvePackageRoots(repoRoot, worktreePath);
72
+ const relativeMatches = new Set();
73
+ const recursiveGlobs = toRecursiveGlobs(globs);
74
+ for (const packageRoot of packageRoots) {
75
+ const packageRootPath = path.join(repoRoot, packageRoot);
76
+ const packageMatches = await fg(recursiveGlobs, {
77
+ cwd: packageRootPath,
78
+ dot: true,
79
+ onlyFiles: true,
80
+ unique: true,
81
+ followSymbolicLinks: false,
82
+ suppressErrors: true,
83
+ });
84
+ for (const packageMatch of packageMatches) {
85
+ relativeMatches.add(toPosixPath(path.posix.join(toPosixPath(packageRoot), packageMatch)));
86
+ }
87
+ }
88
+ return sortPaths([...relativeMatches]);
89
+ }
90
+ async function resolvePackageRoots(repoRoot, worktreePath) {
91
+ const workspacePatterns = await readPnpmWorkspacePackagePatterns(repoRoot);
92
+ const patterns = workspacePatterns.length > 0 ? workspacePatterns : ["packages/*", "apps/*"];
93
+ const packageRoots = await fg(patterns, {
94
+ cwd: repoRoot,
95
+ onlyDirectories: true,
96
+ unique: true,
97
+ followSymbolicLinks: false,
98
+ suppressErrors: true,
99
+ ignore: buildEnvIgnoreGlobs(repoRoot, worktreePath),
100
+ });
101
+ return sortPaths(packageRoots);
102
+ }
103
+ export async function readPnpmWorkspacePackagePatterns(repoRoot) {
104
+ const workspacePath = path.join(repoRoot, "pnpm-workspace.yaml");
105
+ if (!(await pathExists(workspacePath))) {
106
+ return [];
107
+ }
108
+ const workspaceRaw = await readFile(workspacePath, "utf8");
109
+ return parsePnpmWorkspacePackagePatterns(workspaceRaw);
110
+ }
111
+ export function parsePnpmWorkspacePackagePatterns(workspaceRaw) {
112
+ const lines = workspaceRaw.split(/\r?\n/);
113
+ const patterns = [];
114
+ let inPackagesSection = false;
115
+ let packagesIndent = 0;
116
+ for (const line of lines) {
117
+ const trimmed = line.trim();
118
+ if (!trimmed || trimmed.startsWith("#")) {
119
+ continue;
120
+ }
121
+ const leadingWhitespace = line.match(/^\s*/)?.[0] ?? "";
122
+ const currentIndent = leadingWhitespace.length;
123
+ if (!inPackagesSection) {
124
+ if (/^\s*packages:\s*$/.test(line)) {
125
+ inPackagesSection = true;
126
+ packagesIndent = currentIndent;
127
+ }
128
+ continue;
129
+ }
130
+ if (currentIndent <= packagesIndent && /^\s*[\w.-]+\s*:/.test(line)) {
131
+ break;
132
+ }
133
+ const itemMatch = trimmed.match(/^- (.+)$/);
134
+ if (!itemMatch) {
135
+ continue;
136
+ }
137
+ let value = itemMatch[1].trim();
138
+ if ((value.startsWith("'") && value.endsWith("'")) ||
139
+ (value.startsWith('"') && value.endsWith('"'))) {
140
+ value = value.slice(1, -1);
141
+ }
142
+ if (value) {
143
+ patterns.push(value);
144
+ }
145
+ }
146
+ return patterns;
147
+ }
148
+ function buildEnvIgnoreGlobs(repoRoot, worktreePath) {
149
+ const ignore = [
150
+ "**/.git/**",
151
+ "**/node_modules/**",
152
+ "**/dist/**",
153
+ "**/build/**",
154
+ "**/coverage/**",
155
+ "**/.next/**",
156
+ "**/.nuxt/**",
157
+ "**/.turbo/**",
158
+ "**/.cache/**",
159
+ "**/.yarn/**",
160
+ "**/.pnpm-store/**",
161
+ ];
162
+ const relativeWorktreePath = toPosixPath(path.relative(repoRoot, worktreePath));
163
+ if (isSubpath(relativeWorktreePath)) {
164
+ ignore.push(`${relativeWorktreePath}/**`);
165
+ }
166
+ return ignore;
167
+ }
168
+ function isSubpath(relativePath) {
169
+ if (!relativePath) {
170
+ return false;
171
+ }
172
+ return !relativePath.startsWith("../") && relativePath !== "..";
173
+ }
174
+ function sortPaths(paths) {
175
+ return paths
176
+ .map((entry) => toPosixPath(entry))
177
+ .sort((a, b) => a.localeCompare(b));
178
+ }
179
+ function toPosixPath(value) {
180
+ return value.replace(/\\/g, "/");
181
+ }
182
+ function toRecursiveGlobs(globs) {
183
+ const expanded = new Set();
184
+ for (const glob of globs) {
185
+ const normalized = toPosixPath(glob).trim();
186
+ if (!normalized) {
187
+ continue;
188
+ }
189
+ expanded.add(normalized);
190
+ if (!normalized.startsWith("**/")) {
191
+ expanded.add(`**/${normalized}`);
192
+ }
193
+ }
194
+ return [...expanded];
195
+ }
196
+ //# sourceMappingURL=env-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-files.js","sourceRoot":"","sources":["../../src/lib/env-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const ENV_SCOPE_VALUES: readonly ["root", "all", "packages"];
2
+ export type EnvScope = (typeof ENV_SCOPE_VALUES)[number];
3
+ export declare function parseOptionalEnvScope(value: string | undefined, source: string): EnvScope | undefined;
@@ -0,0 +1,15 @@
1
+ export const ENV_SCOPE_VALUES = ["root", "all", "packages"];
2
+ export function parseOptionalEnvScope(value, source) {
3
+ if (value === undefined) {
4
+ return undefined;
5
+ }
6
+ const normalized = value.trim().toLowerCase();
7
+ if (isEnvScope(normalized)) {
8
+ return normalized;
9
+ }
10
+ throw new Error(`Invalid ${source}: "${value}". Expected one of: ${ENV_SCOPE_VALUES.join(", ")}.`);
11
+ }
12
+ function isEnvScope(value) {
13
+ return ENV_SCOPE_VALUES.includes(value);
14
+ }
15
+ //# sourceMappingURL=env-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-scope.js","sourceRoot":"","sources":["../../src/lib/env-scope.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAU,CAAC;AAIrE,MAAM,UAAU,qBAAqB,CACnC,KAAyB,EACzB,MAAc;IAEd,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,MAAM,KAAK,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAClF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function toErrorMessage(error: unknown): string;
2
+ export declare function isMissingExecutableError(error: unknown): boolean;
@@ -0,0 +1,26 @@
1
+ export function toErrorMessage(error) {
2
+ if (error instanceof Error) {
3
+ return error.message;
4
+ }
5
+ if (typeof error === "string") {
6
+ return error;
7
+ }
8
+ try {
9
+ return JSON.stringify(error);
10
+ }
11
+ catch {
12
+ return String(error);
13
+ }
14
+ }
15
+ export function isMissingExecutableError(error) {
16
+ if (typeof error !== "object" || error === null) {
17
+ return false;
18
+ }
19
+ const maybeError = error;
20
+ if (maybeError.code === "ENOENT") {
21
+ return true;
22
+ }
23
+ const combinedMessage = `${maybeError.shortMessage ?? ""} ${maybeError.message ?? ""}`;
24
+ return combinedMessage.includes("ENOENT");
25
+ }
26
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,KAIlB,CAAC;IAEF,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,GAAG,UAAU,CAAC,YAAY,IAAI,EAAE,IAAI,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;IACvF,OAAO,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function pathExists(targetPath: string): Promise<boolean>;
@@ -0,0 +1,11 @@
1
+ import { access } from "node:fs/promises";
2
+ export async function pathExists(targetPath) {
3
+ try {
4
+ await access(targetPath);
5
+ return true;
6
+ }
7
+ catch {
8
+ return false;
9
+ }
10
+ }
11
+ //# sourceMappingURL=fs-utils.js.map