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.
- package/LICENSE +23 -0
- package/README.md +159 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.js +344 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.js +65 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/context.d.ts +12 -0
- package/dist/commands/context.js +176 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.js +54 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.js +70 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +15 -0
- package/dist/commands/init.js +46 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plan.d.ts +17 -0
- package/dist/commands/plan.js +170 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/resume.d.ts +17 -0
- package/dist/commands/resume.js +75 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review.d.ts +17 -0
- package/dist/commands/review.js +67 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +24 -0
- package/dist/commands/run.js +65 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/step.d.ts +44 -0
- package/dist/commands/step.js +50 -0
- package/dist/commands/step.js.map +1 -0
- package/dist/commands/summarize.d.ts +17 -0
- package/dist/commands/summarize.js +276 -0
- package/dist/commands/summarize.js.map +1 -0
- package/dist/commands/task.d.ts +13 -0
- package/dist/commands/task.js +53 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/core/activePointer.d.ts +28 -0
- package/dist/core/activePointer.js +84 -0
- package/dist/core/activePointer.js.map +1 -0
- package/dist/core/approval.d.ts +12 -0
- package/dist/core/approval.js +34 -0
- package/dist/core/approval.js.map +1 -0
- package/dist/core/configManager.d.ts +32 -0
- package/dist/core/configManager.js +177 -0
- package/dist/core/configManager.js.map +1 -0
- package/dist/core/contextBuilder.d.ts +40 -0
- package/dist/core/contextBuilder.js +406 -0
- package/dist/core/contextBuilder.js.map +1 -0
- package/dist/core/memoryLoader.d.ts +4 -0
- package/dist/core/memoryLoader.js +35 -0
- package/dist/core/memoryLoader.js.map +1 -0
- package/dist/core/memoryManager.d.ts +41 -0
- package/dist/core/memoryManager.js +181 -0
- package/dist/core/memoryManager.js.map +1 -0
- package/dist/core/memoryPolicy.d.ts +23 -0
- package/dist/core/memoryPolicy.js +73 -0
- package/dist/core/memoryPolicy.js.map +1 -0
- package/dist/core/modelClient.d.ts +37 -0
- package/dist/core/modelClient.js +160 -0
- package/dist/core/modelClient.js.map +1 -0
- package/dist/core/patchManager.d.ts +89 -0
- package/dist/core/patchManager.js +801 -0
- package/dist/core/patchManager.js.map +1 -0
- package/dist/core/plannerJson.d.ts +23 -0
- package/dist/core/plannerJson.js +118 -0
- package/dist/core/plannerJson.js.map +1 -0
- package/dist/core/promptManager.d.ts +16 -0
- package/dist/core/promptManager.js +35 -0
- package/dist/core/promptManager.js.map +1 -0
- package/dist/core/prompts.d.ts +8 -0
- package/dist/core/prompts.js +18 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/repoIndexer.d.ts +21 -0
- package/dist/core/repoIndexer.js +557 -0
- package/dist/core/repoIndexer.js.map +1 -0
- package/dist/core/reviewEngine.d.ts +53 -0
- package/dist/core/reviewEngine.js +229 -0
- package/dist/core/reviewEngine.js.map +1 -0
- package/dist/core/runLoop.d.ts +26 -0
- package/dist/core/runLoop.js +103 -0
- package/dist/core/runLoop.js.map +1 -0
- package/dist/core/runStep.d.ts +42 -0
- package/dist/core/runStep.js +586 -0
- package/dist/core/runStep.js.map +1 -0
- package/dist/core/safetyManager.d.ts +7 -0
- package/dist/core/safetyManager.js +202 -0
- package/dist/core/safetyManager.js.map +1 -0
- package/dist/core/sessionManager.d.ts +35 -0
- package/dist/core/sessionManager.js +265 -0
- package/dist/core/sessionManager.js.map +1 -0
- package/dist/core/stopConditions.d.ts +24 -0
- package/dist/core/stopConditions.js +18 -0
- package/dist/core/stopConditions.js.map +1 -0
- package/dist/core/taskManager.d.ts +26 -0
- package/dist/core/taskManager.js +312 -0
- package/dist/core/taskManager.js.map +1 -0
- package/dist/core/testRunner.d.ts +27 -0
- package/dist/core/testRunner.js +71 -0
- package/dist/core/testRunner.js.map +1 -0
- package/dist/prompts/coder.d.ts +3 -0
- package/dist/prompts/coder.js +46 -0
- package/dist/prompts/coder.js.map +1 -0
- package/dist/prompts/planner.d.ts +3 -0
- package/dist/prompts/planner.js +44 -0
- package/dist/prompts/planner.js.map +1 -0
- package/dist/prompts/reviewer.d.ts +3 -0
- package/dist/prompts/reviewer.js +41 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/prompts/summarizer.d.ts +3 -0
- package/dist/prompts/summarizer.js +65 -0
- package/dist/prompts/summarizer.js.map +1 -0
- package/dist/prompts/testFixer.d.ts +3 -0
- package/dist/prompts/testFixer.js +33 -0
- package/dist/prompts/testFixer.js.map +1 -0
- package/dist/repl/approver.d.ts +15 -0
- package/dist/repl/approver.js +21 -0
- package/dist/repl/approver.js.map +1 -0
- package/dist/repl/dispatch.d.ts +48 -0
- package/dist/repl/dispatch.js +164 -0
- package/dist/repl/dispatch.js.map +1 -0
- package/dist/repl/loop.d.ts +14 -0
- package/dist/repl/loop.js +124 -0
- package/dist/repl/loop.js.map +1 -0
- package/dist/repl/tokenize.d.ts +13 -0
- package/dist/repl/tokenize.js +56 -0
- package/dist/repl/tokenize.js.map +1 -0
- package/dist/templates/memory.d.ts +13 -0
- package/dist/templates/memory.js +32 -0
- package/dist/templates/memory.js.map +1 -0
- package/dist/types/config.d.ts +235 -0
- package/dist/types/config.js +66 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/context.d.ts +78 -0
- package/dist/types/context.js +141 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.d.ts +117 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/model.d.ts +35 -0
- package/dist/types/model.js +16 -0
- package/dist/types/model.js.map +1 -0
- package/dist/types/patch.d.ts +38 -0
- package/dist/types/patch.js +11 -0
- package/dist/types/patch.js.map +1 -0
- package/dist/types/plan.d.ts +86 -0
- package/dist/types/plan.js +27 -0
- package/dist/types/plan.js.map +1 -0
- package/dist/types/review.d.ts +33 -0
- package/dist/types/review.js +24 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +34 -0
- package/dist/types/run.js +2 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/session.d.ts +21 -0
- package/dist/types/session.js +2 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/summary.d.ts +65 -0
- package/dist/types/summary.js +26 -0
- package/dist/types/summary.js.map +1 -0
- package/dist/types/task.d.ts +31 -0
- package/dist/types/task.js +10 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/test.d.ts +16 -0
- package/dist/types/test.js +2 -0
- package/dist/types/test.js.map +1 -0
- package/dist/utils/fs.d.ts +13 -0
- package/dist/utils/fs.js +65 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/gitRoot.d.ts +5 -0
- package/dist/utils/gitRoot.js +21 -0
- package/dist/utils/gitRoot.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.js +60 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +13 -0
- package/dist/utils/paths.js +24 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/tokenEstimate.d.ts +5 -0
- package/dist/utils/tokenEstimate.js +8 -0
- package/dist/utils/tokenEstimate.js.map +1 -0
- 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>;
|