localptp 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 (186) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +159 -0
  3. package/dist/cli.d.ts +24 -0
  4. package/dist/cli.js +344 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/config.d.ts +14 -0
  7. package/dist/commands/config.js +65 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/context.d.ts +12 -0
  10. package/dist/commands/context.js +176 -0
  11. package/dist/commands/context.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +16 -0
  13. package/dist/commands/doctor.js +54 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/index.d.ts +13 -0
  16. package/dist/commands/index.js +70 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/init.d.ts +15 -0
  19. package/dist/commands/init.js +46 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/plan.d.ts +17 -0
  22. package/dist/commands/plan.js +170 -0
  23. package/dist/commands/plan.js.map +1 -0
  24. package/dist/commands/resume.d.ts +17 -0
  25. package/dist/commands/resume.js +75 -0
  26. package/dist/commands/resume.js.map +1 -0
  27. package/dist/commands/review.d.ts +17 -0
  28. package/dist/commands/review.js +67 -0
  29. package/dist/commands/review.js.map +1 -0
  30. package/dist/commands/run.d.ts +24 -0
  31. package/dist/commands/run.js +65 -0
  32. package/dist/commands/run.js.map +1 -0
  33. package/dist/commands/step.d.ts +44 -0
  34. package/dist/commands/step.js +50 -0
  35. package/dist/commands/step.js.map +1 -0
  36. package/dist/commands/summarize.d.ts +17 -0
  37. package/dist/commands/summarize.js +276 -0
  38. package/dist/commands/summarize.js.map +1 -0
  39. package/dist/commands/task.d.ts +13 -0
  40. package/dist/commands/task.js +53 -0
  41. package/dist/commands/task.js.map +1 -0
  42. package/dist/core/activePointer.d.ts +28 -0
  43. package/dist/core/activePointer.js +84 -0
  44. package/dist/core/activePointer.js.map +1 -0
  45. package/dist/core/approval.d.ts +12 -0
  46. package/dist/core/approval.js +34 -0
  47. package/dist/core/approval.js.map +1 -0
  48. package/dist/core/configManager.d.ts +32 -0
  49. package/dist/core/configManager.js +177 -0
  50. package/dist/core/configManager.js.map +1 -0
  51. package/dist/core/contextBuilder.d.ts +40 -0
  52. package/dist/core/contextBuilder.js +406 -0
  53. package/dist/core/contextBuilder.js.map +1 -0
  54. package/dist/core/memoryLoader.d.ts +4 -0
  55. package/dist/core/memoryLoader.js +35 -0
  56. package/dist/core/memoryLoader.js.map +1 -0
  57. package/dist/core/memoryManager.d.ts +41 -0
  58. package/dist/core/memoryManager.js +181 -0
  59. package/dist/core/memoryManager.js.map +1 -0
  60. package/dist/core/memoryPolicy.d.ts +23 -0
  61. package/dist/core/memoryPolicy.js +73 -0
  62. package/dist/core/memoryPolicy.js.map +1 -0
  63. package/dist/core/modelClient.d.ts +37 -0
  64. package/dist/core/modelClient.js +160 -0
  65. package/dist/core/modelClient.js.map +1 -0
  66. package/dist/core/patchManager.d.ts +89 -0
  67. package/dist/core/patchManager.js +801 -0
  68. package/dist/core/patchManager.js.map +1 -0
  69. package/dist/core/plannerJson.d.ts +23 -0
  70. package/dist/core/plannerJson.js +118 -0
  71. package/dist/core/plannerJson.js.map +1 -0
  72. package/dist/core/promptManager.d.ts +16 -0
  73. package/dist/core/promptManager.js +35 -0
  74. package/dist/core/promptManager.js.map +1 -0
  75. package/dist/core/prompts.d.ts +8 -0
  76. package/dist/core/prompts.js +18 -0
  77. package/dist/core/prompts.js.map +1 -0
  78. package/dist/core/repoIndexer.d.ts +21 -0
  79. package/dist/core/repoIndexer.js +557 -0
  80. package/dist/core/repoIndexer.js.map +1 -0
  81. package/dist/core/reviewEngine.d.ts +53 -0
  82. package/dist/core/reviewEngine.js +229 -0
  83. package/dist/core/reviewEngine.js.map +1 -0
  84. package/dist/core/runLoop.d.ts +26 -0
  85. package/dist/core/runLoop.js +103 -0
  86. package/dist/core/runLoop.js.map +1 -0
  87. package/dist/core/runStep.d.ts +42 -0
  88. package/dist/core/runStep.js +586 -0
  89. package/dist/core/runStep.js.map +1 -0
  90. package/dist/core/safetyManager.d.ts +7 -0
  91. package/dist/core/safetyManager.js +202 -0
  92. package/dist/core/safetyManager.js.map +1 -0
  93. package/dist/core/sessionManager.d.ts +35 -0
  94. package/dist/core/sessionManager.js +265 -0
  95. package/dist/core/sessionManager.js.map +1 -0
  96. package/dist/core/stopConditions.d.ts +24 -0
  97. package/dist/core/stopConditions.js +18 -0
  98. package/dist/core/stopConditions.js.map +1 -0
  99. package/dist/core/taskManager.d.ts +26 -0
  100. package/dist/core/taskManager.js +312 -0
  101. package/dist/core/taskManager.js.map +1 -0
  102. package/dist/core/testRunner.d.ts +27 -0
  103. package/dist/core/testRunner.js +71 -0
  104. package/dist/core/testRunner.js.map +1 -0
  105. package/dist/prompts/coder.d.ts +3 -0
  106. package/dist/prompts/coder.js +46 -0
  107. package/dist/prompts/coder.js.map +1 -0
  108. package/dist/prompts/planner.d.ts +3 -0
  109. package/dist/prompts/planner.js +44 -0
  110. package/dist/prompts/planner.js.map +1 -0
  111. package/dist/prompts/reviewer.d.ts +3 -0
  112. package/dist/prompts/reviewer.js +41 -0
  113. package/dist/prompts/reviewer.js.map +1 -0
  114. package/dist/prompts/summarizer.d.ts +3 -0
  115. package/dist/prompts/summarizer.js +65 -0
  116. package/dist/prompts/summarizer.js.map +1 -0
  117. package/dist/prompts/testFixer.d.ts +3 -0
  118. package/dist/prompts/testFixer.js +33 -0
  119. package/dist/prompts/testFixer.js.map +1 -0
  120. package/dist/repl/approver.d.ts +15 -0
  121. package/dist/repl/approver.js +21 -0
  122. package/dist/repl/approver.js.map +1 -0
  123. package/dist/repl/dispatch.d.ts +48 -0
  124. package/dist/repl/dispatch.js +164 -0
  125. package/dist/repl/dispatch.js.map +1 -0
  126. package/dist/repl/loop.d.ts +14 -0
  127. package/dist/repl/loop.js +124 -0
  128. package/dist/repl/loop.js.map +1 -0
  129. package/dist/repl/tokenize.d.ts +13 -0
  130. package/dist/repl/tokenize.js +56 -0
  131. package/dist/repl/tokenize.js.map +1 -0
  132. package/dist/templates/memory.d.ts +13 -0
  133. package/dist/templates/memory.js +32 -0
  134. package/dist/templates/memory.js.map +1 -0
  135. package/dist/types/config.d.ts +235 -0
  136. package/dist/types/config.js +66 -0
  137. package/dist/types/config.js.map +1 -0
  138. package/dist/types/context.d.ts +78 -0
  139. package/dist/types/context.js +141 -0
  140. package/dist/types/context.js.map +1 -0
  141. package/dist/types/index.d.ts +117 -0
  142. package/dist/types/index.js +24 -0
  143. package/dist/types/index.js.map +1 -0
  144. package/dist/types/model.d.ts +35 -0
  145. package/dist/types/model.js +16 -0
  146. package/dist/types/model.js.map +1 -0
  147. package/dist/types/patch.d.ts +38 -0
  148. package/dist/types/patch.js +11 -0
  149. package/dist/types/patch.js.map +1 -0
  150. package/dist/types/plan.d.ts +86 -0
  151. package/dist/types/plan.js +27 -0
  152. package/dist/types/plan.js.map +1 -0
  153. package/dist/types/review.d.ts +33 -0
  154. package/dist/types/review.js +24 -0
  155. package/dist/types/review.js.map +1 -0
  156. package/dist/types/run.d.ts +34 -0
  157. package/dist/types/run.js +2 -0
  158. package/dist/types/run.js.map +1 -0
  159. package/dist/types/session.d.ts +21 -0
  160. package/dist/types/session.js +2 -0
  161. package/dist/types/session.js.map +1 -0
  162. package/dist/types/summary.d.ts +65 -0
  163. package/dist/types/summary.js +26 -0
  164. package/dist/types/summary.js.map +1 -0
  165. package/dist/types/task.d.ts +31 -0
  166. package/dist/types/task.js +10 -0
  167. package/dist/types/task.js.map +1 -0
  168. package/dist/types/test.d.ts +16 -0
  169. package/dist/types/test.js +2 -0
  170. package/dist/types/test.js.map +1 -0
  171. package/dist/utils/fs.d.ts +13 -0
  172. package/dist/utils/fs.js +65 -0
  173. package/dist/utils/fs.js.map +1 -0
  174. package/dist/utils/gitRoot.d.ts +5 -0
  175. package/dist/utils/gitRoot.js +21 -0
  176. package/dist/utils/gitRoot.js.map +1 -0
  177. package/dist/utils/logger.d.ts +15 -0
  178. package/dist/utils/logger.js +60 -0
  179. package/dist/utils/logger.js.map +1 -0
  180. package/dist/utils/paths.d.ts +13 -0
  181. package/dist/utils/paths.js +24 -0
  182. package/dist/utils/paths.js.map +1 -0
  183. package/dist/utils/tokenEstimate.d.ts +5 -0
  184. package/dist/utils/tokenEstimate.js +8 -0
  185. package/dist/utils/tokenEstimate.js.map +1 -0
  186. package/package.json +44 -0
@@ -0,0 +1,557 @@
1
+ /**
2
+ * Repo Indexer (HLD-SRD §3.3, §16.2).
3
+ *
4
+ * buildIndex — directory walk with layered ignore, per-file metadata, import/export extraction.
5
+ * Heuristics only (no model call, no AST).
6
+ */
7
+ import { promises as fs } from "node:fs";
8
+ import path from "node:path";
9
+ import { simpleGit } from "simple-git";
10
+ import { repoIndexSchema } from "../types/index.js";
11
+ // ---------------------------------------------------------------------------
12
+ // Extension → language map
13
+ // ---------------------------------------------------------------------------
14
+ const EXT_LANGUAGE_MAP = {
15
+ ".ts": "typescript",
16
+ ".tsx": "typescript",
17
+ ".mts": "typescript",
18
+ ".cts": "typescript",
19
+ ".js": "javascript",
20
+ ".jsx": "javascript",
21
+ ".mjs": "javascript",
22
+ ".cjs": "javascript",
23
+ ".py": "python",
24
+ ".pyi": "python",
25
+ ".md": "markdown",
26
+ ".json": "json",
27
+ ".yml": "yaml",
28
+ ".yaml": "yaml",
29
+ ".toml": "toml",
30
+ ".sh": "shell",
31
+ ".bash": "shell",
32
+ ".zsh": "shell",
33
+ ".fish": "shell",
34
+ ".rs": "rust",
35
+ ".go": "go",
36
+ ".java": "java",
37
+ ".kt": "kotlin",
38
+ ".rb": "ruby",
39
+ ".php": "php",
40
+ ".cs": "csharp",
41
+ ".cpp": "cpp",
42
+ ".cc": "cpp",
43
+ ".cxx": "cpp",
44
+ ".c": "c",
45
+ ".h": "c",
46
+ ".hpp": "cpp",
47
+ ".html": "html",
48
+ ".htm": "html",
49
+ ".css": "css",
50
+ ".scss": "scss",
51
+ ".sass": "sass",
52
+ ".less": "less",
53
+ ".sql": "sql",
54
+ ".r": "r",
55
+ ".swift": "swift",
56
+ ".dart": "dart",
57
+ ".lua": "lua",
58
+ ".pl": "perl",
59
+ ".pm": "perl",
60
+ ".ex": "elixir",
61
+ ".exs": "elixir",
62
+ ".erl": "erlang",
63
+ ".hrl": "erlang",
64
+ ".hs": "haskell",
65
+ ".lhs": "haskell",
66
+ ".scala": "scala",
67
+ ".clj": "clojure",
68
+ ".cljs": "clojure",
69
+ ".tf": "terraform",
70
+ ".tfvars": "terraform",
71
+ ".proto": "protobuf",
72
+ ".graphql": "graphql",
73
+ ".gql": "graphql",
74
+ ".xml": "xml",
75
+ ".svg": "xml",
76
+ ".txt": "text",
77
+ ".csv": "csv",
78
+ ".env": "dotenv",
79
+ };
80
+ export const KNOWN_BINARY_EXT = new Set([
81
+ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".ico", ".webp", ".tiff", ".tif",
82
+ ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".odt", ".ods",
83
+ ".zip", ".tar", ".gz", ".bz2", ".xz", ".7z", ".rar", ".tgz",
84
+ ".mp3", ".mp4", ".wav", ".ogg", ".flac", ".aac", ".m4a", ".m4v",
85
+ ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm",
86
+ ".exe", ".dll", ".so", ".dylib", ".lib", ".a", ".o", ".wasm",
87
+ ".bin", ".dat", ".db", ".sqlite", ".sqlite3",
88
+ ".ttf", ".otf", ".woff", ".woff2", ".eot",
89
+ ".class", ".jar", ".pyc", ".pyo",
90
+ ]);
91
+ export function detectLanguage(ext) {
92
+ if (!ext)
93
+ return "unknown";
94
+ return EXT_LANGUAGE_MAP[ext.toLowerCase()] ?? "unknown";
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Path heuristics
98
+ // ---------------------------------------------------------------------------
99
+ export function isTestPath(rel) {
100
+ const posix = rel.replace(/\\/g, "/");
101
+ // *.test.* or *.spec.*
102
+ if (/\.(test|spec)\.[^/]+$/.test(posix))
103
+ return true;
104
+ // __tests__/ anywhere in path
105
+ if (/(^|\/)__tests__\//.test(posix))
106
+ return true;
107
+ // /tests/ as a directory segment (not just "tests" as suffix of another word)
108
+ if (/(^|\/)tests\//.test(posix))
109
+ return true;
110
+ return false;
111
+ }
112
+ const CONFIG_NAMES = new Set([
113
+ "tsconfig.json", "tsconfig.base.json", "tsconfig.build.json",
114
+ "jsconfig.json",
115
+ ".eslintrc", ".eslintrc.js", ".eslintrc.cjs", ".eslintrc.yaml", ".eslintrc.yml", ".eslintrc.json",
116
+ ".prettierrc", ".prettierrc.js", ".prettierrc.cjs", ".prettierrc.yaml", ".prettierrc.yml", ".prettierrc.json",
117
+ ".babelrc", ".babelrc.js", ".babelrc.cjs",
118
+ ".stylelintrc",
119
+ ".editorconfig", ".gitignore", ".gitattributes", ".npmignore", ".npmrc", ".nvmrc",
120
+ "package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock",
121
+ "Makefile", "Dockerfile", ".dockerignore",
122
+ "jest.config.js", "jest.config.ts", "jest.config.cjs", "jest.config.mjs",
123
+ "vitest.config.ts", "vitest.config.js", "vitest.config.mts",
124
+ "webpack.config.js", "webpack.config.ts",
125
+ "rollup.config.js", "rollup.config.ts", "rollup.config.mjs",
126
+ "babel.config.js", "babel.config.cjs", "babel.config.mjs",
127
+ "postcss.config.js", "postcss.config.cjs",
128
+ "tailwind.config.js", "tailwind.config.ts",
129
+ "next.config.js", "next.config.ts", "next.config.mjs",
130
+ "vite.config.js", "vite.config.ts", "vite.config.mts",
131
+ "svelte.config.js",
132
+ "astro.config.mjs",
133
+ "nuxt.config.ts", "nuxt.config.js",
134
+ "remix.config.js",
135
+ "vercel.json", "netlify.toml", "fly.toml",
136
+ ".travis.yml", ".circleci",
137
+ "pyproject.toml", "setup.py", "setup.cfg", "requirements.txt",
138
+ "Cargo.toml", "Cargo.lock",
139
+ "go.mod", "go.sum",
140
+ "Gemfile", "Gemfile.lock",
141
+ ]);
142
+ const CONFIG_FILENAME_PATTERNS = [
143
+ /^\..*rc$/, // .eslintrc, .prettierrc, .babelrc, etc.
144
+ /\.config\.[^/]+$/, // *.config.ts, *.config.js, etc.
145
+ ];
146
+ const ROOT_ONLY_EXTENSIONS = new Set([".yml", ".yaml"]);
147
+ export function isConfigPath(rel) {
148
+ const posix = rel.replace(/\\/g, "/");
149
+ const basename = posix.split("/").pop() ?? posix;
150
+ const isRoot = !posix.includes("/");
151
+ // Named config files — always config regardless of depth
152
+ if (CONFIG_NAMES.has(basename))
153
+ return true;
154
+ // Pattern-based: *.config.* or .XXXrc
155
+ for (const pattern of CONFIG_FILENAME_PATTERNS) {
156
+ if (pattern.test(basename))
157
+ return true;
158
+ }
159
+ // Root-only extensions: .yml/.yaml at repo root only
160
+ const ext = path.extname(basename).toLowerCase();
161
+ if (ROOT_ONLY_EXTENSIONS.has(ext) && isRoot)
162
+ return true;
163
+ return false;
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Binary detection
167
+ // ---------------------------------------------------------------------------
168
+ const MAX_SNIFF_BYTES = 8192;
169
+ export function isBinary(ext, head) {
170
+ if (ext && KNOWN_BINARY_EXT.has(ext.toLowerCase()))
171
+ return true;
172
+ // NUL byte sniff
173
+ for (let i = 0; i < Math.min(head.length, MAX_SNIFF_BYTES); i++) {
174
+ if (head[i] === 0)
175
+ return true;
176
+ }
177
+ return false;
178
+ }
179
+ // ---------------------------------------------------------------------------
180
+ // Import / export extraction
181
+ // ---------------------------------------------------------------------------
182
+ const MAX_PARSE_SIZE = 1024 * 1024; // 1 MB
183
+ function dedup(arr) {
184
+ const seen = new Set();
185
+ const out = [];
186
+ for (const s of arr) {
187
+ if (!seen.has(s)) {
188
+ seen.add(s);
189
+ out.push(s);
190
+ }
191
+ }
192
+ return out;
193
+ }
194
+ const TS_IMPORT_REGEXES = [
195
+ /^\s*import\s+.*?from\s+['"]([^'"]+)['"]/, // import x from '...'
196
+ /^\s*import\s+['"]([^'"]+)['"]/, // import '...' (side-effect)
197
+ ];
198
+ const REQUIRE_REGEX = /require\(\s*['"]([^'"]+)['"]\s*\)/g;
199
+ const DYNAMIC_IMPORT_REGEX = /\bimport\(\s*['"]([^'"]+)['"]\s*\)/g;
200
+ const TS_EXPORT_DECLARED_REGEX = /^\s*export\s+(?:default\s+)?(?:abstract\s+)?(?:const|function|class|let|var|interface|type|enum)\s+([A-Za-z0-9_$]+)/;
201
+ // Named export list WITHOUT a `from` clause: export { A, B };
202
+ // Allows an optional `type` modifier on the whole list (`export type { A }`),
203
+ // which is stripped so the captured names are clean symbol names.
204
+ const TS_EXPORT_LIST_REGEX = /^\s*export\s+(?:type\s+)?\{([^}]+)\}\s*;?\s*$/;
205
+ export function extractImports(text, lang) {
206
+ if (lang !== "typescript" && lang !== "javascript" && lang !== "python")
207
+ return [];
208
+ if (text.length > MAX_PARSE_SIZE)
209
+ return [];
210
+ const specifiers = [];
211
+ if (lang === "typescript" || lang === "javascript") {
212
+ for (const line of text.split("\n")) {
213
+ for (const re of TS_IMPORT_REGEXES) {
214
+ const m = re.exec(line);
215
+ if (m) {
216
+ specifiers.push(m[1]);
217
+ break;
218
+ }
219
+ }
220
+ }
221
+ // require() and dynamic import() — multi-match per line
222
+ let m;
223
+ const reqRe = new RegExp(REQUIRE_REGEX.source, "g");
224
+ while ((m = reqRe.exec(text)) !== null) {
225
+ specifiers.push(m[1]);
226
+ }
227
+ const dynRe = new RegExp(DYNAMIC_IMPORT_REGEX.source, "g");
228
+ while ((m = dynRe.exec(text)) !== null) {
229
+ specifiers.push(m[1]);
230
+ }
231
+ }
232
+ else if (lang === "python") {
233
+ for (const line of text.split("\n")) {
234
+ {
235
+ const m = /^\s*import\s+([\w.]+)/.exec(line);
236
+ if (m) {
237
+ specifiers.push(m[1]);
238
+ continue;
239
+ }
240
+ }
241
+ {
242
+ const m = /^\s*from\s+([\w.]+)\s+import\s+/.exec(line);
243
+ if (m) {
244
+ specifiers.push(m[1]);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ return dedup(specifiers);
250
+ }
251
+ export function extractExports(text, lang) {
252
+ if (lang !== "typescript" && lang !== "javascript")
253
+ return [];
254
+ if (text.length > MAX_PARSE_SIZE)
255
+ return [];
256
+ const names = [];
257
+ for (const line of text.split("\n")) {
258
+ // Skip re-exports: export { ... } from '...' or export * from '...'
259
+ if (/^\s*export\s+.*\bfrom\s+['"]/.test(line))
260
+ continue;
261
+ // export const/function/class/let/var FOO or export default function fn
262
+ const declared = TS_EXPORT_DECLARED_REGEX.exec(line);
263
+ if (declared) {
264
+ names.push(declared[1]);
265
+ continue;
266
+ }
267
+ // export { A, B, C }; (no `from` clause — already excluded above)
268
+ const list = TS_EXPORT_LIST_REGEX.exec(line);
269
+ if (list) {
270
+ for (const part of list[1].split(",")) {
271
+ // Strip an inline `type` modifier (`export { type Foo }`) before taking
272
+ // the local name (the part before any `as` alias).
273
+ const cleaned = part.trim().replace(/^type\s+/, "");
274
+ const name = cleaned.split(/\s+as\s+/)[0].trim();
275
+ if (name)
276
+ names.push(name);
277
+ }
278
+ }
279
+ }
280
+ return dedup(names);
281
+ }
282
+ // ---------------------------------------------------------------------------
283
+ // Ignore resolution
284
+ // ---------------------------------------------------------------------------
285
+ /**
286
+ * Baseline paths always excluded (relative POSIX globs / names).
287
+ * Excludes the tool's own generated artifacts so re-runs stay idempotent.
288
+ */
289
+ export const BASELINE_IGNORE = new Set([
290
+ ".git",
291
+ "node_modules",
292
+ "dist",
293
+ "build",
294
+ ".next",
295
+ "coverage",
296
+ ".ai-orchestrator",
297
+ "package-lock.json",
298
+ "pnpm-lock.yaml",
299
+ "yarn.lock",
300
+ ]);
301
+ // The two tool-rewritten memory files (POSIX relative)
302
+ const TOOL_REWRITTEN_FILES = new Set([
303
+ "ai/repo-map.md",
304
+ "ai/file-index.md",
305
+ ]);
306
+ function matchesBaseline(rel, isDir, configIgnore) {
307
+ const parts = rel.split("/");
308
+ // Baseline names match at ANY path depth, not just the repo root, so a
309
+ // forgotten nested `packages/app/node_modules` (or `.git`, `dist`, etc.) is
310
+ // still pruned — the baseline is defined to always prune well-known
311
+ // generated/dependency trees regardless of nesting.
312
+ for (const seg of parts) {
313
+ if (BASELINE_IGNORE.has(seg))
314
+ return true;
315
+ }
316
+ // Tool-rewritten files
317
+ if (TOOL_REWRITTEN_FILES.has(rel))
318
+ return true;
319
+ // Lock file names at any depth
320
+ const basename = parts[parts.length - 1];
321
+ if (basename === "package-lock.json" || basename === "pnpm-lock.yaml" || basename === "yarn.lock")
322
+ return true;
323
+ // Config ignore entries: treated as glob-like prefix match or exact basename
324
+ for (const pat of configIgnore) {
325
+ if (rel === pat)
326
+ return true;
327
+ if (rel.startsWith(pat + "/"))
328
+ return true;
329
+ if (basename === pat)
330
+ return true;
331
+ }
332
+ return false;
333
+ }
334
+ export async function buildIndex(root, config) {
335
+ const normRoot = root.replace(/\\/g, "/");
336
+ // Detect git
337
+ const git = simpleGit(root);
338
+ let isGit = false;
339
+ try {
340
+ isGit = await git.checkIsRepo();
341
+ }
342
+ catch {
343
+ isGit = false;
344
+ }
345
+ const files = [];
346
+ let ignoredCount = 0;
347
+ async function walk(dir) {
348
+ let entries;
349
+ try {
350
+ entries = await fs.readdir(dir, { withFileTypes: true, encoding: "utf8" });
351
+ }
352
+ catch {
353
+ return; // Directory removed mid-walk — skip
354
+ }
355
+ // Collect candidate paths for batched git check-ignore
356
+ const candidates = [];
357
+ for (const entry of entries) {
358
+ const full = path.join(dir, entry.name);
359
+ const rel = path.relative(root, full).replace(/\\/g, "/");
360
+ candidates.push(rel);
361
+ }
362
+ // Batch check-ignore for git repos
363
+ let gitIgnored = new Set();
364
+ if (isGit && candidates.length > 0) {
365
+ try {
366
+ const result = await git.checkIgnore(candidates);
367
+ // normalize results to POSIX relative
368
+ for (const r of result) {
369
+ gitIgnored.add(r.replace(/\\/g, "/"));
370
+ }
371
+ }
372
+ catch {
373
+ // checkIgnore fails gracefully
374
+ }
375
+ }
376
+ for (const entry of entries) {
377
+ const full = path.join(dir, entry.name);
378
+ const rel = path.relative(root, full).replace(/\\/g, "/");
379
+ // Apply ignore: baseline + config always; git additionally
380
+ if (matchesBaseline(rel, entry.isDirectory(), config.ignore)) {
381
+ ignoredCount++;
382
+ continue;
383
+ }
384
+ if (isGit && gitIgnored.has(rel)) {
385
+ ignoredCount++;
386
+ continue;
387
+ }
388
+ if (entry.isSymbolicLink()) {
389
+ // Record symlink via lstat, do not follow. If the link vanished
390
+ // mid-walk, skip it rather than emitting a fabricated size.
391
+ let size;
392
+ try {
393
+ const stat = await fs.lstat(full);
394
+ size = stat.size;
395
+ }
396
+ catch {
397
+ continue;
398
+ }
399
+ const ext = path.extname(entry.name).toLowerCase();
400
+ files.push({
401
+ path: rel,
402
+ extension: ext,
403
+ size,
404
+ language: detectLanguage(ext),
405
+ isTest: isTestPath(rel),
406
+ isConfig: isConfigPath(rel),
407
+ imports: [],
408
+ exports: [],
409
+ });
410
+ continue;
411
+ }
412
+ if (entry.isDirectory()) {
413
+ await walk(full);
414
+ }
415
+ else {
416
+ const meta = await buildFileMeta(full, rel);
417
+ if (meta)
418
+ files.push(meta);
419
+ }
420
+ }
421
+ }
422
+ await walk(root);
423
+ // Sort by path
424
+ files.sort((a, b) => a.path.localeCompare(b.path));
425
+ const index = {
426
+ generatedAt: new Date().toISOString(),
427
+ root: normRoot,
428
+ files,
429
+ };
430
+ // Validate
431
+ repoIndexSchema.parse(index);
432
+ // Attach ignoredCount as a side channel (not in schema) — stored in a module-level variable
433
+ // We store it in the closure via the walk; return it separately.
434
+ index._ignoredCount = ignoredCount;
435
+ return index;
436
+ }
437
+ async function buildFileMeta(full, rel) {
438
+ let size;
439
+ try {
440
+ const stat = await fs.lstat(full);
441
+ size = stat.size;
442
+ }
443
+ catch {
444
+ // File removed mid-walk — skip it rather than emitting an entry with a
445
+ // fabricated size (documented edge case: a file removed during the scan is
446
+ // skipped, not fatal).
447
+ return null;
448
+ }
449
+ const ext = path.extname(path.basename(rel)).toLowerCase();
450
+ const lang = detectLanguage(ext);
451
+ const large = size > MAX_PARSE_SIZE;
452
+ let imports = [];
453
+ let exports = [];
454
+ if (!large) {
455
+ let headBuf;
456
+ try {
457
+ const fd = await fs.open(full, "r");
458
+ try {
459
+ const buf = Buffer.alloc(Math.min(MAX_SNIFF_BYTES, size || MAX_SNIFF_BYTES));
460
+ const { bytesRead } = await fd.read(buf, 0, buf.length, 0);
461
+ headBuf = buf.subarray(0, bytesRead);
462
+ }
463
+ finally {
464
+ // Always release the descriptor, even if read() throws — otherwise a
465
+ // run over many unreadable files could exhaust file descriptors.
466
+ await fd.close();
467
+ }
468
+ }
469
+ catch {
470
+ headBuf = Buffer.alloc(0);
471
+ }
472
+ if (!isBinary(ext, headBuf)) {
473
+ // Try to read as UTF-8
474
+ let text = null;
475
+ try {
476
+ text = await fs.readFile(full, "utf8");
477
+ }
478
+ catch {
479
+ // Non-UTF8 or unreadable — treat as binary
480
+ text = null;
481
+ }
482
+ if (text !== null) {
483
+ imports = extractImports(text, lang);
484
+ exports = extractExports(text, lang);
485
+ }
486
+ }
487
+ }
488
+ return {
489
+ path: rel,
490
+ extension: ext,
491
+ size,
492
+ language: lang,
493
+ isTest: isTestPath(rel),
494
+ isConfig: isConfigPath(rel),
495
+ imports,
496
+ exports,
497
+ };
498
+ }
499
+ // ---------------------------------------------------------------------------
500
+ // Rendering
501
+ // ---------------------------------------------------------------------------
502
+ const FILE_INDEX_CAP = 500;
503
+ export function renderRepoMap(index) {
504
+ if (index.files.length === 0) {
505
+ return "_0 files indexed._\n";
506
+ }
507
+ // Language counts
508
+ const langCounts = new Map();
509
+ for (const f of index.files) {
510
+ langCounts.set(f.language, (langCounts.get(f.language) ?? 0) + 1);
511
+ }
512
+ const langLines = [...langCounts.entries()]
513
+ .sort((a, b) => b[1] - a[1])
514
+ .map(([lang, count]) => `- ${lang}: ${count}`)
515
+ .join("\n");
516
+ // Directory breakdown (top-level)
517
+ const dirCounts = new Map();
518
+ for (const f of index.files) {
519
+ const top = f.path.includes("/") ? f.path.split("/")[0] : "(root)";
520
+ dirCounts.set(top, (dirCounts.get(top) ?? 0) + 1);
521
+ }
522
+ const dirLines = [...dirCounts.entries()]
523
+ .sort((a, b) => b[1] - a[1])
524
+ .map(([dir, count]) => `- ${dir}: ${count}`)
525
+ .join("\n");
526
+ const testCount = index.files.filter((f) => f.isTest).length;
527
+ const configCount = index.files.filter((f) => f.isConfig).length;
528
+ const totalSize = index.files.reduce((s, f) => s + f.size, 0);
529
+ const sizeKb = (totalSize / 1024).toFixed(1);
530
+ return [
531
+ `**Total:** ${index.files.length} files · ${sizeKb} KB`,
532
+ "",
533
+ "**Languages:**",
534
+ langLines,
535
+ "",
536
+ "**Top-level directories:**",
537
+ dirLines,
538
+ "",
539
+ `**Test files:** ${testCount} · **Config files:** ${configCount}`,
540
+ "",
541
+ `_Generated at ${index.generatedAt}_`,
542
+ ].join("\n");
543
+ }
544
+ export function renderFileIndex(index) {
545
+ if (index.files.length === 0) {
546
+ return "_No files indexed._\n";
547
+ }
548
+ const header = "| path | language | size | isTest | isConfig |";
549
+ const sep = "|------|----------|------|--------|----------|";
550
+ const rows = index.files.slice(0, FILE_INDEX_CAP).map((f) => `| ${f.path} | ${f.language} | ${f.size} | ${f.isTest} | ${f.isConfig} |`);
551
+ const extra = index.files.length - FILE_INDEX_CAP;
552
+ const footer = extra > 0
553
+ ? `\n_+${extra} more (see index.json)_`
554
+ : "";
555
+ return [header, sep, ...rows].join("\n") + footer;
556
+ }
557
+ //# sourceMappingURL=repoIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoIndexer.js","sourceRoot":"","sources":["../../src/core/repoIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { loadMemoryFiles } from "./memoryLoader.js";
2
+ import { type RepoIndex } from "../types/index.js";
3
+ import { type ReviewReport } from "../types/review.js";
4
+ import type { AppConfig } from "../types/config.js";
5
+ import type { ModelClient } from "../types/model.js";
6
+ /**
7
+ * Tolerantly extract + validate a review report from raw model output. Returns
8
+ * the parsed report, or `null` when nothing parseable + valid is found (the
9
+ * caller then prints the raw text).
10
+ */
11
+ export declare function tolerantParseReviewReport(raw: string): ReviewReport | null;
12
+ /**
13
+ * The current working-tree diff for the repo at `root`: staged + unstaged
14
+ * changes to tracked files (`git diff HEAD`). Returns "" when nothing changed
15
+ * or the directory is not a git repo.
16
+ */
17
+ export declare function currentDiff(root: string): Promise<string>;
18
+ /** Parse the changed-file paths from a unified diff (`diff --git a/x b/x`). */
19
+ export declare function changedFilesOf(diff: string): string[];
20
+ export interface BuildReviewPromptInputs {
21
+ config: AppConfig;
22
+ index: RepoIndex;
23
+ memory: Awaited<ReturnType<typeof loadMemoryFiles>>;
24
+ taskRaw?: string;
25
+ sessionRaw?: string;
26
+ diff: string;
27
+ }
28
+ /**
29
+ * Build the reviewer system + user prompts. The Context Builder assembles the
30
+ * task/session/memory; the diff (which it does not model) is appended to the
31
+ * user prompt so the reviewer sees exactly what changed.
32
+ */
33
+ export declare function buildReviewPrompt(inputs: BuildReviewPromptInputs): {
34
+ systemPrompt: string;
35
+ userPrompt: string;
36
+ };
37
+ export interface ReviewEngineDeps {
38
+ cwd: string;
39
+ client: ModelClient;
40
+ }
41
+ export interface ReviewEngineResult {
42
+ hadChanges: boolean;
43
+ /** The parsed report (when the model output was parseable). */
44
+ report?: ReviewReport;
45
+ /** The raw model output (always captured when the model was called). */
46
+ raw?: string;
47
+ }
48
+ /**
49
+ * Run the review: collect the diff, call the model, tolerantly parse the report.
50
+ * Returns `{ hadChanges: false }` when the diff is empty (the caller prints "No
51
+ * changes to review" and exits 0). A model error propagates to the caller.
52
+ */
53
+ export declare function runReviewEngine(deps: ReviewEngineDeps): Promise<ReviewEngineResult>;