guardrail-cli 2.4.13 → 2.5.1

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 (244) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +548 -521
  3. package/dist/commands/autopilot-decision.d.ts +24 -0
  4. package/dist/commands/autopilot-decision.d.ts.map +1 -0
  5. package/dist/commands/autopilot-decision.js +304 -0
  6. package/dist/commands/autopilot-decision.js.map +1 -0
  7. package/dist/commands/autopilot.d.ts +33 -0
  8. package/dist/commands/autopilot.d.ts.map +1 -0
  9. package/dist/commands/autopilot.js +1539 -0
  10. package/dist/commands/autopilot.js.map +1 -0
  11. package/dist/commands/baseline.d.ts.map +1 -1
  12. package/dist/commands/baseline.js.map +1 -1
  13. package/dist/commands/cache.d.ts.map +1 -1
  14. package/dist/commands/cache.js +3 -1
  15. package/dist/commands/cache.js.map +1 -1
  16. package/dist/commands/context.d.ts +8 -0
  17. package/dist/commands/context.d.ts.map +1 -0
  18. package/dist/commands/context.js +340 -0
  19. package/dist/commands/context.js.map +1 -0
  20. package/dist/commands/debug.d.ts +78 -0
  21. package/dist/commands/debug.d.ts.map +1 -0
  22. package/dist/commands/debug.js +381 -0
  23. package/dist/commands/debug.js.map +1 -0
  24. package/dist/commands/evidence.d.ts.map +1 -1
  25. package/dist/commands/evidence.js +23 -7
  26. package/dist/commands/evidence.js.map +1 -1
  27. package/dist/commands/index.d.ts +5 -0
  28. package/dist/commands/index.d.ts.map +1 -1
  29. package/dist/commands/index.js +16 -1
  30. package/dist/commands/index.js.map +1 -1
  31. package/dist/commands/preview.d.ts +54 -0
  32. package/dist/commands/preview.d.ts.map +1 -0
  33. package/dist/commands/preview.js +352 -0
  34. package/dist/commands/preview.js.map +1 -0
  35. package/dist/commands/quality/check.d.ts +31 -0
  36. package/dist/commands/quality/check.d.ts.map +1 -0
  37. package/dist/commands/quality/check.js +242 -0
  38. package/dist/commands/quality/check.js.map +1 -0
  39. package/dist/commands/quality/index.d.ts +8 -0
  40. package/dist/commands/quality/index.d.ts.map +1 -0
  41. package/dist/commands/quality/index.js +14 -0
  42. package/dist/commands/quality/index.js.map +1 -0
  43. package/dist/commands/quality/setup-quality.d.ts +23 -0
  44. package/dist/commands/quality/setup-quality.d.ts.map +1 -0
  45. package/dist/commands/quality/setup-quality.js +452 -0
  46. package/dist/commands/quality/setup-quality.js.map +1 -0
  47. package/dist/commands/quality/tidy.d.ts +41 -0
  48. package/dist/commands/quality/tidy.d.ts.map +1 -0
  49. package/dist/commands/quality/tidy.js +466 -0
  50. package/dist/commands/quality/tidy.js.map +1 -0
  51. package/dist/commands/quality/utils.d.ts +73 -0
  52. package/dist/commands/quality/utils.d.ts.map +1 -0
  53. package/dist/commands/quality/utils.js +158 -0
  54. package/dist/commands/quality/utils.js.map +1 -0
  55. package/dist/commands/scan-secrets.d.ts.map +1 -1
  56. package/dist/commands/scan-secrets.js +35 -18
  57. package/dist/commands/scan-secrets.js.map +1 -1
  58. package/dist/commands/scan-vulnerabilities-enhanced.d.ts +1 -0
  59. package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +1 -1
  60. package/dist/commands/scan-vulnerabilities-enhanced.js +40 -14
  61. package/dist/commands/scan-vulnerabilities-enhanced.js.map +1 -1
  62. package/dist/commands/scan-vulnerabilities-osv.d.ts +1 -1
  63. package/dist/commands/scan-vulnerabilities-osv.d.ts.map +1 -1
  64. package/dist/commands/scan-vulnerabilities-osv.js +76 -45
  65. package/dist/commands/scan-vulnerabilities-osv.js.map +1 -1
  66. package/dist/commands/scan-vulnerabilities.d.ts.map +1 -1
  67. package/dist/commands/scan-vulnerabilities.js +82 -21
  68. package/dist/commands/scan-vulnerabilities.js.map +1 -1
  69. package/dist/commands/secrets-allowlist.d.ts.map +1 -1
  70. package/dist/commands/secrets-allowlist.js +12 -11
  71. package/dist/commands/secrets-allowlist.js.map +1 -1
  72. package/dist/fix/analytics.d.ts +121 -0
  73. package/dist/fix/analytics.d.ts.map +1 -0
  74. package/dist/fix/analytics.js +289 -0
  75. package/dist/fix/analytics.js.map +1 -0
  76. package/dist/fix/applicator.d.ts +21 -2
  77. package/dist/fix/applicator.d.ts.map +1 -1
  78. package/dist/fix/applicator.js +109 -6
  79. package/dist/fix/applicator.js.map +1 -1
  80. package/dist/fix/audit.d.ts +61 -0
  81. package/dist/fix/audit.d.ts.map +1 -0
  82. package/dist/fix/audit.js +149 -0
  83. package/dist/fix/audit.js.map +1 -0
  84. package/dist/fix/backup.d.ts +12 -2
  85. package/dist/fix/backup.d.ts.map +1 -1
  86. package/dist/fix/backup.js +53 -4
  87. package/dist/fix/backup.js.map +1 -1
  88. package/dist/fix/config.d.ts +78 -0
  89. package/dist/fix/config.d.ts.map +1 -0
  90. package/dist/fix/config.js +200 -0
  91. package/dist/fix/config.js.map +1 -0
  92. package/dist/fix/engine.d.ts.map +1 -1
  93. package/dist/fix/engine.js +5 -5
  94. package/dist/fix/engine.js.map +1 -1
  95. package/dist/fix/impact.d.ts +74 -0
  96. package/dist/fix/impact.d.ts.map +1 -0
  97. package/dist/fix/impact.js +281 -0
  98. package/dist/fix/impact.js.map +1 -0
  99. package/dist/fix/index.d.ts +3 -0
  100. package/dist/fix/index.d.ts.map +1 -1
  101. package/dist/fix/index.js +7 -1
  102. package/dist/fix/index.js.map +1 -1
  103. package/dist/fix/interactive.d.ts.map +1 -1
  104. package/dist/fix/interactive.js +9 -4
  105. package/dist/fix/interactive.js.map +1 -1
  106. package/dist/fix/learning.d.ts +109 -0
  107. package/dist/fix/learning.d.ts.map +1 -0
  108. package/dist/fix/learning.js +296 -0
  109. package/dist/fix/learning.js.map +1 -0
  110. package/dist/fix/metrics.d.ts +106 -0
  111. package/dist/fix/metrics.d.ts.map +1 -0
  112. package/dist/fix/metrics.js +138 -0
  113. package/dist/fix/metrics.js.map +1 -0
  114. package/dist/fix/parallel.d.ts +69 -0
  115. package/dist/fix/parallel.d.ts.map +1 -0
  116. package/dist/fix/parallel.js +203 -0
  117. package/dist/fix/parallel.js.map +1 -0
  118. package/dist/fix/report.d.ts +40 -0
  119. package/dist/fix/report.d.ts.map +1 -0
  120. package/dist/fix/report.js +212 -0
  121. package/dist/fix/report.js.map +1 -0
  122. package/dist/fix/strategy.d.ts +53 -0
  123. package/dist/fix/strategy.d.ts.map +1 -0
  124. package/dist/fix/strategy.js +143 -0
  125. package/dist/fix/strategy.js.map +1 -0
  126. package/dist/fix/templates.d.ts +58 -0
  127. package/dist/fix/templates.d.ts.map +1 -0
  128. package/dist/fix/templates.js +259 -0
  129. package/dist/fix/templates.js.map +1 -0
  130. package/dist/fix/testing.d.ts +68 -0
  131. package/dist/fix/testing.d.ts.map +1 -0
  132. package/dist/fix/testing.js +245 -0
  133. package/dist/fix/testing.js.map +1 -0
  134. package/dist/fix/validation.d.ts +71 -0
  135. package/dist/fix/validation.d.ts.map +1 -0
  136. package/dist/fix/validation.js +267 -0
  137. package/dist/fix/validation.js.map +1 -0
  138. package/dist/fix/visualization.d.ts +73 -0
  139. package/dist/fix/visualization.d.ts.map +1 -0
  140. package/dist/fix/visualization.js +243 -0
  141. package/dist/fix/visualization.js.map +1 -0
  142. package/dist/formatters/sarif-enhanced.d.ts.map +1 -1
  143. package/dist/formatters/sarif-enhanced.js +15 -7
  144. package/dist/formatters/sarif-enhanced.js.map +1 -1
  145. package/dist/formatters/sarif-v2.d.ts.map +1 -1
  146. package/dist/formatters/sarif-v2.js +82 -46
  147. package/dist/formatters/sarif-v2.js.map +1 -1
  148. package/dist/formatters/sarif.d.ts.map +1 -1
  149. package/dist/formatters/sarif.js +49 -22
  150. package/dist/formatters/sarif.js.map +1 -1
  151. package/dist/index.js +2544 -410
  152. package/dist/index.js.map +1 -1
  153. package/dist/init/ci-generator.d.ts.map +1 -1
  154. package/dist/init/ci-generator.js +186 -180
  155. package/dist/init/ci-generator.js.map +1 -1
  156. package/dist/init/detect-framework.d.ts.map +1 -1
  157. package/dist/init/detect-framework.js +19 -9
  158. package/dist/init/detect-framework.js.map +1 -1
  159. package/dist/init/hooks-installer.d.ts.map +1 -1
  160. package/dist/init/hooks-installer.js +74 -65
  161. package/dist/init/hooks-installer.js.map +1 -1
  162. package/dist/init/index.d.ts +3 -3
  163. package/dist/init/index.d.ts.map +1 -1
  164. package/dist/init/index.js.map +1 -1
  165. package/dist/init/templates.d.ts +10 -10
  166. package/dist/init/templates.d.ts.map +1 -1
  167. package/dist/init/templates.js +9 -4
  168. package/dist/init/templates.js.map +1 -1
  169. package/dist/reality/reality-runner.d.ts.map +1 -1
  170. package/dist/reality/reality-runner.js +23 -7
  171. package/dist/reality/reality-runner.js.map +1 -1
  172. package/dist/runtime/auth-utils.d.ts.map +1 -1
  173. package/dist/runtime/auth-utils.js.map +1 -1
  174. package/dist/runtime/cli-errors.d.ts +38 -0
  175. package/dist/runtime/cli-errors.d.ts.map +1 -0
  176. package/dist/runtime/cli-errors.js +354 -0
  177. package/dist/runtime/cli-errors.js.map +1 -0
  178. package/dist/runtime/client.d.ts.map +1 -1
  179. package/dist/runtime/client.js +27 -10
  180. package/dist/runtime/client.js.map +1 -1
  181. package/dist/runtime/creds.d.ts +5 -0
  182. package/dist/runtime/creds.d.ts.map +1 -1
  183. package/dist/runtime/creds.js +6 -1
  184. package/dist/runtime/creds.js.map +1 -1
  185. package/dist/runtime/exit-codes.d.ts +32 -4
  186. package/dist/runtime/exit-codes.d.ts.map +1 -1
  187. package/dist/runtime/exit-codes.js +42 -14
  188. package/dist/runtime/exit-codes.js.map +1 -1
  189. package/dist/runtime/owner-mode.d.ts +48 -0
  190. package/dist/runtime/owner-mode.d.ts.map +1 -0
  191. package/dist/runtime/owner-mode.js +284 -0
  192. package/dist/runtime/owner-mode.js.map +1 -0
  193. package/dist/runtime/semver.d.ts.map +1 -1
  194. package/dist/runtime/semver.js +5 -2
  195. package/dist/runtime/semver.js.map +1 -1
  196. package/dist/scanner/baseline.d.ts.map +1 -1
  197. package/dist/scanner/baseline.js +3 -3
  198. package/dist/scanner/baseline.js.map +1 -1
  199. package/dist/scanner/incremental.d.ts.map +1 -1
  200. package/dist/scanner/incremental.js +3 -3
  201. package/dist/scanner/incremental.js.map +1 -1
  202. package/dist/scanner/index.d.ts +8 -0
  203. package/dist/scanner/index.d.ts.map +1 -0
  204. package/dist/scanner/index.js +15 -0
  205. package/dist/scanner/index.js.map +1 -0
  206. package/dist/scanner/parallel.d.ts.map +1 -1
  207. package/dist/scanner/parallel.js +29 -8
  208. package/dist/scanner/parallel.js.map +1 -1
  209. package/dist/scanner/placeholder-detector.d.ts +56 -0
  210. package/dist/scanner/placeholder-detector.d.ts.map +1 -0
  211. package/dist/scanner/placeholder-detector.js +220 -0
  212. package/dist/scanner/placeholder-detector.js.map +1 -0
  213. package/dist/scanner/route-detector.d.ts +100 -0
  214. package/dist/scanner/route-detector.d.ts.map +1 -0
  215. package/dist/scanner/route-detector.js +455 -0
  216. package/dist/scanner/route-detector.js.map +1 -0
  217. package/dist/scanner/scoring.d.ts +67 -0
  218. package/dist/scanner/scoring.d.ts.map +1 -0
  219. package/dist/scanner/scoring.js +284 -0
  220. package/dist/scanner/scoring.js.map +1 -0
  221. package/dist/ship-baseline.d.ts +56 -0
  222. package/dist/ship-baseline.d.ts.map +1 -0
  223. package/dist/ship-baseline.js +194 -0
  224. package/dist/ship-baseline.js.map +1 -0
  225. package/dist/ship-config.d.ts +91 -0
  226. package/dist/ship-config.d.ts.map +1 -0
  227. package/dist/ship-config.js +133 -0
  228. package/dist/ship-config.js.map +1 -0
  229. package/dist/ship-data-loader.d.ts +70 -0
  230. package/dist/ship-data-loader.d.ts.map +1 -0
  231. package/dist/ship-data-loader.js +301 -0
  232. package/dist/ship-data-loader.js.map +1 -0
  233. package/dist/ui/frame.d.ts.map +1 -1
  234. package/dist/ui/frame.js +3 -1
  235. package/dist/ui/frame.js.map +1 -1
  236. package/dist/utils/ai-helpers.d.ts +72 -0
  237. package/dist/utils/ai-helpers.d.ts.map +1 -0
  238. package/dist/utils/ai-helpers.js +339 -0
  239. package/dist/utils/ai-helpers.js.map +1 -0
  240. package/dist/utils/validation.d.ts +34 -0
  241. package/dist/utils/validation.d.ts.map +1 -0
  242. package/dist/utils/validation.js +160 -0
  243. package/dist/utils/validation.js.map +1 -0
  244. package/package.json +3 -2
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ /**
3
+ * Route Detector for Client-Side Routers
4
+ *
5
+ * Detects routes in various routing frameworks:
6
+ * - Next.js/Remix (file-based routing)
7
+ * - React Router (component-based)
8
+ * - Wouter (lightweight router)
9
+ * - Generic route inference mode
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.RouteDetector = void 0;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ class RouteDetector {
49
+ constructor(config) {
50
+ this.config = config;
51
+ }
52
+ /**
53
+ * Detect routes in the project
54
+ */
55
+ async detectRoutes() {
56
+ // Try framework-specific detection first
57
+ const frameworkResult = await this.detectFrameworkRoutes();
58
+ if (frameworkResult.routes.length > 0) {
59
+ return frameworkResult;
60
+ }
61
+ // Fall back to generic route inference
62
+ const genericResult = await this.detectGenericRoutes();
63
+ if (genericResult.routes.length > 0) {
64
+ return genericResult;
65
+ }
66
+ // If we still have no routes, check for route hints
67
+ if (this.config.routeHints && this.config.routeHints.length > 0) {
68
+ return {
69
+ routes: this.config.routeHints.map((hint) => ({
70
+ path: hint.path,
71
+ file: hint.file,
72
+ source: 'config',
73
+ })),
74
+ framework: this.config.framework || 'unknown',
75
+ confidence: 'medium',
76
+ message: 'Routes detected from configuration hints',
77
+ };
78
+ }
79
+ // No routes found - provide helpful message
80
+ return {
81
+ routes: [],
82
+ framework: this.config.framework || 'unknown',
83
+ confidence: 'low',
84
+ message: 'Route system not recognized. Enable route hints in .guardrailrc',
85
+ hints: [
86
+ 'Add route hints to .guardrailrc configuration file',
87
+ 'Example config: { "routes": [{ "path": "/home", "file": "src/pages/home.tsx" }] }',
88
+ 'Or use framework-specific route detection for Next.js, Remix, React Router, or Wouter',
89
+ ],
90
+ };
91
+ }
92
+ /**
93
+ * Detect routes based on detected framework
94
+ */
95
+ async detectFrameworkRoutes() {
96
+ const framework = this.config.framework?.toLowerCase() || '';
97
+ if (framework.includes('next')) {
98
+ return this.detectNextJSRoutes();
99
+ }
100
+ if (framework.includes('remix')) {
101
+ return this.detectRemixRoutes();
102
+ }
103
+ // React Router or Wouter - detect component-based routes
104
+ const componentResult = await this.detectComponentRoutes();
105
+ if (componentResult.routes.length > 0) {
106
+ return componentResult;
107
+ }
108
+ return {
109
+ routes: [],
110
+ framework: framework || 'unknown',
111
+ confidence: 'low',
112
+ };
113
+ }
114
+ /**
115
+ * Detect Next.js file-based routes
116
+ */
117
+ async detectNextJSRoutes() {
118
+ const routes = [];
119
+ const pagesDir = path.join(this.config.projectPath, 'pages');
120
+ const appDir = path.join(this.config.projectPath, 'app');
121
+ if (fs.existsSync(pagesDir)) {
122
+ // Next.js pages router
123
+ const pages = await this.findRouteFiles(pagesDir);
124
+ routes.push(...pages);
125
+ }
126
+ else if (fs.existsSync(appDir)) {
127
+ // Next.js app router
128
+ const pages = await this.findRouteFiles(appDir);
129
+ routes.push(...pages);
130
+ }
131
+ return {
132
+ routes,
133
+ framework: 'nextjs',
134
+ confidence: routes.length > 0 ? 'high' : 'low',
135
+ };
136
+ }
137
+ /**
138
+ * Detect Remix routes
139
+ */
140
+ async detectRemixRoutes() {
141
+ const routes = [];
142
+ const routesDir = path.join(this.config.projectPath, 'app', 'routes');
143
+ if (fs.existsSync(routesDir)) {
144
+ const files = await this.findRouteFiles(routesDir);
145
+ routes.push(...files);
146
+ }
147
+ return {
148
+ routes,
149
+ framework: 'remix',
150
+ confidence: routes.length > 0 ? 'high' : 'low',
151
+ };
152
+ }
153
+ /**
154
+ * Detect component-based routes (React Router, Wouter)
155
+ */
156
+ async detectComponentRoutes() {
157
+ const routes = [];
158
+ const srcFiles = await this.findSourceFiles(this.config.projectPath);
159
+ // Patterns for React Router
160
+ const reactRouterPatterns = [
161
+ /<Route\s+path=["']([^"']+)["']/gi,
162
+ /path:\s*["']([^"']+)["']/gi,
163
+ /route\(["']([^"']+)["']/gi,
164
+ ];
165
+ // Patterns for Wouter
166
+ const wouterPatterns = [
167
+ /<Route\s+path=["']([^"']+)["']/gi,
168
+ /route\(["']([^"']+)["']/gi,
169
+ /useRoute\(["']([^"']+)["']/gi,
170
+ ];
171
+ for (const file of srcFiles.slice(0, 100)) {
172
+ // Limit for performance
173
+ try {
174
+ const content = await fs.promises.readFile(file, 'utf-8');
175
+ const lines = content.split('\n');
176
+ // Check for React Router patterns
177
+ for (let i = 0; i < lines.length; i++) {
178
+ const line = lines[i];
179
+ for (const pattern of [...reactRouterPatterns, ...wouterPatterns]) {
180
+ let match;
181
+ pattern.lastIndex = 0;
182
+ while ((match = pattern.exec(line)) !== null) {
183
+ const routePath = match[1];
184
+ if (routePath) {
185
+ routes.push({
186
+ path: routePath,
187
+ file: path.relative(this.config.projectPath, file),
188
+ line: i + 1,
189
+ source: 'component',
190
+ dynamic: routePath.includes(':') || routePath.includes('*'),
191
+ params: this.extractRouteParams(routePath),
192
+ });
193
+ }
194
+ }
195
+ }
196
+ }
197
+ // Check for route arrays/configs
198
+ const routeArrayMatch = content.match(/routes\s*[:=]\s*\[([\s\S]*?)\]/);
199
+ if (routeArrayMatch) {
200
+ const routeConfigs = this.parseRouteArray(routeArrayMatch[1]);
201
+ for (const routeConfig of routeConfigs) {
202
+ routes.push({
203
+ ...routeConfig,
204
+ file: path.relative(this.config.projectPath, file),
205
+ source: 'config',
206
+ });
207
+ }
208
+ }
209
+ }
210
+ catch (e) {
211
+ // Skip unreadable files
212
+ }
213
+ }
214
+ // Determine framework based on imports
215
+ const framework = await this.detectRouterFramework();
216
+ return {
217
+ routes: this.deduplicateRoutes(routes),
218
+ framework: framework || 'react-router',
219
+ confidence: routes.length > 0 ? 'medium' : 'low',
220
+ };
221
+ }
222
+ /**
223
+ * Generic route inference mode
224
+ */
225
+ async detectGenericRoutes() {
226
+ const routes = [];
227
+ const srcFiles = await this.findSourceFiles(this.config.projectPath);
228
+ // Look for common route patterns
229
+ const routePatterns = [
230
+ /path\s*[:=]\s*["']([^"']+)["']/gi,
231
+ /route\s*[:=]\s*["']([^"']+)["']/gi,
232
+ /["']([\/][^"']+)["']/g, // Path-like strings starting with /
233
+ ];
234
+ for (const file of srcFiles.slice(0, 50)) {
235
+ // Limit for performance
236
+ try {
237
+ const content = await fs.promises.readFile(file, 'utf-8');
238
+ const lines = content.split('\n');
239
+ for (let i = 0; i < lines.length; i++) {
240
+ const line = lines[i];
241
+ for (const pattern of routePatterns) {
242
+ let match;
243
+ pattern.lastIndex = 0;
244
+ while ((match = pattern.exec(line)) !== null) {
245
+ const candidate = match[1];
246
+ if (this.looksLikeRoute(candidate)) {
247
+ routes.push({
248
+ path: candidate,
249
+ file: path.relative(this.config.projectPath, file),
250
+ line: i + 1,
251
+ source: 'inferred',
252
+ dynamic: candidate.includes(':'),
253
+ });
254
+ }
255
+ }
256
+ }
257
+ }
258
+ }
259
+ catch (e) {
260
+ // Skip unreadable files
261
+ }
262
+ }
263
+ return {
264
+ routes: this.deduplicateRoutes(routes),
265
+ framework: 'generic',
266
+ confidence: 'low',
267
+ };
268
+ }
269
+ /**
270
+ * Detect router framework from dependencies
271
+ */
272
+ async detectRouterFramework() {
273
+ const packageJsonPath = path.join(this.config.projectPath, 'package.json');
274
+ if (!fs.existsSync(packageJsonPath))
275
+ return null;
276
+ try {
277
+ const packageJson = JSON.parse(await fs.promises.readFile(packageJsonPath, 'utf-8'));
278
+ const deps = {
279
+ ...packageJson.dependencies,
280
+ ...packageJson.devDependencies,
281
+ };
282
+ if (deps.wouter)
283
+ return 'wouter';
284
+ if (deps['react-router'] || deps['react-router-dom']) {
285
+ return 'react-router';
286
+ }
287
+ if (deps.next)
288
+ return 'nextjs';
289
+ if (deps.remix)
290
+ return 'remix';
291
+ }
292
+ catch (e) {
293
+ // Ignore
294
+ }
295
+ return null;
296
+ }
297
+ /**
298
+ * Check if a string looks like a route path
299
+ */
300
+ looksLikeRoute(candidate) {
301
+ // Must start with / and be reasonable length
302
+ if (!candidate.startsWith('/') || candidate.length < 2)
303
+ return false;
304
+ // Common non-route patterns to exclude
305
+ const excludePatterns = [
306
+ /^\/node_modules\//,
307
+ /^\/\./,
308
+ /\.(js|ts|tsx|jsx|json|md|css)$/,
309
+ /^\/src\//,
310
+ /^\/public\//,
311
+ ];
312
+ return !excludePatterns.some((pattern) => pattern.test(candidate));
313
+ }
314
+ /**
315
+ * Extract route parameters from path
316
+ */
317
+ extractRouteParams(routePath) {
318
+ const params = [];
319
+ const paramPattern = /:(\w+)/g;
320
+ let match;
321
+ while ((match = paramPattern.exec(routePath)) !== null) {
322
+ params.push(match[1]);
323
+ }
324
+ return params;
325
+ }
326
+ /**
327
+ * Parse route array from config
328
+ */
329
+ parseRouteArray(content) {
330
+ const routes = [];
331
+ // Simple parsing - look for path: "..." patterns
332
+ const pathPattern = /path\s*:\s*["']([^"']+)["']/gi;
333
+ let match;
334
+ while ((match = pathPattern.exec(content)) !== null) {
335
+ routes.push({
336
+ path: match[1],
337
+ source: 'config',
338
+ dynamic: match[1].includes(':'),
339
+ });
340
+ }
341
+ return routes;
342
+ }
343
+ /**
344
+ * Find route files in directory (for file-based routing)
345
+ */
346
+ async findRouteFiles(dir) {
347
+ const routes = [];
348
+ const files = await this.getAllFiles(dir);
349
+ for (const file of files) {
350
+ const relativePath = path.relative(dir, file);
351
+ const routePath = this.filePathToRoute(relativePath);
352
+ if (routePath) {
353
+ routes.push({
354
+ path: routePath,
355
+ file: path.relative(this.config.projectPath, file),
356
+ source: 'file_based',
357
+ dynamic: routePath.includes('[') || routePath.includes(':'),
358
+ });
359
+ }
360
+ }
361
+ return routes;
362
+ }
363
+ /**
364
+ * Convert file path to route path
365
+ */
366
+ filePathToRoute(filePath) {
367
+ // Remove extension
368
+ let route = filePath.replace(/\.[^/.]+$/, '');
369
+ // Handle index files
370
+ if (route.endsWith('/index')) {
371
+ route = route.slice(0, -6);
372
+ }
373
+ // Handle Next.js dynamic routes [id].tsx -> /:id
374
+ route = route.replace(/\[([^\]]+)\]/g, ':$1');
375
+ // Must start with /
376
+ if (!route.startsWith('/')) {
377
+ route = '/' + route;
378
+ }
379
+ return route || '/';
380
+ }
381
+ /**
382
+ * Find all source files in project
383
+ */
384
+ async findSourceFiles(dir) {
385
+ const files = [];
386
+ const extensions = ['.ts', '.tsx', '.js', '.jsx'];
387
+ try {
388
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
389
+ for (const entry of entries) {
390
+ const fullPath = path.join(dir, entry.name);
391
+ // Skip node_modules, .git, etc.
392
+ if (entry.name.startsWith('.') ||
393
+ entry.name === 'node_modules' ||
394
+ entry.name === 'dist' ||
395
+ entry.name === 'build') {
396
+ continue;
397
+ }
398
+ if (entry.isDirectory()) {
399
+ const subFiles = await this.findSourceFiles(fullPath);
400
+ files.push(...subFiles);
401
+ }
402
+ else if (entry.isFile()) {
403
+ const ext = path.extname(entry.name);
404
+ if (extensions.includes(ext)) {
405
+ files.push(fullPath);
406
+ }
407
+ }
408
+ }
409
+ }
410
+ catch (e) {
411
+ // Skip unreadable directories
412
+ }
413
+ return files;
414
+ }
415
+ /**
416
+ * Get all files recursively
417
+ */
418
+ async getAllFiles(dir) {
419
+ const files = [];
420
+ try {
421
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
422
+ for (const entry of entries) {
423
+ const fullPath = path.join(dir, entry.name);
424
+ if (entry.isDirectory()) {
425
+ const subFiles = await this.getAllFiles(fullPath);
426
+ files.push(...subFiles);
427
+ }
428
+ else if (entry.isFile()) {
429
+ files.push(fullPath);
430
+ }
431
+ }
432
+ }
433
+ catch (e) {
434
+ // Skip unreadable directories
435
+ }
436
+ return files;
437
+ }
438
+ /**
439
+ * Deduplicate routes
440
+ */
441
+ deduplicateRoutes(routes) {
442
+ const seen = new Set();
443
+ const unique = [];
444
+ for (const route of routes) {
445
+ const key = `${route.path}:${route.file || ''}`;
446
+ if (!seen.has(key)) {
447
+ seen.add(key);
448
+ unique.push(route);
449
+ }
450
+ }
451
+ return unique;
452
+ }
453
+ }
454
+ exports.RouteDetector = RouteDetector;
455
+ //# sourceMappingURL=route-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-detector.js","sourceRoot":"","sources":["../../src/scanner/route-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Improved Scoring System
3
+ *
4
+ * Separates score components for better transparency:
5
+ * - Integrity score (routes, links, 404s)
6
+ * - Production readiness (placeholders, mocks, TODOs)
7
+ * - Security score (secrets, vulnerabilities)
8
+ *
9
+ * Provides weighted final score that's less punitive
10
+ */
11
+ export interface ScoreComponent {
12
+ name: string;
13
+ score: number;
14
+ maxScore: number;
15
+ weight: number;
16
+ details: {
17
+ label: string;
18
+ value: number;
19
+ impact: number;
20
+ }[];
21
+ }
22
+ export interface ScoringResult {
23
+ integrity: ScoreComponent;
24
+ productionReadiness: ScoreComponent;
25
+ security: ScoreComponent;
26
+ overall: {
27
+ score: number;
28
+ maxScore: number;
29
+ percentage: number;
30
+ grade: string;
31
+ };
32
+ breakdown: {
33
+ category: string;
34
+ score: number;
35
+ weight: number;
36
+ weightedScore: number;
37
+ }[];
38
+ }
39
+ export interface ScoringInputs {
40
+ integrity?: {
41
+ routes?: number;
42
+ deadLinks?: number;
43
+ orphanRoutes?: number;
44
+ runtime404s?: number;
45
+ unresolvedDynamic?: number;
46
+ };
47
+ productionReadiness?: {
48
+ placeholders?: number;
49
+ mocks?: number;
50
+ todos?: number;
51
+ testData?: number;
52
+ };
53
+ security?: {
54
+ secrets?: number;
55
+ vulnerabilities?: number;
56
+ complianceIssues?: number;
57
+ };
58
+ }
59
+ /**
60
+ * Calculate comprehensive score
61
+ */
62
+ export declare function calculateScore(inputs: ScoringInputs): ScoringResult;
63
+ /**
64
+ * Format score as text
65
+ */
66
+ export declare function formatScoreAsText(result: ScoringResult): string;
67
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/scanner/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,cAAc,CAAC;IAC1B,mBAAmB,EAAE,cAAc,CAAC;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,mBAAmB,CAAC,EAAE;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AA2ND;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CA+CnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA0D/D"}