@tarunspandit/codexflow 0.29.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 (92) hide show
  1. package/AGENTS.example.md +18 -0
  2. package/CHANGELOG.md +311 -0
  3. package/CHATGPT_PROMPT.md +12 -0
  4. package/CODEX_PROMPT.md +12 -0
  5. package/CONTRIBUTING.md +51 -0
  6. package/DOMAIN_SETUP.md +241 -0
  7. package/FAQ.md +327 -0
  8. package/FAQ_ZH.md +279 -0
  9. package/LICENSE +21 -0
  10. package/NOTICE +9 -0
  11. package/PUBLIC_LAUNCH_CHECKLIST.md +111 -0
  12. package/README.md +287 -0
  13. package/README_ZH.md +461 -0
  14. package/SECURITY.md +145 -0
  15. package/config.example.env +31 -0
  16. package/dist/analysis/cache.js +27 -0
  17. package/dist/analysis/cache.js.map +1 -0
  18. package/dist/analysis/classify.js +102 -0
  19. package/dist/analysis/classify.js.map +1 -0
  20. package/dist/analysis/extract.js +139 -0
  21. package/dist/analysis/extract.js.map +1 -0
  22. package/dist/analysis/graph.js +22 -0
  23. package/dist/analysis/graph.js.map +1 -0
  24. package/dist/analysis/impact.js +167 -0
  25. package/dist/analysis/impact.js.map +1 -0
  26. package/dist/analysis/index.js +215 -0
  27. package/dist/analysis/index.js.map +1 -0
  28. package/dist/analysis/inventory.js +51 -0
  29. package/dist/analysis/inventory.js.map +1 -0
  30. package/dist/analysis/providers.js +24 -0
  31. package/dist/analysis/providers.js.map +1 -0
  32. package/dist/analysis/rank.js +27 -0
  33. package/dist/analysis/rank.js.map +1 -0
  34. package/dist/analysis/types.js +8 -0
  35. package/dist/analysis/types.js.map +1 -0
  36. package/dist/bashOps.js +233 -0
  37. package/dist/bashOps.js.map +1 -0
  38. package/dist/capabilitiesOps.js +365 -0
  39. package/dist/capabilitiesOps.js.map +1 -0
  40. package/dist/codexSessions.js +379 -0
  41. package/dist/codexSessions.js.map +1 -0
  42. package/dist/config.js +289 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/fsOps.js +286 -0
  45. package/dist/fsOps.js.map +1 -0
  46. package/dist/gitOps.js +79 -0
  47. package/dist/gitOps.js.map +1 -0
  48. package/dist/guard.js +198 -0
  49. package/dist/guard.js.map +1 -0
  50. package/dist/http.js +1671 -0
  51. package/dist/http.js.map +1 -0
  52. package/dist/proContext.js +274 -0
  53. package/dist/proContext.js.map +1 -0
  54. package/dist/profileStore.js +89 -0
  55. package/dist/profileStore.js.map +1 -0
  56. package/dist/projectCatalog.js +134 -0
  57. package/dist/projectCatalog.js.map +1 -0
  58. package/dist/redact.js +73 -0
  59. package/dist/redact.js.map +1 -0
  60. package/dist/searchOps.js +186 -0
  61. package/dist/searchOps.js.map +1 -0
  62. package/dist/server.js +2502 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/stdio.js +36 -0
  65. package/dist/stdio.js.map +1 -0
  66. package/dist/toolCardWidget.js +1155 -0
  67. package/dist/toolCardWidget.js.map +1 -0
  68. package/dist/workspaceOps.js +229 -0
  69. package/dist/workspaceOps.js.map +1 -0
  70. package/docs/.nojekyll +1 -0
  71. package/docs/favicon.svg +5 -0
  72. package/docs/index.html +638 -0
  73. package/docs/og.png +0 -0
  74. package/docs/script.js +80 -0
  75. package/docs/star.svg +11 -0
  76. package/docs/styles.css +1229 -0
  77. package/docs/zh.html +436 -0
  78. package/package.json +94 -0
  79. package/scripts/analysis-cli-smoke.mjs +81 -0
  80. package/scripts/analysis-smoke.mjs +179 -0
  81. package/scripts/clean.mjs +6 -0
  82. package/scripts/cli-smoke.mjs +168 -0
  83. package/scripts/codexflow.mjs +4375 -0
  84. package/scripts/doctor-smoke.mjs +90 -0
  85. package/scripts/execute-handoff-smoke.mjs +1110 -0
  86. package/scripts/http-smoke.mjs +812 -0
  87. package/scripts/pro-apply.mjs +141 -0
  88. package/scripts/pro-bundle.mjs +121 -0
  89. package/scripts/pro-smoke.mjs +95 -0
  90. package/scripts/settings-smoke.mjs +756 -0
  91. package/scripts/smoke.mjs +1194 -0
  92. package/scripts/stress.mjs +835 -0
package/dist/config.js ADDED
@@ -0,0 +1,289 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { DEFAULT_ANALYSIS_LIMITS } from "./analysis/types.js";
5
+ const DEFAULT_BLOCKED_GLOBS = [
6
+ ".git",
7
+ ".git/**",
8
+ "**/.git/**",
9
+ "node_modules",
10
+ "node_modules/**",
11
+ "**/node_modules/**",
12
+ ".env",
13
+ ".env/**",
14
+ ".env.*",
15
+ ".env.*/**",
16
+ "**/.env",
17
+ "**/.env/**",
18
+ "**/.env.*",
19
+ "**/.env.*/**",
20
+ "**/*.pem",
21
+ "**/*.key",
22
+ "**/id_rsa",
23
+ "**/id_rsa.*",
24
+ "**/id_ed25519",
25
+ "**/id_ed25519.*",
26
+ "**/.ssh/**",
27
+ "dist",
28
+ "dist/**",
29
+ "**/dist/**",
30
+ "build",
31
+ "build/**",
32
+ "**/build/**",
33
+ ".next",
34
+ ".next/**",
35
+ "**/.next/**",
36
+ "coverage",
37
+ "coverage/**",
38
+ "**/coverage/**",
39
+ ".cache",
40
+ ".cache/**",
41
+ "**/.cache/**"
42
+ ];
43
+ function parseArgs(argv) {
44
+ const out = {};
45
+ for (let i = 0; i < argv.length; i += 1) {
46
+ const raw = argv[i];
47
+ if (!raw.startsWith("--"))
48
+ continue;
49
+ const withoutPrefix = raw.slice(2);
50
+ const eqIndex = withoutPrefix.indexOf("=");
51
+ let key;
52
+ let value;
53
+ if (eqIndex >= 0) {
54
+ key = withoutPrefix.slice(0, eqIndex);
55
+ value = withoutPrefix.slice(eqIndex + 1);
56
+ }
57
+ else {
58
+ key = withoutPrefix;
59
+ const next = argv[i + 1];
60
+ if (next && !next.startsWith("--")) {
61
+ value = next;
62
+ i += 1;
63
+ }
64
+ else {
65
+ value = true;
66
+ }
67
+ }
68
+ if (key === "allow-root") {
69
+ const prev = out[key];
70
+ if (Array.isArray(prev))
71
+ prev.push(String(value));
72
+ else if (prev)
73
+ out[key] = [String(prev), String(value)];
74
+ else
75
+ out[key] = [String(value)];
76
+ }
77
+ else {
78
+ out[key] = value;
79
+ }
80
+ }
81
+ return out;
82
+ }
83
+ export function expandHome(input) {
84
+ if (!input || input === "~")
85
+ return os.homedir();
86
+ if (input.startsWith("~/"))
87
+ return path.join(os.homedir(), input.slice(2));
88
+ return input;
89
+ }
90
+ function splitList(value, delimiter = path.delimiter) {
91
+ if (!value)
92
+ return [];
93
+ return value
94
+ .split(delimiter)
95
+ .map((part) => part.trim())
96
+ .filter(Boolean);
97
+ }
98
+ function splitRoots(value) {
99
+ return splitList(value, path.delimiter);
100
+ }
101
+ function toRealDir(input) {
102
+ const expanded = expandHome(input);
103
+ const resolved = path.resolve(expanded);
104
+ if (!fs.existsSync(resolved)) {
105
+ throw new Error(`Directory does not exist: ${resolved}`);
106
+ }
107
+ const stat = fs.statSync(resolved);
108
+ if (!stat.isDirectory()) {
109
+ throw new Error(`Not a directory: ${resolved}`);
110
+ }
111
+ return fs.realpathSync(resolved);
112
+ }
113
+ function numberFrom(value, fallback, min, max) {
114
+ const parsed = Number(value);
115
+ if (!Number.isFinite(parsed))
116
+ return fallback;
117
+ return Math.max(min, Math.min(max, Math.floor(parsed)));
118
+ }
119
+ function bashModeFrom(value) {
120
+ if (value === "off" || value === "safe" || value === "full")
121
+ return value;
122
+ return "safe";
123
+ }
124
+ function bashTranscriptFrom(value) {
125
+ if (value === "compact" || value === "full")
126
+ return value;
127
+ return "compact";
128
+ }
129
+ function codexSessionsFrom(value) {
130
+ if (value === "metadata" || value === "read")
131
+ return value;
132
+ if (value === "1" || value === "true" || value === "yes" || value === "on")
133
+ return "metadata";
134
+ return "off";
135
+ }
136
+ function bashSessionIdFrom(value) {
137
+ const trimmed = value?.trim();
138
+ if (!trimmed)
139
+ return undefined;
140
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(trimmed)) {
141
+ throw new Error("CODEXFLOW_BASH_SESSION_ID must be 1-64 characters using letters, numbers, dot, underscore, or dash, and must start with a letter or number.");
142
+ }
143
+ return trimmed;
144
+ }
145
+ function writeModeFrom(value) {
146
+ if (value === "off" || value === "handoff" || value === "workspace")
147
+ return value;
148
+ return "workspace";
149
+ }
150
+ function toolModeFrom(value) {
151
+ if (value === "minimal" || value === "standard" || value === "full")
152
+ return value;
153
+ return "standard";
154
+ }
155
+ function widgetDomainFrom(value) {
156
+ const raw = value?.trim() || "https://tarunspandit.github.io";
157
+ let parsed;
158
+ try {
159
+ parsed = new URL(raw);
160
+ }
161
+ catch {
162
+ throw new Error(`CODEXFLOW_WIDGET_DOMAIN must be a valid origin URL, got: ${raw}`);
163
+ }
164
+ if (parsed.protocol !== "https:") {
165
+ throw new Error("CODEXFLOW_WIDGET_DOMAIN must use https.");
166
+ }
167
+ if (parsed.pathname !== "/" || parsed.search || parsed.hash) {
168
+ throw new Error("CODEXFLOW_WIDGET_DOMAIN must be an origin only, for example https://widgets.example.com.");
169
+ }
170
+ return parsed.origin;
171
+ }
172
+ function contextDirFrom(value) {
173
+ const raw = (value?.trim() || ".ai-bridge").replaceAll("\\", "/");
174
+ if (path.isAbsolute(raw) || path.win32.isAbsolute(raw)) {
175
+ throw new Error("CODEXFLOW_CONTEXT_DIR must be a workspace-relative hidden directory, for example .ai-bridge.");
176
+ }
177
+ const normalized = path.posix.normalize(raw);
178
+ if (!normalized || normalized === "." || normalized === ".." || normalized.startsWith("../")) {
179
+ throw new Error("CODEXFLOW_CONTEXT_DIR must stay inside the workspace.");
180
+ }
181
+ const parts = normalized.split("/");
182
+ if (parts.some((part) => !part || part === "." || part === "..")) {
183
+ throw new Error("CODEXFLOW_CONTEXT_DIR must be a simple relative directory path.");
184
+ }
185
+ if (!parts[0].startsWith(".")) {
186
+ throw new Error("CODEXFLOW_CONTEXT_DIR must start with a hidden directory such as .ai-bridge.");
187
+ }
188
+ const blocked = new Set([".git", ".ssh", ".gnupg", ".cache", "node_modules", "src", "dist", "build", ".next", "coverage"]);
189
+ if (parts.some((part) => blocked.has(part))) {
190
+ throw new Error("CODEXFLOW_CONTEXT_DIR cannot point at source, dependency, build, cache, or credential directories.");
191
+ }
192
+ return normalized;
193
+ }
194
+ function boolFrom(value, fallback = false) {
195
+ if (value === undefined)
196
+ return fallback;
197
+ return ["1", "true", "yes", "y", "on"].includes(value.toLowerCase());
198
+ }
199
+ function isLoopbackHost(host) {
200
+ return host === "127.0.0.1" || host === "localhost" || host === "::1";
201
+ }
202
+ export function loadConfig(argv = process.argv.slice(2)) {
203
+ const args = parseArgs(argv);
204
+ const rootFromArgs = typeof args.root === "string" ? args.root : undefined;
205
+ const root = rootFromArgs ?? process.env.CODEXFLOW_ROOT ?? process.env.CODEBASE_BRIDGE_REPO_ROOT ?? process.cwd();
206
+ const defaultRoot = toRealDir(root);
207
+ const allowRootArgs = Array.isArray(args["allow-root"])
208
+ ? args["allow-root"]
209
+ : typeof args["allow-root"] === "string"
210
+ ? [args["allow-root"]]
211
+ : [];
212
+ const envAllowedRoots = [
213
+ ...splitRoots(process.env.CODEXFLOW_ALLOWED_ROOTS),
214
+ ...splitRoots(process.env.CODEBASE_BRIDGE_ALLOWED_ROOTS)
215
+ ];
216
+ const allowHome = process.env.CODEXFLOW_ALLOW_HOME === "1" || args["allow-home"] === true;
217
+ const requestedAllowed = [defaultRoot, ...allowRootArgs, ...envAllowedRoots, ...(allowHome ? [os.homedir()] : [])];
218
+ const allowedRoots = [...new Set(requestedAllowed.map(toRealDir))];
219
+ const portArg = typeof args.port === "string" ? args.port : undefined;
220
+ const hostArg = typeof args.host === "string" ? args.host : undefined;
221
+ const bashArg = typeof args.bash === "string" ? args.bash : undefined;
222
+ const bashTranscriptArg = typeof args["bash-transcript"] === "string" ? args["bash-transcript"] : undefined;
223
+ const bashSessionArg = typeof args["bash-session"] === "string" ? args["bash-session"] : undefined;
224
+ const codexSessionsArg = typeof args["codex-sessions"] === "string" ? args["codex-sessions"] : undefined;
225
+ const codexDirArg = typeof args["codex-dir"] === "string" ? args["codex-dir"] : undefined;
226
+ const requireBashSessionArg = args["require-bash-session"] === true
227
+ ? "true"
228
+ : typeof args["require-bash-session"] === "string"
229
+ ? args["require-bash-session"]
230
+ : undefined;
231
+ const writeArg = typeof args.write === "string" ? args.write : undefined;
232
+ const toolModeArg = typeof args["tool-mode"] === "string" ? args["tool-mode"] : undefined;
233
+ const widgetDomainArg = typeof args["widget-domain"] === "string" ? args["widget-domain"] : undefined;
234
+ const toolCardsArg = args["tool-cards"] === true
235
+ ? "true"
236
+ : typeof args["tool-cards"] === "string"
237
+ ? args["tool-cards"]
238
+ : undefined;
239
+ const extraBlockedGlobs = splitList(process.env.CODEXFLOW_BLOCKED_GLOBS, ",");
240
+ const host = hostArg ?? process.env.CODEXFLOW_HOST ?? process.env.HOST ?? "127.0.0.1";
241
+ const authToken = process.env.CODEXFLOW_HTTP_TOKEN ?? process.env.CODEBASE_BRIDGE_HTTP_TOKEN;
242
+ const allowNoToken = boolFrom(process.env.CODEXFLOW_ALLOW_NO_HTTP_TOKEN, false) && isLoopbackHost(host);
243
+ const requireHttpToken = (!authToken && !allowNoToken) ||
244
+ boolFrom(process.env.CODEXFLOW_REQUIRE_HTTP_TOKEN, false) ||
245
+ boolFrom(process.env.CODEXFLOW_TUNNEL_MODE, false) ||
246
+ (!isLoopbackHost(host) && !allowNoToken);
247
+ const bashSessionId = bashSessionIdFrom(bashSessionArg ?? process.env.CODEXFLOW_BASH_SESSION_ID);
248
+ const requireBashSession = boolFrom(requireBashSessionArg ?? process.env.CODEXFLOW_REQUIRE_BASH_SESSION, false);
249
+ if (requireBashSession && !bashSessionId) {
250
+ throw new Error("CODEXFLOW_REQUIRE_BASH_SESSION requires CODEXFLOW_BASH_SESSION_ID or --bash-session.");
251
+ }
252
+ return {
253
+ defaultRoot,
254
+ allowedRoots,
255
+ host,
256
+ port: numberFrom(portArg ?? process.env.CODEXFLOW_PORT ?? process.env.PORT, 8787, 1, 65535),
257
+ widgetDomain: widgetDomainFrom(widgetDomainArg ?? process.env.CODEXFLOW_WIDGET_DOMAIN),
258
+ authToken,
259
+ requireHttpToken,
260
+ bashMode: bashModeFrom(bashArg ?? process.env.CODEXFLOW_BASH_MODE),
261
+ bashTranscript: bashTranscriptFrom(bashTranscriptArg ?? process.env.CODEXFLOW_BASH_TRANSCRIPT),
262
+ bashSessionId,
263
+ requireBashSession,
264
+ codexSessions: codexSessionsFrom(codexSessionsArg ?? process.env.CODEXFLOW_CODEX_SESSIONS),
265
+ codexDir: expandHome(codexDirArg || process.env.CODEXFLOW_CODEX_DIR || path.join(os.homedir(), ".codex")),
266
+ writeMode: writeModeFrom(writeArg ?? process.env.CODEXFLOW_WRITE_MODE),
267
+ toolMode: toolModeFrom(toolModeArg ?? process.env.CODEXFLOW_TOOL_MODE),
268
+ inheritEnv: process.env.CODEXFLOW_INHERIT_ENV === "1",
269
+ maxReadBytes: numberFrom(process.env.CODEXFLOW_MAX_READ_BYTES, 180_000, 4_000, 2_000_000),
270
+ maxWriteBytes: numberFrom(process.env.CODEXFLOW_MAX_WRITE_BYTES, 1_000_000, 1_000, 10_000_000),
271
+ maxOutputBytes: numberFrom(process.env.CODEXFLOW_MAX_OUTPUT_BYTES, 120_000, 4_000, 2_000_000),
272
+ maxSearchResults: numberFrom(process.env.CODEXFLOW_MAX_SEARCH_RESULTS, 200, 5, 2_000),
273
+ maxHttpSessions: numberFrom(process.env.CODEXFLOW_MAX_HTTP_SESSIONS, 64, 1, 512),
274
+ httpSessionTtlMs: numberFrom(process.env.CODEXFLOW_HTTP_SESSION_TTL_MS, 30 * 60_000, 60_000, 24 * 60 * 60_000),
275
+ blockedGlobs: [...DEFAULT_BLOCKED_GLOBS, ...extraBlockedGlobs],
276
+ contextDir: contextDirFrom(process.env.CODEXFLOW_CONTEXT_DIR),
277
+ toolCards: boolFrom(toolCardsArg ?? process.env.CODEXFLOW_TOOL_CARDS, false),
278
+ connectionTest: boolFrom(process.env.CODEXFLOW_CONNECTION_TEST, false),
279
+ analysisEnabled: boolFrom(process.env.CODEXFLOW_ANALYSIS, true),
280
+ analysisLimits: {
281
+ maxInventoryFiles: numberFrom(process.env.CODEXFLOW_ANALYSIS_MAX_INVENTORY_FILES, DEFAULT_ANALYSIS_LIMITS.maxInventoryFiles, 100, 100_000),
282
+ maxAnalyzedFiles: numberFrom(process.env.CODEXFLOW_ANALYSIS_MAX_ANALYZED_FILES, DEFAULT_ANALYSIS_LIMITS.maxAnalyzedFiles, 10, 50_000),
283
+ maxScannedBytes: numberFrom(process.env.CODEXFLOW_ANALYSIS_MAX_SCANNED_BYTES, DEFAULT_ANALYSIS_LIMITS.maxScannedBytes, 1_000_000, 512 * 1024 * 1024),
284
+ maxSymbols: numberFrom(process.env.CODEXFLOW_ANALYSIS_MAX_SYMBOLS, DEFAULT_ANALYSIS_LIMITS.maxSymbols, 100, 1_000_000),
285
+ maxRelationships: numberFrom(process.env.CODEXFLOW_ANALYSIS_MAX_RELATIONSHIPS, DEFAULT_ANALYSIS_LIMITS.maxRelationships, 100, 2_000_000)
286
+ }
287
+ };
288
+ }
289
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/fsOps.js ADDED
@@ -0,0 +1,286 @@
1
+ import fs from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { createHash } from "node:crypto";
5
+ import { minimatch } from "minimatch";
6
+ import { CodexFlowError, displayPath, normalizeRelPath } from "./guard.js";
7
+ import { hasSecretValue, redactSensitiveText } from "./redact.js";
8
+ export function sha256(text) {
9
+ return createHash("sha256").update(text).digest("hex");
10
+ }
11
+ // ponytail: bounded scan window covers normal source files over the read cap; add a separate knob only if real repos need larger files.
12
+ export function textScanByteLimit(config) {
13
+ return Math.min(2_000_000, config.maxReadBytes * 4);
14
+ }
15
+ function splitLines(text) {
16
+ return text.replace(/\r\n/g, "\n").split("\n");
17
+ }
18
+ function withLineNumbers(lines, startLine) {
19
+ const width = String(startLine + lines.length - 1).length;
20
+ return lines.map((line, idx) => `${String(startLine + idx).padStart(width, " ")} | ${line}`).join("\n");
21
+ }
22
+ export function makeUnifiedDiff(oldText, newText, relPath, maxChars = 60_000) {
23
+ if (oldText === newText) {
24
+ return { diff: `No changes in ${relPath}.`, additions: 0, deletions: 0, changed: false };
25
+ }
26
+ const oldLines = splitLines(oldText);
27
+ const newLines = splitLines(newText);
28
+ let prefix = 0;
29
+ while (prefix < oldLines.length && prefix < newLines.length && oldLines[prefix] === newLines[prefix]) {
30
+ prefix += 1;
31
+ }
32
+ let suffix = 0;
33
+ while (suffix < oldLines.length - prefix &&
34
+ suffix < newLines.length - prefix &&
35
+ oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) {
36
+ suffix += 1;
37
+ }
38
+ const coreOldStart = prefix;
39
+ const coreOldEnd = oldLines.length - suffix;
40
+ const coreNewStart = prefix;
41
+ const coreNewEnd = newLines.length - suffix;
42
+ const context = 3;
43
+ const oldStart = Math.max(0, coreOldStart - context);
44
+ const oldEnd = Math.min(oldLines.length, coreOldEnd + context);
45
+ const newStart = Math.max(0, coreNewStart - context);
46
+ const newEnd = Math.min(newLines.length, coreNewEnd + context);
47
+ const additions = Math.max(0, coreNewEnd - coreNewStart);
48
+ const deletions = Math.max(0, coreOldEnd - coreOldStart);
49
+ const out = [`--- a/${relPath}`, `+++ b/${relPath}`, `@@ -${oldStart + 1},${oldEnd - oldStart} +${newStart + 1},${newEnd - newStart} @@`];
50
+ for (let i = oldStart; i < coreOldStart; i += 1)
51
+ out.push(` ${oldLines[i]}`);
52
+ for (let i = coreOldStart; i < coreOldEnd; i += 1)
53
+ out.push(`-${oldLines[i]}`);
54
+ for (let i = coreNewStart; i < coreNewEnd; i += 1)
55
+ out.push(`+${newLines[i]}`);
56
+ for (let i = coreOldEnd; i < oldEnd; i += 1)
57
+ out.push(` ${oldLines[i]}`);
58
+ let diff = out.join("\n");
59
+ if (diff.length > maxChars) {
60
+ diff = diff.slice(0, maxChars) + `\n...[diff truncated to ${maxChars} chars]`;
61
+ }
62
+ return { diff: redactSensitiveText(diff), additions, deletions, changed: true };
63
+ }
64
+ function isHiddenName(name) {
65
+ return name.startsWith(".") && name !== "." && name !== "..";
66
+ }
67
+ export async function repoTree(config, guard, workspace, options) {
68
+ const target = guard.resolve(workspace, options.path ?? ".");
69
+ const stat = await fsp.stat(target.absPath);
70
+ if (!stat.isDirectory()) {
71
+ throw new CodexFlowError(`Not a directory: ${target.relPath}`);
72
+ }
73
+ const lines = [target.relPath === "." ? "." : `${target.relPath}/`];
74
+ let entries = 0;
75
+ let truncated = false;
76
+ async function walk(absDir, relDir, depth, prefix) {
77
+ if (depth >= options.maxDepth || truncated)
78
+ return;
79
+ let dirents = await fsp.readdir(absDir, { withFileTypes: true });
80
+ dirents = dirents
81
+ .filter((entry) => options.includeHidden || !isHiddenName(entry.name))
82
+ .filter((entry) => !guard.isBlockedRelativePath(normalizeRelPath(path.join(relDir, entry.name))))
83
+ .sort((a, b) => {
84
+ if (a.isDirectory() && !b.isDirectory())
85
+ return -1;
86
+ if (!a.isDirectory() && b.isDirectory())
87
+ return 1;
88
+ return a.name.localeCompare(b.name);
89
+ });
90
+ for (let i = 0; i < dirents.length; i += 1) {
91
+ if (entries >= options.maxEntries) {
92
+ truncated = true;
93
+ return;
94
+ }
95
+ const entry = dirents[i];
96
+ const isLast = i === dirents.length - 1;
97
+ const branch = isLast ? "└── " : "├── ";
98
+ const childPrefix = prefix + (isLast ? " " : "│ ");
99
+ const childAbs = path.join(absDir, entry.name);
100
+ const childRel = normalizeRelPath(path.join(relDir, entry.name));
101
+ const displayName = entry.isDirectory() ? `${entry.name}/` : entry.name;
102
+ lines.push(`${prefix}${branch}${displayName}`);
103
+ entries += 1;
104
+ if (entry.isDirectory()) {
105
+ await walk(childAbs, childRel, depth + 1, childPrefix);
106
+ }
107
+ if (truncated)
108
+ return;
109
+ }
110
+ }
111
+ await walk(target.absPath, target.relPath === "." ? "" : target.relPath, 0, "");
112
+ if (truncated)
113
+ lines.push(`...[tree truncated after ${entries} entries]`);
114
+ return { text: lines.join("\n"), entries, truncated };
115
+ }
116
+ export async function listFiles(guard, workspace, options) {
117
+ const target = guard.resolve(workspace, options.root ?? ".");
118
+ const stat = await fsp.stat(target.absPath);
119
+ const files = [];
120
+ async function addFile(absFile) {
121
+ const rel = displayPath(absFile, workspace.root);
122
+ if (guard.isBlockedRelativePath(rel))
123
+ return;
124
+ if (!options.includeHidden && rel.split("/").some(isHiddenName))
125
+ return;
126
+ if (options.glob && !minimatch(rel, options.glob, { dot: true }))
127
+ return;
128
+ files.push(rel);
129
+ }
130
+ async function walk(absDir) {
131
+ if (files.length >= options.maxFiles)
132
+ return;
133
+ let entries;
134
+ try {
135
+ entries = await fsp.readdir(absDir, { withFileTypes: true });
136
+ }
137
+ catch {
138
+ return;
139
+ }
140
+ entries.sort((a, b) => a.name.localeCompare(b.name));
141
+ for (const entry of entries) {
142
+ if (files.length >= options.maxFiles)
143
+ return;
144
+ const abs = path.join(absDir, entry.name);
145
+ const rel = displayPath(abs, workspace.root);
146
+ if (guard.isBlockedRelativePath(rel))
147
+ continue;
148
+ if (!options.includeHidden && rel.split("/").some(isHiddenName))
149
+ continue;
150
+ if (entry.isDirectory())
151
+ await walk(abs);
152
+ else if (entry.isFile())
153
+ await addFile(abs);
154
+ }
155
+ }
156
+ if (stat.isFile())
157
+ await addFile(target.absPath);
158
+ else
159
+ await walk(target.absPath);
160
+ return files;
161
+ }
162
+ export async function readTextFile(config, guard, workspace, filePath, options = {}) {
163
+ const resolved = guard.resolve(workspace, filePath);
164
+ const maxBytes = Math.min(options.maxBytes ?? config.maxReadBytes, config.maxReadBytes);
165
+ const hasRange = options.startLine !== undefined || options.endLine !== undefined;
166
+ await guard.assertTextFile(resolved.absPath, hasRange ? textScanByteLimit(config) : maxBytes);
167
+ const buffer = await fsp.readFile(resolved.absPath);
168
+ const text = buffer.toString("utf8");
169
+ const allLines = splitLines(text);
170
+ const totalLines = allLines.length;
171
+ const startLine = Math.max(1, Math.floor(options.startLine ?? 1));
172
+ const endLine = Math.min(totalLines, Math.floor(options.endLine ?? totalLines));
173
+ if (endLine < startLine) {
174
+ throw new CodexFlowError(`end_line (${endLine}) must be >= start_line (${startLine}).`);
175
+ }
176
+ const selected = allLines.slice(startLine - 1, endLine);
177
+ const numbered = withLineNumbers(selected, startLine);
178
+ if (hasRange && Buffer.byteLength(numbered, "utf8") > maxBytes) {
179
+ throw new CodexFlowError(`Selected line range is too large. Limit: ${maxBytes} bytes.`);
180
+ }
181
+ const truncated = startLine > 1 || endLine < totalLines;
182
+ return {
183
+ path: resolved.relPath,
184
+ text: numbered,
185
+ startLine,
186
+ endLine,
187
+ totalLines,
188
+ bytes: buffer.byteLength,
189
+ sha256: sha256(text),
190
+ truncated
191
+ };
192
+ }
193
+ export async function writeTextFile(config, guard, workspace, filePath, content, options = {}) {
194
+ const resolved = guard.resolve(workspace, filePath, { forWrite: true });
195
+ const contentBytes = Buffer.byteLength(content, "utf8");
196
+ if (contentBytes > config.maxWriteBytes) {
197
+ throw new CodexFlowError(`Write content is too large (${contentBytes} bytes). Limit: ${config.maxWriteBytes} bytes.`);
198
+ }
199
+ if (hasSecretValue(content)) {
200
+ throw new CodexFlowError("Secret-looking content is blocked from write. Use placeholders such as [REDACTED_SECRET] in handoff files.");
201
+ }
202
+ let oldText = "";
203
+ let existed = false;
204
+ try {
205
+ await guard.assertTextFile(resolved.absPath, Math.max(config.maxWriteBytes, config.maxReadBytes));
206
+ oldText = await fsp.readFile(resolved.absPath, "utf8");
207
+ existed = true;
208
+ }
209
+ catch (error) {
210
+ if (error instanceof CodexFlowError && error.message.startsWith("Not a file"))
211
+ throw error;
212
+ if (fs.existsSync(resolved.absPath))
213
+ throw error;
214
+ }
215
+ if (existed && options.overwrite === false) {
216
+ throw new CodexFlowError(`File already exists and overwrite=false: ${resolved.relPath}`);
217
+ }
218
+ if (options.createDirs) {
219
+ await fsp.mkdir(path.dirname(resolved.absPath), { recursive: true });
220
+ }
221
+ const diff = makeUnifiedDiff(oldText, content, resolved.relPath);
222
+ await fsp.writeFile(resolved.absPath, content, "utf8");
223
+ return { path: resolved.relPath, bytes: contentBytes, sha256: sha256(content), existed, diff };
224
+ }
225
+ export async function editTextFile(config, guard, workspace, filePath, oldText, newText, options = {}) {
226
+ if (!oldText)
227
+ throw new CodexFlowError("old_text must not be empty.");
228
+ const resolved = guard.resolve(workspace, filePath, { forWrite: true });
229
+ await guard.assertTextFile(resolved.absPath, Math.max(config.maxWriteBytes, config.maxReadBytes));
230
+ const before = await fsp.readFile(resolved.absPath, "utf8");
231
+ const occurrences = before.split(oldText).length - 1;
232
+ if (occurrences === 0) {
233
+ throw new CodexFlowError(`old_text was not found in ${resolved.relPath}. Read the file and retry with an exact snippet.`);
234
+ }
235
+ let replacements;
236
+ let after;
237
+ if (options.replaceAll) {
238
+ after = before.split(oldText).join(newText);
239
+ replacements = occurrences;
240
+ }
241
+ else {
242
+ if (occurrences !== 1) {
243
+ throw new CodexFlowError(`old_text matched ${occurrences} times. Provide a more specific old_text or set replace_all=true.`);
244
+ }
245
+ after = before.replace(oldText, newText);
246
+ replacements = 1;
247
+ }
248
+ if (typeof options.expectedReplacements === "number" && replacements !== options.expectedReplacements) {
249
+ throw new CodexFlowError(`Expected ${options.expectedReplacements} replacements but would perform ${replacements}.`);
250
+ }
251
+ const afterBytes = Buffer.byteLength(after, "utf8");
252
+ if (afterBytes > config.maxWriteBytes) {
253
+ throw new CodexFlowError(`Edited file would be too large (${afterBytes} bytes). Limit: ${config.maxWriteBytes} bytes.`);
254
+ }
255
+ if (hasSecretValue(after)) {
256
+ throw new CodexFlowError("Secret-looking content is blocked from edit. Use placeholders such as [REDACTED_SECRET] in handoff files.");
257
+ }
258
+ const diff = makeUnifiedDiff(before, after, resolved.relPath);
259
+ await fsp.writeFile(resolved.absPath, after, "utf8");
260
+ return { path: resolved.relPath, replacements, bytes: afterBytes, sha256: sha256(after), diff };
261
+ }
262
+ export async function ensureAiBridge(config, guard, workspace) {
263
+ const files = {
264
+ "README.md": `# AI Bridge\n\nShared planning context for ChatGPT, other planning models, Codex, OpenCode, Pi, or another local implementation agent.\n\n- current-plan.md: plan produced by ChatGPT or another planning model for the implementation agent.\n- agent-status.md: generic implementation notes, touched files, test results, blockers, and review notes.\n- implementation-diff.patch: final review diff from the implementation agent when practical.\n- codex-status.md: legacy Codex-specific status file, kept for existing workflows.\n- decisions.md: architectural decisions that should remain stable.\n- open-questions.md: unresolved questions.\n- execution-log.jsonl: append-only generic agent handoff and execution events.\n- handoff-run-state.json: machine-readable run lifecycle (running/completed/failed/timed_out) written by execute-handoff/watch-handoff/loop-handoff and polled by the read-only wait_for_handoff tool.\n- session-log.jsonl: append-only legacy session events.\n`,
265
+ "current-plan.md": "# Current Plan\n\nNo plan written yet.\n",
266
+ "agent-status.md": "# Agent Status\n\nNo implementation agent status written yet.\n",
267
+ "implementation-diff.patch": "",
268
+ "codex-status.md": "# Codex Status\n\nNo Codex status written yet.\n",
269
+ "decisions.md": "# Decisions\n\n",
270
+ "open-questions.md": "# Open Questions\n\n",
271
+ "execution-log.jsonl": "",
272
+ "session-log.jsonl": ""
273
+ };
274
+ const created = [];
275
+ for (const [name, content] of Object.entries(files)) {
276
+ const rel = `${config.contextDir}/${name}`;
277
+ const resolved = guard.resolve(workspace, rel, { forWrite: true });
278
+ if (!fs.existsSync(resolved.absPath)) {
279
+ await fsp.mkdir(path.dirname(resolved.absPath), { recursive: true });
280
+ await fsp.writeFile(resolved.absPath, content, "utf8");
281
+ created.push(rel);
282
+ }
283
+ }
284
+ return created;
285
+ }
286
+ //# sourceMappingURL=fsOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsOps.js","sourceRoot":"","sources":["../src/fsOps.ts"],"names":[],"mappings":"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"}