@promptwheel/core 0.6.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 (169) hide show
  1. package/dist/codebase-index/index.d.ts +23 -0
  2. package/dist/codebase-index/index.d.ts.map +1 -0
  3. package/dist/codebase-index/index.js +361 -0
  4. package/dist/codebase-index/index.js.map +1 -0
  5. package/dist/codebase-index/shared.d.ts +95 -0
  6. package/dist/codebase-index/shared.d.ts.map +1 -0
  7. package/dist/codebase-index/shared.js +319 -0
  8. package/dist/codebase-index/shared.js.map +1 -0
  9. package/dist/config/defaults.d.ts +45 -0
  10. package/dist/config/defaults.d.ts.map +1 -0
  11. package/dist/config/defaults.js +79 -0
  12. package/dist/config/defaults.js.map +1 -0
  13. package/dist/critic/shared.d.ts +49 -0
  14. package/dist/critic/shared.d.ts.map +1 -0
  15. package/dist/critic/shared.js +204 -0
  16. package/dist/critic/shared.js.map +1 -0
  17. package/dist/db/adapter.d.ts +191 -0
  18. package/dist/db/adapter.d.ts.map +1 -0
  19. package/dist/db/adapter.js +40 -0
  20. package/dist/db/adapter.js.map +1 -0
  21. package/dist/db/contract.d.ts +47 -0
  22. package/dist/db/contract.d.ts.map +1 -0
  23. package/dist/db/contract.js +258 -0
  24. package/dist/db/contract.js.map +1 -0
  25. package/dist/db/index.d.ts +6 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +7 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/dedup/shared.d.ts +82 -0
  30. package/dist/dedup/shared.d.ts.map +1 -0
  31. package/dist/dedup/shared.js +215 -0
  32. package/dist/dedup/shared.js.map +1 -0
  33. package/dist/exec/index.d.ts +5 -0
  34. package/dist/exec/index.d.ts.map +1 -0
  35. package/dist/exec/index.js +5 -0
  36. package/dist/exec/index.js.map +1 -0
  37. package/dist/exec/types.d.ts +64 -0
  38. package/dist/exec/types.d.ts.map +1 -0
  39. package/dist/exec/types.js +8 -0
  40. package/dist/exec/types.js.map +1 -0
  41. package/dist/formulas/shared.d.ts +42 -0
  42. package/dist/formulas/shared.d.ts.map +1 -0
  43. package/dist/formulas/shared.js +204 -0
  44. package/dist/formulas/shared.js.map +1 -0
  45. package/dist/guidelines/shared.d.ts +46 -0
  46. package/dist/guidelines/shared.d.ts.map +1 -0
  47. package/dist/guidelines/shared.js +128 -0
  48. package/dist/guidelines/shared.js.map +1 -0
  49. package/dist/index.d.ts +35 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +51 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/learnings/shared.d.ts +112 -0
  54. package/dist/learnings/shared.d.ts.map +1 -0
  55. package/dist/learnings/shared.js +402 -0
  56. package/dist/learnings/shared.js.map +1 -0
  57. package/dist/proposals/shared.d.ts +137 -0
  58. package/dist/proposals/shared.d.ts.map +1 -0
  59. package/dist/proposals/shared.js +254 -0
  60. package/dist/proposals/shared.js.map +1 -0
  61. package/dist/repos/index.d.ts +15 -0
  62. package/dist/repos/index.d.ts.map +1 -0
  63. package/dist/repos/index.js +11 -0
  64. package/dist/repos/index.js.map +1 -0
  65. package/dist/repos/projects.d.ts +41 -0
  66. package/dist/repos/projects.d.ts.map +1 -0
  67. package/dist/repos/projects.js +75 -0
  68. package/dist/repos/projects.js.map +1 -0
  69. package/dist/repos/run_steps.d.ts +152 -0
  70. package/dist/repos/run_steps.d.ts.map +1 -0
  71. package/dist/repos/run_steps.js +328 -0
  72. package/dist/repos/run_steps.js.map +1 -0
  73. package/dist/repos/runs.d.ts +92 -0
  74. package/dist/repos/runs.d.ts.map +1 -0
  75. package/dist/repos/runs.js +185 -0
  76. package/dist/repos/runs.js.map +1 -0
  77. package/dist/repos/tickets.d.ts +71 -0
  78. package/dist/repos/tickets.d.ts.map +1 -0
  79. package/dist/repos/tickets.js +158 -0
  80. package/dist/repos/tickets.js.map +1 -0
  81. package/dist/scope/shared.d.ts +67 -0
  82. package/dist/scope/shared.d.ts.map +1 -0
  83. package/dist/scope/shared.js +355 -0
  84. package/dist/scope/shared.js.map +1 -0
  85. package/dist/scout/index.d.ts +18 -0
  86. package/dist/scout/index.d.ts.map +1 -0
  87. package/dist/scout/index.js +445 -0
  88. package/dist/scout/index.js.map +1 -0
  89. package/dist/scout/kimi-runner.d.ts +21 -0
  90. package/dist/scout/kimi-runner.d.ts.map +1 -0
  91. package/dist/scout/kimi-runner.js +76 -0
  92. package/dist/scout/kimi-runner.js.map +1 -0
  93. package/dist/scout/mcp-batch-server.d.ts +37 -0
  94. package/dist/scout/mcp-batch-server.d.ts.map +1 -0
  95. package/dist/scout/mcp-batch-server.js +144 -0
  96. package/dist/scout/mcp-batch-server.js.map +1 -0
  97. package/dist/scout/openai-local-runner.d.ts +20 -0
  98. package/dist/scout/openai-local-runner.d.ts.map +1 -0
  99. package/dist/scout/openai-local-runner.js +82 -0
  100. package/dist/scout/openai-local-runner.js.map +1 -0
  101. package/dist/scout/prompt.d.ts +49 -0
  102. package/dist/scout/prompt.d.ts.map +1 -0
  103. package/dist/scout/prompt.js +153 -0
  104. package/dist/scout/prompt.js.map +1 -0
  105. package/dist/scout/runner.d.ts +101 -0
  106. package/dist/scout/runner.d.ts.map +1 -0
  107. package/dist/scout/runner.js +521 -0
  108. package/dist/scout/runner.js.map +1 -0
  109. package/dist/scout/scanner.d.ts +61 -0
  110. package/dist/scout/scanner.d.ts.map +1 -0
  111. package/dist/scout/scanner.js +315 -0
  112. package/dist/scout/scanner.js.map +1 -0
  113. package/dist/scout/types.d.ts +221 -0
  114. package/dist/scout/types.d.ts.map +1 -0
  115. package/dist/scout/types.js +44 -0
  116. package/dist/scout/types.js.map +1 -0
  117. package/dist/sectors/shared.d.ts +146 -0
  118. package/dist/sectors/shared.d.ts.map +1 -0
  119. package/dist/sectors/shared.js +408 -0
  120. package/dist/sectors/shared.js.map +1 -0
  121. package/dist/services/index.d.ts +10 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +9 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/qa.d.ts +76 -0
  126. package/dist/services/qa.d.ts.map +1 -0
  127. package/dist/services/qa.js +228 -0
  128. package/dist/services/qa.js.map +1 -0
  129. package/dist/services/scout.d.ts +164 -0
  130. package/dist/services/scout.d.ts.map +1 -0
  131. package/dist/services/scout.js +215 -0
  132. package/dist/services/scout.js.map +1 -0
  133. package/dist/spindle/shared.d.ts +14 -0
  134. package/dist/spindle/shared.d.ts.map +1 -0
  135. package/dist/spindle/shared.js +65 -0
  136. package/dist/spindle/shared.js.map +1 -0
  137. package/dist/tools/shared.d.ts +35 -0
  138. package/dist/tools/shared.d.ts.map +1 -0
  139. package/dist/tools/shared.js +247 -0
  140. package/dist/tools/shared.js.map +1 -0
  141. package/dist/trace/shared.d.ts +147 -0
  142. package/dist/trace/shared.d.ts.map +1 -0
  143. package/dist/trace/shared.js +414 -0
  144. package/dist/trace/shared.js.map +1 -0
  145. package/dist/trajectory/shared.d.ts +69 -0
  146. package/dist/trajectory/shared.d.ts.map +1 -0
  147. package/dist/trajectory/shared.js +336 -0
  148. package/dist/trajectory/shared.js.map +1 -0
  149. package/dist/utils/id.d.ts +12 -0
  150. package/dist/utils/id.d.ts.map +1 -0
  151. package/dist/utils/id.js +24 -0
  152. package/dist/utils/id.js.map +1 -0
  153. package/dist/utils/id.test.d.ts +5 -0
  154. package/dist/utils/id.test.d.ts.map +1 -0
  155. package/dist/utils/id.test.js +173 -0
  156. package/dist/utils/id.test.js.map +1 -0
  157. package/dist/utils/index.d.ts +6 -0
  158. package/dist/utils/index.d.ts.map +1 -0
  159. package/dist/utils/index.js +6 -0
  160. package/dist/utils/index.js.map +1 -0
  161. package/dist/utils/json.d.ts +9 -0
  162. package/dist/utils/json.d.ts.map +1 -0
  163. package/dist/utils/json.js +19 -0
  164. package/dist/utils/json.js.map +1 -0
  165. package/dist/waves/shared.d.ts +106 -0
  166. package/dist/waves/shared.d.ts.map +1 -0
  167. package/dist/waves/shared.js +356 -0
  168. package/dist/waves/shared.js.map +1 -0
  169. package/package.json +126 -0
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Pure scope algorithms — no filesystem, no external dependencies.
3
+ *
4
+ * Shared by both @promptwheel/cli and @promptwheel/mcp.
5
+ * CLI keeps its proposal-level scope checking wrapper.
6
+ * MCP keeps its minimatch-based policy enforcement + file I/O.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Always-denied paths (build artifacts, lockfiles, VCS internals)
10
+ // ---------------------------------------------------------------------------
11
+ export const ALWAYS_DENIED = [
12
+ '.env', '.env.*',
13
+ 'node_modules/**', '.git/**', '.promptwheel/**',
14
+ 'dist/**', 'build/**', 'coverage/**',
15
+ // Lock files are auto-generated; governed by per-ticket allowed_paths instead
16
+ 'package-lock.json',
17
+ ];
18
+ // ---------------------------------------------------------------------------
19
+ // Credential / secret detection patterns
20
+ // ---------------------------------------------------------------------------
21
+ export const CREDENTIAL_PATTERNS = [
22
+ /AKIA[0-9A-Z]{16}/, // AWS access key
23
+ /-----BEGIN.*PRIVATE KEY-----/, // PEM keys
24
+ /ghp_[a-zA-Z0-9]{36}/, // GitHub PAT
25
+ /\bsk-(?:proj-)?[a-zA-Z0-9_-]{32,}/, // OpenAI key
26
+ /password\s*[:=]\s*['"][^'"]+/i, // hardcoded passwords
27
+ /xox[bporas]-[a-zA-Z0-9-]+/, // Slack tokens
28
+ /postgres(ql)?:\/\/[^\s'"]+/i, // PostgreSQL connection string
29
+ /mongodb(\+srv)?:\/\/[^\s'"]+/i, // MongoDB connection string
30
+ /mysql:\/\/[^\s'"]+/i, // MySQL connection string
31
+ /eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\./, // JWT tokens
32
+ /(?:SECRET|TOKEN|API_?KEY|PRIVATE_?KEY)\s*[:=]\s*['"][^'"]{8,}/i, // Generic secrets
33
+ ];
34
+ // ---------------------------------------------------------------------------
35
+ // File deny patterns (sensitive file names)
36
+ // ---------------------------------------------------------------------------
37
+ export const FILE_DENY_PATTERNS = [
38
+ /\.(env|pem|key)$/,
39
+ /credentials/i,
40
+ /secret/i,
41
+ ];
42
+ // ---------------------------------------------------------------------------
43
+ // Path normalization
44
+ // ---------------------------------------------------------------------------
45
+ /**
46
+ * Normalize a file path for consistent matching.
47
+ */
48
+ export function normalizePath(filePath) {
49
+ return filePath
50
+ .replace(/\\/g, '/') // Normalize backslashes
51
+ .replace(/^\.\//, '') // Remove leading ./
52
+ .replace(/\/+/g, '/') // Collapse multiple slashes
53
+ .replace(/\/$/, ''); // Remove trailing slash
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Hallucinated path detection
57
+ // ---------------------------------------------------------------------------
58
+ /**
59
+ * Detect if a path appears to be hallucinated by an LLM.
60
+ * Common patterns: repeated segments like 'foo/foo/'.
61
+ */
62
+ export function detectHallucinatedPath(filePath) {
63
+ const normalized = normalizePath(filePath);
64
+ const segments = normalized.split('/').filter(s => s.length > 0);
65
+ // Check for repeated consecutive segments
66
+ for (let i = 0; i < segments.length - 1; i++) {
67
+ if (segments[i] === segments[i + 1] && segments[i].length > 0) {
68
+ return {
69
+ isHallucinated: true,
70
+ reason: `Repeated path segment: '${segments[i]}/${segments[i]}'`,
71
+ };
72
+ }
73
+ }
74
+ // Double slashes in original
75
+ if (/\/\//.test(filePath)) {
76
+ return {
77
+ isHallucinated: true,
78
+ reason: 'Contains double slashes',
79
+ };
80
+ }
81
+ return { isHallucinated: false };
82
+ }
83
+ // ---------------------------------------------------------------------------
84
+ // Credential detection in file content
85
+ // ---------------------------------------------------------------------------
86
+ /**
87
+ * Check file content for credential patterns.
88
+ * Returns a description of the first match, or null if clean.
89
+ */
90
+ export function detectCredentialInContent(content) {
91
+ for (const pattern of CREDENTIAL_PATTERNS) {
92
+ const match = content.match(pattern);
93
+ if (match) {
94
+ return `Content contains potential credential: ${pattern.source}`;
95
+ }
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Check if a file path matches credential/sensitive file patterns.
101
+ */
102
+ export function detectCredentialPattern(filePath) {
103
+ for (const pattern of FILE_DENY_PATTERNS) {
104
+ if (pattern.test(filePath))
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Pure glob-style pattern matching (no external deps)
111
+ // ---------------------------------------------------------------------------
112
+ /**
113
+ * Simple glob-style pattern matching.
114
+ * Supports: * (any chars), ** (any path segments), ? (single char)
115
+ */
116
+ export function matchesPattern(filePath, pattern) {
117
+ const normalizedFile = filePath.replace(/\\/g, '/');
118
+ const normalizedPattern = pattern.replace(/\\/g, '/');
119
+ // Convert glob to regex
120
+ let regexPattern = normalizedPattern
121
+ .replace(/\*\*\//g, '<<<GLOBSTAR_SLASH>>>')
122
+ .replace(/\*\*/g, '<<<GLOBSTAR>>>')
123
+ .replace(/\*/g, '<<<STAR>>>')
124
+ .replace(/\?/g, '<<<QUESTION>>>');
125
+ regexPattern = regexPattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
126
+ regexPattern = regexPattern
127
+ .replace(/<<<GLOBSTAR_SLASH>>>/g, '(?:.*/)?')
128
+ .replace(/<<<GLOBSTAR>>>/g, '.*')
129
+ .replace(/<<<STAR>>>/g, '[^/]*')
130
+ .replace(/<<<QUESTION>>>/g, '[^/]');
131
+ const regex = new RegExp(`^${regexPattern}$`);
132
+ return regex.test(normalizedFile);
133
+ }
134
+ // ---------------------------------------------------------------------------
135
+ // Path allowed/denied checking (pure — no minimatch dependency)
136
+ // ---------------------------------------------------------------------------
137
+ /**
138
+ * Check if a path is allowed given allow/deny lists using built-in glob matching.
139
+ * When allowed is empty, everything not denied is allowed.
140
+ */
141
+ export function isPathAllowed(filePath, allowed, denied) {
142
+ const normalized = normalizePath(filePath);
143
+ // Check denied first (higher priority)
144
+ for (const pattern of denied) {
145
+ if (matchesPattern(normalized, pattern))
146
+ return false;
147
+ }
148
+ // Check denied file patterns
149
+ if (detectCredentialPattern(normalized))
150
+ return false;
151
+ // Check allowed (empty = everything allowed)
152
+ if (allowed.length === 0)
153
+ return true;
154
+ return allowed.some(pattern => matchesPattern(normalized, pattern));
155
+ }
156
+ /**
157
+ * Check if changed files violate scope constraints.
158
+ */
159
+ export function checkScopeViolations(changedFiles, allowedPaths, forbiddenPaths) {
160
+ const violations = [];
161
+ for (const file of changedFiles) {
162
+ // Check hallucinated paths first
163
+ const hallucinationCheck = detectHallucinatedPath(file);
164
+ if (hallucinationCheck.isHallucinated) {
165
+ violations.push({
166
+ file,
167
+ violation: 'not_in_allowed',
168
+ pattern: `hallucinated: ${hallucinationCheck.reason}`,
169
+ });
170
+ continue;
171
+ }
172
+ const normalizedFile = normalizePath(file);
173
+ // Check forbidden paths (higher priority)
174
+ let isForbidden = false;
175
+ for (const pattern of forbiddenPaths) {
176
+ if (matchesPattern(normalizedFile, pattern)) {
177
+ violations.push({ file, violation: 'in_forbidden', pattern });
178
+ isForbidden = true;
179
+ break;
180
+ }
181
+ }
182
+ // Check allowed paths
183
+ if (!isForbidden && allowedPaths.length > 0) {
184
+ let isAllowed = allowedPaths.some(pattern => matchesPattern(normalizedFile, pattern));
185
+ if (!isAllowed && file.endsWith('/')) {
186
+ const dirPrefix = normalizedFile + '/';
187
+ isAllowed = allowedPaths.some(pattern => pattern.startsWith(dirPrefix));
188
+ }
189
+ if (!isAllowed) {
190
+ violations.push({ file, violation: 'not_in_allowed' });
191
+ }
192
+ }
193
+ }
194
+ return violations;
195
+ }
196
+ /**
197
+ * Analyze violations and determine if paths can be auto-expanded.
198
+ * Allows expansion for sibling files, test files, type definitions,
199
+ * index files, subdirectories, and root configs.
200
+ */
201
+ export function analyzeViolationsForExpansion(violations, currentAllowedPaths, maxExpansions = 10) {
202
+ // Forbidden violations cannot be expanded
203
+ const forbiddenViolations = violations.filter(v => v.violation === 'in_forbidden');
204
+ if (forbiddenViolations.length > 0) {
205
+ return {
206
+ canExpand: false,
207
+ expandedPaths: currentAllowedPaths,
208
+ addedPaths: [],
209
+ reason: `Cannot expand: ${forbiddenViolations.length} file(s) match forbidden paths`,
210
+ };
211
+ }
212
+ // Hallucinated paths cannot be expanded
213
+ const hallucinatedViolations = violations.filter(v => v.pattern?.startsWith('hallucinated:'));
214
+ if (hallucinatedViolations.length > 0) {
215
+ return {
216
+ canExpand: false,
217
+ expandedPaths: currentAllowedPaths,
218
+ addedPaths: [],
219
+ reason: `Cannot expand: ${hallucinatedViolations.length} hallucinated path(s) detected`,
220
+ };
221
+ }
222
+ // Get allowed directories
223
+ const allowedDirs = new Set();
224
+ for (const p of currentAllowedPaths) {
225
+ const normalized = normalizePath(p);
226
+ const lastSlash = normalized.lastIndexOf('/');
227
+ if (lastSlash > 0) {
228
+ allowedDirs.add(normalized.slice(0, lastSlash));
229
+ }
230
+ }
231
+ const pathsToAdd = [];
232
+ const notAllowedViolations = violations.filter(v => v.violation === 'not_in_allowed');
233
+ for (const violation of notAllowedViolations) {
234
+ const normalizedFile = normalizePath(violation.file);
235
+ const lastSlash = normalizedFile.lastIndexOf('/');
236
+ const fileDir = lastSlash > 0 ? normalizedFile.slice(0, lastSlash) : '';
237
+ const fileName = lastSlash > 0 ? normalizedFile.slice(lastSlash + 1) : normalizedFile;
238
+ const isSiblingFile = allowedDirs.has(fileDir);
239
+ const isRelatedFile =
240
+ // JS/TS
241
+ fileName.endsWith('.d.ts') ||
242
+ fileName.includes('.test.') ||
243
+ fileName.includes('.spec.') ||
244
+ fileName === 'index.ts' || fileName === 'index.tsx' || fileName === 'index.js' ||
245
+ fileName === 'types.ts' || fileName === 'types.tsx' ||
246
+ // Python
247
+ fileName === '__init__.py' || fileName === 'conftest.py' ||
248
+ fileName.startsWith('test_') || fileName.endsWith('_test.py') ||
249
+ // Rust
250
+ fileName === 'mod.rs' || fileName === 'lib.rs' || fileName === 'build.rs' ||
251
+ // Go
252
+ fileName === 'go.mod' || fileName === 'go.sum' ||
253
+ fileName.endsWith('_test.go') ||
254
+ // Java/Kotlin
255
+ fileName.endsWith('Test.java') || fileName.endsWith('Test.kt') ||
256
+ // C#
257
+ fileName.endsWith('.csproj') || fileName.endsWith('.sln') ||
258
+ fileName.endsWith('Tests.cs') || fileName.endsWith('Test.cs') ||
259
+ // Ruby
260
+ fileName.endsWith('_spec.rb') || fileName === 'Rakefile' || fileName === 'Gemfile.lock' ||
261
+ // Elixir
262
+ fileName.endsWith('_test.exs') || fileName === 'mix.lock' ||
263
+ // Swift
264
+ fileName === 'Package.swift' || fileName.endsWith('Tests.swift') ||
265
+ // Dart
266
+ fileName === 'pubspec.yaml' || fileName === 'pubspec.lock' ||
267
+ fileName.endsWith('_test.dart') ||
268
+ // Scala
269
+ fileName.endsWith('Spec.scala') || fileName.endsWith('Test.scala') ||
270
+ fileName === 'build.sbt' ||
271
+ // Haskell
272
+ fileName.endsWith('Spec.hs') || fileName === 'stack.yaml' ||
273
+ fileName.endsWith('.cabal') ||
274
+ // Zig
275
+ fileName === 'build.zig' || fileName === 'build.zig.zon' ||
276
+ // C/C++
277
+ fileName === 'CMakeLists.txt' || fileName === 'Makefile';
278
+ const isSubdirectory = [...allowedDirs].some(dir => fileDir.startsWith(dir + '/'));
279
+ const isRootConfig = !fileDir && /^(vitest|vite|jest|tsconfig|eslint|prettier|babel|rollup|webpack|next|tailwind|pyproject|setup|Cargo|go\.mod|go\.sum|Gemfile|mix|pom|build\.gradle|CMakeLists|Makefile)\b/.test(fileName);
280
+ if (isSiblingFile || isRelatedFile || isSubdirectory || isRootConfig) {
281
+ pathsToAdd.push(normalizedFile);
282
+ }
283
+ }
284
+ // Second pass: cross-directory within same top-level module
285
+ if (pathsToAdd.length < notAllowedViolations.length) {
286
+ const allowedTopDirs = new Set();
287
+ for (const dir of allowedDirs) {
288
+ const parts = dir.split('/');
289
+ if (parts.length >= 1)
290
+ allowedTopDirs.add(parts[0]);
291
+ if (parts.length >= 2)
292
+ allowedTopDirs.add(parts.slice(0, 2).join('/'));
293
+ }
294
+ const hasPackagesDir = [...allowedDirs].some(d => d.startsWith('packages/'));
295
+ if (hasPackagesDir)
296
+ allowedTopDirs.add('packages');
297
+ for (const violation of notAllowedViolations) {
298
+ const normalizedFile = normalizePath(violation.file);
299
+ if (pathsToAdd.includes(normalizedFile))
300
+ continue;
301
+ const fileParts = normalizedFile.split('/');
302
+ const fileTopDir = fileParts.length >= 2
303
+ ? fileParts.slice(0, 2).join('/')
304
+ : fileParts[0];
305
+ if (allowedTopDirs.has(fileTopDir) || allowedTopDirs.has(fileParts[0])) {
306
+ pathsToAdd.push(normalizedFile);
307
+ }
308
+ }
309
+ }
310
+ if (pathsToAdd.length === 0) {
311
+ return {
312
+ canExpand: false,
313
+ expandedPaths: currentAllowedPaths,
314
+ addedPaths: [],
315
+ reason: `Cannot expand: ${notAllowedViolations.length} file(s) in unrelated directories`,
316
+ };
317
+ }
318
+ if (pathsToAdd.length > maxExpansions) {
319
+ return {
320
+ canExpand: false,
321
+ expandedPaths: currentAllowedPaths,
322
+ addedPaths: [],
323
+ reason: `Cannot expand: ${pathsToAdd.length} files need expansion (max: ${maxExpansions})`,
324
+ };
325
+ }
326
+ const expandedPaths = [...new Set([...currentAllowedPaths, ...pathsToAdd])];
327
+ return {
328
+ canExpand: true,
329
+ expandedPaths,
330
+ addedPaths: pathsToAdd,
331
+ };
332
+ }
333
+ // ---------------------------------------------------------------------------
334
+ // Git status parsing
335
+ // ---------------------------------------------------------------------------
336
+ /**
337
+ * Parse git status --porcelain output to get changed file paths.
338
+ */
339
+ export function parseChangedFiles(statusOutput) {
340
+ if (!statusOutput.trim())
341
+ return [];
342
+ return statusOutput
343
+ .split('\n')
344
+ .filter(line => line.trim())
345
+ .map(line => {
346
+ // Format: XY filename or XY original -> renamed
347
+ // eslint-disable-next-line security/detect-unsafe-regex
348
+ const match = line.match(/^..\s+(.+?)(?:\s+->\s+(.+))?$/);
349
+ if (!match)
350
+ return null;
351
+ return match[2] || match[1];
352
+ })
353
+ .filter((f) => f !== null);
354
+ }
355
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/scope/shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,MAAM,EAAE,QAAQ;IAChB,iBAAiB,EAAE,SAAS,EAAE,iBAAiB;IAC/C,SAAS,EAAE,UAAU,EAAE,aAAa;IACpC,8EAA8E;IAC9E,mBAAmB;CACpB,CAAC;AAEF,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,kBAAkB,EAAyB,iBAAiB;IAC5D,8BAA8B,EAAe,WAAW;IACxD,qBAAqB,EAAuB,aAAa;IACzD,mCAAmC,EAAS,aAAa;IACzD,+BAA+B,EAAa,sBAAsB;IAClE,2BAA2B,EAAgB,eAAe;IAC1D,6BAA6B,EAAc,+BAA+B;IAC1E,+BAA+B,EAAY,4BAA4B;IACvE,qBAAqB,EAAuB,0BAA0B;IACtE,6CAA6C,EAAE,aAAa;IAC5D,gEAAgE,EAAE,kBAAkB;CACrF,CAAC;AAEF,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,kBAAkB;IAClB,cAAc;IACd,SAAS;CACV,CAAC;AAEF,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,QAAQ;SACZ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAK,wBAAwB;SAChD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAI,oBAAoB;SAC5C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAG,4BAA4B;SACnD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAK,wBAAwB;AACrD,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IAIrD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEjE,0CAA0C;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO;gBACL,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,2BAA2B,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;aACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,yBAAyB;SAClC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,0CAA0C,OAAO,CAAC,MAAM,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IAC9D,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEtD,wBAAwB;IACxB,IAAI,YAAY,GAAG,iBAAiB;SACjC,OAAO,CAAC,SAAS,EAAE,sBAAsB,CAAC;SAC1C,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC;SAClC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAEpC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAEjE,YAAY,GAAG,YAAY;SACxB,OAAO,CAAC,uBAAuB,EAAE,UAAU,CAAC;SAC5C,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAChC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC;SAC/B,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC;AAED,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,OAAiB,EACjB,MAAgB;IAEhB,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE3C,uCAAuC;IACvC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,IAAI,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IACxD,CAAC;IAED,6BAA6B;IAC7B,IAAI,uBAAuB,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtD,6CAA6C;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACtE,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAsB,EACtB,YAAsB,EACtB,cAAwB;IAExB,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,iCAAiC;QACjC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,kBAAkB,CAAC,cAAc,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,SAAS,EAAE,gBAAgB;gBAC3B,OAAO,EAAE,iBAAiB,kBAAkB,CAAC,MAAM,EAAE;aACtD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAE3C,0CAA0C;QAC1C,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC5C,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9D,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC1C,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,CACxC,CAAC;YAEF,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,cAAc,GAAG,GAAG,CAAC;gBACvC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;YAC1E,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAaD;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,UAA4B,EAC5B,mBAA6B,EAC7B,gBAAwB,EAAE;IAE1B,0CAA0C;IAC1C,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC;IACnF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,mBAAmB;YAClC,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,kBAAkB,mBAAmB,CAAC,MAAM,gCAAgC;SACrF,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,MAAM,sBAAsB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACnD,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,eAAe,CAAC,CACvC,CAAC;IACF,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,mBAAmB;YAClC,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,kBAAkB,sBAAsB,CAAC,MAAM,gCAAgC;SACxF,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,oBAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,gBAAgB,CAAC,CAAC;IAEtF,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QAEtF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,aAAa;QACjB,QAAQ;QACR,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,UAAU;YAC9E,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,WAAW;YACnD,SAAS;YACT,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,aAAa;YACxD,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7D,OAAO;YACP,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,UAAU;YACzE,KAAK;YACL,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;YAC9C,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7B,cAAc;YACd,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC9D,KAAK;YACL,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzD,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC7D,OAAO;YACP,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,cAAc;YACvF,SAAS;YACT,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,KAAK,UAAU;YACzD,QAAQ;YACR,QAAQ,KAAK,eAAe,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;YAChE,OAAO;YACP,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,cAAc;YAC1D,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/B,QAAQ;YACR,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClE,QAAQ,KAAK,WAAW;YACxB,UAAU;YACV,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,KAAK,YAAY;YACzD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,MAAM;YACN,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,eAAe;YACxD,QAAQ;YACR,QAAQ,KAAK,gBAAgB,IAAI,QAAQ,KAAK,UAAU,CAAC;QAC3D,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,CAAC,OAAO,IAAI,2KAA2K,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5N,IAAI,aAAa,IAAI,aAAa,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;YACrE,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,UAAU,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,IAAI,cAAc;YAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnD,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,SAAS;YAElD,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC;gBACtC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAEjB,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,mBAAmB;YAClC,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,kBAAkB,oBAAoB,CAAC,MAAM,mCAAmC;SACzF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACtC,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,mBAAmB;YAClC,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,kBAAkB,UAAU,CAAC,MAAM,+BAA+B,aAAa,GAAG;SAC3F,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,mBAAmB,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,SAAS,EAAE,IAAI;QACf,aAAa;QACb,UAAU,EAAE,UAAU;KACvB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAEpC,OAAO,YAAY;SAChB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC3B,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,gDAAgD;QAChD,wDAAwD;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Scout service - Analyzes codebases and generates improvement proposals
3
+ *
4
+ * This is the core scout implementation that works with any DatabaseAdapter.
5
+ */
6
+ import type { ScoutOptions, ScoutResult } from './types.js';
7
+ export * from './types.js';
8
+ export { buildScoutPrompt, buildCategoryPrompt } from './prompt.js';
9
+ export { runClaude, parseClaudeOutput, ClaudeScoutBackend, CodexScoutBackend, CodexMcpScoutBackend, type ScoutBackend } from './runner.js';
10
+ export { KimiScoutBackend } from './kimi-runner.js';
11
+ export { OpenAILocalScoutBackend } from './openai-local-runner.js';
12
+ export { McpBatchServer } from './mcp-batch-server.js';
13
+ export { scanFiles, batchFiles, batchFilesByTokens, batchFilesByModule, estimateTokens, type ScannedFile, type ModuleGroup } from './scanner.js';
14
+ /**
15
+ * Scout a codebase for improvement opportunities
16
+ */
17
+ export declare function scout(options: ScoutOptions): Promise<ScoutResult>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scout/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3I,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAiOjJ;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA6QvE"}