vibecheck-ai 2.0.2 → 5.0.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 (456) hide show
  1. package/bin/.generated +25 -0
  2. package/bin/_deprecations.js +463 -0
  3. package/bin/_router.js +46 -0
  4. package/bin/cli-hygiene.js +241 -0
  5. package/bin/dev/run-v2-torture.js +30 -0
  6. package/bin/registry.js +656 -0
  7. package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
  8. package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
  9. package/bin/runners/REPORT_AUDIT.md +64 -0
  10. package/bin/runners/cli-utils.js +1070 -0
  11. package/bin/runners/context/ai-task-decomposer.js +337 -0
  12. package/bin/runners/context/analyzer.js +513 -0
  13. package/bin/runners/context/api-contracts.js +427 -0
  14. package/bin/runners/context/context-diff.js +342 -0
  15. package/bin/runners/context/context-pruner.js +291 -0
  16. package/bin/runners/context/dependency-graph.js +414 -0
  17. package/bin/runners/context/generators/claude.js +107 -0
  18. package/bin/runners/context/generators/codex.js +108 -0
  19. package/bin/runners/context/generators/copilot.js +119 -0
  20. package/bin/runners/context/generators/cursor-enhanced.js +2525 -0
  21. package/bin/runners/context/generators/cursor.js +514 -0
  22. package/bin/runners/context/generators/mcp.js +169 -0
  23. package/bin/runners/context/generators/windsurf.js +180 -0
  24. package/bin/runners/context/git-context.js +304 -0
  25. package/bin/runners/context/index.js +1110 -0
  26. package/bin/runners/context/insights.js +173 -0
  27. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  28. package/bin/runners/context/mcp-server/index.js +1176 -0
  29. package/bin/runners/context/mcp-server/package.json +24 -0
  30. package/bin/runners/context/memory.js +200 -0
  31. package/bin/runners/context/monorepo.js +215 -0
  32. package/bin/runners/context/multi-repo-federation.js +404 -0
  33. package/bin/runners/context/patterns.js +253 -0
  34. package/bin/runners/context/proof-context.js +1264 -0
  35. package/bin/runners/context/security-scanner.js +541 -0
  36. package/bin/runners/context/semantic-search.js +350 -0
  37. package/bin/runners/context/shared.js +264 -0
  38. package/bin/runners/context/team-conventions.js +336 -0
  39. package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
  40. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
  41. package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
  42. package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
  43. package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
  44. package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
  45. package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
  46. package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
  47. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  48. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  49. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  50. package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
  51. package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
  52. package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
  53. package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
  54. package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
  55. package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
  56. package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
  57. package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
  58. package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
  59. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
  60. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
  61. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
  62. package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
  63. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
  64. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
  65. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
  66. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
  67. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
  68. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
  69. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
  70. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
  71. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
  72. package/bin/runners/lib/agent-firewall/index.js +200 -0
  73. package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
  74. package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
  75. package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
  76. package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
  77. package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
  78. package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
  79. package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
  80. package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
  81. package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
  82. package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
  83. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
  84. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
  85. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
  86. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  87. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  88. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  89. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  90. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  91. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  92. package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
  93. package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
  94. package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
  95. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
  96. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
  97. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
  98. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
  99. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
  100. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
  101. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
  102. package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
  103. package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
  104. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  105. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  106. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  107. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  108. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  109. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  110. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  111. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  112. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  113. package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
  114. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  115. package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
  116. package/bin/runners/lib/agent-firewall/session/index.js +26 -0
  117. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  118. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  119. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  120. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  121. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  122. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  123. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  124. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  125. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  126. package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
  127. package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
  128. package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
  129. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
  130. package/bin/runners/lib/ai-bridge.js +416 -0
  131. package/bin/runners/lib/analysis-core.js +309 -0
  132. package/bin/runners/lib/analyzers.js +2500 -0
  133. package/bin/runners/lib/api-client.js +269 -0
  134. package/bin/runners/lib/approve-output.js +235 -0
  135. package/bin/runners/lib/artifact-envelope.js +540 -0
  136. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  137. package/bin/runners/lib/audit-bridge.js +391 -0
  138. package/bin/runners/lib/auth-shared.js +977 -0
  139. package/bin/runners/lib/auth-truth.js +193 -0
  140. package/bin/runners/lib/auth.js +215 -0
  141. package/bin/runners/lib/authority-badge.js +425 -0
  142. package/bin/runners/lib/backup.js +62 -0
  143. package/bin/runners/lib/billing.js +107 -0
  144. package/bin/runners/lib/checkpoint.js +941 -0
  145. package/bin/runners/lib/claims.js +118 -0
  146. package/bin/runners/lib/classify-output.js +204 -0
  147. package/bin/runners/lib/cleanup/engine.js +571 -0
  148. package/bin/runners/lib/cleanup/index.js +53 -0
  149. package/bin/runners/lib/cleanup/output.js +375 -0
  150. package/bin/runners/lib/cleanup/rules.js +1060 -0
  151. package/bin/runners/lib/cli-output.js +400 -0
  152. package/bin/runners/lib/cli-ui.js +540 -0
  153. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  154. package/bin/runners/lib/compliance-bridge.js +165 -0
  155. package/bin/runners/lib/contracts/auth-contract.js +202 -0
  156. package/bin/runners/lib/contracts/env-contract.js +181 -0
  157. package/bin/runners/lib/contracts/external-contract.js +206 -0
  158. package/bin/runners/lib/contracts/guard.js +168 -0
  159. package/bin/runners/lib/contracts/index.js +89 -0
  160. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  161. package/bin/runners/lib/contracts/route-contract.js +199 -0
  162. package/bin/runners/lib/contracts.js +804 -0
  163. package/bin/runners/lib/default-config.js +127 -0
  164. package/bin/runners/lib/detect.js +89 -0
  165. package/bin/runners/lib/detectors-v2.js +622 -0
  166. package/bin/runners/lib/doctor/autofix.js +254 -0
  167. package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
  168. package/bin/runners/lib/doctor/failure-signatures.js +526 -0
  169. package/bin/runners/lib/doctor/fix-script.js +336 -0
  170. package/bin/runners/lib/doctor/index.js +37 -0
  171. package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
  172. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  173. package/bin/runners/lib/doctor/modules/index.js +105 -0
  174. package/bin/runners/lib/doctor/modules/network.js +250 -0
  175. package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
  176. package/bin/runners/lib/doctor/modules/project.js +312 -0
  177. package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
  178. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  179. package/bin/runners/lib/doctor/modules/security.js +350 -0
  180. package/bin/runners/lib/doctor/modules/system.js +213 -0
  181. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  182. package/bin/runners/lib/doctor/reporter.js +262 -0
  183. package/bin/runners/lib/doctor/safe-repair.js +384 -0
  184. package/bin/runners/lib/doctor/service.js +262 -0
  185. package/bin/runners/lib/doctor/types.js +113 -0
  186. package/bin/runners/lib/doctor/ui.js +263 -0
  187. package/bin/runners/lib/doctor-enhanced.js +233 -0
  188. package/bin/runners/lib/doctor-output.js +226 -0
  189. package/bin/runners/lib/doctor-v2.js +608 -0
  190. package/bin/runners/lib/drift.js +425 -0
  191. package/bin/runners/lib/enforcement.js +72 -0
  192. package/bin/runners/lib/engine/ast-cache.js +210 -0
  193. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  194. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  195. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  196. package/bin/runners/lib/engine/env-extractor.js +207 -0
  197. package/bin/runners/lib/engine/express-extractor.js +208 -0
  198. package/bin/runners/lib/engine/extractors.js +849 -0
  199. package/bin/runners/lib/engine/index.js +207 -0
  200. package/bin/runners/lib/engine/repo-index.js +514 -0
  201. package/bin/runners/lib/engine/types.js +124 -0
  202. package/bin/runners/lib/engines/accessibility-engine.js +190 -0
  203. package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
  204. package/bin/runners/lib/engines/ast-cache.js +99 -0
  205. package/bin/runners/lib/engines/attack-detector.js +1192 -0
  206. package/bin/runners/lib/engines/code-quality-engine.js +255 -0
  207. package/bin/runners/lib/engines/console-logs-engine.js +115 -0
  208. package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
  209. package/bin/runners/lib/engines/dead-code-engine.js +198 -0
  210. package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
  211. package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
  212. package/bin/runners/lib/engines/file-filter.js +131 -0
  213. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
  214. package/bin/runners/lib/engines/mock-data-engine.js +272 -0
  215. package/bin/runners/lib/engines/parallel-processor.js +71 -0
  216. package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
  217. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
  218. package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
  219. package/bin/runners/lib/engines/type-aware-engine.js +152 -0
  220. package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
  221. package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
  222. package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
  223. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  224. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  225. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  226. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  227. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  228. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  229. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  230. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
  231. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  232. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  233. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  234. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  235. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  236. package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
  237. package/bin/runners/lib/enterprise-detect.js +603 -0
  238. package/bin/runners/lib/enterprise-init.js +942 -0
  239. package/bin/runners/lib/entitlements-v2.js +265 -0
  240. package/bin/runners/lib/entitlements.generated.js +0 -0
  241. package/bin/runners/lib/entitlements.js +340 -0
  242. package/bin/runners/lib/env-resolver.js +417 -0
  243. package/bin/runners/lib/env-template.js +66 -0
  244. package/bin/runners/lib/env.js +189 -0
  245. package/bin/runners/lib/error-handler.js +368 -0
  246. package/bin/runners/lib/error-messages.js +289 -0
  247. package/bin/runners/lib/evidence-pack.js +684 -0
  248. package/bin/runners/lib/exit-codes.js +275 -0
  249. package/bin/runners/lib/extractors/client-calls.js +990 -0
  250. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  251. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  252. package/bin/runners/lib/extractors/index.js +363 -0
  253. package/bin/runners/lib/extractors/next-routes.js +524 -0
  254. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  255. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  256. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  257. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  258. package/bin/runners/lib/finding-id.js +69 -0
  259. package/bin/runners/lib/finding-sorter.js +89 -0
  260. package/bin/runners/lib/findings-schema.js +281 -0
  261. package/bin/runners/lib/fingerprint.js +377 -0
  262. package/bin/runners/lib/firewall-prompt.js +50 -0
  263. package/bin/runners/lib/fix-output.js +228 -0
  264. package/bin/runners/lib/global-flags.js +250 -0
  265. package/bin/runners/lib/graph/graph-builder.js +265 -0
  266. package/bin/runners/lib/graph/html-renderer.js +413 -0
  267. package/bin/runners/lib/graph/index.js +32 -0
  268. package/bin/runners/lib/graph/runtime-collector.js +215 -0
  269. package/bin/runners/lib/graph/static-extractor.js +518 -0
  270. package/bin/runners/lib/help-formatter.js +413 -0
  271. package/bin/runners/lib/html-proof-report.js +913 -0
  272. package/bin/runners/lib/html-report.js +650 -0
  273. package/bin/runners/lib/init-wizard.js +601 -0
  274. package/bin/runners/lib/interactive-menu.js +1496 -0
  275. package/bin/runners/lib/json-output.js +76 -0
  276. package/bin/runners/lib/llm.js +75 -0
  277. package/bin/runners/lib/logger.js +38 -0
  278. package/bin/runners/lib/meter.js +61 -0
  279. package/bin/runners/lib/missions/briefing.js +427 -0
  280. package/bin/runners/lib/missions/checkpoint.js +753 -0
  281. package/bin/runners/lib/missions/evidence.js +126 -0
  282. package/bin/runners/lib/missions/hardening.js +851 -0
  283. package/bin/runners/lib/missions/plan.js +648 -0
  284. package/bin/runners/lib/missions/safety-gates.js +645 -0
  285. package/bin/runners/lib/missions/schema.js +478 -0
  286. package/bin/runners/lib/missions/templates.js +317 -0
  287. package/bin/runners/lib/next-action.js +560 -0
  288. package/bin/runners/lib/packs/bundle.js +675 -0
  289. package/bin/runners/lib/packs/evidence-pack.js +671 -0
  290. package/bin/runners/lib/packs/pack-factory.js +837 -0
  291. package/bin/runners/lib/packs/permissions-pack.js +686 -0
  292. package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
  293. package/bin/runners/lib/patch.js +40 -0
  294. package/bin/runners/lib/permissions/auth-model.js +213 -0
  295. package/bin/runners/lib/permissions/idor-prover.js +205 -0
  296. package/bin/runners/lib/permissions/index.js +45 -0
  297. package/bin/runners/lib/permissions/matrix-builder.js +198 -0
  298. package/bin/runners/lib/pkgjson.js +28 -0
  299. package/bin/runners/lib/policy.js +295 -0
  300. package/bin/runners/lib/polish/accessibility.js +62 -0
  301. package/bin/runners/lib/polish/analyzer.js +93 -0
  302. package/bin/runners/lib/polish/backend.js +87 -0
  303. package/bin/runners/lib/polish/configuration.js +83 -0
  304. package/bin/runners/lib/polish/documentation.js +83 -0
  305. package/bin/runners/lib/polish/frontend.js +817 -0
  306. package/bin/runners/lib/polish/index.js +27 -0
  307. package/bin/runners/lib/polish/infrastructure.js +80 -0
  308. package/bin/runners/lib/polish/internationalization.js +85 -0
  309. package/bin/runners/lib/polish/libraries.js +180 -0
  310. package/bin/runners/lib/polish/observability.js +75 -0
  311. package/bin/runners/lib/polish/performance.js +64 -0
  312. package/bin/runners/lib/polish/privacy.js +110 -0
  313. package/bin/runners/lib/polish/resilience.js +92 -0
  314. package/bin/runners/lib/polish/security.js +78 -0
  315. package/bin/runners/lib/polish/seo.js +71 -0
  316. package/bin/runners/lib/polish/styles.js +62 -0
  317. package/bin/runners/lib/polish/utils.js +104 -0
  318. package/bin/runners/lib/preflight.js +142 -0
  319. package/bin/runners/lib/prerequisites.js +149 -0
  320. package/bin/runners/lib/prove-output.js +220 -0
  321. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  322. package/bin/runners/lib/reality/index.js +318 -0
  323. package/bin/runners/lib/reality/request-hashing.js +416 -0
  324. package/bin/runners/lib/reality/request-mapper.js +453 -0
  325. package/bin/runners/lib/reality/safety-rails.js +463 -0
  326. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  327. package/bin/runners/lib/reality/toast-detector.js +393 -0
  328. package/bin/runners/lib/reality-findings.js +84 -0
  329. package/bin/runners/lib/reality-output.js +231 -0
  330. package/bin/runners/lib/receipts.js +179 -0
  331. package/bin/runners/lib/redact.js +29 -0
  332. package/bin/runners/lib/replay/capsule-manager.js +154 -0
  333. package/bin/runners/lib/replay/index.js +263 -0
  334. package/bin/runners/lib/replay/player.js +348 -0
  335. package/bin/runners/lib/replay/recorder.js +331 -0
  336. package/bin/runners/lib/report-engine.js +626 -0
  337. package/bin/runners/lib/report-html.js +1233 -0
  338. package/bin/runners/lib/report-output.js +366 -0
  339. package/bin/runners/lib/report-templates.js +967 -0
  340. package/bin/runners/lib/report.js +135 -0
  341. package/bin/runners/lib/route-detection.js +1209 -0
  342. package/bin/runners/lib/route-truth.js +1322 -0
  343. package/bin/runners/lib/safelist/index.js +96 -0
  344. package/bin/runners/lib/safelist/integration.js +334 -0
  345. package/bin/runners/lib/safelist/matcher.js +696 -0
  346. package/bin/runners/lib/safelist/schema.js +948 -0
  347. package/bin/runners/lib/safelist/store.js +438 -0
  348. package/bin/runners/lib/sandbox/index.js +59 -0
  349. package/bin/runners/lib/sandbox/proof-chain.js +399 -0
  350. package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
  351. package/bin/runners/lib/sandbox/worktree.js +174 -0
  352. package/bin/runners/lib/scan-cache.js +330 -0
  353. package/bin/runners/lib/scan-output-schema.js +344 -0
  354. package/bin/runners/lib/scan-output.js +631 -0
  355. package/bin/runners/lib/scan-runner.js +135 -0
  356. package/bin/runners/lib/schema-validator.js +350 -0
  357. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  358. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  359. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  360. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  361. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  362. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  363. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  364. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  365. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  366. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  367. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  368. package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
  369. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  370. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  371. package/bin/runners/lib/schemas/validator.js +465 -0
  372. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  373. package/bin/runners/lib/score-history.js +282 -0
  374. package/bin/runners/lib/security-bridge.js +249 -0
  375. package/bin/runners/lib/server-usage.js +513 -0
  376. package/bin/runners/lib/share-pack.js +239 -0
  377. package/bin/runners/lib/ship-gate.js +832 -0
  378. package/bin/runners/lib/ship-manifest.js +1153 -0
  379. package/bin/runners/lib/ship-output-enterprise.js +239 -0
  380. package/bin/runners/lib/ship-output.js +1128 -0
  381. package/bin/runners/lib/snippets.js +67 -0
  382. package/bin/runners/lib/status-output.js +340 -0
  383. package/bin/runners/lib/terminal-ui.js +356 -0
  384. package/bin/runners/lib/truth.js +1691 -0
  385. package/bin/runners/lib/ui.js +562 -0
  386. package/bin/runners/lib/unified-cli-output.js +947 -0
  387. package/bin/runners/lib/unified-output.js +197 -0
  388. package/bin/runners/lib/upsell.js +410 -0
  389. package/bin/runners/lib/usage.js +153 -0
  390. package/bin/runners/lib/validate-patch.js +156 -0
  391. package/bin/runners/lib/verdict-engine.js +628 -0
  392. package/bin/runners/lib/verification.js +345 -0
  393. package/bin/runners/lib/why-tree.js +650 -0
  394. package/bin/runners/reality/engine.js +917 -0
  395. package/bin/runners/reality/flows.js +122 -0
  396. package/bin/runners/reality/report.js +378 -0
  397. package/bin/runners/reality/session.js +193 -0
  398. package/bin/runners/runAIAgent.js +229 -0
  399. package/bin/runners/runAgent.d.ts +5 -0
  400. package/bin/runners/runAgent.js +161 -0
  401. package/bin/runners/runAllowlist.js +418 -0
  402. package/bin/runners/runApprove.js +320 -0
  403. package/bin/runners/runAudit.js +692 -0
  404. package/bin/runners/runAuth.js +731 -0
  405. package/bin/runners/runCI.js +353 -0
  406. package/bin/runners/runCheckpoint.js +530 -0
  407. package/bin/runners/runClassify.js +928 -0
  408. package/bin/runners/runCleanup.js +343 -0
  409. package/bin/runners/runContext.d.ts +4 -0
  410. package/bin/runners/runContext.js +175 -0
  411. package/bin/runners/runDoctor.js +877 -0
  412. package/bin/runners/runEvidencePack.js +362 -0
  413. package/bin/runners/runFirewall.d.ts +5 -0
  414. package/bin/runners/runFirewall.js +134 -0
  415. package/bin/runners/runFirewallHook.d.ts +5 -0
  416. package/bin/runners/runFirewallHook.js +56 -0
  417. package/bin/runners/runFix.js +1355 -0
  418. package/bin/runners/runForge.js +451 -0
  419. package/bin/runners/runGuard.js +262 -0
  420. package/bin/runners/runInit.js +1927 -0
  421. package/bin/runners/runIntent.js +906 -0
  422. package/bin/runners/runKickoff.js +878 -0
  423. package/bin/runners/runLabs.js +424 -0
  424. package/bin/runners/runLaunch.js +2000 -0
  425. package/bin/runners/runLink.js +785 -0
  426. package/bin/runners/runMcp.js +1875 -0
  427. package/bin/runners/runPacks.js +2089 -0
  428. package/bin/runners/runPolish.d.ts +4 -0
  429. package/bin/runners/runPolish.js +390 -0
  430. package/bin/runners/runPromptFirewall.js +211 -0
  431. package/bin/runners/runProve.js +1411 -0
  432. package/bin/runners/runQuickstart.js +531 -0
  433. package/bin/runners/runReality.js +2260 -0
  434. package/bin/runners/runReport.js +726 -0
  435. package/bin/runners/runRuntime.js +110 -0
  436. package/bin/runners/runSafelist.js +1190 -0
  437. package/bin/runners/runScan.js +688 -0
  438. package/bin/runners/runShield.js +1282 -0
  439. package/bin/runners/runShip.js +1660 -0
  440. package/bin/runners/runTruth.d.ts +5 -0
  441. package/bin/runners/runTruth.js +101 -0
  442. package/bin/runners/runValidate.js +179 -0
  443. package/bin/runners/runWatch.js +478 -0
  444. package/bin/runners/utils.js +360 -0
  445. package/bin/scan.js +617 -0
  446. package/bin/vibecheck.js +1617 -0
  447. package/dist/guardrail/index.d.ts +2405 -0
  448. package/dist/guardrail/index.js +9747 -0
  449. package/dist/guardrail/index.js.map +1 -0
  450. package/dist/scanner/index.d.ts +282 -0
  451. package/dist/scanner/index.js +3395 -0
  452. package/dist/scanner/index.js.map +1 -0
  453. package/package.json +123 -104
  454. package/README.md +0 -491
  455. package/dist/index.js +0 -99711
  456. package/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/guardrail/index.ts","../../src/guardrail/scanners/index.ts","../../src/guardrail/scanners/large-codebase-scanner.ts","../../src/guardrail/forge/index.ts","../../src/guardrail/docguard/index.ts","../../src/guardrail/docguard/TaskTracker.ts","../../src/guardrail/docguard/CompletionGuard.ts","../../src/guardrail/watcher/index.ts","../../src/guardrail/anti-hallucination/SemanticVerifier.ts","../../src/guardrail/anti-hallucination/HallucinationDetector.ts","../../src/guardrail/anti-hallucination/ConfidenceScorer.ts","../../src/guardrail/anti-hallucination/PatternLearner.ts","../../src/guardrail/anti-hallucination/ContextOptimizer.ts","../../src/guardrail/anti-hallucination/AntiHallucinationEngine.ts","../../src/guardrail/anti-hallucination/VibecheckVerifier.ts","../../src/guardrail/anti-hallucination/CodeQualityAnalyzer.ts","../../src/guardrail/anti-hallucination/PromptOptimizer.ts","../../src/guardrail/anti-hallucination/ASTAnalyzer.ts","../../src/guardrail/anti-hallucination/PackageVerifier.ts","../../src/guardrail/anti-hallucination/CrossFileAnalyzer.ts"],"sourcesContent":["/**\n * Guardrail Core\n * \n * Context-aware anti-drift and anti-hallucination system for AI coding agents.\n * Provides scanners, generators, and continuous monitoring capabilities.\n */\n\nexport * from './scanners/index.js';\nexport * from './scanners/large-codebase-scanner.js';\nexport * from './forge/index.js';\nexport * from './docguard/index.js';\nexport * from './watcher/index.js';\nexport * from './anti-hallucination/index.js';\nexport * from './types.js';\n","/**\n * Guardrail Scanners\n * \n * Scan the codebase to build the Truthpack - ground truth data\n * that AI agents use to verify their claims.\n */\n\nimport { glob } from 'fast-glob';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { \n RouteInfo, \n EnvVarInfo, \n AuthRule, \n ContractInfo,\n TruthpackData,\n TruthpackMeta,\n ScannerConfig \n} from '../types.js';\n\nexport class TruthpackScanner {\n private projectRoot: string;\n private config: ScannerConfig;\n\n constructor(projectRoot: string, config: ScannerConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n }\n\n async scan(): Promise<TruthpackData> {\n const [routes, envVars, authRules, contracts] = await Promise.all([\n this.config.routes.enabled ? this.scanRoutes() : [],\n this.config.env.enabled ? this.scanEnvVars() : [],\n this.config.auth.enabled ? this.scanAuth() : [],\n this.config.contracts.enabled ? this.scanContracts() : [],\n ]);\n\n const meta: TruthpackMeta = {\n version: '1.0.0',\n generatedAt: new Date().toISOString(),\n hash: await this.computeHash({ routes, envVars, authRules, contracts }),\n scannerVersions: {\n routes: '1.0.0',\n env: '1.0.0',\n auth: '1.0.0',\n contracts: '1.0.0',\n },\n summary: {\n routes: routes.length,\n envVars: envVars.length,\n authRules: authRules.length,\n contracts: contracts.length,\n },\n };\n\n return { routes, envVars, authRules, contracts, meta };\n }\n\n private async scanRoutes(): Promise<RouteInfo[]> {\n const routes: RouteInfo[] = [];\n const files = await glob(this.config.routes.patterns, {\n cwd: this.projectRoot,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n absolute: true,\n });\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const fileRoutes = this.extractRoutes(content, file);\n routes.push(...fileRoutes);\n }\n\n return routes;\n }\n\n private extractRoutes(content: string, file: string): RouteInfo[] {\n const routes: RouteInfo[] = [];\n const relativePath = path.relative(this.projectRoot, file);\n\n // Express-style routes: app.get('/path', handler)\n const expressPattern = /\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi;\n let match;\n \n while ((match = expressPattern.exec(content)) !== null) {\n const method = match[1].toUpperCase() as RouteInfo['method'];\n const routePath = match[2];\n const line = content.substring(0, match.index).split('\\n').length;\n \n routes.push({\n path: routePath,\n method,\n handler: this.extractHandler(content, match.index),\n file: relativePath,\n line,\n parameters: this.extractRouteParams(routePath),\n middleware: this.extractMiddleware(content, match.index),\n auth: this.detectAuthRequirement(content, match.index),\n });\n }\n\n // Router-style routes: router.get('/path', handler)\n const routerPattern = /router\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi;\n \n while ((match = routerPattern.exec(content)) !== null) {\n const method = match[1].toUpperCase() as RouteInfo['method'];\n const routePath = match[2];\n const line = content.substring(0, match.index).split('\\n').length;\n \n routes.push({\n path: routePath,\n method,\n handler: this.extractHandler(content, match.index),\n file: relativePath,\n line,\n parameters: this.extractRouteParams(routePath),\n middleware: this.extractMiddleware(content, match.index),\n auth: this.detectAuthRequirement(content, match.index),\n });\n }\n\n // Next.js API routes: export default function handler\n if (file.includes('/api/') || file.includes('\\\\api\\\\')) {\n const nextPattern = /export\\s+(default\\s+)?(async\\s+)?function\\s+(\\w+)/i;\n const nextMatch = content.match(nextPattern);\n \n if (nextMatch) {\n const apiPath = this.filePathToApiRoute(file);\n routes.push({\n path: apiPath,\n method: 'GET', // Next.js handles all methods\n handler: nextMatch[3] || 'handler',\n file: relativePath,\n line: 1,\n parameters: this.extractRouteParams(apiPath),\n middleware: [],\n });\n }\n }\n\n return routes;\n }\n\n private extractHandler(content: string, index: number): string {\n const afterRoute = content.substring(index, index + 200);\n const handlerMatch = afterRoute.match(/,\\s*(\\w+)/);\n return handlerMatch?.[1] || 'anonymous';\n }\n\n private extractRouteParams(routePath: string): RouteInfo['parameters'] {\n const params: RouteInfo['parameters'] = [];\n const paramPattern = /:(\\w+)/g;\n let match;\n \n while ((match = paramPattern.exec(routePath)) !== null) {\n params.push({\n name: match[1],\n type: 'string',\n required: true,\n in: 'path',\n });\n }\n \n return params;\n }\n\n private extractMiddleware(content: string, index: number): string[] {\n const middleware: string[] = [];\n const beforeRoute = content.substring(Math.max(0, index - 500), index);\n \n // Look for common middleware patterns\n const authMiddleware = ['authenticate', 'auth', 'requireAuth', 'isAuthenticated', 'protect'];\n const validationMiddleware = ['validate', 'validateBody', 'validateParams'];\n \n for (const mw of [...authMiddleware, ...validationMiddleware]) {\n if (beforeRoute.includes(mw)) {\n middleware.push(mw);\n }\n }\n \n return middleware;\n }\n\n private detectAuthRequirement(content: string, index: number): RouteInfo['auth'] | undefined {\n const context = content.substring(Math.max(0, index - 200), index + 200);\n const authPatterns = ['authenticate', 'auth', 'requireAuth', 'isAuthenticated', 'protect', 'jwt', 'session'];\n \n for (const pattern of authPatterns) {\n if (context.toLowerCase().includes(pattern)) {\n return { required: true };\n }\n }\n \n return undefined;\n }\n\n private filePathToApiRoute(file: string): string {\n const relativePath = path.relative(this.projectRoot, file);\n const apiMatch = relativePath.match(/(?:pages|app)\\/api\\/(.+)\\.(ts|js|tsx|jsx)/i);\n \n if (apiMatch) {\n let route = '/' + apiMatch[1]\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*') // Catch-all\n .replace(/\\[(\\w+)\\]/g, ':$1') // Dynamic segments\n .replace(/\\/index$/, '') // Remove index suffix\n .replace(/\\\\/g, '/'); // Normalize path\n return '/api' + route;\n }\n \n return '/api/unknown';\n }\n\n private async scanEnvVars(): Promise<EnvVarInfo[]> {\n const envVars: EnvVarInfo[] = [];\n \n for (const envFile of this.config.env.files) {\n const filePath = path.join(this.projectRoot, envFile);\n \n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n \n // Skip comments and empty lines\n if (line.startsWith('#') || !line) continue;\n \n const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);\n if (match) {\n const [, name, value] = match;\n const isSensitive = this.isSensitiveEnvVar(name);\n \n envVars.push({\n name,\n file: envFile,\n line: i + 1,\n hasDefault: value.length > 0,\n defaultValue: isSensitive ? '[REDACTED]' : value,\n required: !value.length,\n sensitive: isSensitive,\n });\n }\n }\n } catch {\n // File doesn't exist, skip\n }\n }\n \n return envVars;\n }\n\n private isSensitiveEnvVar(name: string): boolean {\n const sensitivePatterns = [\n 'SECRET', 'KEY', 'PASSWORD', 'TOKEN', 'PRIVATE',\n 'CREDENTIAL', 'AUTH', 'API_KEY', 'APIKEY'\n ];\n \n return sensitivePatterns.some(pattern => \n name.toUpperCase().includes(pattern)\n );\n }\n\n private async scanAuth(): Promise<AuthRule[]> {\n const authRules: AuthRule[] = [];\n const files = await glob(this.config.auth.patterns, {\n cwd: this.projectRoot,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n absolute: true,\n });\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const relativePath = path.relative(this.projectRoot, file);\n \n // Detect roles\n const rolePattern = /(?:role|ROLE|Role)\\s*[=:]\\s*['\"`](\\w+)['\"`]/g;\n let match;\n \n while ((match = rolePattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n authRules.push({\n name: match[1],\n type: 'role',\n file: relativePath,\n line,\n });\n }\n\n // Detect permissions\n const permPattern = /(?:permission|PERMISSION|Permission)\\s*[=:]\\s*['\"`](\\w+)['\"`]/g;\n \n while ((match = permPattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n authRules.push({\n name: match[1],\n type: 'permission',\n file: relativePath,\n line,\n });\n }\n\n // Detect middleware\n const middlewarePattern = /(?:export\\s+(?:const|function|async function)\\s+)?(authenticate|requireAuth|isAuthenticated|protect|authMiddleware)\\b/gi;\n \n while ((match = middlewarePattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n authRules.push({\n name: match[1],\n type: 'middleware',\n file: relativePath,\n line,\n });\n }\n }\n\n // Deduplicate\n return Array.from(new Map(authRules.map(r => [`${r.name}-${r.type}`, r])).values());\n }\n\n private async scanContracts(): Promise<ContractInfo[]> {\n const contracts: ContractInfo[] = [];\n const files = await glob(['**/*.ts', '**/*.tsx'], {\n cwd: this.projectRoot,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/*.test.ts', '**/*.spec.ts'],\n absolute: true,\n });\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const relativePath = path.relative(this.projectRoot, file);\n \n // TypeScript interfaces\n const interfacePattern = /export\\s+interface\\s+(\\w+)/g;\n let match;\n \n while ((match = interfacePattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n contracts.push({\n name: match[1],\n type: 'interface',\n file: relativePath,\n line,\n source: 'typescript',\n });\n }\n\n // TypeScript types\n const typePattern = /export\\s+type\\s+(\\w+)\\s*=/g;\n \n while ((match = typePattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n contracts.push({\n name: match[1],\n type: 'type',\n file: relativePath,\n line,\n source: 'typescript',\n });\n }\n\n // Zod schemas\n const zodPattern = /(?:export\\s+)?(?:const|let)\\s+(\\w+Schema|\\w+Validator)\\s*=\\s*z\\./g;\n \n while ((match = zodPattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n contracts.push({\n name: match[1],\n type: 'schema',\n file: relativePath,\n line,\n source: 'zod',\n });\n }\n\n // Enums\n const enumPattern = /export\\s+(?:const\\s+)?enum\\s+(\\w+)/g;\n \n while ((match = enumPattern.exec(content)) !== null) {\n const line = content.substring(0, match.index).split('\\n').length;\n contracts.push({\n name: match[1],\n type: 'enum',\n file: relativePath,\n line,\n source: 'typescript',\n });\n }\n }\n\n return contracts;\n }\n\n private async computeHash(data: Omit<TruthpackData, 'meta'>): Promise<string> {\n const str = JSON.stringify(data);\n // Simple hash for now - in production use xxhash\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(16, '0');\n }\n}\n\nexport async function scanTruthpack(projectRoot: string, config: ScannerConfig): Promise<TruthpackData> {\n const scanner = new TruthpackScanner(projectRoot, config);\n return scanner.scan();\n}\n\nexport async function saveTruthpack(projectRoot: string, data: TruthpackData): Promise<void> {\n const truthpackDir = path.join(projectRoot, '.guardrail', 'truthpack');\n \n await fs.mkdir(truthpackDir, { recursive: true });\n \n await Promise.all([\n fs.writeFile(\n path.join(truthpackDir, 'routes.json'),\n JSON.stringify({ version: '1.0.0', generatedAt: data.meta.generatedAt, routes: data.routes }, null, 2)\n ),\n fs.writeFile(\n path.join(truthpackDir, 'env.json'),\n JSON.stringify({ version: '1.0.0', generatedAt: data.meta.generatedAt, variables: data.envVars }, null, 2)\n ),\n fs.writeFile(\n path.join(truthpackDir, 'auth.json'),\n JSON.stringify({ version: '1.0.0', generatedAt: data.meta.generatedAt, rules: data.authRules }, null, 2)\n ),\n fs.writeFile(\n path.join(truthpackDir, 'contracts.json'),\n JSON.stringify({ version: '1.0.0', generatedAt: data.meta.generatedAt, contracts: data.contracts }, null, 2)\n ),\n fs.writeFile(\n path.join(truthpackDir, 'meta.json'),\n JSON.stringify(data.meta, null, 2)\n ),\n ]);\n}\n\nexport async function loadTruthpack(projectRoot: string): Promise<TruthpackData | null> {\n const truthpackDir = path.join(projectRoot, '.guardrail', 'truthpack');\n \n try {\n const [routesFile, envFile, authFile, contractsFile, metaFile] = await Promise.all([\n fs.readFile(path.join(truthpackDir, 'routes.json'), 'utf-8'),\n fs.readFile(path.join(truthpackDir, 'env.json'), 'utf-8'),\n fs.readFile(path.join(truthpackDir, 'auth.json'), 'utf-8'),\n fs.readFile(path.join(truthpackDir, 'contracts.json'), 'utf-8'),\n fs.readFile(path.join(truthpackDir, 'meta.json'), 'utf-8'),\n ]);\n\n const routes = JSON.parse(routesFile).routes || [];\n const envVars = JSON.parse(envFile).variables || [];\n const authRules = JSON.parse(authFile).rules || [];\n const contracts = JSON.parse(contractsFile).contracts || [];\n const meta = JSON.parse(metaFile);\n\n return { routes, envVars, authRules, contracts, meta };\n } catch {\n return null;\n }\n}\n","/**\n * Large Codebase Scanner\n * \n * Optimized scanner for handling codebases with 1,000,000+ lines of code.\n * Features:\n * - Chunked file processing with configurable batch sizes\n * - Incremental scanning with file hash caching\n * - Parallel processing using worker threads\n * - Memory-efficient streaming for large files\n * - Progress reporting for UI integration\n */\n\nimport { glob } from 'fast-glob';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type {\n RouteInfo,\n EnvVarInfo,\n AuthRule,\n ContractInfo,\n TruthpackData,\n TruthpackMeta,\n ScannerConfig\n} from '../types.js';\n\nexport interface LargeScannerConfig extends ScannerConfig {\n largeCodebase?: {\n enabled: boolean;\n chunkSize: number; // Files per chunk (default: 100)\n maxConcurrency: number; // Parallel processing limit (default: 4)\n incrementalScan: boolean; // Use cached results for unchanged files\n memoryLimit: number; // MB limit before forced GC (default: 512)\n streamLargeFiles: boolean; // Stream files > 1MB\n largeFileThreshold: number; // Bytes threshold for \"large\" files (default: 1MB)\n };\n}\n\nexport interface ScanProgress {\n phase: 'discovery' | 'scanning' | 'processing' | 'finalizing';\n totalFiles: number;\n processedFiles: number;\n currentFile?: string;\n estimatedTimeRemaining?: number;\n memoryUsage?: number;\n errors: ScanError[];\n}\n\nexport interface ScanError {\n file: string;\n error: string;\n recoverable: boolean;\n}\n\nexport interface FileCache {\n hash: string;\n lastModified: number;\n routes: RouteInfo[];\n contracts: ContractInfo[];\n authRules: AuthRule[];\n}\n\nexport type ProgressCallback = (progress: ScanProgress) => void;\n\nexport class LargeCodebaseScanner {\n private projectRoot: string;\n private config: LargeScannerConfig;\n private cache: Map<string, FileCache> = new Map();\n private cacheDir: string;\n private progress: ScanProgress;\n private progressCallback?: ProgressCallback;\n private startTime: number = 0;\n\n constructor(\n projectRoot: string,\n config: LargeScannerConfig,\n progressCallback?: ProgressCallback\n ) {\n this.projectRoot = projectRoot;\n this.config = this.normalizeConfig(config);\n this.cacheDir = path.join(projectRoot, '.guardrail', 'cache');\n this.progressCallback = progressCallback;\n this.progress = {\n phase: 'discovery',\n totalFiles: 0,\n processedFiles: 0,\n errors: [],\n };\n }\n\n private normalizeConfig(config: LargeScannerConfig): LargeScannerConfig {\n return {\n ...config,\n largeCodebase: {\n enabled: true,\n chunkSize: config.largeCodebase?.chunkSize ?? 100,\n maxConcurrency: config.largeCodebase?.maxConcurrency ?? 4,\n incrementalScan: config.largeCodebase?.incrementalScan ?? true,\n memoryLimit: config.largeCodebase?.memoryLimit ?? 512,\n streamLargeFiles: config.largeCodebase?.streamLargeFiles ?? true,\n largeFileThreshold: config.largeCodebase?.largeFileThreshold ?? 1024 * 1024,\n },\n };\n }\n\n async scan(): Promise<TruthpackData> {\n this.startTime = Date.now();\n \n // Phase 1: Discovery\n this.updateProgress({ phase: 'discovery' });\n await this.loadCache();\n const files = await this.discoverFiles();\n this.updateProgress({ totalFiles: files.length });\n\n // Phase 2: Scanning\n this.updateProgress({ phase: 'scanning' });\n const results = await this.processFilesInChunks(files);\n\n // Phase 3: Processing env and special files\n this.updateProgress({ phase: 'processing' });\n const envVars = this.config.env.enabled ? await this.scanEnvVars() : [];\n\n // Phase 4: Finalizing\n this.updateProgress({ phase: 'finalizing' });\n await this.saveCache();\n\n const meta: TruthpackMeta = {\n version: '1.0.0',\n generatedAt: new Date().toISOString(),\n hash: await this.computeHash(results, envVars),\n scannerVersions: {\n routes: '2.0.0-large',\n env: '1.0.0',\n auth: '2.0.0-large',\n contracts: '2.0.0-large',\n },\n summary: {\n routes: results.routes.length,\n envVars: envVars.length,\n authRules: results.authRules.length,\n contracts: results.contracts.length,\n },\n };\n\n return {\n routes: results.routes,\n envVars,\n authRules: results.authRules,\n contracts: results.contracts,\n meta,\n };\n }\n\n private async discoverFiles(): Promise<string[]> {\n const patterns = [\n ...this.config.routes.patterns,\n ...this.config.auth.patterns,\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n ];\n\n const uniquePatterns = [...new Set(patterns)];\n\n const files = await glob(uniquePatterns, {\n cwd: this.projectRoot,\n ignore: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/coverage/**',\n '**/*.min.js',\n '**/*.bundle.js',\n '**/vendor/**',\n '**/.next/**',\n '**/.nuxt/**',\n ],\n absolute: true,\n stats: false,\n onlyFiles: true,\n });\n\n return files;\n }\n\n private async processFilesInChunks(files: string[]): Promise<{\n routes: RouteInfo[];\n contracts: ContractInfo[];\n authRules: AuthRule[];\n }> {\n const allRoutes: RouteInfo[] = [];\n const allContracts: ContractInfo[] = [];\n const allAuthRules: AuthRule[] = [];\n\n const chunkSize = this.config.largeCodebase!.chunkSize;\n const chunks = this.chunkArray(files, chunkSize);\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n \n // Process chunk with concurrency limit\n const results = await this.processChunkWithConcurrency(chunk);\n \n for (const result of results) {\n allRoutes.push(...result.routes);\n allContracts.push(...result.contracts);\n allAuthRules.push(...result.authRules);\n }\n\n // Check memory and force GC if needed\n await this.checkMemory();\n }\n\n // Deduplicate auth rules\n const uniqueAuthRules = Array.from(\n new Map(allAuthRules.map(r => [`${r.name}-${r.type}`, r])).values()\n );\n\n return {\n routes: allRoutes,\n contracts: allContracts,\n authRules: uniqueAuthRules,\n };\n }\n\n private async processChunkWithConcurrency(files: string[]): Promise<FileCache[]> {\n const maxConcurrency = this.config.largeCodebase!.maxConcurrency;\n const results: FileCache[] = [];\n \n // Process in batches based on concurrency limit\n for (let i = 0; i < files.length; i += maxConcurrency) {\n const batch = files.slice(i, i + maxConcurrency);\n const batchResults = await Promise.all(\n batch.map(file => this.processFile(file))\n );\n results.push(...batchResults);\n }\n\n return results;\n }\n\n private async processFile(file: string): Promise<FileCache> {\n try {\n const stats = await fs.stat(file);\n const currentHash = await this.computeFileHash(file);\n\n // Check cache for incremental scanning\n if (this.config.largeCodebase!.incrementalScan) {\n const cached = this.cache.get(file);\n if (cached && cached.hash === currentHash) {\n this.updateProgress({\n processedFiles: this.progress.processedFiles + 1,\n currentFile: path.relative(this.projectRoot, file),\n });\n return cached;\n }\n }\n\n // Read file content\n let content: string;\n if (\n this.config.largeCodebase!.streamLargeFiles &&\n stats.size > this.config.largeCodebase!.largeFileThreshold\n ) {\n content = await this.readLargeFile(file);\n } else {\n content = await fs.readFile(file, 'utf-8');\n }\n\n const relativePath = path.relative(this.projectRoot, file);\n\n // Extract data from file\n const routes = this.config.routes.enabled\n ? this.extractRoutes(content, relativePath, file)\n : [];\n const contracts = this.config.contracts.enabled\n ? this.extractContracts(content, relativePath)\n : [];\n const authRules = this.config.auth.enabled\n ? this.extractAuthRules(content, relativePath)\n : [];\n\n const result: FileCache = {\n hash: currentHash,\n lastModified: stats.mtimeMs,\n routes,\n contracts,\n authRules,\n };\n\n // Update cache\n this.cache.set(file, result);\n\n this.updateProgress({\n processedFiles: this.progress.processedFiles + 1,\n currentFile: relativePath,\n });\n\n return result;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.progress.errors.push({\n file: path.relative(this.projectRoot, file),\n error: errorMsg,\n recoverable: true,\n });\n\n return {\n hash: '',\n lastModified: 0,\n routes: [],\n contracts: [],\n authRules: [],\n };\n }\n }\n\n private async readLargeFile(file: string): Promise<string> {\n // For very large files, read in chunks to avoid memory issues\n const handle = await fs.open(file, 'r');\n const chunks: Buffer[] = [];\n const bufferSize = 64 * 1024; // 64KB chunks\n const buffer = Buffer.alloc(bufferSize);\n \n let bytesRead: number;\n let position = 0;\n\n try {\n do {\n const result = await handle.read(buffer, 0, bufferSize, position);\n bytesRead = result.bytesRead;\n if (bytesRead > 0) {\n chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));\n position += bytesRead;\n }\n } while (bytesRead === bufferSize);\n\n return Buffer.concat(chunks).toString('utf-8');\n } finally {\n await handle.close();\n }\n }\n\n private extractRoutes(content: string, relativePath: string, absolutePath: string): RouteInfo[] {\n const routes: RouteInfo[] = [];\n\n // Express-style routes\n const expressPattern = /\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi;\n let match;\n\n while ((match = expressPattern.exec(content)) !== null) {\n const method = match[1].toUpperCase() as RouteInfo['method'];\n const routePath = match[2];\n const line = this.getLineNumber(content, match.index);\n\n routes.push({\n path: routePath,\n method,\n handler: this.extractHandler(content, match.index),\n file: relativePath,\n line,\n parameters: this.extractRouteParams(routePath),\n middleware: this.extractMiddleware(content, match.index),\n auth: this.detectAuthRequirement(content, match.index),\n });\n }\n\n // Router-style routes\n const routerPattern = /router\\.(get|post|put|patch|delete|options|head)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/gi;\n\n while ((match = routerPattern.exec(content)) !== null) {\n const method = match[1].toUpperCase() as RouteInfo['method'];\n const routePath = match[2];\n const line = this.getLineNumber(content, match.index);\n\n routes.push({\n path: routePath,\n method,\n handler: this.extractHandler(content, match.index),\n file: relativePath,\n line,\n parameters: this.extractRouteParams(routePath),\n middleware: this.extractMiddleware(content, match.index),\n auth: this.detectAuthRequirement(content, match.index),\n });\n }\n\n // Next.js/Hono/Fastify API routes\n if (absolutePath.includes('/api/') || absolutePath.includes('\\\\api\\\\')) {\n const nextPattern = /export\\s+(default\\s+)?(async\\s+)?function\\s+(\\w+)/i;\n const nextMatch = content.match(nextPattern);\n\n if (nextMatch) {\n const apiPath = this.filePathToApiRoute(absolutePath);\n routes.push({\n path: apiPath,\n method: 'GET',\n handler: nextMatch[3] || 'handler',\n file: relativePath,\n line: 1,\n parameters: this.extractRouteParams(apiPath),\n middleware: [],\n });\n }\n }\n\n return routes;\n }\n\n private extractContracts(content: string, relativePath: string): ContractInfo[] {\n const contracts: ContractInfo[] = [];\n\n // TypeScript interfaces\n const interfacePattern = /export\\s+interface\\s+(\\w+)/g;\n let match;\n\n while ((match = interfacePattern.exec(content)) !== null) {\n contracts.push({\n name: match[1],\n type: 'interface',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n source: 'typescript',\n });\n }\n\n // TypeScript types\n const typePattern = /export\\s+type\\s+(\\w+)\\s*=/g;\n\n while ((match = typePattern.exec(content)) !== null) {\n contracts.push({\n name: match[1],\n type: 'type',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n source: 'typescript',\n });\n }\n\n // Zod schemas\n const zodPattern = /(?:export\\s+)?(?:const|let)\\s+(\\w+Schema|\\w+Validator)\\s*=\\s*z\\./g;\n\n while ((match = zodPattern.exec(content)) !== null) {\n contracts.push({\n name: match[1],\n type: 'schema',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n source: 'zod',\n });\n }\n\n // Enums\n const enumPattern = /export\\s+(?:const\\s+)?enum\\s+(\\w+)/g;\n\n while ((match = enumPattern.exec(content)) !== null) {\n contracts.push({\n name: match[1],\n type: 'enum',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n source: 'typescript',\n });\n }\n\n return contracts;\n }\n\n private extractAuthRules(content: string, relativePath: string): AuthRule[] {\n const authRules: AuthRule[] = [];\n\n // Detect roles\n const rolePattern = /(?:role|ROLE|Role)\\s*[=:]\\s*['\"`](\\w+)['\"`]/g;\n let match;\n\n while ((match = rolePattern.exec(content)) !== null) {\n authRules.push({\n name: match[1],\n type: 'role',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Detect permissions\n const permPattern = /(?:permission|PERMISSION|Permission)\\s*[=:]\\s*['\"`](\\w+)['\"`]/g;\n\n while ((match = permPattern.exec(content)) !== null) {\n authRules.push({\n name: match[1],\n type: 'permission',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Detect middleware\n const middlewarePattern = /(?:export\\s+(?:const|function|async function)\\s+)?(authenticate|requireAuth|isAuthenticated|protect|authMiddleware)\\b/gi;\n\n while ((match = middlewarePattern.exec(content)) !== null) {\n authRules.push({\n name: match[1],\n type: 'middleware',\n file: relativePath,\n line: this.getLineNumber(content, match.index),\n });\n }\n\n return authRules;\n }\n\n private getLineNumber(content: string, index: number): number {\n return content.substring(0, index).split('\\n').length;\n }\n\n private extractHandler(content: string, index: number): string {\n const afterRoute = content.substring(index, index + 200);\n const handlerMatch = afterRoute.match(/,\\s*(\\w+)/);\n return handlerMatch?.[1] || 'anonymous';\n }\n\n private extractRouteParams(routePath: string): RouteInfo['parameters'] {\n const params: RouteInfo['parameters'] = [];\n const paramPattern = /:(\\w+)/g;\n let match;\n\n while ((match = paramPattern.exec(routePath)) !== null) {\n params.push({\n name: match[1],\n type: 'string',\n required: true,\n in: 'path',\n });\n }\n\n return params;\n }\n\n private extractMiddleware(content: string, index: number): string[] {\n const middleware: string[] = [];\n const beforeRoute = content.substring(Math.max(0, index - 500), index);\n\n const authMiddleware = ['authenticate', 'auth', 'requireAuth', 'isAuthenticated', 'protect'];\n const validationMiddleware = ['validate', 'validateBody', 'validateParams'];\n\n for (const mw of [...authMiddleware, ...validationMiddleware]) {\n if (beforeRoute.includes(mw)) {\n middleware.push(mw);\n }\n }\n\n return middleware;\n }\n\n private detectAuthRequirement(content: string, index: number): RouteInfo['auth'] | undefined {\n const context = content.substring(Math.max(0, index - 200), index + 200);\n const authPatterns = ['authenticate', 'auth', 'requireAuth', 'isAuthenticated', 'protect', 'jwt', 'session'];\n\n for (const pattern of authPatterns) {\n if (context.toLowerCase().includes(pattern)) {\n return { required: true };\n }\n }\n\n return undefined;\n }\n\n private filePathToApiRoute(file: string): string {\n const relativePath = path.relative(this.projectRoot, file);\n const apiMatch = relativePath.match(/(?:pages|app)\\/api\\/(.+)\\.(ts|js|tsx|jsx)/i);\n\n if (apiMatch) {\n let route = '/' + apiMatch[1]\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, '*')\n .replace(/\\[(\\w+)\\]/g, ':$1')\n .replace(/\\/index$/, '')\n .replace(/\\\\/g, '/');\n return '/api' + route;\n }\n\n return '/api/unknown';\n }\n\n private async scanEnvVars(): Promise<EnvVarInfo[]> {\n const envVars: EnvVarInfo[] = [];\n\n for (const envFile of this.config.env.files) {\n const filePath = path.join(this.projectRoot, envFile);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n if (line.startsWith('#') || !line) continue;\n\n const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);\n if (match) {\n const [, name, value] = match;\n const isSensitive = this.isSensitiveEnvVar(name);\n\n envVars.push({\n name,\n file: envFile,\n line: i + 1,\n hasDefault: value.length > 0,\n defaultValue: isSensitive ? '[REDACTED]' : value,\n required: !value.length,\n sensitive: isSensitive,\n });\n }\n }\n } catch {\n // File doesn't exist, skip\n }\n }\n\n return envVars;\n }\n\n private isSensitiveEnvVar(name: string): boolean {\n const sensitivePatterns = [\n 'SECRET', 'KEY', 'PASSWORD', 'TOKEN', 'PRIVATE',\n 'CREDENTIAL', 'AUTH', 'API_KEY', 'APIKEY'\n ];\n\n return sensitivePatterns.some(pattern =>\n name.toUpperCase().includes(pattern)\n );\n }\n\n private async computeFileHash(file: string): Promise<string> {\n const content = await fs.readFile(file);\n return crypto.createHash('xxhash64' in crypto ? 'sha256' : 'sha256')\n .update(content)\n .digest('hex')\n .substring(0, 16);\n }\n\n private async computeHash(\n results: { routes: RouteInfo[]; contracts: ContractInfo[]; authRules: AuthRule[] },\n envVars: EnvVarInfo[]\n ): Promise<string> {\n const str = JSON.stringify({ ...results, envVars });\n return crypto.createHash('sha256')\n .update(str)\n .digest('hex')\n .substring(0, 16);\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n\n private async checkMemory(): Promise<void> {\n if (typeof global.gc === 'function') {\n const memoryUsage = process.memoryUsage();\n const heapUsedMB = memoryUsage.heapUsed / 1024 / 1024;\n\n if (heapUsedMB > this.config.largeCodebase!.memoryLimit) {\n global.gc();\n }\n\n this.updateProgress({ memoryUsage: heapUsedMB });\n }\n }\n\n private updateProgress(updates: Partial<ScanProgress>): void {\n Object.assign(this.progress, updates);\n\n // Calculate estimated time remaining\n if (this.progress.totalFiles > 0 && this.progress.processedFiles > 0) {\n const elapsed = Date.now() - this.startTime;\n const rate = this.progress.processedFiles / elapsed;\n const remaining = this.progress.totalFiles - this.progress.processedFiles;\n this.progress.estimatedTimeRemaining = Math.round(remaining / rate);\n }\n\n this.progressCallback?.(this.progress);\n }\n\n private async loadCache(): Promise<void> {\n try {\n const cachePath = path.join(this.cacheDir, 'file-cache.json');\n const cacheContent = await fs.readFile(cachePath, 'utf-8');\n const cacheData = JSON.parse(cacheContent);\n\n for (const [file, data] of Object.entries(cacheData)) {\n this.cache.set(file, data as FileCache);\n }\n } catch {\n // No cache exists yet\n }\n }\n\n private async saveCache(): Promise<void> {\n try {\n await fs.mkdir(this.cacheDir, { recursive: true });\n const cachePath = path.join(this.cacheDir, 'file-cache.json');\n const cacheData: Record<string, FileCache> = {};\n\n for (const [file, data] of this.cache.entries()) {\n cacheData[file] = data;\n }\n\n await fs.writeFile(cachePath, JSON.stringify(cacheData, null, 2));\n } catch (error) {\n console.error('Failed to save cache:', error);\n }\n }\n}\n\nexport async function scanLargeCodebase(\n projectRoot: string,\n config: LargeScannerConfig,\n progressCallback?: ProgressCallback\n): Promise<TruthpackData> {\n const scanner = new LargeCodebaseScanner(projectRoot, config, progressCallback);\n return scanner.scan();\n}\n\nexport async function estimateCodebaseSize(projectRoot: string): Promise<{\n fileCount: number;\n estimatedLines: number;\n isLarge: boolean;\n recommendedChunkSize: number;\n}> {\n const files = await glob(['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], {\n cwd: projectRoot,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],\n stats: true,\n });\n\n const fileCount = files.length;\n \n // Estimate ~50 lines per KB on average\n let totalSize = 0;\n for (const file of files) {\n if (typeof file === 'object' && 'stats' in file) {\n totalSize += (file.stats as { size: number }).size;\n }\n }\n \n const estimatedLines = Math.round(totalSize / 1024 * 50);\n const isLarge = estimatedLines > 100000 || fileCount > 5000;\n\n // Recommend chunk size based on file count\n let recommendedChunkSize = 100;\n if (fileCount > 50000) {\n recommendedChunkSize = 500;\n } else if (fileCount > 10000) {\n recommendedChunkSize = 200;\n }\n\n return {\n fileCount,\n estimatedLines,\n isLarge,\n recommendedChunkSize,\n };\n}\n","/**\n * Guardrail Forge\n * \n * Auto-generates MDC rules, subagents, hooks, and skills based on\n * codebase analysis. Learns project conventions and creates tailored\n * guardrails to prevent AI drift.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { glob } from 'fast-glob';\nimport type {\n GuardrailConfig,\n GeneratedRule,\n GeneratedSubagent,\n GeneratedHook,\n GeneratedSkill,\n ConventionRule,\n PatternDefinition,\n TruthpackData,\n RuleCategory,\n} from '../types.js';\nimport { loadTruthpack } from '../scanners/index.js';\n\ninterface ForgeResult {\n rules: GeneratedRule[];\n subagents: GeneratedSubagent[];\n hooks: GeneratedHook[];\n skills: GeneratedSkill[];\n conventions: ConventionRule[];\n patterns: PatternDefinition[];\n}\n\ninterface ProjectAnalysis {\n framework: string;\n language: 'typescript' | 'javascript';\n architecture: string;\n hasTests: boolean;\n hasApi: boolean;\n hasAuth: boolean;\n hasDocs: boolean;\n dependencies: string[];\n fileCount: number;\n conventions: ConventionRule[];\n patterns: PatternDefinition[];\n}\n\nexport class GuardrailForge {\n private projectRoot: string;\n private config: GuardrailConfig;\n private truthpack: TruthpackData | null = null;\n\n constructor(projectRoot: string, config: GuardrailConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n }\n\n async forge(): Promise<ForgeResult> {\n console.log('🔨 Guardrail Forge starting...');\n \n // Load truthpack if available\n this.truthpack = await loadTruthpack(this.projectRoot);\n \n // Analyze the project\n const analysis = await this.analyzeProject();\n console.log(`📊 Project: ${analysis.framework} (${analysis.language})`);\n console.log(`📁 Files: ${analysis.fileCount}, Architecture: ${analysis.architecture}`);\n \n // Generate all artifacts\n const rules = await this.generateRules(analysis);\n const subagents = await this.generateSubagents(analysis);\n const hooks = await this.generateHooks(analysis);\n const skills = await this.generateSkills(analysis);\n \n // Write all artifacts\n await this.writeArtifacts({ rules, subagents, hooks, skills, conventions: analysis.conventions, patterns: analysis.patterns });\n \n console.log(`✅ Generated: ${rules.length} rules, ${subagents.length} subagents, ${hooks.length} hooks, ${skills.length} skills`);\n \n return {\n rules,\n subagents,\n hooks,\n skills,\n conventions: analysis.conventions,\n patterns: analysis.patterns,\n };\n }\n\n private async analyzeProject(): Promise<ProjectAnalysis> {\n // Get all source files\n const files = await glob(['**/*.{ts,tsx,js,jsx}'], {\n cwd: this.projectRoot,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.next/**'],\n });\n\n // Read package.json for dependencies\n let packageJson: Record<string, unknown> = {};\n try {\n const content = await fs.readFile(path.join(this.projectRoot, 'package.json'), 'utf-8');\n packageJson = JSON.parse(content);\n } catch {\n // No package.json\n }\n\n const dependencies = [\n ...Object.keys((packageJson.dependencies as Record<string, string>) || {}),\n ...Object.keys((packageJson.devDependencies as Record<string, string>) || {}),\n ];\n\n // Detect framework\n const framework = this.detectFramework(dependencies, files);\n \n // Detect language\n const hasTypeScript = files.some(f => f.endsWith('.ts') || f.endsWith('.tsx'));\n const language = hasTypeScript ? 'typescript' : 'javascript';\n \n // Detect architecture\n const architecture = this.detectArchitecture(files);\n \n // Detect features\n const hasTests = files.some(f => f.includes('.test.') || f.includes('.spec.') || f.includes('__tests__'));\n const hasApi = files.some(f => f.includes('/api/') || f.includes('routes'));\n const hasAuth = dependencies.some(d => ['next-auth', 'passport', 'jsonwebtoken', 'clerk', 'auth0'].includes(d));\n const hasDocs = await this.hasDocumentation();\n\n // Learn conventions from code\n const conventions = await this.learnConventions(files);\n const patterns = await this.detectPatterns(files);\n\n return {\n framework,\n language,\n architecture,\n hasTests,\n hasApi,\n hasAuth,\n hasDocs,\n dependencies,\n fileCount: files.length,\n conventions,\n patterns,\n };\n }\n\n private detectFramework(dependencies: string[], files: string[]): string {\n if (dependencies.includes('next')) return 'nextjs';\n if (dependencies.includes('react')) return 'react';\n if (dependencies.includes('vue')) return 'vue';\n if (dependencies.includes('express')) return 'express';\n if (dependencies.includes('fastify')) return 'fastify';\n if (dependencies.includes('hono')) return 'hono';\n if (dependencies.includes('@nestjs/core')) return 'nestjs';\n if (files.some(f => f.includes('app/') && f.includes('page.'))) return 'nextjs-app-router';\n return 'unknown';\n }\n\n private detectArchitecture(files: string[]): string {\n const hasSrc = files.some(f => f.startsWith('src/'));\n const hasFeatures = files.some(f => f.includes('/features/') || f.includes('/modules/'));\n const hasLayers = files.some(f => \n f.includes('/services/') || f.includes('/repositories/') || f.includes('/controllers/')\n );\n \n if (hasFeatures) return 'feature-based';\n if (hasLayers) return 'layered';\n if (hasSrc) return 'src-based';\n return 'flat';\n }\n\n private async hasDocumentation(): Promise<boolean> {\n try {\n const docs = await glob(['README.md', 'docs/**/*.md'], { cwd: this.projectRoot });\n return docs.length > 0;\n } catch {\n return false;\n }\n }\n\n private async learnConventions(files: string[]): Promise<ConventionRule[]> {\n const conventions: ConventionRule[] = [];\n \n // Analyze naming conventions\n const namingRules = await this.analyzeNamingConventions(files);\n if (namingRules.length > 0) {\n conventions.push({ category: 'naming', rules: namingRules });\n }\n\n // Analyze import conventions\n const importRules = await this.analyzeImportConventions(files);\n if (importRules.length > 0) {\n conventions.push({ category: 'imports', rules: importRules });\n }\n\n // Analyze error handling\n const errorRules = await this.analyzeErrorHandling(files);\n if (errorRules.length > 0) {\n conventions.push({ category: 'error-handling', rules: errorRules });\n }\n\n return conventions;\n }\n\n private async analyzeNamingConventions(files: string[]): Promise<string[]> {\n const rules: string[] = [];\n \n // Check file naming\n const kebabCase = files.filter(f => /^[a-z0-9-]+\\.(ts|js|tsx|jsx)$/.test(path.basename(f)));\n const pascalCase = files.filter(f => /^[A-Z][a-zA-Z0-9]+\\.(ts|js|tsx|jsx)$/.test(path.basename(f)));\n \n if (kebabCase.length > pascalCase.length * 2) {\n rules.push('Use kebab-case for file names');\n } else if (pascalCase.length > kebabCase.length * 2) {\n rules.push('Use PascalCase for component file names');\n }\n\n // Check for test file patterns\n const testFiles = files.filter(f => f.includes('.test.') || f.includes('.spec.'));\n if (testFiles.length > 0) {\n const useTest = testFiles.filter(f => f.includes('.test.')).length;\n const useSpec = testFiles.filter(f => f.includes('.spec.')).length;\n \n if (useTest > useSpec * 2) {\n rules.push('Use .test.ts suffix for test files');\n } else if (useSpec > useTest * 2) {\n rules.push('Use .spec.ts suffix for test files');\n }\n }\n\n return rules;\n }\n\n private async analyzeImportConventions(files: string[]): Promise<string[]> {\n const rules: string[] = [];\n let typeImports = 0;\n let aliasImports = 0;\n let sampleSize = 0;\n\n // Sample first 50 files\n const sampleFiles = files.slice(0, 50);\n \n for (const file of sampleFiles) {\n try {\n const fullPath = path.join(this.projectRoot, file);\n const content = await fs.readFile(fullPath, 'utf-8');\n \n if (content.includes('import type')) typeImports++;\n if (content.includes(\"from '@/\") || content.includes('from \"~/')) aliasImports++;\n sampleSize++;\n } catch {\n // Skip unreadable files\n }\n }\n\n if (sampleSize > 0) {\n if (typeImports / sampleSize > 0.3) {\n rules.push('Use import type for type-only imports');\n }\n if (aliasImports / sampleSize > 0.3) {\n rules.push('Use @/ alias for src directory imports');\n }\n }\n\n return rules;\n }\n\n private async analyzeErrorHandling(files: string[]): Promise<string[]> {\n const rules: string[] = [];\n let tryCatch = 0;\n let customErrors = 0;\n let sampleSize = 0;\n\n const sampleFiles = files.slice(0, 50);\n \n for (const file of sampleFiles) {\n try {\n const fullPath = path.join(this.projectRoot, file);\n const content = await fs.readFile(fullPath, 'utf-8');\n \n if (content.includes('try {') && content.includes('catch')) tryCatch++;\n if (content.includes('extends Error')) customErrors++;\n sampleSize++;\n } catch {\n // Skip unreadable files\n }\n }\n\n if (sampleSize > 0) {\n if (tryCatch / sampleSize > 0.2) {\n rules.push('Always handle async errors with try/catch');\n }\n if (customErrors > 0) {\n rules.push('Use custom error classes for domain errors');\n }\n }\n\n return rules;\n }\n\n private async detectPatterns(files: string[]): Promise<PatternDefinition[]> {\n const patterns: PatternDefinition[] = [];\n\n // Detect service pattern\n const serviceFiles = files.filter(f => f.includes('service') || f.includes('Service'));\n if (serviceFiles.length > 2) {\n patterns.push({\n name: 'service-class',\n category: 'architecture',\n description: 'Service class pattern for business logic',\n example: 'export class UserService { constructor(private db: Database) {} }',\n antiPatterns: ['Putting business logic in controllers', 'Direct database access without service layer'],\n });\n }\n\n // Detect repository pattern\n const repoFiles = files.filter(f => f.includes('repository') || f.includes('Repository'));\n if (repoFiles.length > 1) {\n patterns.push({\n name: 'repository-pattern',\n category: 'data-access',\n description: 'Repository pattern for data access abstraction',\n example: 'export interface UserRepository { findById(id: string): Promise<User | null>; }',\n antiPatterns: ['Mixing data access with business logic', 'Direct SQL in controllers'],\n });\n }\n\n // Detect hooks pattern (React)\n const hookFiles = files.filter(f => f.includes('use') && (f.endsWith('.ts') || f.endsWith('.tsx')));\n if (hookFiles.length > 2) {\n patterns.push({\n name: 'custom-hooks',\n category: 'react',\n description: 'Custom hooks for reusable logic',\n example: 'export function useAuth() { const [user, setUser] = useState(null); return { user }; }',\n antiPatterns: ['Duplicate state logic across components', 'Side effects in render'],\n });\n }\n\n return patterns;\n }\n\n private async generateRules(analysis: ProjectAnalysis): Promise<GeneratedRule[]> {\n const rules: GeneratedRule[] = [];\n \n // Anti-hallucination rule (ALWAYS include)\n rules.push(this.createAntiHallucinationRule(analysis));\n \n // Architecture rule\n rules.push(this.createArchitectureRule(analysis));\n \n // Framework-specific rules\n if (analysis.framework === 'nextjs' || analysis.framework === 'nextjs-app-router') {\n rules.push(this.createNextJsRule(analysis));\n }\n \n if (analysis.framework === 'react' || analysis.framework.includes('next')) {\n rules.push(this.createReactRule(analysis));\n }\n \n // TypeScript rules\n if (analysis.language === 'typescript') {\n rules.push(this.createTypeScriptRule(analysis));\n }\n \n // Testing rules\n if (analysis.hasTests) {\n rules.push(this.createTestingRule(analysis));\n }\n \n // API rules\n if (analysis.hasApi && this.truthpack) {\n rules.push(this.createApiRule(analysis));\n }\n \n // Auth rules\n if (analysis.hasAuth) {\n rules.push(this.createAuthRule(analysis));\n }\n\n // Sort by impact\n rules.sort((a, b) => b.impact - a.impact);\n \n // Return top N based on tier\n const tierLimits: Record<string, number> = {\n minimal: 5,\n standard: 10,\n extended: 20,\n comprehensive: 50,\n };\n \n const limit = tierLimits[this.config.forge.tier] || 10;\n return rules.slice(0, limit);\n }\n\n private createAntiHallucinationRule(analysis: ProjectAnalysis): GeneratedRule {\n const routeCount = this.truthpack?.routes.length || 0;\n const contractCount = this.truthpack?.contracts.length || 0;\n\n let content = `---\ndescription: Anti-hallucination protocol - prevents AI from inventing code\nalwaysApply: true\npriority: 100\n---\n\n# Anti-Hallucination Protocol\n\n## Verification Before Code Generation\n- NEVER invent APIs, methods, or packages that don't exist\n- ALWAYS verify imports exist in package.json before using them\n- Reference existing codebase patterns before creating new ones\n\n## When Uncertain\nRespond with clarification requests, not guesses:\n- \"I couldn't find [X] in the codebase. Should I create it?\"\n- \"This API signature might have changed. Please verify.\"\n\n## Mandatory Checks\n1. ✓ All imports resolve to real modules\n2. ✓ All referenced functions/methods exist\n3. ✓ Types match actual implementations\n4. ✓ Patterns match existing codebase conventions\n`;\n\n if (routeCount > 0) {\n content += `\n## Verified API Routes (${routeCount} total)\nReference \\`.vibecheck/truthpack/routes.json\\` for verified endpoints.\n`;\n }\n\n if (contractCount > 0) {\n content += `\n## Verified Contracts (${contractCount} total)\nReference \\`.vibecheck/truthpack/contracts.json\\` for verified types.\n`;\n }\n\n content += `\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`;\n\n return {\n id: 'anti-hallucination',\n name: 'Anti-Hallucination Protocol',\n category: 'anti-hallucination',\n description: 'Prevents AI from inventing APIs, fabricating data, and making unverified claims',\n content,\n priority: 100,\n impact: 100,\n alwaysApply: true,\n };\n }\n\n private createArchitectureRule(analysis: ProjectAnalysis): GeneratedRule {\n const content = `---\ndescription: Project architecture guidelines for ${analysis.framework}\nalwaysApply: true\npriority: 90\n---\n\n# Architecture Guidelines\n\n## Project Type: ${analysis.architecture}\n## Framework: ${analysis.framework}\n## Language: ${analysis.language}\n\n### Directory Structure\n${this.generateDirectoryGuidelines(analysis)}\n\n### Import Conventions\n${analysis.conventions.find(c => c.category === 'imports')?.rules.map(r => `- ${r}`).join('\\n') || '- Use @/ for src directory imports'}\n\n### File Naming\n${analysis.conventions.find(c => c.category === 'naming')?.rules.map(r => `- ${r}`).join('\\n') || '- Use kebab-case for files'}\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`;\n\n return {\n id: 'architecture',\n name: 'Architecture Guidelines',\n category: 'architecture',\n description: 'Project structure and architecture patterns',\n content,\n priority: 90,\n impact: 95,\n alwaysApply: true,\n };\n }\n\n private generateDirectoryGuidelines(analysis: ProjectAnalysis): string {\n if (analysis.architecture === 'feature-based') {\n return `- Organize code by feature/domain\n- Each feature should be self-contained\n- Shared code goes in \\`shared/\\` or \\`common/\\``;\n }\n \n if (analysis.architecture === 'layered') {\n return `- Use layered architecture (controllers, services, repositories)\n- Dependencies flow inward (controllers → services → repositories)\n- Keep business logic in services`;\n }\n \n return `- Follow existing directory conventions\n- Keep related files together\n- Use index files for clean exports`;\n }\n\n private createNextJsRule(analysis: ProjectAnalysis): GeneratedRule {\n const isAppRouter = analysis.framework === 'nextjs-app-router';\n \n return {\n id: 'nextjs',\n name: 'Next.js Conventions',\n category: 'architecture',\n description: 'Next.js specific patterns and conventions',\n content: `---\ndescription: Next.js ${isAppRouter ? 'App Router' : 'Pages Router'} conventions\nglobs: [\"**/*.tsx\", \"**/*.ts\"]\nalwaysApply: false\npriority: 80\n---\n\n# Next.js Conventions\n\n## Router: ${isAppRouter ? 'App Router' : 'Pages Router'}\n\n### File Conventions\n${isAppRouter ? `- Use \\`page.tsx\\` for pages\n- Use \\`layout.tsx\\` for layouts\n- Use \\`loading.tsx\\` for loading states\n- Use \\`error.tsx\\` for error boundaries` : `- Pages in \\`pages/\\` directory\n- API routes in \\`pages/api/\\`\n- Use \\`_app.tsx\\` for app wrapper`}\n\n### Data Fetching\n${isAppRouter ? `- Use Server Components by default\n- Use \\`'use client'\\` directive for client components\n- Prefer server actions for mutations` : `- Use \\`getServerSideProps\\` for SSR\n- Use \\`getStaticProps\\` for SSG\n- API routes for client-side data`}\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`,\n priority: 80,\n impact: 85,\n globs: ['**/*.tsx', '**/*.ts'],\n alwaysApply: false,\n };\n }\n\n private createReactRule(analysis: ProjectAnalysis): GeneratedRule {\n return {\n id: 'react',\n name: 'React Best Practices',\n category: 'conventions',\n description: 'React patterns and best practices',\n content: `---\ndescription: React component patterns and hooks\nglobs: [\"**/*.tsx\", \"**/*.jsx\"]\nalwaysApply: false\npriority: 75\n---\n\n# React Best Practices\n\n## Component Patterns\n- Prefer functional components with hooks\n- Use TypeScript for props interfaces\n- Keep components small and focused\n\n## Hooks\n- Custom hooks should start with \\`use\\`\n- Don't call hooks conditionally\n- Extract complex logic to custom hooks\n\n## State Management\n- Lift state up when needed\n- Use context for global state sparingly\n- Prefer server state libraries (React Query, SWR) for API data\n\n## Performance\n- Memoize expensive computations with \\`useMemo\\`\n- Memoize callbacks with \\`useCallback\\` when passing to children\n- Use React.memo for pure components\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`,\n priority: 75,\n impact: 80,\n globs: ['**/*.tsx', '**/*.jsx'],\n alwaysApply: false,\n };\n }\n\n private createTypeScriptRule(analysis: ProjectAnalysis): GeneratedRule {\n return {\n id: 'typescript',\n name: 'TypeScript Standards',\n category: 'conventions',\n description: 'TypeScript type safety rules',\n content: `---\ndescription: TypeScript strict mode and type safety\nglobs: [\"**/*.ts\", \"**/*.tsx\"]\nalwaysApply: false\npriority: 85\n---\n\n# TypeScript Standards\n\n## Type Safety\n- NEVER use \\`any\\` type - use \\`unknown\\` if uncertain\n- Always declare explicit return types for exported functions\n- Use \\`strict: true\\` in tsconfig.json\n\n## Type Definitions\n- Prefer \\`interface\\` for object shapes\n- Use \\`type\\` for unions and primitives\n- Export types that are used by other modules\n\n## Best Practices\n- Use \\`as const\\` for literal types\n- Avoid type assertions (\\`as\\`) - fix the types instead\n- Use discriminated unions for complex state\n\n## Common Patterns\n\\`\\`\\`typescript\n// Good: Explicit types\nfunction getUser(id: string): Promise<User> { ... }\n\n// Bad: Implicit any\nfunction getUser(id) { ... }\n\\`\\`\\`\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`,\n priority: 85,\n impact: 90,\n globs: ['**/*.ts', '**/*.tsx'],\n alwaysApply: false,\n };\n }\n\n private createTestingRule(analysis: ProjectAnalysis): GeneratedRule {\n const testSuffix = analysis.conventions\n .find(c => c.category === 'naming')\n ?.rules.find(r => r.includes('.test.') || r.includes('.spec.'))\n ?.includes('.spec.') ? '.spec.ts' : '.test.ts';\n\n return {\n id: 'testing',\n name: 'Testing Guidelines',\n category: 'testing',\n description: 'Testing patterns and conventions',\n content: `---\ndescription: Testing patterns and requirements\nglobs: [\"**/*${testSuffix}\", \"**/*.spec.ts\"]\nalwaysApply: false\npriority: 70\n---\n\n# Testing Guidelines\n\n## File Naming\n- Test files: \\`*${testSuffix}\\`\n- Integration tests: \\`*.integration${testSuffix}\\`\n\n## Test Structure\n\\`\\`\\`typescript\ndescribe('ComponentName', () => {\n describe('method or scenario', () => {\n it('should do something specific', () => {\n // Arrange\n // Act\n // Assert\n });\n });\n});\n\\`\\`\\`\n\n## Requirements\n- All new features must have tests\n- All bug fixes must have regression tests\n- Test edge cases and error conditions\n\n## Forbidden\n- No skipped tests without explanation\n- No tests that depend on execution order\n- No tests that mutate global state\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`,\n priority: 70,\n impact: 75,\n globs: [`**/*${testSuffix}`, '**/*.spec.ts'],\n alwaysApply: false,\n };\n }\n\n private createApiRule(analysis: ProjectAnalysis): GeneratedRule {\n const routeCount = this.truthpack?.routes.length || 0;\n const routes = this.truthpack?.routes.slice(0, 10) || [];\n\n return {\n id: 'api',\n name: 'API Conventions',\n category: 'architecture',\n description: 'API route patterns and conventions',\n content: `---\ndescription: API route patterns (${routeCount} verified routes)\nglobs: [\"**/api/**/*.ts\", \"**/routes/**/*.ts\"]\nalwaysApply: false\npriority: 80\n---\n\n# API Conventions\n\n## Verified Routes (${routeCount} total)\n${routes.map(r => `- \\`${r.method} ${r.path}\\` → ${r.file}:${r.line}`).join('\\n')}\n${routeCount > 10 ? `\\n... and ${routeCount - 10} more in .vibecheck/truthpack/routes.json` : ''}\n\n## Pattern Requirements\n- Use consistent HTTP methods (GET for read, POST for create, etc.)\n- Always validate request body with schemas\n- Return consistent response shapes\n- Handle errors with proper status codes\n\n## Response Format\n\\`\\`\\`typescript\n// Success\n{ success: true, data: T }\n\n// Error\n{ success: false, error: { code: string, message: string } }\n\\`\\`\\`\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`,\n priority: 80,\n impact: 85,\n globs: ['**/api/**/*.ts', '**/routes/**/*.ts'],\n alwaysApply: false,\n };\n }\n\n private createAuthRule(analysis: ProjectAnalysis): GeneratedRule {\n const authRules = this.truthpack?.authRules || [];\n \n return {\n id: 'auth',\n name: 'Authentication & Authorization',\n category: 'security',\n description: 'Auth patterns and security requirements',\n content: `---\ndescription: Authentication and authorization patterns\nglobs: [\"**/auth/**/*.ts\", \"**/middleware/**/*.ts\"]\nalwaysApply: false\npriority: 95\n---\n\n# Authentication & Authorization\n\n## Verified Auth Rules\n${authRules.slice(0, 10).map(r => `- \\`${r.name}\\` (${r.type}) → ${r.file}`).join('\\n') || '- No auth rules detected yet'}\n\n## Security Requirements\n- NEVER commit secrets to code\n- ALWAYS validate authentication before accessing protected resources\n- Use environment variables for sensitive configuration\n- Implement proper session management\n\n## Protected Routes\n- All routes under \\`/api/admin/*\\` require authentication\n- Check authorization (roles/permissions) after authentication\n- Log security-relevant events\n\n## Common Middleware\n\\`\\`\\`typescript\n// Auth middleware pattern\nexport async function authenticate(req, res, next) {\n const token = req.headers.authorization?.split(' ')[1];\n if (!token) return res.status(401).json({ error: 'Unauthorized' });\n // Verify token...\n}\n\\`\\`\\`\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*`,\n priority: 95,\n impact: 95,\n globs: ['**/auth/**/*.ts', '**/middleware/**/*.ts'],\n alwaysApply: false,\n };\n }\n\n private async generateSubagents(analysis: ProjectAnalysis): Promise<GeneratedSubagent[]> {\n const subagents: GeneratedSubagent[] = [];\n\n // Code reviewer subagent\n subagents.push({\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Reviews code for quality, security, and best practices',\n capabilities: ['code-review', 'security-audit', 'performance-check'],\n content: `# Code Reviewer Agent\n\n## Role\nPrincipal-level code reviewer with security audit capabilities.\n\n## Review Checklist\n- [ ] Code follows ${analysis.framework} best practices\n- [ ] TypeScript types are correct and complete\n- [ ] Error handling is comprehensive\n- [ ] Security vulnerabilities addressed\n- [ ] Performance considerations met\n- [ ] Tests cover critical paths\n\n## Security Focus\n- Check for SQL injection vulnerabilities\n- Verify authentication/authorization\n- Look for sensitive data exposure\n- Review dependency versions\n\n## Output Format\nProvide structured review with:\n1. Summary (approve/request changes)\n2. Critical issues (must fix)\n3. Suggestions (nice to have)\n4. Positive observations\n`,\n });\n\n // Debugger subagent\n subagents.push({\n id: 'debugger',\n name: 'Debugger',\n description: 'Systematic debugging with root cause analysis',\n capabilities: ['debugging', 'root-cause-analysis', 'log-analysis'],\n content: `# Debugger Agent\n\n## Role\nMaster debugger specializing in systematic root cause analysis.\n\n## Debugging Process\n1. **Reproduce** - Understand how to trigger the issue\n2. **Isolate** - Narrow down the affected code\n3. **Identify** - Find the root cause\n4. **Fix** - Propose minimal fix\n5. **Verify** - Ensure fix works and doesn't break other things\n\n## Evidence Collection\n- Stack traces\n- Log output\n- State snapshots\n- Network requests\n\n## Output Format\n1. Root cause (1-2 sentences)\n2. Evidence supporting diagnosis\n3. Proposed fix with code\n4. Test to verify fix\n`,\n });\n\n return subagents;\n }\n\n private async generateHooks(analysis: ProjectAnalysis): Promise<GeneratedHook[]> {\n const hooks: GeneratedHook[] = [];\n\n // Pre-commit hook\n hooks.push({\n id: 'pre-commit',\n name: 'Pre-Commit Validation',\n trigger: 'pre-commit',\n description: 'Validates code before committing',\n content: `# Pre-Commit Hook\n\n## Checks to Run\n1. **Lint Check** - Run ESLint/Prettier\n2. **Type Check** - Run TypeScript compiler\n3. **Test Check** - Run affected tests\n4. **Secret Scan** - Check for exposed secrets\n\n## Blocking Conditions\n- Any lint errors\n- TypeScript errors\n- Test failures\n- Detected secrets\n\n## Commands\n\\`\\`\\`bash\nnpm run lint\nnpm run typecheck\nnpm run test:affected\n\\`\\`\\`\n`,\n });\n\n // Save hook for continuous validation\n hooks.push({\n id: 'on-save',\n name: 'On-Save Validation',\n trigger: 'save',\n description: 'Validates code on file save',\n content: `# On-Save Hook\n\n## Quick Checks (< 2s)\n1. Format file with Prettier\n2. Run ESLint on saved file\n3. Check for obvious anti-patterns\n\n## Deferred Checks\n1. Update truthpack if API route changed\n2. Check for duplicate files/content\n3. Validate imports exist\n`,\n });\n\n return hooks;\n }\n\n private async generateSkills(analysis: ProjectAnalysis): Promise<GeneratedSkill[]> {\n const skills: GeneratedSkill[] = [];\n\n // API builder skill\n if (analysis.hasApi) {\n skills.push({\n id: 'api-builder',\n name: 'API Builder',\n description: 'Creates API endpoints following project conventions',\n trigger: 'building API, creating endpoint, REST route',\n content: `# API Builder Skill\n\n## When to Use\nWhen creating new API endpoints, routes, or handlers.\n\n## Project API Conventions\n- Framework: ${analysis.framework}\n${this.truthpack?.routes.length ? `- Existing routes: ${this.truthpack.routes.length}` : ''}\n\n## Endpoint Creation Process\n1. Check if similar endpoint exists (no duplicates!)\n2. Follow existing route patterns\n3. Add request validation\n4. Implement proper error handling\n5. Add to appropriate router\n\n## Template\n\\`\\`\\`typescript\nexport async function handler(req: Request, res: Response) {\n try {\n // Validate input\n const validated = schema.parse(req.body);\n \n // Process\n const result = await service.process(validated);\n \n // Respond\n res.json({ success: true, data: result });\n } catch (error) {\n res.status(500).json({ success: false, error: error.message });\n }\n}\n\\`\\`\\`\n`,\n });\n }\n\n return skills;\n }\n\n private async writeArtifacts(result: ForgeResult): Promise<void> {\n const rulesDir = path.join(this.projectRoot, '.cursor', 'rules');\n const agentsDir = path.join(this.projectRoot, '.cursor', 'agents');\n const hooksDir = path.join(this.projectRoot, '.cursor', 'hooks');\n const skillsDir = path.join(this.projectRoot, '.cursor', 'skills');\n const knowledgeDir = path.join(this.projectRoot, '.vibecheck', 'knowledge');\n\n // Create directories\n await Promise.all([\n fs.mkdir(rulesDir, { recursive: true }),\n fs.mkdir(agentsDir, { recursive: true }),\n fs.mkdir(hooksDir, { recursive: true }),\n fs.mkdir(skillsDir, { recursive: true }),\n fs.mkdir(knowledgeDir, { recursive: true }),\n ]);\n\n // Write rules\n for (const rule of result.rules) {\n await fs.writeFile(\n path.join(rulesDir, `${rule.id}.mdc`),\n rule.content\n );\n }\n\n // Write subagents\n for (const agent of result.subagents) {\n await fs.writeFile(\n path.join(agentsDir, `${agent.id}.md`),\n agent.content\n );\n }\n\n // Write hooks\n for (const hook of result.hooks) {\n await fs.writeFile(\n path.join(hooksDir, `${hook.id}.md`),\n hook.content\n );\n }\n\n // Write skills\n for (const skill of result.skills) {\n const skillDir = path.join(skillsDir, skill.id);\n await fs.mkdir(skillDir, { recursive: true });\n await fs.writeFile(\n path.join(skillDir, 'SKILL.md'),\n skill.content\n );\n }\n\n // Write conventions\n await fs.writeFile(\n path.join(knowledgeDir, 'conventions.json'),\n JSON.stringify({ version: '1.0.0', conventions: result.conventions }, null, 2)\n );\n\n // Write patterns\n await fs.writeFile(\n path.join(knowledgeDir, 'patterns.json'),\n JSON.stringify({ version: '1.0.0', patterns: result.patterns }, null, 2)\n );\n\n // Write .cursorrules\n await this.writeCursorRules(result);\n }\n\n private async writeCursorRules(result: ForgeResult): Promise<void> {\n const content = `# Guardrail AI - Project Context\n\n> Generated by Guardrail Forge - Context-aware AI guardrails\n\n## Quick Reference\n\n${result.rules.slice(0, 6).map(r => `- **${r.name}** (Impact: ${r.impact}) - ${r.description}`).join('\\n')}\n\n## Anti-Hallucination Protocol (CRITICAL)\n\nBefore generating ANY code:\n1. Verify imports exist in package.json\n2. Confirm referenced functions/methods exist\n3. Check types match actual implementations\n4. Reference existing patterns before creating new ones\n\nWhen uncertain, ASK - don't guess.\n\n## Detailed Rules\n\nSee \\`.cursor/rules/\\` directory for detailed MDC specifications.\n\n## Subagents\n\n${result.subagents.map(a => `- **${a.name}** - ${a.description}`).join('\\n')}\n\n## Skills\n\n${result.skills.map(s => `- **${s.name}** - ${s.description}`).join('\\n')}\n\n---\n*Generated at: ${new Date().toISOString()}*\n*Total Rules: ${result.rules.length} | Subagents: ${result.subagents.length} | Skills: ${result.skills.length}*\n\n---\n<!-- guardrail:auto-generated -->\n*Verified by Guardrail ✓*\n`;\n\n await fs.writeFile(\n path.join(this.projectRoot, '.cursorrules'),\n content\n );\n }\n}\n\nexport async function forge(projectRoot: string, config: GuardrailConfig): Promise<ForgeResult> {\n const forgeInstance = new GuardrailForge(projectRoot, config);\n return forgeInstance.forge();\n}\n","/**\n * Guardrail DocGuard\n * \n * Documentation quality control system that prevents drift, detects slop,\n * ensures documentation stays grounded in reality, and tracks task progress.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { glob } from 'fast-glob';\nimport type { DocGuardConfig, DocGuardResult, DocGuardIssue, DuplicateCheckResult } from '../types.js';\n\n// Re-export TaskTracker and CompletionGuard\nexport * from './TaskTracker.js';\nexport * from './CompletionGuard.js';\n\n// Slop phrases that indicate low-quality AI-generated content\nconst SLOP_PHRASES = [\n 'in this guide we will explore',\n \"let's dive into\",\n 'it is important to note',\n 'best practices suggest',\n 'seamlessly integrates',\n 'this comprehensive guide',\n 'in order to',\n 'it should be noted that',\n 'without further ado',\n 'at the end of the day',\n 'paradigm shift',\n 'synergy',\n 'leverage',\n 'utilize',\n 'cutting-edge',\n 'state-of-the-art',\n 'revolutionary',\n 'game-changing',\n 'empower',\n 'holistic approach',\n];\n\n// Fluff words that add no value\nconst FLUFF_WORDS = [\n 'very', 'really', 'actually', 'basically', 'essentially',\n 'literally', 'simply', 'incredibly', 'absolutely', 'comprehensive',\n 'robust', 'seamless', 'elegant', 'powerful', 'innovative',\n];\n\n// Reality anchor patterns\nconst ANCHOR_PATTERNS = [\n /`[a-zA-Z0-9_\\-./]+\\.(ts|js|tsx|jsx|json|md|css|html)`/, // File paths\n /`(npm|npx|yarn|pnpm)\\s+[a-z]+/, // CLI commands\n /`(GET|POST|PUT|PATCH|DELETE)\\s+\\/[a-zA-Z0-9/_-]+`/, // API endpoints\n /`[A-Z_]+`/, // Environment variables\n /line\\s+\\d+/i, // Line references\n /```[\\s\\S]+```/, // Code blocks\n];\n\nexport class DocGuard {\n private projectRoot: string;\n private config: DocGuardConfig;\n private documentRegistry: Map<string, DocumentInfo> = new Map();\n\n constructor(projectRoot: string, config: DocGuardConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n }\n\n /**\n * Evaluate a document for quality\n */\n async evaluate(content: string, filePath?: string): Promise<DocGuardResult> {\n const issues: DocGuardIssue[] = [];\n const anchors: string[] = [];\n const slopPhrases: string[] = [];\n\n // Check for slop phrases\n const contentLower = content.toLowerCase();\n for (const phrase of SLOP_PHRASES) {\n if (contentLower.includes(phrase)) {\n slopPhrases.push(phrase);\n issues.push({\n type: 'slop-phrase',\n message: `Detected slop phrase: \"${phrase}\"`,\n suggestion: 'Remove or rephrase with specific, concrete language',\n });\n }\n }\n\n // Calculate fluff ratio\n const words = content.split(/\\s+/);\n const fluffCount = words.filter(w => \n FLUFF_WORDS.includes(w.toLowerCase().replace(/[^a-z]/g, ''))\n ).length;\n const fluffRatio = words.length > 0 ? fluffCount / words.length : 0;\n\n if (fluffRatio > this.config.maxFluffRatio) {\n issues.push({\n type: 'high-fluff',\n message: `High fluff ratio: ${(fluffRatio * 100).toFixed(1)}% (max: ${(this.config.maxFluffRatio * 100).toFixed(0)}%)`,\n suggestion: 'Remove unnecessary filler words',\n });\n }\n\n // Count reality anchors\n for (const pattern of ANCHOR_PATTERNS) {\n const matches = content.match(new RegExp(pattern, 'g'));\n if (matches) {\n anchors.push(...matches);\n }\n }\n\n if (anchors.length < this.config.minAnchors) {\n issues.push({\n type: 'missing-anchor',\n message: `Only ${anchors.length} reality anchors found (minimum: ${this.config.minAnchors})`,\n suggestion: 'Add file paths, code examples, CLI commands, or API endpoints',\n });\n }\n\n // Check for code example\n const hasCodeBlock = /```[\\s\\S]+```/.test(content);\n if (!hasCodeBlock && words.length > 100) {\n issues.push({\n type: 'no-example',\n message: 'No code example found in document',\n suggestion: 'Add at least one runnable code block',\n });\n }\n\n // Check for duplicate if file path provided\n if (filePath) {\n const duplicateCheck = await this.checkDuplicate(content, filePath);\n if (duplicateCheck.isDuplicate) {\n issues.push({\n type: 'duplicate',\n message: `Similar content found in ${duplicateCheck.existingFile}`,\n suggestion: duplicateCheck.suggestion === 'merge' \n ? 'Consider merging with existing document'\n : 'Update existing document instead',\n });\n }\n }\n\n // Calculate quality score\n let score = 100;\n score -= slopPhrases.length * 10;\n score -= Math.max(0, (fluffRatio - this.config.maxFluffRatio) * 100);\n score -= Math.max(0, (this.config.minAnchors - anchors.length) * 15);\n score -= issues.filter(i => i.type === 'no-example').length * 10;\n score -= issues.filter(i => i.type === 'duplicate').length * 20;\n score = Math.max(0, Math.min(100, score));\n\n return {\n valid: issues.length === 0,\n score,\n issues,\n anchors,\n slopPhrases,\n fluffRatio,\n };\n }\n\n /**\n * Quick slop check - fast validation\n */\n quickCheck(content: string): { hasSop: boolean; phrases: string[] } {\n const phrases: string[] = [];\n const contentLower = content.toLowerCase();\n \n for (const phrase of SLOP_PHRASES) {\n if (contentLower.includes(phrase)) {\n phrases.push(phrase);\n }\n }\n\n return {\n hasSop: phrases.length > 0,\n phrases,\n };\n }\n\n /**\n * Check for duplicate content\n */\n async checkDuplicate(content: string, filePath: string): Promise<DuplicateCheckResult> {\n await this.loadDocumentRegistry();\n\n const contentHash = this.computeSimHash(content);\n const contentWords = new Set(content.toLowerCase().split(/\\s+/));\n\n for (const [existingPath, info] of this.documentRegistry) {\n if (existingPath === filePath) continue;\n\n // Check Jaccard similarity\n const existingWords = new Set(info.content.toLowerCase().split(/\\s+/));\n const intersection = new Set([...contentWords].filter(w => existingWords.has(w)));\n const union = new Set([...contentWords, ...existingWords]);\n const similarity = intersection.size / union.size;\n\n if (similarity > this.config.similarityThreshold) {\n return {\n isDuplicate: true,\n similarity,\n existingFile: existingPath,\n existingContent: info.content.substring(0, 200) + '...',\n suggestion: similarity > 0.9 ? 'update' : 'merge',\n };\n }\n }\n\n return {\n isDuplicate: false,\n similarity: 0,\n };\n }\n\n /**\n * Scan all documentation and update registry\n */\n async scanDocuments(): Promise<void> {\n const docFiles = await glob(['**/*.md'], {\n cwd: this.projectRoot,\n ignore: ['**/node_modules/**', ...this.config.ignorePatterns],\n absolute: true,\n });\n\n this.documentRegistry.clear();\n\n for (const file of docFiles) {\n try {\n const content = await fs.readFile(file, 'utf-8');\n const relativePath = path.relative(this.projectRoot, file);\n \n this.documentRegistry.set(relativePath, {\n path: relativePath,\n content,\n hash: this.computeSimHash(content),\n lastModified: new Date(),\n });\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n /**\n * Find canonical document for a topic\n */\n async findCanonical(topic: string): Promise<string | null> {\n await this.loadDocumentRegistry();\n\n const topicWords = new Set(topic.toLowerCase().split(/\\s+/));\n\n let bestMatch: { path: string; score: number } | null = null;\n\n for (const [docPath, info] of this.documentRegistry) {\n const titleMatch = docPath.toLowerCase();\n const contentWords = new Set(info.content.toLowerCase().split(/\\s+/));\n \n // Check title match\n let score = 0;\n for (const word of topicWords) {\n if (titleMatch.includes(word)) score += 10;\n if (contentWords.has(word)) score += 1;\n }\n\n if (score > 0 && (!bestMatch || score > bestMatch.score)) {\n bestMatch = { path: docPath, score };\n }\n }\n\n return bestMatch?.path || null;\n }\n\n /**\n * Get suggestion for where to place content\n */\n suggestLocation(topic: string): string {\n // Default doc locations based on topic\n const topicLower = topic.toLowerCase();\n \n if (topicLower.includes('api') || topicLower.includes('endpoint')) {\n return 'docs/api/';\n }\n if (topicLower.includes('setup') || topicLower.includes('install')) {\n return 'docs/getting-started/';\n }\n if (topicLower.includes('architecture') || topicLower.includes('design')) {\n return 'docs/architecture/';\n }\n if (topicLower.includes('guide') || topicLower.includes('tutorial')) {\n return 'docs/guides/';\n }\n \n return 'docs/';\n }\n\n /**\n * Get registry statistics\n */\n getStats(): { totalDocs: number; avgScore: number; duplicates: number } {\n return {\n totalDocs: this.documentRegistry.size,\n avgScore: 0, // Would require evaluating all docs\n duplicates: 0, // Would require checking all pairs\n };\n }\n\n private async loadDocumentRegistry(): Promise<void> {\n if (this.documentRegistry.size === 0) {\n await this.scanDocuments();\n }\n }\n\n private computeSimHash(content: string): string {\n // Simple hash for now\n let hash = 0;\n for (let i = 0; i < content.length; i++) {\n const char = content.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n}\n\ninterface DocumentInfo {\n path: string;\n content: string;\n hash: string;\n lastModified: Date;\n}\n\n/**\n * Create a DocGuard instance\n */\nexport function createDocGuard(projectRoot: string, config: DocGuardConfig): DocGuard {\n return new DocGuard(projectRoot, config);\n}\n\n/**\n * Quick evaluation of document content\n */\nexport async function evaluateDoc(\n content: string, \n projectRoot: string, \n config: DocGuardConfig\n): Promise<DocGuardResult> {\n const guard = new DocGuard(projectRoot, config);\n return guard.evaluate(content);\n}\n\n/**\n * Check if content should be blocked due to quality issues\n */\nexport function shouldBlock(result: DocGuardResult, strictMode: boolean): boolean {\n if (strictMode) {\n return !result.valid || result.score < 70;\n }\n return result.score < 50;\n}\n","/**\n * Task Tracker - Ensures AI agents document remaining work\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Forces AI to document what's remaining before stopping\n * - Creates checkpoints for task resumption\n * - Tracks progress across sessions\n * - Prevents abandoned incomplete work\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface TaskStep {\n id: string;\n description: string;\n status: 'pending' | 'in_progress' | 'completed' | 'blocked' | 'skipped';\n startedAt?: string;\n completedAt?: string;\n notes?: string;\n blockedReason?: string;\n filesModified?: string[];\n dependencies?: string[];\n}\n\nexport interface TaskCheckpoint {\n id: string;\n taskId: string;\n timestamp: string;\n currentStep: number;\n totalSteps: number;\n completedSteps: string[];\n remainingSteps: TaskStep[];\n contextSnapshot: ContextSnapshot;\n resumptionNotes: string;\n canResume: boolean;\n}\n\nexport interface ContextSnapshot {\n openFiles: string[];\n lastModifiedFile?: string;\n cursorPosition?: { file: string; line: number };\n relevantVariables?: Record<string, string>;\n environmentState?: Record<string, string>;\n}\n\nexport interface Task {\n id: string;\n title: string;\n description: string;\n createdAt: string;\n updatedAt: string;\n status: 'active' | 'paused' | 'completed' | 'abandoned';\n steps: TaskStep[];\n checkpoints: TaskCheckpoint[];\n totalEstimatedSteps: number;\n completionPercentage: number;\n lastActiveAgent?: string;\n tags?: string[];\n}\n\nexport interface TaskSummary {\n completed: string[];\n inProgress: string[];\n remaining: string[];\n blocked: string[];\n estimatedRemainingWork: string;\n nextSteps: string[];\n warnings: string[];\n}\n\nexport interface StopValidation {\n canStop: boolean;\n mustDocument: string[];\n warnings: string[];\n suggestedCheckpoint: Partial<TaskCheckpoint>;\n}\n\nexport class TaskTracker {\n private workspaceRoot: string;\n private tasksPath: string;\n private currentTask: Task | null = null;\n private tasks: Map<string, Task> = new Map();\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.tasksPath = path.join(workspaceRoot, '.guardrail', 'tasks.json');\n this.loadTasks();\n }\n\n /**\n * Start a new task\n */\n startTask(title: string, description: string, estimatedSteps?: string[]): Task {\n const task: Task = {\n id: `task-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n title,\n description,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n steps: estimatedSteps?.map((desc, i) => ({\n id: `step-${i + 1}`,\n description: desc,\n status: 'pending',\n })) || [],\n checkpoints: [],\n totalEstimatedSteps: estimatedSteps?.length || 0,\n completionPercentage: 0,\n };\n\n this.tasks.set(task.id, task);\n this.currentTask = task;\n this.saveTasks();\n\n return task;\n }\n\n /**\n * Add steps to current task\n */\n addSteps(steps: string[]): void {\n if (!this.currentTask) {\n throw new Error('No active task. Call startTask first.');\n }\n\n const newSteps: TaskStep[] = steps.map((desc, i) => ({\n id: `step-${this.currentTask!.steps.length + i + 1}`,\n description: desc,\n status: 'pending',\n }));\n\n this.currentTask.steps.push(...newSteps);\n this.currentTask.totalEstimatedSteps = this.currentTask.steps.length;\n this.currentTask.updatedAt = new Date().toISOString();\n this.saveTasks();\n }\n\n /**\n * Update step status\n */\n updateStep(stepId: string, status: TaskStep['status'], notes?: string): void {\n if (!this.currentTask) return;\n\n const step = this.currentTask.steps.find(s => s.id === stepId);\n if (!step) return;\n\n step.status = status;\n if (notes) step.notes = notes;\n\n if (status === 'in_progress' && !step.startedAt) {\n step.startedAt = new Date().toISOString();\n }\n if (status === 'completed') {\n step.completedAt = new Date().toISOString();\n }\n\n this.updateCompletionPercentage();\n this.currentTask.updatedAt = new Date().toISOString();\n this.saveTasks();\n }\n\n /**\n * Mark current step as in progress\n */\n startStep(stepId: string): void {\n this.updateStep(stepId, 'in_progress');\n }\n\n /**\n * Complete current step\n */\n completeStep(stepId: string, notes?: string, filesModified?: string[]): void {\n if (!this.currentTask) return;\n\n const step = this.currentTask.steps.find(s => s.id === stepId);\n if (step) {\n step.status = 'completed';\n step.completedAt = new Date().toISOString();\n if (notes) step.notes = notes;\n if (filesModified) step.filesModified = filesModified;\n }\n\n this.updateCompletionPercentage();\n this.saveTasks();\n }\n\n /**\n * Mark step as blocked\n */\n blockStep(stepId: string, reason: string): void {\n if (!this.currentTask) return;\n\n const step = this.currentTask.steps.find(s => s.id === stepId);\n if (step) {\n step.status = 'blocked';\n step.blockedReason = reason;\n }\n\n this.saveTasks();\n }\n\n /**\n * CRITICAL: Validate if agent can stop working\n * This is the key feature - prevents stopping without documenting remaining work\n */\n validateStop(): StopValidation {\n if (!this.currentTask) {\n return {\n canStop: true,\n mustDocument: [],\n warnings: ['No active task tracked'],\n suggestedCheckpoint: {},\n };\n }\n\n const mustDocument: string[] = [];\n const warnings: string[] = [];\n\n // Check for in-progress steps\n const inProgressSteps = this.currentTask.steps.filter(s => s.status === 'in_progress');\n if (inProgressSteps.length > 0) {\n mustDocument.push(`Document status of in-progress step(s): ${inProgressSteps.map(s => s.description).join(', ')}`);\n }\n\n // Check for remaining steps\n const remainingSteps = this.currentTask.steps.filter(s => s.status === 'pending');\n if (remainingSteps.length > 0) {\n mustDocument.push(`Document ${remainingSteps.length} remaining steps`);\n warnings.push(`Task is ${this.currentTask.completionPercentage}% complete - ${remainingSteps.length} steps remaining`);\n }\n\n // Check for blocked steps\n const blockedSteps = this.currentTask.steps.filter(s => s.status === 'blocked');\n if (blockedSteps.length > 0) {\n mustDocument.push(`Document resolution needed for ${blockedSteps.length} blocked step(s)`);\n }\n\n // Check completion percentage\n if (this.currentTask.completionPercentage < 100) {\n warnings.push(`Task not complete (${this.currentTask.completionPercentage}%)`);\n }\n\n const canStop = mustDocument.length === 0 || this.currentTask.completionPercentage === 100;\n\n return {\n canStop,\n mustDocument,\n warnings,\n suggestedCheckpoint: {\n taskId: this.currentTask.id,\n currentStep: this.currentTask.steps.findIndex(s => s.status === 'in_progress') + 1,\n totalSteps: this.currentTask.steps.length,\n remainingSteps: remainingSteps,\n canResume: true,\n },\n };\n }\n\n /**\n * Create a checkpoint before stopping\n * REQUIRED if task is incomplete\n */\n createCheckpoint(\n resumptionNotes: string,\n contextSnapshot?: Partial<ContextSnapshot>\n ): TaskCheckpoint {\n if (!this.currentTask) {\n throw new Error('No active task to checkpoint');\n }\n\n const completedSteps = this.currentTask.steps\n .filter(s => s.status === 'completed')\n .map(s => s.id);\n\n const remainingSteps = this.currentTask.steps\n .filter(s => s.status === 'pending' || s.status === 'in_progress' || s.status === 'blocked');\n\n const checkpoint: TaskCheckpoint = {\n id: `checkpoint-${Date.now()}`,\n taskId: this.currentTask.id,\n timestamp: new Date().toISOString(),\n currentStep: completedSteps.length + 1,\n totalSteps: this.currentTask.steps.length,\n completedSteps,\n remainingSteps,\n contextSnapshot: {\n openFiles: contextSnapshot?.openFiles || [],\n lastModifiedFile: contextSnapshot?.lastModifiedFile,\n cursorPosition: contextSnapshot?.cursorPosition,\n relevantVariables: contextSnapshot?.relevantVariables,\n environmentState: contextSnapshot?.environmentState,\n },\n resumptionNotes,\n canResume: true,\n };\n\n this.currentTask.checkpoints.push(checkpoint);\n this.currentTask.status = 'paused';\n this.currentTask.updatedAt = new Date().toISOString();\n this.saveTasks();\n\n return checkpoint;\n }\n\n /**\n * Generate a task summary for handoff or resumption\n */\n generateSummary(): TaskSummary {\n if (!this.currentTask) {\n return {\n completed: [],\n inProgress: [],\n remaining: [],\n blocked: [],\n estimatedRemainingWork: 'No active task',\n nextSteps: [],\n warnings: ['No active task'],\n };\n }\n\n const completed = this.currentTask.steps\n .filter(s => s.status === 'completed')\n .map(s => `✓ ${s.description}${s.notes ? ` (${s.notes})` : ''}`);\n\n const inProgress = this.currentTask.steps\n .filter(s => s.status === 'in_progress')\n .map(s => `⏳ ${s.description}${s.notes ? ` (${s.notes})` : ''}`);\n\n const remaining = this.currentTask.steps\n .filter(s => s.status === 'pending')\n .map(s => `○ ${s.description}`);\n\n const blocked = this.currentTask.steps\n .filter(s => s.status === 'blocked')\n .map(s => `🚫 ${s.description}: ${s.blockedReason || 'Unknown reason'}`);\n\n const warnings: string[] = [];\n if (inProgress.length > 0) {\n warnings.push('Has in-progress work that needs attention');\n }\n if (blocked.length > 0) {\n warnings.push(`${blocked.length} step(s) are blocked`);\n }\n\n // Estimate remaining work\n const remainingCount = remaining.length + inProgress.length;\n const avgTimePerStep = 5; // minutes estimate\n const estimatedRemainingWork = remainingCount > 0\n ? `~${remainingCount * avgTimePerStep} minutes (${remainingCount} steps)`\n : 'Complete';\n\n // Determine next steps\n const nextSteps: string[] = [];\n if (inProgress.length > 0) {\n nextSteps.push(`Continue: ${this.currentTask.steps.find(s => s.status === 'in_progress')?.description}`);\n } else if (remaining.length > 0) {\n const nextPending = this.currentTask.steps.find(s => s.status === 'pending');\n if (nextPending) {\n nextSteps.push(`Start: ${nextPending.description}`);\n }\n }\n if (blocked.length > 0) {\n nextSteps.push(`Resolve blocked: ${this.currentTask.steps.find(s => s.status === 'blocked')?.description}`);\n }\n\n return {\n completed,\n inProgress,\n remaining,\n blocked,\n estimatedRemainingWork,\n nextSteps,\n warnings,\n };\n }\n\n /**\n * Generate markdown summary for documentation\n */\n generateMarkdownSummary(): string {\n const summary = this.generateSummary();\n const task = this.currentTask;\n\n if (!task) {\n return '## No Active Task\\n\\nNo task is currently being tracked.';\n }\n\n let md = `## Task Progress: ${task.title}\\n\\n`;\n md += `**Status:** ${task.status} | **Progress:** ${task.completionPercentage}%\\n\\n`;\n\n if (summary.completed.length > 0) {\n md += `### ✅ Completed (${summary.completed.length})\\n`;\n summary.completed.forEach(s => md += `- ${s}\\n`);\n md += '\\n';\n }\n\n if (summary.inProgress.length > 0) {\n md += `### ⏳ In Progress (${summary.inProgress.length})\\n`;\n summary.inProgress.forEach(s => md += `- ${s}\\n`);\n md += '\\n';\n }\n\n if (summary.remaining.length > 0) {\n md += `### 📋 Remaining (${summary.remaining.length})\\n`;\n summary.remaining.forEach(s => md += `- ${s}\\n`);\n md += '\\n';\n }\n\n if (summary.blocked.length > 0) {\n md += `### 🚫 Blocked (${summary.blocked.length})\\n`;\n summary.blocked.forEach(s => md += `- ${s}\\n`);\n md += '\\n';\n }\n\n if (summary.warnings.length > 0) {\n md += `### ⚠️ Warnings\\n`;\n summary.warnings.forEach(w => md += `- ${w}\\n`);\n md += '\\n';\n }\n\n md += `### 📊 Metrics\\n`;\n md += `- **Estimated Remaining:** ${summary.estimatedRemainingWork}\\n`;\n md += `- **Last Updated:** ${task.updatedAt}\\n`;\n\n if (summary.nextSteps.length > 0) {\n md += `\\n### 👉 Next Steps\\n`;\n summary.nextSteps.forEach((s, i) => md += `${i + 1}. ${s}\\n`);\n }\n\n return md;\n }\n\n /**\n * Resume from a checkpoint\n */\n resumeFromCheckpoint(checkpointId: string): Task | null {\n for (const task of this.tasks.values()) {\n const checkpoint = task.checkpoints.find(c => c.id === checkpointId);\n if (checkpoint) {\n task.status = 'active';\n task.updatedAt = new Date().toISOString();\n this.currentTask = task;\n this.saveTasks();\n return task;\n }\n }\n return null;\n }\n\n /**\n * Resume the most recent paused task\n */\n resumeLatest(): Task | null {\n let latestTask: Task | null = null;\n let latestTime = 0;\n\n for (const task of this.tasks.values()) {\n if (task.status === 'paused') {\n const time = new Date(task.updatedAt).getTime();\n if (time > latestTime) {\n latestTime = time;\n latestTask = task;\n }\n }\n }\n\n if (latestTask) {\n latestTask.status = 'active';\n latestTask.updatedAt = new Date().toISOString();\n this.currentTask = latestTask;\n this.saveTasks();\n }\n\n return latestTask;\n }\n\n /**\n * Complete the current task\n */\n completeTask(): void {\n if (!this.currentTask) return;\n\n this.currentTask.status = 'completed';\n this.currentTask.completionPercentage = 100;\n this.currentTask.updatedAt = new Date().toISOString();\n\n // Mark all pending steps as completed\n this.currentTask.steps.forEach(s => {\n if (s.status === 'pending' || s.status === 'in_progress') {\n s.status = 'completed';\n s.completedAt = new Date().toISOString();\n }\n });\n\n this.saveTasks();\n this.currentTask = null;\n }\n\n /**\n * Abandon task (with documentation)\n */\n abandonTask(reason: string): TaskCheckpoint {\n if (!this.currentTask) {\n throw new Error('No active task to abandon');\n }\n\n const checkpoint = this.createCheckpoint(`ABANDONED: ${reason}`);\n this.currentTask.status = 'abandoned';\n this.saveTasks();\n this.currentTask = null;\n\n return checkpoint;\n }\n\n /**\n * Get current task\n */\n getCurrentTask(): Task | null {\n return this.currentTask;\n }\n\n /**\n * Get all tasks\n */\n getAllTasks(): Task[] {\n return Array.from(this.tasks.values());\n }\n\n /**\n * Get paused tasks\n */\n getPausedTasks(): Task[] {\n return Array.from(this.tasks.values()).filter(t => t.status === 'paused');\n }\n\n /**\n * Load task by ID\n */\n loadTask(taskId: string): Task | null {\n const task = this.tasks.get(taskId);\n if (task) {\n this.currentTask = task;\n return task;\n }\n return null;\n }\n\n private updateCompletionPercentage(): void {\n if (!this.currentTask || this.currentTask.steps.length === 0) return;\n\n const completed = this.currentTask.steps.filter(s => s.status === 'completed').length;\n this.currentTask.completionPercentage = Math.round((completed / this.currentTask.steps.length) * 100);\n }\n\n private loadTasks(): void {\n try {\n if (fs.existsSync(this.tasksPath)) {\n const data = JSON.parse(fs.readFileSync(this.tasksPath, 'utf-8'));\n this.tasks = new Map(Object.entries(data.tasks || {}));\n \n // Restore current task if it was active\n if (data.currentTaskId) {\n this.currentTask = this.tasks.get(data.currentTaskId) || null;\n }\n }\n } catch (e) {\n console.error('Failed to load tasks:', e);\n }\n }\n\n private saveTasks(): void {\n try {\n const dir = path.dirname(this.tasksPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const data = {\n tasks: Object.fromEntries(this.tasks),\n currentTaskId: this.currentTask?.id,\n lastUpdated: new Date().toISOString(),\n };\n\n fs.writeFileSync(this.tasksPath, JSON.stringify(data, null, 2));\n } catch (e) {\n console.error('Failed to save tasks:', e);\n }\n }\n}\n\n/**\n * Create task tracker instance\n */\nexport function createTaskTracker(workspaceRoot: string): TaskTracker {\n return new TaskTracker(workspaceRoot);\n}\n","/**\n * Completion Guard - Ensures tasks are properly completed\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Enforces documentation of remaining work before stopping\n * - Validates task completion criteria\n * - Generates handoff documentation automatically\n * - Prevents silent task abandonment\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { TaskTracker, Task, TaskSummary, StopValidation, TaskCheckpoint } from './TaskTracker';\n\nexport interface CompletionCriteria {\n requireAllStepsComplete: boolean;\n requireNoBlockedSteps: boolean;\n requireResumptionNotes: boolean;\n minCompletionPercentage: number;\n requireFilesDocumented: boolean;\n requireNextStepsDocumented: boolean;\n}\n\nexport interface CompletionResult {\n canComplete: boolean;\n violations: string[];\n suggestions: string[];\n requiredActions: RequiredAction[];\n handoffDocument?: string;\n}\n\nexport interface RequiredAction {\n type: 'document' | 'complete' | 'unblock' | 'checkpoint';\n description: string;\n priority: 'critical' | 'high' | 'medium' | 'low';\n targetStepId?: string;\n}\n\nexport interface HandoffDocument {\n taskTitle: string;\n summary: string;\n completedWork: string[];\n remainingWork: string[];\n blockedItems: string[];\n contextNotes: string;\n resumptionInstructions: string;\n filesModified: string[];\n estimatedRemainingTime: string;\n createdAt: string;\n createdBy: string;\n}\n\nconst DEFAULT_CRITERIA: CompletionCriteria = {\n requireAllStepsComplete: false,\n requireNoBlockedSteps: false,\n requireResumptionNotes: true,\n minCompletionPercentage: 0,\n requireFilesDocumented: true,\n requireNextStepsDocumented: true,\n};\n\nexport class CompletionGuard {\n private workspaceRoot: string;\n private taskTracker: TaskTracker;\n private criteria: CompletionCriteria;\n private handoffPath: string;\n\n constructor(\n workspaceRoot: string,\n taskTracker: TaskTracker,\n criteria: Partial<CompletionCriteria> = {}\n ) {\n this.workspaceRoot = workspaceRoot;\n this.taskTracker = taskTracker;\n this.criteria = { ...DEFAULT_CRITERIA, ...criteria };\n this.handoffPath = path.join(workspaceRoot, '.guardrail', 'handoffs');\n }\n\n /**\n * Validate if work can be stopped\n * This is the CRITICAL check before any AI agent stops working\n */\n validateCompletion(): CompletionResult {\n const task = this.taskTracker.getCurrentTask();\n const violations: string[] = [];\n const suggestions: string[] = [];\n const requiredActions: RequiredAction[] = [];\n\n if (!task) {\n return {\n canComplete: true,\n violations: [],\n suggestions: ['Consider using task tracking for better progress visibility'],\n requiredActions: [],\n };\n }\n\n const summary = this.taskTracker.generateSummary();\n\n // Check completion percentage\n if (task.completionPercentage < this.criteria.minCompletionPercentage) {\n violations.push(\n `Task only ${task.completionPercentage}% complete (minimum: ${this.criteria.minCompletionPercentage}%)`\n );\n requiredActions.push({\n type: 'complete',\n description: `Complete more steps to reach ${this.criteria.minCompletionPercentage}% completion`,\n priority: 'high',\n });\n }\n\n // Check all steps complete\n if (this.criteria.requireAllStepsComplete && summary.remaining.length > 0) {\n violations.push(`${summary.remaining.length} steps still pending`);\n summary.remaining.forEach(step => {\n requiredActions.push({\n type: 'complete',\n description: step,\n priority: 'medium',\n });\n });\n }\n\n // Check in-progress steps\n if (summary.inProgress.length > 0) {\n violations.push(`${summary.inProgress.length} steps still in progress`);\n summary.inProgress.forEach(step => {\n requiredActions.push({\n type: 'document',\n description: `Document progress on: ${step}`,\n priority: 'critical',\n });\n });\n }\n\n // Check blocked steps\n if (this.criteria.requireNoBlockedSteps && summary.blocked.length > 0) {\n violations.push(`${summary.blocked.length} steps are blocked`);\n summary.blocked.forEach(step => {\n requiredActions.push({\n type: 'unblock',\n description: step,\n priority: 'high',\n });\n });\n }\n\n // Check if resumption notes are needed\n if (this.criteria.requireResumptionNotes && task.completionPercentage < 100) {\n const hasRecentCheckpoint = task.checkpoints.some(\n c => Date.now() - new Date(c.timestamp).getTime() < 5 * 60 * 1000 // 5 minutes\n );\n \n if (!hasRecentCheckpoint) {\n violations.push('No recent checkpoint with resumption notes');\n requiredActions.push({\n type: 'checkpoint',\n description: 'Create a checkpoint with resumption notes before stopping',\n priority: 'critical',\n });\n }\n }\n\n // Check files documented\n if (this.criteria.requireFilesDocumented) {\n const filesModified = task.steps\n .filter(s => s.status === 'completed')\n .flatMap(s => s.filesModified || []);\n \n if (filesModified.length === 0 && task.completionPercentage > 0) {\n suggestions.push('Document which files were modified in completed steps');\n }\n }\n\n // Check next steps documented\n if (this.criteria.requireNextStepsDocumented && summary.remaining.length > 0) {\n if (summary.nextSteps.length === 0) {\n violations.push('Next steps not documented');\n requiredActions.push({\n type: 'document',\n description: 'Document the next steps to be taken',\n priority: 'high',\n });\n }\n }\n\n // Generate handoff document if there are violations\n let handoffDocument: string | undefined;\n if (violations.length > 0) {\n handoffDocument = this.generateHandoffDocument(task, summary);\n }\n\n return {\n canComplete: violations.length === 0,\n violations,\n suggestions,\n requiredActions,\n handoffDocument,\n };\n }\n\n /**\n * Force create a handoff document before stopping\n */\n createHandoff(\n contextNotes: string,\n resumptionInstructions: string,\n agentId: string = 'unknown'\n ): HandoffDocument {\n const task = this.taskTracker.getCurrentTask();\n if (!task) {\n throw new Error('No active task to create handoff for');\n }\n\n const summary = this.taskTracker.generateSummary();\n\n const handoff: HandoffDocument = {\n taskTitle: task.title,\n summary: task.description,\n completedWork: summary.completed,\n remainingWork: [...summary.inProgress, ...summary.remaining],\n blockedItems: summary.blocked,\n contextNotes,\n resumptionInstructions,\n filesModified: task.steps\n .filter(s => s.filesModified)\n .flatMap(s => s.filesModified!),\n estimatedRemainingTime: summary.estimatedRemainingWork,\n createdAt: new Date().toISOString(),\n createdBy: agentId,\n };\n\n // Save handoff document\n this.saveHandoff(handoff, task.id);\n\n // Create checkpoint\n this.taskTracker.createCheckpoint(resumptionInstructions, {\n relevantVariables: { contextNotes },\n });\n\n return handoff;\n }\n\n /**\n * Generate handoff documentation markdown\n */\n generateHandoffDocument(task: Task, summary: TaskSummary): string {\n let doc = `# Task Handoff: ${task.title}\\n\\n`;\n doc += `**Task ID:** ${task.id}\\n`;\n doc += `**Status:** ${task.status}\\n`;\n doc += `**Progress:** ${task.completionPercentage}%\\n`;\n doc += `**Generated:** ${new Date().toISOString()}\\n\\n`;\n\n doc += `## Description\\n${task.description}\\n\\n`;\n\n doc += `## Progress Summary\\n\\n`;\n\n if (summary.completed.length > 0) {\n doc += `### ✅ Completed Work\\n`;\n summary.completed.forEach(item => doc += `- ${item}\\n`);\n doc += '\\n';\n }\n\n if (summary.inProgress.length > 0) {\n doc += `### ⏳ Work In Progress (NEEDS ATTENTION)\\n`;\n summary.inProgress.forEach(item => doc += `- ${item}\\n`);\n doc += '\\n';\n }\n\n if (summary.remaining.length > 0) {\n doc += `### 📋 Remaining Work\\n`;\n summary.remaining.forEach(item => doc += `- ${item}\\n`);\n doc += '\\n';\n }\n\n if (summary.blocked.length > 0) {\n doc += `### 🚫 Blocked Items\\n`;\n summary.blocked.forEach(item => doc += `- ${item}\\n`);\n doc += '\\n';\n }\n\n doc += `## Resumption Information\\n\\n`;\n doc += `**Estimated Remaining Time:** ${summary.estimatedRemainingWork}\\n\\n`;\n\n if (summary.nextSteps.length > 0) {\n doc += `### Next Steps\\n`;\n summary.nextSteps.forEach((step, i) => doc += `${i + 1}. ${step}\\n`);\n doc += '\\n';\n }\n\n if (summary.warnings.length > 0) {\n doc += `### ⚠️ Warnings\\n`;\n summary.warnings.forEach(w => doc += `- ${w}\\n`);\n doc += '\\n';\n }\n\n // Add checkpoint history\n if (task.checkpoints.length > 0) {\n const lastCheckpoint = task.checkpoints[task.checkpoints.length - 1];\n doc += `## Last Checkpoint\\n`;\n doc += `**Created:** ${lastCheckpoint.timestamp}\\n`;\n doc += `**Notes:** ${lastCheckpoint.resumptionNotes}\\n\\n`;\n }\n\n return doc;\n }\n\n /**\n * Validate and enforce completion with automatic handoff\n */\n enforceCompletion(\n contextNotes: string = '',\n agentId: string = 'unknown'\n ): {\n allowed: boolean;\n handoff?: HandoffDocument;\n message: string;\n } {\n const result = this.validateCompletion();\n\n if (result.canComplete) {\n return {\n allowed: true,\n message: 'Task completed successfully. All criteria met.',\n };\n }\n\n // Force create handoff for incomplete task\n const task = this.taskTracker.getCurrentTask();\n if (!task) {\n return {\n allowed: true,\n message: 'No active task.',\n };\n }\n\n const summary = this.taskTracker.generateSummary();\n const resumptionInstructions = this.generateResumptionInstructions(result, summary);\n\n const handoff = this.createHandoff(\n contextNotes || 'No additional context provided',\n resumptionInstructions,\n agentId\n );\n\n return {\n allowed: true, // Now allowed because we created the handoff\n handoff,\n message: `Task paused with handoff documentation. ${result.violations.length} items documented for next session.`,\n };\n }\n\n /**\n * Generate automatic resumption instructions\n */\n private generateResumptionInstructions(\n result: CompletionResult,\n summary: TaskSummary\n ): string {\n const instructions: string[] = [];\n\n instructions.push('## How to Resume This Task\\n');\n\n if (summary.inProgress.length > 0) {\n instructions.push('### Continue In-Progress Work');\n instructions.push('The following items were being worked on:');\n summary.inProgress.forEach(item => instructions.push(`- ${item}`));\n instructions.push('');\n }\n\n if (summary.nextSteps.length > 0) {\n instructions.push('### Recommended Next Steps');\n summary.nextSteps.forEach((step, i) => instructions.push(`${i + 1}. ${step}`));\n instructions.push('');\n }\n\n if (summary.blocked.length > 0) {\n instructions.push('### Blocked Items to Resolve');\n summary.blocked.forEach(item => instructions.push(`- ${item}`));\n instructions.push('');\n }\n\n if (result.requiredActions.length > 0) {\n instructions.push('### Required Actions');\n result.requiredActions\n .filter(a => a.priority === 'critical' || a.priority === 'high')\n .forEach(action => {\n instructions.push(`- [${action.priority.toUpperCase()}] ${action.description}`);\n });\n }\n\n return instructions.join('\\n');\n }\n\n /**\n * Save handoff document to disk\n */\n private saveHandoff(handoff: HandoffDocument, taskId: string): void {\n try {\n if (!fs.existsSync(this.handoffPath)) {\n fs.mkdirSync(this.handoffPath, { recursive: true });\n }\n\n const filename = `handoff-${taskId}-${Date.now()}.json`;\n const filepath = path.join(this.handoffPath, filename);\n fs.writeFileSync(filepath, JSON.stringify(handoff, null, 2));\n\n // Also save markdown version\n const mdFilename = `handoff-${taskId}-${Date.now()}.md`;\n const mdPath = path.join(this.handoffPath, mdFilename);\n const task = this.taskTracker.getCurrentTask();\n if (task) {\n const summary = this.taskTracker.generateSummary();\n fs.writeFileSync(mdPath, this.generateHandoffDocument(task, summary));\n }\n } catch (e) {\n console.error('Failed to save handoff:', e);\n }\n }\n\n /**\n * Get all handoff documents\n */\n getHandoffs(): HandoffDocument[] {\n const handoffs: HandoffDocument[] = [];\n\n try {\n if (fs.existsSync(this.handoffPath)) {\n const files = fs.readdirSync(this.handoffPath).filter(f => f.endsWith('.json'));\n for (const file of files) {\n const content = fs.readFileSync(path.join(this.handoffPath, file), 'utf-8');\n handoffs.push(JSON.parse(content));\n }\n }\n } catch (e) {\n console.error('Failed to load handoffs:', e);\n }\n\n return handoffs.sort((a, b) => \n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n }\n\n /**\n * Get latest handoff for a task\n */\n getLatestHandoff(taskId: string): HandoffDocument | null {\n const handoffs = this.getHandoffs().filter(h => \n h.taskTitle.includes(taskId) || \n fs.readdirSync(this.handoffPath).some(f => f.includes(taskId))\n );\n return handoffs[0] || null;\n }\n\n /**\n * Update completion criteria\n */\n updateCriteria(criteria: Partial<CompletionCriteria>): void {\n this.criteria = { ...this.criteria, ...criteria };\n }\n\n /**\n * Get current criteria\n */\n getCriteria(): CompletionCriteria {\n return { ...this.criteria };\n }\n}\n\n/**\n * Create completion guard instance\n */\nexport function createCompletionGuard(\n workspaceRoot: string,\n taskTracker: TaskTracker,\n criteria?: Partial<CompletionCriteria>\n): CompletionGuard {\n return new CompletionGuard(workspaceRoot, taskTracker, criteria);\n}\n","/**\n * Guardrail Watcher\n * \n * Continuously monitors the codebase for changes and triggers\n * automatic re-analysis to keep guardrails up-to-date.\n */\n\nimport * as chokidar from 'chokidar';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { \n GuardrailConfig, \n WatcherEvent, \n RefreshResult,\n TruthpackData \n} from '../types.js';\nimport { scanTruthpack, saveTruthpack, loadTruthpack } from '../scanners/index.js';\nimport { forge } from '../forge/index.js';\n\nexport interface WatcherOptions {\n projectRoot: string;\n config: GuardrailConfig;\n onRefresh?: (result: RefreshResult) => void;\n onError?: (error: Error) => void;\n debounceMs?: number;\n}\n\nexport class GuardrailWatcher {\n private projectRoot: string;\n private config: GuardrailConfig;\n private watcher: chokidar.FSWatcher | null = null;\n private debounceTimer: NodeJS.Timeout | null = null;\n private debounceMs: number;\n private pendingChanges: WatcherEvent[] = [];\n private lastTruthpackHash: string | null = null;\n private isRefreshing = false;\n private onRefresh?: (result: RefreshResult) => void;\n private onError?: (error: Error) => void;\n\n constructor(options: WatcherOptions) {\n this.projectRoot = options.projectRoot;\n this.config = options.config;\n this.debounceMs = options.debounceMs || 5000;\n this.onRefresh = options.onRefresh;\n this.onError = options.onError;\n }\n\n /**\n * Start watching for changes\n */\n async start(): Promise<void> {\n console.log('👁️ Guardrail Watcher starting...');\n\n // Load initial truthpack hash\n const truthpack = await loadTruthpack(this.projectRoot);\n this.lastTruthpackHash = truthpack?.meta.hash || null;\n\n // Create watcher\n this.watcher = chokidar.watch([\n '**/*.ts',\n '**/*.tsx',\n '**/*.js',\n '**/*.jsx',\n '**/*.json',\n '**/*.md',\n '.env*',\n ], {\n cwd: this.projectRoot,\n ignored: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/.git/**',\n '**/.vibecheck/**', // Don't watch our own output\n '**/.cursor/**', // Don't watch cursor rules\n ],\n persistent: true,\n ignoreInitial: true,\n });\n\n this.watcher.on('add', (filePath) => this.handleChange('add', filePath));\n this.watcher.on('change', (filePath) => this.handleChange('change', filePath));\n this.watcher.on('unlink', (filePath) => this.handleChange('unlink', filePath));\n this.watcher.on('error', (error) => this.handleError(error));\n\n console.log('👁️ Watching for changes...');\n\n // Do initial refresh based on configured interval\n if (this.config.settings.autoRefresh) {\n this.schedulePeriodicRefresh();\n }\n }\n\n /**\n * Stop watching\n */\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n console.log('👁️ Watcher stopped');\n }\n\n /**\n * Force a refresh now\n */\n async forceRefresh(): Promise<RefreshResult> {\n return this.doRefresh();\n }\n\n private handleChange(type: WatcherEvent['type'], filePath: string): void {\n this.pendingChanges.push({\n type,\n path: filePath,\n timestamp: new Date(),\n });\n\n // Debounce changes\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.processChanges();\n }, this.debounceMs);\n }\n\n private async processChanges(): Promise<void> {\n if (this.isRefreshing) {\n return; // Skip if already refreshing\n }\n\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n\n if (changes.length === 0) {\n return;\n }\n\n // Categorize changes\n const categories = this.categorizeChanges(changes);\n \n console.log(`📝 Processing ${changes.length} changes...`);\n console.log(` - Source files: ${categories.source}`);\n console.log(` - Config files: ${categories.config}`);\n console.log(` - Documentation: ${categories.docs}`);\n\n // Decide what to refresh based on changes\n if (categories.source > 0 || categories.config > 0) {\n await this.doRefresh();\n } else if (categories.docs > 0) {\n // Only refresh documentation-related rules\n await this.refreshDocRules();\n }\n }\n\n private categorizeChanges(changes: WatcherEvent[]): {\n source: number;\n config: number;\n docs: number;\n } {\n let source = 0;\n let config = 0;\n let docs = 0;\n\n for (const change of changes) {\n const ext = path.extname(change.path).toLowerCase();\n const basename = path.basename(change.path).toLowerCase();\n\n if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n source++;\n } else if (basename.includes('.env') || ext === '.json') {\n config++;\n } else if (ext === '.md') {\n docs++;\n }\n }\n\n return { source, config, docs };\n }\n\n private async doRefresh(): Promise<RefreshResult> {\n this.isRefreshing = true;\n const startTime = Date.now();\n\n try {\n console.log('🔄 Refreshing guardrails...');\n\n // Rescan truthpack\n const newTruthpack = await scanTruthpack(this.projectRoot, this.config.scanners);\n await saveTruthpack(this.projectRoot, newTruthpack);\n\n // Compare with previous\n const oldHash = this.lastTruthpackHash;\n const newHash = newTruthpack.meta.hash;\n this.lastTruthpackHash = newHash;\n\n // If truthpack changed significantly, regenerate rules\n let rulesUpdated = 0;\n let rulesAdded = 0;\n let rulesRemoved = 0;\n\n if (oldHash !== newHash) {\n console.log('📊 Truthpack changed, regenerating rules...');\n \n // Get old rules count\n const oldRulesDir = path.join(this.projectRoot, '.cursor', 'rules');\n let oldRulesCount = 0;\n try {\n const oldFiles = await fs.readdir(oldRulesDir);\n oldRulesCount = oldFiles.filter(f => f.endsWith('.mdc')).length;\n } catch {\n // Dir doesn't exist\n }\n\n // Regenerate\n const forgeResult = await forge(this.projectRoot, this.config);\n \n rulesUpdated = Math.min(oldRulesCount, forgeResult.rules.length);\n rulesAdded = Math.max(0, forgeResult.rules.length - oldRulesCount);\n rulesRemoved = Math.max(0, oldRulesCount - forgeResult.rules.length);\n }\n\n // Learn new conventions\n const conventionsLearned: string[] = [];\n const patternsDetected: string[] = [];\n\n const duration = Date.now() - startTime;\n \n const result: RefreshResult = {\n rulesUpdated,\n rulesAdded,\n rulesRemoved,\n conventionsLearned,\n patternsDetected,\n duration,\n };\n\n console.log(`✅ Refresh complete in ${duration}ms`);\n console.log(` - Rules: +${rulesAdded} / -${rulesRemoved} / ~${rulesUpdated}`);\n\n if (this.onRefresh) {\n this.onRefresh(result);\n }\n\n return result;\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n } finally {\n this.isRefreshing = false;\n }\n }\n\n private async refreshDocRules(): Promise<void> {\n // Lightweight refresh for documentation changes only\n console.log('📄 Refreshing documentation rules...');\n // This could be expanded to just update docguard-related rules\n }\n\n private schedulePeriodicRefresh(): void {\n const intervalMs = this.config.settings.refreshInterval;\n \n console.log(`⏰ Periodic refresh scheduled every ${intervalMs / 1000}s`);\n \n setInterval(async () => {\n if (!this.isRefreshing && this.pendingChanges.length === 0) {\n console.log('⏰ Running periodic refresh...');\n try {\n await this.doRefresh();\n } catch (error) {\n // Error already handled\n }\n }\n }, intervalMs);\n }\n\n private handleError(error: Error): void {\n console.error('❌ Watcher error:', error.message);\n if (this.onError) {\n this.onError(error);\n }\n }\n}\n\n/**\n * Create and start a watcher\n */\nexport async function startWatcher(options: WatcherOptions): Promise<GuardrailWatcher> {\n const watcher = new GuardrailWatcher(options);\n await watcher.start();\n return watcher;\n}\n\n/**\n * Quick one-time refresh\n */\nexport async function refreshGuardrails(\n projectRoot: string, \n config: GuardrailConfig\n): Promise<RefreshResult> {\n const watcher = new GuardrailWatcher({ projectRoot, config });\n return watcher.forceRefresh();\n}\n","/**\n * Semantic Verification Engine\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Verifies AI suggestions against ACTUAL codebase state\n * - Cross-references imports with real node_modules and local files\n * - Validates function signatures against real definitions\n * - Checks type compatibility with actual TypeScript types\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n CodeSuggestion,\n VerificationResult,\n VerificationIssue,\n VerificationMetrics,\n HallucinationType,\n CodebaseKnowledge,\n ImportInfo,\n AHFunctionInfo,\n AHParameterInfo,\n} from './types';\n\nexport class SemanticVerifier {\n private workspaceRoot: string;\n private knowledge: CodebaseKnowledge;\n private nodeModulesCache: Map<string, Set<string>> = new Map();\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.knowledge = this.initializeKnowledge();\n }\n\n private initializeKnowledge(): CodebaseKnowledge {\n return {\n imports: new Map(),\n exports: new Map(),\n types: new Map(),\n functions: new Map(),\n patterns: [],\n envVars: new Set(),\n routes: [],\n };\n }\n\n /**\n * Main verification entry point\n */\n async verify(suggestion: CodeSuggestion): Promise<VerificationResult> {\n const issues: VerificationIssue[] = [];\n \n // Extract code elements for verification\n const imports = this.extractImports(suggestion.code);\n const functionCalls = this.extractFunctionCalls(suggestion.code);\n const typeReferences = this.extractTypeReferences(suggestion.code);\n const envReferences = this.extractEnvReferences(suggestion.code);\n\n // Verify each category\n const importIssues = await this.verifyImports(imports);\n const apiIssues = await this.verifyAPICalls(functionCalls);\n const typeIssues = await this.verifyTypes(typeReferences);\n const envIssues = await this.verifyEnvVars(envReferences);\n\n issues.push(...importIssues, ...apiIssues, ...typeIssues, ...envIssues);\n\n // Calculate metrics\n const metrics = this.calculateMetrics(\n imports.length,\n importIssues.length,\n functionCalls.length,\n apiIssues.length,\n typeReferences.length,\n typeIssues.length\n );\n\n // Generate suggestions for fixes\n const suggestions = this.generateFixSuggestions(issues);\n\n return {\n valid: issues.filter(i => i.severity === 'error').length === 0,\n confidence: metrics.overallConfidence,\n issues,\n suggestions,\n metrics,\n };\n }\n\n /**\n * Extract import statements from code\n */\n private extractImports(code: string): Array<{ source: string; specifiers: string[]; line: number }> {\n const imports: Array<{ source: string; specifiers: string[]; line: number }> = [];\n const lines = code.split('\\n');\n\n // ES6 imports\n const importRegex = /import\\s+(?:(\\{[^}]+\\})|(\\*\\s+as\\s+\\w+)|(\\w+))(?:\\s*,\\s*(?:(\\{[^}]+\\})|(\\w+)))?\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n \n lines.forEach((line, index) => {\n let match;\n const lineImportRegex = /import\\s+(?:(\\{[^}]+\\})|(\\*\\s+as\\s+\\w+)|(\\w+))(?:\\s*,\\s*(?:(\\{[^}]+\\})|(\\w+)))?\\s+from\\s+['\"]([^'\"]+)['\"]/;\n match = lineImportRegex.exec(line);\n \n if (match) {\n const specifiers: string[] = [];\n // Named imports {a, b, c}\n if (match[1]) {\n const named = match[1].replace(/[{}]/g, '').split(',').map(s => s.trim().split(' as ')[0]);\n specifiers.push(...named);\n }\n // Namespace import * as X\n if (match[2]) {\n specifiers.push(match[2].replace('* as ', '').trim());\n }\n // Default import\n if (match[3]) {\n specifiers.push(match[3]);\n }\n // Additional named imports after default\n if (match[4]) {\n const named = match[4].replace(/[{}]/g, '').split(',').map(s => s.trim().split(' as ')[0]);\n specifiers.push(...named);\n }\n \n imports.push({\n source: match[6],\n specifiers,\n line: index + 1,\n });\n }\n });\n\n // CommonJS requires\n const requireRegex = /(?:const|let|var)\\s+(?:(\\{[^}]+\\})|(\\w+))\\s*=\\s*require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/;\n lines.forEach((line, index) => {\n const match = requireRegex.exec(line);\n if (match) {\n const specifiers: string[] = [];\n if (match[1]) {\n const named = match[1].replace(/[{}]/g, '').split(',').map(s => s.trim());\n specifiers.push(...named);\n }\n if (match[2]) {\n specifiers.push(match[2]);\n }\n imports.push({\n source: match[3],\n specifiers,\n line: index + 1,\n });\n }\n });\n\n return imports;\n }\n\n /**\n * Extract function calls from code\n */\n private extractFunctionCalls(code: string): Array<{ name: string; object?: string; args: number; line: number }> {\n const calls: Array<{ name: string; object?: string; args: number; line: number }> = [];\n const lines = code.split('\\n');\n\n lines.forEach((line, index) => {\n // Method calls: object.method(args)\n const methodRegex = /(\\w+)\\.(\\w+)\\s*\\(([^)]*)\\)/g;\n let match;\n while ((match = methodRegex.exec(line)) !== null) {\n const args = match[3].trim() ? match[3].split(',').length : 0;\n calls.push({\n object: match[1],\n name: match[2],\n args,\n line: index + 1,\n });\n }\n\n // Standalone function calls: func(args)\n const funcRegex = /(?<![.\\w])(\\w+)\\s*\\(([^)]*)\\)/g;\n while ((match = funcRegex.exec(line)) !== null) {\n // Skip if it's a method call (has . before it)\n const beforeMatch = line.substring(0, match.index);\n if (!beforeMatch.endsWith('.') && !['if', 'for', 'while', 'switch', 'function', 'catch'].includes(match[1])) {\n const args = match[2].trim() ? match[2].split(',').length : 0;\n calls.push({\n name: match[1],\n args,\n line: index + 1,\n });\n }\n }\n });\n\n return calls;\n }\n\n /**\n * Extract type references from code\n */\n private extractTypeReferences(code: string): Array<{ name: string; line: number }> {\n const types: Array<{ name: string; line: number }> = [];\n const lines = code.split('\\n');\n\n lines.forEach((line, index) => {\n // Type annotations: : Type, : Type[], : Type<T>\n const typeAnnotationRegex = /:\\s*(\\w+)(?:<[^>]+>)?(?:\\[\\])?/g;\n let match;\n while ((match = typeAnnotationRegex.exec(line)) !== null) {\n const typeName = match[1];\n // Skip primitive types\n if (!['string', 'number', 'boolean', 'void', 'any', 'unknown', 'never', 'null', 'undefined', 'object'].includes(typeName)) {\n types.push({ name: typeName, line: index + 1 });\n }\n }\n\n // Type assertions: as Type\n const assertionRegex = /\\bas\\s+(\\w+)/g;\n while ((match = assertionRegex.exec(line)) !== null) {\n types.push({ name: match[1], line: index + 1 });\n }\n\n // Generic type parameters: <Type>\n const genericRegex = /<(\\w+)(?:,\\s*(\\w+))*>/g;\n while ((match = genericRegex.exec(line)) !== null) {\n if (match[1] && !['T', 'K', 'V', 'U', 'P'].includes(match[1])) {\n types.push({ name: match[1], line: index + 1 });\n }\n }\n });\n\n return types;\n }\n\n /**\n * Extract environment variable references\n */\n private extractEnvReferences(code: string): Array<{ name: string; line: number }> {\n const envVars: Array<{ name: string; line: number }> = [];\n const lines = code.split('\\n');\n\n lines.forEach((line, index) => {\n // process.env.VAR_NAME\n const processEnvRegex = /process\\.env\\.(\\w+)/g;\n let match;\n while ((match = processEnvRegex.exec(line)) !== null) {\n envVars.push({ name: match[1], line: index + 1 });\n }\n\n // process.env['VAR_NAME'] or process.env[\"VAR_NAME\"]\n const bracketEnvRegex = /process\\.env\\[['\"](\\w+)['\"]\\]/g;\n while ((match = bracketEnvRegex.exec(line)) !== null) {\n envVars.push({ name: match[1], line: index + 1 });\n }\n\n // import.meta.env.VAR_NAME (Vite)\n const metaEnvRegex = /import\\.meta\\.env\\.(\\w+)/g;\n while ((match = metaEnvRegex.exec(line)) !== null) {\n envVars.push({ name: match[1], line: index + 1 });\n }\n });\n\n return envVars;\n }\n\n /**\n * Verify imports against actual node_modules and local files\n */\n private async verifyImports(imports: Array<{ source: string; specifiers: string[]; line: number }>): Promise<VerificationIssue[]> {\n const issues: VerificationIssue[] = [];\n\n for (const imp of imports) {\n const { source, specifiers, line } = imp;\n\n // Check if it's a local import\n if (source.startsWith('.') || source.startsWith('/')) {\n const resolved = await this.resolveLocalImport(source);\n if (!resolved.exists) {\n issues.push({\n type: 'fake_import',\n severity: 'error',\n message: `Import '${source}' does not exist`,\n line,\n evidence: `File not found: ${resolved.attemptedPaths.join(', ')}`,\n fix: `Check if the file exists or correct the import path`,\n });\n } else {\n // Verify exported specifiers\n for (const specifier of specifiers) {\n if (!resolved.exports.includes(specifier) && specifier !== 'default') {\n issues.push({\n type: 'invented_api',\n severity: 'error',\n message: `'${specifier}' is not exported from '${source}'`,\n line,\n evidence: `Available exports: ${resolved.exports.slice(0, 5).join(', ')}${resolved.exports.length > 5 ? '...' : ''}`,\n fix: `Use one of the available exports or add '${specifier}' to the source file`,\n });\n }\n }\n }\n } else {\n // Node module import\n const moduleExists = await this.checkNodeModule(source);\n if (!moduleExists) {\n issues.push({\n type: 'fake_import',\n severity: 'error',\n message: `Package '${source}' is not installed`,\n line,\n evidence: `Not found in node_modules`,\n fix: `Run: npm install ${source}`,\n });\n } else {\n // Verify module exports (for popular packages)\n const invalidSpecifiers = await this.verifyModuleExports(source, specifiers);\n for (const invalid of invalidSpecifiers) {\n issues.push({\n type: 'invented_api',\n severity: 'warning',\n message: `'${invalid}' may not be exported from '${source}'`,\n line,\n fix: `Check the package documentation for correct exports`,\n });\n }\n }\n }\n }\n\n return issues;\n }\n\n /**\n * Verify API/function calls against known signatures\n */\n private async verifyAPICalls(calls: Array<{ name: string; object?: string; args: number; line: number }>): Promise<VerificationIssue[]> {\n const issues: VerificationIssue[] = [];\n\n for (const call of calls) {\n // Check against known function signatures\n const funcInfo = this.knowledge.functions.get(call.object ? `${call.object}.${call.name}` : call.name);\n \n if (funcInfo) {\n const requiredParams = funcInfo.parameters.filter((p: AHParameterInfo) => !p.optional).length;\n const maxParams = funcInfo.parameters.length;\n\n if (call.args < requiredParams) {\n issues.push({\n type: 'wrong_signature',\n severity: 'error',\n message: `'${call.name}' requires at least ${requiredParams} arguments, but got ${call.args}`,\n line: call.line,\n evidence: `Expected: ${funcInfo.parameters.map((p: AHParameterInfo) => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join(', ')}`,\n fix: `Add the required arguments`,\n });\n } else if (call.args > maxParams && !funcInfo.parameters.some((p: AHParameterInfo) => p.type.includes('...'))) {\n issues.push({\n type: 'wrong_signature',\n severity: 'warning',\n message: `'${call.name}' accepts at most ${maxParams} arguments, but got ${call.args}`,\n line: call.line,\n });\n }\n }\n\n // Check for common API mistakes\n const apiMistake = this.checkCommonAPIMistakes(call);\n if (apiMistake) {\n issues.push(apiMistake);\n }\n }\n\n return issues;\n }\n\n /**\n * Verify type references against defined types\n */\n private async verifyTypes(types: Array<{ name: string; line: number }>): Promise<VerificationIssue[]> {\n const issues: VerificationIssue[] = [];\n\n for (const type of types) {\n const typeInfo = this.knowledge.types.get(type.name);\n \n if (!typeInfo) {\n // Check if it's a well-known global type\n const wellKnownTypes = ['Promise', 'Array', 'Map', 'Set', 'Record', 'Partial', 'Required', 'Pick', 'Omit', 'Exclude', 'Extract', 'ReturnType', 'Parameters', 'InstanceType', 'Readonly', 'NonNullable', 'HTMLElement', 'Event', 'Error', 'Date', 'RegExp', 'JSON', 'Math', 'console', 'window', 'document', 'Response', 'Request', 'Headers', 'URL', 'URLSearchParams', 'FormData', 'Blob', 'File', 'FileReader', 'AbortController', 'AbortSignal', 'WebSocket', 'MessageEvent', 'EventSource', 'Worker', 'SharedWorker', 'ServiceWorker', 'Navigator', 'Storage', 'localStorage', 'sessionStorage', 'crypto', 'performance', 'fetch', 'XMLHttpRequest'];\n \n if (!wellKnownTypes.includes(type.name)) {\n issues.push({\n type: 'type_mismatch',\n severity: 'warning',\n message: `Type '${type.name}' is not defined in the codebase`,\n line: type.line,\n fix: `Define the type or import it from the correct module`,\n });\n }\n }\n }\n\n return issues;\n }\n\n /**\n * Verify environment variable references\n */\n private async verifyEnvVars(envVars: Array<{ name: string; line: number }>): Promise<VerificationIssue[]> {\n const issues: VerificationIssue[] = [];\n const knownEnvVars = await this.loadKnownEnvVars();\n\n for (const env of envVars) {\n if (!knownEnvVars.has(env.name)) {\n // Check for common env var patterns\n const isStandardVar = ['NODE_ENV', 'PORT', 'HOST', 'DEBUG', 'LOG_LEVEL'].includes(env.name);\n \n issues.push({\n type: 'env_hallucination',\n severity: isStandardVar ? 'info' : 'warning',\n message: `Environment variable '${env.name}' is not defined in .env files`,\n line: env.line,\n evidence: `Known env vars: ${Array.from(knownEnvVars).slice(0, 5).join(', ')}`,\n fix: `Add ${env.name} to your .env file`,\n });\n }\n }\n\n return issues;\n }\n\n /**\n * Resolve local import path\n */\n private async resolveLocalImport(source: string): Promise<{ exists: boolean; exports: string[]; attemptedPaths: string[] }> {\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', ''];\n const attemptedPaths: string[] = [];\n\n for (const ext of extensions) {\n const filePath = path.resolve(this.workspaceRoot, source + ext);\n attemptedPaths.push(filePath);\n \n if (fs.existsSync(filePath)) {\n const exports = await this.extractExportsFromFile(filePath);\n return { exists: true, exports, attemptedPaths };\n }\n\n // Try index file\n const indexPath = path.resolve(this.workspaceRoot, source, `index${ext}`);\n attemptedPaths.push(indexPath);\n \n if (fs.existsSync(indexPath)) {\n const exports = await this.extractExportsFromFile(indexPath);\n return { exists: true, exports, attemptedPaths };\n }\n }\n\n return { exists: false, exports: [], attemptedPaths };\n }\n\n /**\n * Extract exports from a file\n */\n private async extractExportsFromFile(filePath: string): Promise<string[]> {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const exports: string[] = [];\n\n // export const/let/var/function/class name\n const namedExportRegex = /export\\s+(?:const|let|var|function|class|interface|type|enum)\\s+(\\w+)/g;\n let match;\n while ((match = namedExportRegex.exec(content)) !== null) {\n exports.push(match[1]);\n }\n\n // export { name1, name2 }\n const bracketExportRegex = /export\\s*\\{([^}]+)\\}/g;\n while ((match = bracketExportRegex.exec(content)) !== null) {\n const names = match[1].split(',').map(s => s.trim().split(' as ')[0].trim());\n exports.push(...names);\n }\n\n // export default\n if (/export\\s+default/.test(content)) {\n exports.push('default');\n }\n\n return exports;\n } catch {\n return [];\n }\n }\n\n /**\n * Check if a node module exists\n */\n private async checkNodeModule(moduleName: string): Promise<boolean> {\n // Handle scoped packages\n const packageName = moduleName.startsWith('@') \n ? moduleName.split('/').slice(0, 2).join('/')\n : moduleName.split('/')[0];\n\n const nodeModulesPath = path.join(this.workspaceRoot, 'node_modules', packageName);\n return fs.existsSync(nodeModulesPath);\n }\n\n /**\n * Verify module exports (basic check for popular packages)\n */\n private async verifyModuleExports(moduleName: string, specifiers: string[]): Promise<string[]> {\n // Common package exports mapping (extensible)\n const knownExports: Record<string, string[]> = {\n 'react': ['useState', 'useEffect', 'useCallback', 'useMemo', 'useRef', 'useContext', 'useReducer', 'createContext', 'forwardRef', 'memo', 'lazy', 'Suspense', 'Fragment', 'createElement', 'cloneElement', 'Children', 'Component', 'PureComponent', 'StrictMode'],\n 'react-dom': ['render', 'hydrate', 'createPortal', 'findDOMNode', 'unmountComponentAtNode', 'createRoot', 'hydrateRoot'],\n 'express': ['Router', 'json', 'urlencoded', 'static', 'raw', 'text'],\n 'lodash': ['map', 'filter', 'reduce', 'find', 'findIndex', 'sortBy', 'groupBy', 'debounce', 'throttle', 'cloneDeep', 'merge', 'omit', 'pick', 'get', 'set', 'isEmpty', 'isEqual', 'uniq', 'flatten', 'chunk'],\n 'axios': ['get', 'post', 'put', 'patch', 'delete', 'request', 'create', 'isAxiosError', 'all', 'spread'],\n 'zod': ['z', 'string', 'number', 'boolean', 'object', 'array', 'enum', 'union', 'intersection', 'literal', 'optional', 'nullable', 'infer'],\n };\n\n const exports = knownExports[moduleName];\n if (!exports) return []; // Can't verify unknown packages\n\n return specifiers.filter(s => s !== 'default' && !exports.includes(s));\n }\n\n /**\n * Check for common API mistakes\n */\n private checkCommonAPIMistakes(call: { name: string; object?: string; args: number; line: number }): VerificationIssue | null {\n const mistakes: Record<string, { correct: string; message: string }> = {\n 'array.length()': { correct: 'array.length', message: 'length is a property, not a method' },\n 'string.length()': { correct: 'string.length', message: 'length is a property, not a method' },\n 'console.write': { correct: 'console.log', message: 'Use console.log instead of console.write' },\n 'array.contains': { correct: 'array.includes', message: 'Use includes() instead of contains()' },\n 'string.contains': { correct: 'string.includes', message: 'Use includes() instead of contains()' },\n 'object.hasKey': { correct: 'Object.hasOwn or \"key\" in object', message: 'Use Object.hasOwn() or the in operator' },\n };\n\n const key = call.object ? `${call.object}.${call.name}` : call.name;\n const mistake = mistakes[key];\n\n if (mistake) {\n return {\n type: 'invented_api',\n severity: 'error',\n message: mistake.message,\n line: call.line,\n fix: `Use ${mistake.correct} instead`,\n };\n }\n\n return null;\n }\n\n /**\n * Load known environment variables from .env files\n */\n private async loadKnownEnvVars(): Promise<Set<string>> {\n const envFiles = ['.env', '.env.local', '.env.example', '.env.development', '.env.production'];\n const envVars = new Set<string>();\n\n for (const file of envFiles) {\n const filePath = path.join(this.workspaceRoot, file);\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n \n for (const line of lines) {\n const match = /^([A-Z_][A-Z0-9_]*)\\s*=/.exec(line);\n if (match) {\n envVars.add(match[1]);\n }\n }\n }\n }\n\n return envVars;\n }\n\n /**\n * Calculate verification metrics\n */\n private calculateMetrics(\n totalImports: number,\n importIssues: number,\n totalCalls: number,\n callIssues: number,\n totalTypes: number,\n typeIssues: number\n ): VerificationMetrics {\n const importVerification = totalImports > 0 ? ((totalImports - importIssues) / totalImports) * 100 : 100;\n const apiVerification = totalCalls > 0 ? ((totalCalls - callIssues) / totalCalls) * 100 : 100;\n const typeVerification = totalTypes > 0 ? ((totalTypes - typeIssues) / totalTypes) * 100 : 100;\n \n // Pattern alignment would require deeper analysis\n const patternAlignment = 85; // Placeholder, will be calculated by PatternLearner\n\n const overallConfidence = (importVerification * 0.35 + apiVerification * 0.35 + typeVerification * 0.2 + patternAlignment * 0.1);\n\n return {\n importVerification: Math.round(importVerification),\n apiVerification: Math.round(apiVerification),\n typeVerification: Math.round(typeVerification),\n patternAlignment,\n overallConfidence: Math.round(overallConfidence),\n };\n }\n\n /**\n * Generate fix suggestions based on issues\n */\n private generateFixSuggestions(issues: VerificationIssue[]): string[] {\n const suggestions: string[] = [];\n\n const fakeImports = issues.filter(i => i.type === 'fake_import');\n if (fakeImports.length > 0) {\n suggestions.push(`Install missing packages: npm install ${fakeImports.map(i => i.message.match(/Package '([^']+)'/)?.[1]).filter(Boolean).join(' ')}`);\n }\n\n const inventedAPIs = issues.filter(i => i.type === 'invented_api');\n if (inventedAPIs.length > 0) {\n suggestions.push(`Check API documentation for correct method names and exports`);\n }\n\n const envIssues = issues.filter(i => i.type === 'env_hallucination');\n if (envIssues.length > 0) {\n suggestions.push(`Add missing env vars to .env: ${envIssues.map(i => i.message.match(/variable '([^']+)'/)?.[1]).filter(Boolean).join(', ')}`);\n }\n\n return suggestions;\n }\n\n /**\n * Update knowledge base with new information\n */\n updateKnowledge(knowledge: Partial<CodebaseKnowledge>): void {\n if (knowledge.imports) {\n knowledge.imports.forEach((v, k) => this.knowledge.imports.set(k, v));\n }\n if (knowledge.exports) {\n knowledge.exports.forEach((v, k) => this.knowledge.exports.set(k, v));\n }\n if (knowledge.types) {\n knowledge.types.forEach((v, k) => this.knowledge.types.set(k, v));\n }\n if (knowledge.functions) {\n knowledge.functions.forEach((v, k) => this.knowledge.functions.set(k, v));\n }\n if (knowledge.patterns) {\n this.knowledge.patterns.push(...knowledge.patterns);\n }\n if (knowledge.envVars) {\n knowledge.envVars.forEach(v => this.knowledge.envVars.add(v));\n }\n if (knowledge.routes) {\n this.knowledge.routes.push(...knowledge.routes);\n }\n }\n}\n","/**\n * Hallucination Fingerprint Detector\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Detects common hallucination patterns before they cause issues\n * - Maintains a fingerprint database of known AI mistakes\n * - Uses pattern matching to catch fake packages, invented APIs\n * - Learns new patterns from user feedback\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n HallucinationFingerprint,\n HallucinationType,\n VerificationIssue,\n} from './types';\n\nexport interface DetectionResult {\n detected: boolean;\n fingerprints: HallucinationFingerprint[];\n issues: VerificationIssue[];\n riskScore: number; // 0-100, higher = more likely hallucination\n}\n\nexport class HallucinationDetector {\n private workspaceRoot: string;\n private fingerprints: HallucinationFingerprint[] = [];\n private customFingerprints: HallucinationFingerprint[] = [];\n private fingerprintPath: string;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.fingerprintPath = path.join(workspaceRoot, '.guardrail', 'hallucination-fingerprints.json');\n this.initializeBuiltInFingerprints();\n this.loadCustomFingerprints();\n }\n\n /**\n * Initialize built-in hallucination fingerprints\n * These are common patterns that AI models frequently get wrong\n */\n private initializeBuiltInFingerprints(): void {\n this.fingerprints = [\n // Fake NPM packages - commonly hallucinated\n {\n id: 'fake-pkg-1',\n pattern: '^(react-native-async|async-hooks|node-utils|simple-fetch|easy-router|quick-db|fast-json|smart-cache|auto-format|super-logger)$',\n type: 'fake_import',\n description: 'Commonly hallucinated NPM package names',\n examples: ['react-native-async', 'node-utils', 'simple-fetch'],\n frequency: 0.15,\n falsePositiveRate: 0.02,\n },\n // Invented React hooks\n {\n id: 'fake-hook-1',\n pattern: 'use(Fetch|Data|API|Query|Request|Http|Axios|Form|Input|Modal|Dialog|Toast|Notification|Auth|User|Session|Storage|Cache|Theme|Dark|Light|Responsive|Mobile|Desktop|Scroll|Intersection|Mutation|Subscription|Socket|WebSocket|SSE|EventSource|Worker|ServiceWorker|PWA|Offline|Online|Network|Connectivity|Battery|Geolocation|Camera|Microphone|MediaRecorder|Speech|Voice|Recognition|Synthesis|Vibration|DeviceMotion|DeviceOrientation|Clipboard|Share|Bluetooth|USB|NFC|Serial|HID|Gamepad|Pointer|Gyroscope|Accelerometer|Magnetometer|AmbientLight|Proximity)[A-Z]',\n type: 'invented_api',\n description: 'Potentially invented React hook (verify it exists)',\n examples: ['useFetch', 'useData', 'useAPI'],\n frequency: 0.25,\n falsePositiveRate: 0.15, // Some of these are real libraries\n },\n // Wrong Array methods\n {\n id: 'wrong-array-1',\n pattern: '\\\\.(contains|remove|add|delete|insert|append|prepend|first|last|empty|clear|size)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent Array method',\n examples: ['.contains(', '.remove(', '.first('],\n frequency: 0.08,\n falsePositiveRate: 0.01,\n },\n // Wrong String methods\n {\n id: 'wrong-string-1',\n pattern: '\\\\.(reverse|capitalize|camelCase|snakeCase|kebabCase|count|isEmpty|isBlank|format|printf|center|ljust|rjust|zfill)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent String method',\n examples: ['.capitalize(', '.reverse(', '.isEmpty('],\n frequency: 0.06,\n falsePositiveRate: 0.01,\n },\n // Wrong Promise methods\n {\n id: 'wrong-promise-1',\n pattern: 'Promise\\\\.(wait|delay|sleep|timeout|retry|parallel|serial|map|filter|reduce)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent Promise static method',\n examples: ['Promise.wait(', 'Promise.delay(', 'Promise.sleep('],\n frequency: 0.04,\n falsePositiveRate: 0.01,\n },\n // Wrong Object methods\n {\n id: 'wrong-object-1',\n pattern: 'Object\\\\.(length|size|isEmpty|isNotEmpty|merge|deepMerge|clone|deepClone|equals|deepEquals|get|set|has|delete|forEach|map|filter)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent Object static method',\n examples: ['Object.length(', 'Object.isEmpty(', 'Object.merge('],\n frequency: 0.05,\n falsePositiveRate: 0.02,\n },\n // Wrong console methods\n {\n id: 'wrong-console-1',\n pattern: 'console\\\\.(write|writeln|print|println|printf|debug|verbose|notice|critical|emergency|success|failure)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent console method',\n examples: ['console.write(', 'console.print(', 'console.success('],\n frequency: 0.03,\n falsePositiveRate: 0.01,\n },\n // Wrong fs methods (Node.js)\n {\n id: 'wrong-fs-1',\n pattern: 'fs\\\\.(read|write|delete|remove|copy|move|rename|create|open|close|seek|tell|flush|sync)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Incorrect fs method name (check correct API)',\n examples: ['fs.read(', 'fs.write(', 'fs.delete('],\n frequency: 0.04,\n falsePositiveRate: 0.05,\n },\n // Mixing async patterns\n {\n id: 'async-mix-1',\n pattern: 'await\\\\s+\\\\w+\\\\.then\\\\s*\\\\(',\n type: 'pattern_violation',\n description: 'Mixing await with .then() is redundant',\n examples: ['await fetch().then('],\n frequency: 0.07,\n falsePositiveRate: 0.01,\n },\n // Wrong Express methods\n {\n id: 'wrong-express-1',\n pattern: '(app|router)\\\\.(send|json|render|redirect|status|header|cookie|session|body|params|query)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Wrong Express method (these are response methods)',\n examples: ['app.send(', 'router.json('],\n frequency: 0.05,\n falsePositiveRate: 0.03,\n },\n // Deprecated/removed APIs\n {\n id: 'deprecated-1',\n pattern: '(componentWillMount|componentWillReceiveProps|componentWillUpdate|getInitialState|createClass|PropTypes\\\\.)',\n type: 'deprecated_api',\n description: 'Deprecated React API',\n examples: ['componentWillMount', 'componentWillReceiveProps'],\n frequency: 0.06,\n falsePositiveRate: 0.01,\n },\n // Security anti-patterns\n {\n id: 'security-1',\n pattern: '(eval\\\\s*\\\\(|innerHTML\\\\s*=|document\\\\.write|new\\\\s+Function\\\\s*\\\\()',\n type: 'security_antipattern',\n description: 'Potential security vulnerability',\n examples: ['eval(', 'innerHTML =', 'document.write('],\n frequency: 0.03,\n falsePositiveRate: 0.01,\n },\n // Hardcoded secrets\n {\n id: 'security-2',\n pattern: '(password|secret|apiKey|api_key|token|privateKey|private_key)\\\\s*[=:]\\\\s*[\\'\"][^\\'\"]{8,}[\\'\"]',\n type: 'security_antipattern',\n description: 'Potential hardcoded secret',\n examples: ['password = \"abc123\"', 'apiKey: \"sk-...\"'],\n frequency: 0.04,\n falsePositiveRate: 0.05,\n },\n // Wrong TypeScript utility types\n {\n id: 'wrong-ts-1',\n pattern: '(Optional|Nullable|Mutable|Immutable|Deep|Shallow|Strict|Loose|Safe)\\\\s*<',\n type: 'type_mismatch',\n description: 'Non-standard TypeScript utility type',\n examples: ['Optional<', 'Nullable<', 'Mutable<'],\n frequency: 0.04,\n falsePositiveRate: 0.1, // Some libraries define these\n },\n // Wrong JSON methods\n {\n id: 'wrong-json-1',\n pattern: 'JSON\\\\.(encode|decode|load|dump|loads|dumps|read|write)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent JSON method (use parse/stringify)',\n examples: ['JSON.encode(', 'JSON.decode(', 'JSON.load('],\n frequency: 0.05,\n falsePositiveRate: 0.01,\n },\n // Wrong Math methods\n {\n id: 'wrong-math-1',\n pattern: 'Math\\\\.(sum|average|avg|mean|median|mode|variance|stddev|clamp|lerp|map|constrain)\\\\s*\\\\(',\n type: 'invented_api',\n description: 'Non-existent Math method',\n examples: ['Math.sum(', 'Math.average(', 'Math.clamp('],\n frequency: 0.04,\n falsePositiveRate: 0.01,\n },\n // Confusing Python with JavaScript\n {\n id: 'python-js-1',\n pattern: '(print\\\\s*\\\\(|len\\\\s*\\\\(|range\\\\s*\\\\(|str\\\\s*\\\\(|int\\\\s*\\\\(|float\\\\s*\\\\(|list\\\\s*\\\\(|dict\\\\s*\\\\(|tuple\\\\s*\\\\(|set\\\\s*\\\\()',\n type: 'invented_api',\n description: 'Python syntax used in JavaScript context',\n examples: ['print(', 'len(', 'range('],\n frequency: 0.03,\n falsePositiveRate: 0.02,\n },\n // Wrong event names\n {\n id: 'wrong-event-1',\n pattern: 'on(click|change|submit|focus|blur|keydown|keyup|keypress|mousedown|mouseup|mousemove|mouseenter|mouseleave|scroll|resize|load)\\\\s*=',\n type: 'pattern_violation',\n description: 'Event handler should use camelCase (onClick)',\n examples: ['onclick=', 'onchange='],\n frequency: 0.02,\n falsePositiveRate: 0.1, // Valid in some contexts\n },\n ];\n }\n\n /**\n * Load custom fingerprints from project\n */\n private loadCustomFingerprints(): void {\n try {\n if (fs.existsSync(this.fingerprintPath)) {\n const data = JSON.parse(fs.readFileSync(this.fingerprintPath, 'utf-8'));\n this.customFingerprints = data.fingerprints || [];\n }\n } catch (e) {\n console.error('Failed to load custom fingerprints:', e);\n }\n }\n\n /**\n * Save custom fingerprints\n */\n private saveCustomFingerprints(): void {\n try {\n const dir = path.dirname(this.fingerprintPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.fingerprintPath, JSON.stringify({\n fingerprints: this.customFingerprints,\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n } catch (e) {\n console.error('Failed to save custom fingerprints:', e);\n }\n }\n\n /**\n * Detect hallucinations in code\n */\n detect(code: string): DetectionResult {\n const detectedFingerprints: HallucinationFingerprint[] = [];\n const issues: VerificationIssue[] = [];\n let riskScore = 0;\n\n const allFingerprints = [...this.fingerprints, ...this.customFingerprints];\n const lines = code.split('\\n');\n\n for (const fingerprint of allFingerprints) {\n try {\n const regex = new RegExp(fingerprint.pattern, 'gm');\n let match;\n\n while ((match = regex.exec(code)) !== null) {\n detectedFingerprints.push(fingerprint);\n \n // Find line number\n const lineNum = code.substring(0, match.index).split('\\n').length;\n \n issues.push({\n type: fingerprint.type,\n severity: this.getSeverity(fingerprint),\n message: fingerprint.description,\n line: lineNum,\n evidence: match[0],\n fix: this.getFix(fingerprint, match[0]),\n });\n\n // Adjust risk score based on fingerprint characteristics\n const impactScore = (1 - fingerprint.falsePositiveRate) * fingerprint.frequency * 100;\n riskScore = Math.min(100, riskScore + impactScore);\n }\n } catch (e) {\n console.error(`Invalid fingerprint pattern: ${fingerprint.pattern}`, e);\n }\n }\n\n // Additional context-aware detection\n const contextIssues = this.detectContextualHallucinations(code);\n issues.push(...contextIssues);\n\n return {\n detected: detectedFingerprints.length > 0,\n fingerprints: detectedFingerprints,\n issues,\n riskScore: Math.round(riskScore),\n };\n }\n\n /**\n * Detect hallucinations that require context\n */\n private detectContextualHallucinations(code: string): VerificationIssue[] {\n const issues: VerificationIssue[] = [];\n const lines = code.split('\\n');\n\n // Check for inconsistent async/await usage\n const hasAsync = code.includes('async ');\n const hasAwait = code.includes('await ');\n const hasPromise = code.includes('Promise');\n const hasThen = code.includes('.then(');\n\n if (hasAwait && !hasAsync) {\n const awaitLine = lines.findIndex(l => l.includes('await ')) + 1;\n issues.push({\n type: 'pattern_violation',\n severity: 'error',\n message: 'await used outside of async function',\n line: awaitLine,\n fix: 'Add async keyword to the containing function',\n });\n }\n\n // Check for mixed promise patterns (await + .then)\n if (hasAwait && hasThen) {\n const thenLine = lines.findIndex(l => l.includes('.then(')) + 1;\n issues.push({\n type: 'pattern_violation',\n severity: 'warning',\n message: 'Mixing async/await with .then() chains (pick one pattern)',\n line: thenLine,\n fix: 'Convert .then() chains to await for consistency',\n });\n }\n\n // Check for undefined variable usage (basic check)\n const variableDeclarations = new Set<string>();\n const variableUsages: Array<{ name: string; line: number }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Extract declarations\n const declMatch = line.match(/(?:const|let|var|function)\\s+(\\w+)/g);\n if (declMatch) {\n declMatch.forEach(m => {\n const name = m.split(/\\s+/)[1];\n variableDeclarations.add(name);\n });\n }\n\n // Extract usages (simplified)\n const usageMatch = line.match(/\\b([a-z_]\\w*)\\s*\\(/gi);\n if (usageMatch) {\n usageMatch.forEach(m => {\n const name = m.replace(/\\s*\\($/, '');\n if (!variableDeclarations.has(name)) {\n variableUsages.push({ name, line: i + 1 });\n }\n });\n }\n }\n\n // Check for imports that should exist for function calls\n const builtIns = new Set([\n 'console', 'Math', 'JSON', 'Date', 'Array', 'Object', 'String', 'Number',\n 'Boolean', 'RegExp', 'Error', 'Promise', 'Map', 'Set', 'WeakMap', 'WeakSet',\n 'Symbol', 'Proxy', 'Reflect', 'fetch', 'setTimeout', 'setInterval',\n 'clearTimeout', 'clearInterval', 'parseInt', 'parseFloat', 'isNaN', 'isFinite',\n 'encodeURI', 'decodeURI', 'encodeURIComponent', 'decodeURIComponent',\n 'require', 'module', 'exports', '__dirname', '__filename', 'process', 'Buffer',\n 'if', 'for', 'while', 'switch', 'catch', 'throw', 'return', 'new', 'class',\n 'function', 'async', 'await', 'import', 'export', 'default', 'from', 'const',\n 'let', 'var', 'true', 'false', 'null', 'undefined', 'this', 'super',\n ]);\n\n return issues;\n }\n\n /**\n * Get severity based on fingerprint characteristics\n */\n private getSeverity(fingerprint: HallucinationFingerprint): 'error' | 'warning' | 'info' {\n if (fingerprint.type === 'security_antipattern') return 'error';\n if (fingerprint.type === 'fake_import') return 'error';\n if (fingerprint.type === 'invented_api') return 'error';\n if (fingerprint.falsePositiveRate > 0.1) return 'info';\n if (fingerprint.frequency > 0.1) return 'warning';\n return 'warning';\n }\n\n /**\n * Get fix suggestion for a detected fingerprint\n */\n private getFix(fingerprint: HallucinationFingerprint, match: string): string {\n const fixes: Record<HallucinationType, string> = {\n fake_import: 'Verify the package exists on npm or correct the import path',\n invented_api: 'Check the API documentation for correct method names',\n wrong_signature: 'Check the function signature and provide correct arguments',\n type_mismatch: 'Use the correct TypeScript type',\n nonexistent_file: 'Create the file or correct the import path',\n deprecated_api: 'Update to use the modern API',\n pattern_violation: 'Follow the established coding patterns in the codebase',\n env_hallucination: 'Add the environment variable to .env file',\n route_mismatch: 'Match the route with defined API endpoints',\n schema_violation: 'Ensure data matches the defined schema',\n security_antipattern: 'Use a safer alternative to avoid security vulnerabilities',\n stale_reference: 'Update to reference current code/patterns',\n };\n\n return fixes[fingerprint.type] || 'Review and correct the issue';\n }\n\n /**\n * Add a new fingerprint learned from user feedback\n */\n addFingerprint(fingerprint: Omit<HallucinationFingerprint, 'id'>): void {\n const newFingerprint: HallucinationFingerprint = {\n ...fingerprint,\n id: `custom-${Date.now()}`,\n };\n this.customFingerprints.push(newFingerprint);\n this.saveCustomFingerprints();\n }\n\n /**\n * Update fingerprint frequency based on detection\n */\n updateFrequency(fingerprintId: string, detected: boolean): void {\n const fingerprint = [...this.fingerprints, ...this.customFingerprints].find(f => f.id === fingerprintId);\n if (fingerprint) {\n // Exponential moving average\n const alpha = 0.1;\n fingerprint.frequency = fingerprint.frequency * (1 - alpha) + (detected ? 1 : 0) * alpha;\n }\n }\n\n /**\n * Get all fingerprints for analysis\n */\n getAllFingerprints(): HallucinationFingerprint[] {\n return [...this.fingerprints, ...this.customFingerprints];\n }\n\n /**\n * Get high-risk fingerprints\n */\n getHighRiskFingerprints(): HallucinationFingerprint[] {\n return this.getAllFingerprints()\n .filter(f => f.frequency > 0.05 && f.falsePositiveRate < 0.1)\n .sort((a, b) => b.frequency - a.frequency);\n }\n}\n","/**\n * Confidence Scoring System\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Multi-dimensional confidence scoring based on codebase familiarity\n * - Historical accuracy tracking per code pattern type\n * - Weighted scoring based on context relevance\n * - Adaptive thresholds that learn from feedback\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n CodeSuggestion,\n ConfidenceFactors,\n CodebaseKnowledge,\n PatternSignature,\n AHParameterInfo,\n} from './types';\n\nexport interface ConfidenceScore {\n overall: number; // 0-100\n factors: ConfidenceFactors;\n grade: 'A' | 'B' | 'C' | 'D' | 'F';\n recommendation: 'accept' | 'review' | 'reject';\n reasoning: string[];\n}\n\ninterface HistoricalAccuracy {\n category: string;\n totalSuggestions: number;\n accepted: number;\n acceptedWithEdits: number;\n rejected: number;\n averageEditDistance: number;\n lastUpdated: string;\n}\n\nexport class ConfidenceScorer {\n private workspaceRoot: string;\n private knowledge: CodebaseKnowledge | null = null;\n private historicalAccuracy: Map<string, HistoricalAccuracy> = new Map();\n private historyPath: string;\n \n // Adaptive thresholds (learned over time)\n private acceptThreshold = 75;\n private reviewThreshold = 50;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.historyPath = path.join(workspaceRoot, '.guardrail', 'confidence-history.json');\n this.loadHistory();\n }\n\n /**\n * Calculate confidence score for a suggestion\n */\n score(suggestion: CodeSuggestion, knowledge?: CodebaseKnowledge): ConfidenceScore {\n if (knowledge) {\n this.knowledge = knowledge;\n }\n\n const factors = this.calculateFactors(suggestion);\n const overall = this.calculateOverall(factors);\n const grade = this.calculateGrade(overall);\n const recommendation = this.getRecommendation(overall, factors);\n const reasoning = this.generateReasoning(factors, overall);\n\n return {\n overall,\n factors,\n grade,\n recommendation,\n reasoning,\n };\n }\n\n /**\n * Calculate individual confidence factors\n */\n private calculateFactors(suggestion: CodeSuggestion): ConfidenceFactors {\n const code = suggestion.code;\n\n return {\n importFamiliarity: this.calculateImportFamiliarity(code),\n patternSimilarity: this.calculatePatternSimilarity(code),\n typeConsistency: this.calculateTypeConsistency(code),\n apiAccuracy: this.calculateAPIAccuracy(code),\n contextRelevance: this.calculateContextRelevance(suggestion),\n historicalAccuracy: this.calculateHistoricalAccuracy(code),\n };\n }\n\n /**\n * Calculate how familiar the imports are to the codebase\n */\n private calculateImportFamiliarity(code: string): number {\n if (!this.knowledge) return 50; // Neutral if no knowledge\n\n const imports = this.extractImports(code);\n if (imports.length === 0) return 100;\n\n let familiarCount = 0;\n for (const imp of imports) {\n if (this.knowledge.imports.has(imp)) {\n familiarCount++;\n } else if (this.isCommonPackage(imp)) {\n familiarCount += 0.8; // Common packages get partial credit\n }\n }\n\n return Math.round((familiarCount / imports.length) * 100);\n }\n\n /**\n * Calculate pattern similarity to existing codebase\n */\n private calculatePatternSimilarity(code: string): number {\n if (!this.knowledge || this.knowledge.patterns.length === 0) return 50;\n\n let matchScore = 0;\n let totalPatterns = 0;\n\n for (const pattern of this.knowledge.patterns) {\n try {\n const regex = new RegExp(pattern.pattern);\n if (regex.test(code)) {\n matchScore += pattern.frequency;\n }\n totalPatterns++;\n } catch {\n // Invalid pattern\n }\n }\n\n if (totalPatterns === 0) return 50;\n\n // Normalize to 0-100\n const normalized = (matchScore / totalPatterns) * 100;\n return Math.min(100, Math.round(normalized * 2)); // Scale up since matches are sparse\n }\n\n /**\n * Calculate type consistency with codebase types\n */\n private calculateTypeConsistency(code: string): number {\n if (!this.knowledge) return 50;\n\n const typeRefs = this.extractTypeReferences(code);\n if (typeRefs.length === 0) return 100;\n\n let consistentCount = 0;\n for (const type of typeRefs) {\n if (this.knowledge.types.has(type) || this.isBuiltInType(type)) {\n consistentCount++;\n }\n }\n\n return Math.round((consistentCount / typeRefs.length) * 100);\n }\n\n /**\n * Calculate API accuracy based on known function signatures\n */\n private calculateAPIAccuracy(code: string): number {\n if (!this.knowledge) return 50;\n\n const functionCalls = this.extractFunctionCalls(code);\n if (functionCalls.length === 0) return 100;\n\n let accurateCount = 0;\n for (const call of functionCalls) {\n const funcInfo = this.knowledge.functions.get(call.name);\n if (funcInfo) {\n // Check argument count\n const minArgs = funcInfo.parameters.filter((p: AHParameterInfo) => !p.optional).length;\n const maxArgs = funcInfo.parameters.length;\n \n if (call.argCount >= minArgs && call.argCount <= maxArgs) {\n accurateCount++;\n } else {\n accurateCount += 0.3; // Partial credit for known function with wrong args\n }\n } else if (this.isBuiltInFunction(call.name)) {\n accurateCount += 0.8; // Partial credit for built-ins\n }\n }\n\n return Math.round((accurateCount / functionCalls.length) * 100);\n }\n\n /**\n * Calculate context relevance\n */\n private calculateContextRelevance(suggestion: CodeSuggestion): number {\n let score = 50; // Start neutral\n\n // Language consistency\n if (suggestion.language === 'typescript' || suggestion.language === 'javascript') {\n score += 10;\n }\n\n // File path relevance (if provided)\n if (suggestion.filePath) {\n const ext = path.extname(suggestion.filePath);\n if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\n score += 10;\n }\n }\n\n // Code length (very short or very long is suspicious)\n const lineCount = suggestion.code.split('\\n').length;\n if (lineCount >= 3 && lineCount <= 100) {\n score += 15;\n } else if (lineCount > 100) {\n score -= 10; // Long suggestions more likely to have issues\n }\n\n // Check for documentation/comments\n if (suggestion.code.includes('//') || suggestion.code.includes('/*')) {\n score += 5;\n }\n\n // Check for error handling\n if (suggestion.code.includes('try') || suggestion.code.includes('catch') || suggestion.code.includes('.catch(')) {\n score += 10;\n }\n\n return Math.min(100, Math.max(0, score));\n }\n\n /**\n * Calculate based on historical accuracy for similar code\n */\n private calculateHistoricalAccuracy(code: string): number {\n const category = this.categorizeCode(code);\n const history = this.historicalAccuracy.get(category);\n\n if (!history || history.totalSuggestions < 5) {\n return 50; // Not enough data\n }\n\n const acceptRate = (history.accepted + history.acceptedWithEdits * 0.7) / history.totalSuggestions;\n return Math.round(acceptRate * 100);\n }\n\n /**\n * Calculate overall confidence score\n */\n private calculateOverall(factors: ConfidenceFactors): number {\n // Weighted average with importance-based weights\n const weights = {\n importFamiliarity: 0.20,\n patternSimilarity: 0.15,\n typeConsistency: 0.15,\n apiAccuracy: 0.25,\n contextRelevance: 0.10,\n historicalAccuracy: 0.15,\n };\n\n const overall = \n factors.importFamiliarity * weights.importFamiliarity +\n factors.patternSimilarity * weights.patternSimilarity +\n factors.typeConsistency * weights.typeConsistency +\n factors.apiAccuracy * weights.apiAccuracy +\n factors.contextRelevance * weights.contextRelevance +\n factors.historicalAccuracy * weights.historicalAccuracy;\n\n return Math.round(overall);\n }\n\n /**\n * Calculate letter grade\n */\n private calculateGrade(overall: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (overall >= 90) return 'A';\n if (overall >= 80) return 'B';\n if (overall >= 70) return 'C';\n if (overall >= 60) return 'D';\n return 'F';\n }\n\n /**\n * Get recommendation based on score and factors\n */\n private getRecommendation(overall: number, factors: ConfidenceFactors): 'accept' | 'review' | 'reject' {\n // Hard reject if any critical factor is too low\n if (factors.importFamiliarity < 30 || factors.apiAccuracy < 30) {\n return 'reject';\n }\n\n if (overall >= this.acceptThreshold) {\n return 'accept';\n } else if (overall >= this.reviewThreshold) {\n return 'review';\n }\n return 'reject';\n }\n\n /**\n * Generate human-readable reasoning\n */\n private generateReasoning(factors: ConfidenceFactors, overall: number): string[] {\n const reasons: string[] = [];\n\n if (factors.importFamiliarity >= 80) {\n reasons.push('✓ Uses familiar imports from this codebase');\n } else if (factors.importFamiliarity < 50) {\n reasons.push('⚠ Contains unfamiliar imports - verify they exist');\n }\n\n if (factors.patternSimilarity >= 70) {\n reasons.push('✓ Follows established code patterns');\n } else if (factors.patternSimilarity < 40) {\n reasons.push('⚠ Code style differs from codebase patterns');\n }\n\n if (factors.typeConsistency >= 80) {\n reasons.push('✓ Type usage is consistent with codebase');\n } else if (factors.typeConsistency < 50) {\n reasons.push('⚠ Uses types not found in codebase');\n }\n\n if (factors.apiAccuracy >= 80) {\n reasons.push('✓ API calls match known signatures');\n } else if (factors.apiAccuracy < 50) {\n reasons.push('⚠ API calls may have incorrect signatures');\n }\n\n if (factors.historicalAccuracy >= 70) {\n reasons.push('✓ Similar code has been accepted before');\n } else if (factors.historicalAccuracy < 40) {\n reasons.push('⚠ Similar code often rejected/edited');\n }\n\n if (overall >= 80) {\n reasons.unshift(`High confidence (${overall}%) - likely correct`);\n } else if (overall >= 60) {\n reasons.unshift(`Medium confidence (${overall}%) - review recommended`);\n } else {\n reasons.unshift(`Low confidence (${overall}%) - careful review needed`);\n }\n\n return reasons;\n }\n\n /**\n * Record feedback to improve future scoring\n */\n recordFeedback(suggestion: CodeSuggestion, accepted: boolean, edited: boolean, editDistance?: number): void {\n const category = this.categorizeCode(suggestion.code);\n \n let history = this.historicalAccuracy.get(category);\n if (!history) {\n history = {\n category,\n totalSuggestions: 0,\n accepted: 0,\n acceptedWithEdits: 0,\n rejected: 0,\n averageEditDistance: 0,\n lastUpdated: new Date().toISOString(),\n };\n }\n\n history.totalSuggestions++;\n if (accepted) {\n if (edited) {\n history.acceptedWithEdits++;\n if (editDistance !== undefined) {\n history.averageEditDistance = \n (history.averageEditDistance * (history.acceptedWithEdits - 1) + editDistance) / history.acceptedWithEdits;\n }\n } else {\n history.accepted++;\n }\n } else {\n history.rejected++;\n }\n history.lastUpdated = new Date().toISOString();\n\n this.historicalAccuracy.set(category, history);\n this.saveHistory();\n\n // Adapt thresholds based on feedback\n this.adaptThresholds();\n }\n\n /**\n * Adapt thresholds based on accumulated feedback\n */\n private adaptThresholds(): void {\n let totalAccepted = 0;\n let totalRejected = 0;\n\n this.historicalAccuracy.forEach(h => {\n totalAccepted += h.accepted + h.acceptedWithEdits;\n totalRejected += h.rejected;\n });\n\n const total = totalAccepted + totalRejected;\n if (total < 20) return; // Not enough data\n\n const acceptRate = totalAccepted / total;\n\n // If accept rate is high, we can be more lenient\n if (acceptRate > 0.8) {\n this.acceptThreshold = Math.max(60, this.acceptThreshold - 2);\n this.reviewThreshold = Math.max(40, this.reviewThreshold - 2);\n }\n // If accept rate is low, be more strict\n else if (acceptRate < 0.5) {\n this.acceptThreshold = Math.min(85, this.acceptThreshold + 2);\n this.reviewThreshold = Math.min(60, this.reviewThreshold + 2);\n }\n }\n\n /**\n * Helper methods\n */\n private extractImports(code: string): string[] {\n const imports: string[] = [];\n const importRegex = /import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n const requireRegex = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\n let match;\n while ((match = importRegex.exec(code)) !== null) {\n imports.push(match[1].split('/')[0].replace(/^@/, '@').split('/').slice(0, 2).join('/'));\n }\n while ((match = requireRegex.exec(code)) !== null) {\n imports.push(match[1].split('/')[0]);\n }\n\n return [...new Set(imports)];\n }\n\n private extractTypeReferences(code: string): string[] {\n const types: string[] = [];\n const typeRegex = /:\\s*(\\w+)(?:<|>|\\[|\\]|\\s|,|;|\\))/g;\n \n let match;\n while ((match = typeRegex.exec(code)) !== null) {\n if (!this.isPrimitiveType(match[1])) {\n types.push(match[1]);\n }\n }\n\n return [...new Set(types)];\n }\n\n private extractFunctionCalls(code: string): Array<{ name: string; argCount: number }> {\n const calls: Array<{ name: string; argCount: number }> = [];\n const funcRegex = /(\\w+)\\s*\\(([^)]*)\\)/g;\n\n let match;\n while ((match = funcRegex.exec(code)) !== null) {\n const name = match[1];\n const args = match[2].trim();\n if (!['if', 'for', 'while', 'switch', 'catch', 'function', 'return'].includes(name)) {\n calls.push({\n name,\n argCount: args ? args.split(',').length : 0,\n });\n }\n }\n\n return calls;\n }\n\n private categorizeCode(code: string): string {\n if (code.includes('async') || code.includes('await') || code.includes('Promise')) {\n return 'async';\n }\n if (code.includes('useState') || code.includes('useEffect') || code.includes('React')) {\n return 'react';\n }\n if (code.includes('express') || code.includes('app.get') || code.includes('router')) {\n return 'express';\n }\n if (code.includes('SELECT') || code.includes('INSERT') || code.includes('prisma')) {\n return 'database';\n }\n if (code.includes('describe') || code.includes('test(') || code.includes('expect')) {\n return 'testing';\n }\n if (code.includes('interface') || code.includes('type ') || code.includes(': {')) {\n return 'types';\n }\n return 'general';\n }\n\n private isCommonPackage(name: string): boolean {\n const common = [\n 'react', 'react-dom', 'next', 'express', 'lodash', 'axios', 'moment',\n 'date-fns', 'uuid', 'zod', 'yup', 'joi', 'prisma', 'mongoose', 'typeorm',\n 'jest', 'mocha', 'chai', 'vitest', 'typescript', 'webpack', 'vite',\n 'tailwindcss', 'styled-components', 'emotion', 'framer-motion',\n ];\n return common.includes(name.replace(/^@\\w+\\//, ''));\n }\n\n private isPrimitiveType(type: string): boolean {\n return ['string', 'number', 'boolean', 'void', 'any', 'unknown', 'never', 'null', 'undefined', 'object'].includes(type);\n }\n\n private isBuiltInType(type: string): boolean {\n const builtIns = [\n 'Promise', 'Array', 'Map', 'Set', 'Date', 'RegExp', 'Error',\n 'Record', 'Partial', 'Required', 'Pick', 'Omit', 'Exclude', 'Extract',\n 'ReturnType', 'Parameters', 'InstanceType', 'Readonly', 'NonNullable',\n 'HTMLElement', 'Event', 'Response', 'Request',\n ];\n return builtIns.includes(type) || this.isPrimitiveType(type);\n }\n\n private isBuiltInFunction(name: string): boolean {\n const builtIns = [\n 'console', 'Math', 'JSON', 'Object', 'Array', 'String', 'Number',\n 'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'fetch', 'setTimeout',\n 'setInterval', 'clearTimeout', 'clearInterval', 'Promise', 'require',\n ];\n return builtIns.includes(name);\n }\n\n private loadHistory(): void {\n try {\n if (fs.existsSync(this.historyPath)) {\n const data = JSON.parse(fs.readFileSync(this.historyPath, 'utf-8'));\n this.historicalAccuracy = new Map(Object.entries(data.history || {}));\n this.acceptThreshold = data.acceptThreshold || 75;\n this.reviewThreshold = data.reviewThreshold || 50;\n }\n } catch (e) {\n console.error('Failed to load confidence history:', e);\n }\n }\n\n private saveHistory(): void {\n try {\n const dir = path.dirname(this.historyPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n \n const data = {\n history: Object.fromEntries(this.historicalAccuracy),\n acceptThreshold: this.acceptThreshold,\n reviewThreshold: this.reviewThreshold,\n lastUpdated: new Date().toISOString(),\n };\n \n fs.writeFileSync(this.historyPath, JSON.stringify(data, null, 2));\n } catch (e) {\n console.error('Failed to save confidence history:', e);\n }\n }\n\n /**\n * Update codebase knowledge\n */\n updateKnowledge(knowledge: CodebaseKnowledge): void {\n this.knowledge = knowledge;\n }\n\n /**\n * Get current thresholds\n */\n getThresholds(): { accept: number; review: number } {\n return {\n accept: this.acceptThreshold,\n review: this.reviewThreshold,\n };\n }\n\n /**\n * Get historical accuracy stats\n */\n getStats(): { categories: HistoricalAccuracy[]; overall: { accepted: number; rejected: number; total: number } } {\n const categories = Array.from(this.historicalAccuracy.values());\n const overall = {\n accepted: categories.reduce((sum, h) => sum + h.accepted + h.acceptedWithEdits, 0),\n rejected: categories.reduce((sum, h) => sum + h.rejected, 0),\n total: categories.reduce((sum, h) => sum + h.totalSuggestions, 0),\n };\n return { categories, overall };\n }\n}\n","/**\n * Pattern Learning Engine\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Learns coding patterns from user accept/reject decisions\n * - Builds a personalized model of what \"good code\" looks like\n * - Identifies anti-patterns from rejected suggestions\n * - Continuously improves pattern matching over time\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n PatternSignature,\n LearningFeedback,\n CodeSuggestion,\n} from './types';\n\nexport interface LearnedPattern {\n id: string;\n pattern: string;\n type: 'positive' | 'negative'; // positive = good pattern, negative = anti-pattern\n category: PatternSignature['category'];\n confidence: number; // How confident we are this pattern matters\n examples: string[];\n frequency: number;\n acceptRate: number;\n rejectRate: number;\n lastSeen: string;\n}\n\nexport interface LearningStats {\n totalFeedback: number;\n patternsLearned: number;\n positivePatterns: number;\n negativePatterns: number;\n accuracyImprovement: number; // % improvement since start\n}\n\nexport class PatternLearner {\n private workspaceRoot: string;\n private patterns: LearnedPattern[] = [];\n private feedbackHistory: LearningFeedback[] = [];\n private patternsPath: string;\n private minFrequencyForPattern = 3; // Need to see pattern X times before learning\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.patternsPath = path.join(workspaceRoot, '.guardrail', 'learned-patterns.json');\n this.loadPatterns();\n }\n\n /**\n * Record feedback and learn from it\n */\n learn(feedback: LearningFeedback): void {\n this.feedbackHistory.push(feedback);\n \n // Extract patterns from the code\n const codePatterns = this.extractPatterns(feedback.context);\n \n for (const extracted of codePatterns) {\n this.updatePattern(extracted, feedback.accepted, feedback.editedBefore);\n }\n\n // Prune low-value patterns periodically\n if (this.feedbackHistory.length % 50 === 0) {\n this.prunePatterns();\n }\n\n this.savePatterns();\n }\n\n /**\n * Extract patterns from code\n */\n private extractPatterns(code: string): Array<{ pattern: string; category: PatternSignature['category'] }> {\n const patterns: Array<{ pattern: string; category: PatternSignature['category'] }> = [];\n\n // Naming patterns\n patterns.push(...this.extractNamingPatterns(code));\n \n // Structure patterns\n patterns.push(...this.extractStructurePatterns(code));\n \n // Import patterns\n patterns.push(...this.extractImportPatterns(code));\n \n // Error handling patterns\n patterns.push(...this.extractErrorPatterns(code));\n \n // Async patterns\n patterns.push(...this.extractAsyncPatterns(code));\n \n // Testing patterns\n patterns.push(...this.extractTestingPatterns(code));\n\n // API patterns (new)\n patterns.push(...this.extractAPIPatterns(code));\n\n return patterns;\n }\n\n /**\n * Extract API usage patterns\n */\n private extractAPIPatterns(code: string): Array<{ pattern: string; category: 'api' }> {\n const patterns: Array<{ pattern: string; category: 'api' }> = [];\n\n // REST API patterns\n if (/fetch\\s*\\(\\s*['\"`]/.test(code)) {\n patterns.push({ pattern: 'fetch-api', category: 'api' });\n }\n if (/axios\\.(get|post|put|patch|delete)\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'axios-methods', category: 'api' });\n }\n\n // Express/API route patterns\n if (/\\.(get|post|put|patch|delete)\\s*\\(\\s*['\"`]\\//.test(code)) {\n patterns.push({ pattern: 'rest-route-handler', category: 'api' });\n }\n if (/router\\.(get|post|put|patch|delete)/.test(code)) {\n patterns.push({ pattern: 'express-router', category: 'api' });\n }\n\n // Response handling\n if (/res\\.(json|send|status|redirect)\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'express-response', category: 'api' });\n }\n if (/\\.json\\(\\)\\s*\\.then/.test(code) || /await\\s+\\w+\\.json\\(\\)/.test(code)) {\n patterns.push({ pattern: 'json-parse-response', category: 'api' });\n }\n\n // Request validation\n if (/req\\.(body|params|query|headers)/.test(code)) {\n patterns.push({ pattern: 'request-destructure', category: 'api' });\n }\n if (/zod|yup|joi|validator/.test(code)) {\n patterns.push({ pattern: 'validation-library', category: 'api' });\n }\n\n // Authentication patterns\n if (/bearer|authorization|jwt|token/i.test(code)) {\n patterns.push({ pattern: 'auth-header', category: 'api' });\n }\n if (/middleware|authenticate|isAuth|requireAuth/i.test(code)) {\n patterns.push({ pattern: 'auth-middleware', category: 'api' });\n }\n\n // Error response patterns\n if (/res\\.status\\s*\\(\\s*[45]\\d{2}\\s*\\)/.test(code)) {\n patterns.push({ pattern: 'error-status-code', category: 'api' });\n }\n\n // Database query patterns\n if (/prisma\\.\\w+\\.(find|create|update|delete|upsert)/.test(code)) {\n patterns.push({ pattern: 'prisma-query', category: 'api' });\n }\n if (/mongoose|\\.find\\(|\\.findOne\\(|\\.save\\(\\)/.test(code)) {\n patterns.push({ pattern: 'mongoose-query', category: 'api' });\n }\n\n // GraphQL patterns\n if (/useQuery|useMutation|gql`/.test(code)) {\n patterns.push({ pattern: 'graphql-hooks', category: 'api' });\n }\n\n // WebSocket patterns\n if (/WebSocket|socket\\.io|\\.on\\s*\\(\\s*['\"]message['\"]/.test(code)) {\n patterns.push({ pattern: 'websocket', category: 'api' });\n }\n\n return patterns;\n }\n\n /**\n * Extract naming convention patterns\n */\n private extractNamingPatterns(code: string): Array<{ pattern: string; category: 'naming' }> {\n const patterns: Array<{ pattern: string; category: 'naming' }> = [];\n\n // Function naming\n const funcRegex = /(?:function|const|let|var)\\s+([a-zA-Z_]\\w*)\\s*(?:=\\s*(?:async\\s*)?\\(|[\\(:])/g;\n let match;\n while ((match = funcRegex.exec(code)) !== null) {\n const name = match[1];\n \n // Detect naming conventions\n if (/^handle[A-Z]/.test(name)) {\n patterns.push({ pattern: 'handle[A-Z]\\\\w+', category: 'naming' });\n } else if (/^on[A-Z]/.test(name)) {\n patterns.push({ pattern: 'on[A-Z]\\\\w+', category: 'naming' });\n } else if (/^get[A-Z]/.test(name)) {\n patterns.push({ pattern: 'get[A-Z]\\\\w+', category: 'naming' });\n } else if (/^set[A-Z]/.test(name)) {\n patterns.push({ pattern: 'set[A-Z]\\\\w+', category: 'naming' });\n } else if (/^is[A-Z]/.test(name)) {\n patterns.push({ pattern: 'is[A-Z]\\\\w+', category: 'naming' });\n } else if (/^has[A-Z]/.test(name)) {\n patterns.push({ pattern: 'has[A-Z]\\\\w+', category: 'naming' });\n } else if (/^use[A-Z]/.test(name)) {\n patterns.push({ pattern: 'use[A-Z]\\\\w+', category: 'naming' });\n } else if (/^fetch[A-Z]/.test(name)) {\n patterns.push({ pattern: 'fetch[A-Z]\\\\w+', category: 'naming' });\n } else if (/^load[A-Z]/.test(name)) {\n patterns.push({ pattern: 'load[A-Z]\\\\w+', category: 'naming' });\n } else if (/^create[A-Z]/.test(name)) {\n patterns.push({ pattern: 'create[A-Z]\\\\w+', category: 'naming' });\n } else if (/^update[A-Z]/.test(name)) {\n patterns.push({ pattern: 'update[A-Z]\\\\w+', category: 'naming' });\n } else if (/^delete[A-Z]/.test(name)) {\n patterns.push({ pattern: 'delete[A-Z]\\\\w+', category: 'naming' });\n }\n \n // Case style detection\n if (/^[a-z]+[A-Z]/.test(name)) {\n patterns.push({ pattern: 'camelCase', category: 'naming' });\n } else if (/^[A-Z][a-z]+[A-Z]/.test(name)) {\n patterns.push({ pattern: 'PascalCase', category: 'naming' });\n } else if (/^[a-z]+_[a-z]/.test(name)) {\n patterns.push({ pattern: 'snake_case', category: 'naming' });\n }\n }\n\n return patterns;\n }\n\n /**\n * Extract code structure patterns\n */\n private extractStructurePatterns(code: string): Array<{ pattern: string; category: 'structure' }> {\n const patterns: Array<{ pattern: string; category: 'structure' }> = [];\n\n // Arrow function vs regular function\n if (/const\\s+\\w+\\s*=\\s*\\([^)]*\\)\\s*=>/.test(code)) {\n patterns.push({ pattern: 'arrow-function-assignment', category: 'structure' });\n }\n if (/function\\s+\\w+\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'function-declaration', category: 'structure' });\n }\n\n // Destructuring patterns\n if (/const\\s*\\{[^}]+\\}\\s*=/.test(code)) {\n patterns.push({ pattern: 'object-destructuring', category: 'structure' });\n }\n if (/const\\s*\\[[^\\]]+\\]\\s*=/.test(code)) {\n patterns.push({ pattern: 'array-destructuring', category: 'structure' });\n }\n\n // Template literals\n if (/`[^`]*\\$\\{[^}]+\\}[^`]*`/.test(code)) {\n patterns.push({ pattern: 'template-literal', category: 'structure' });\n }\n\n // Spread operator\n if (/\\.\\.\\.\\w+/.test(code)) {\n patterns.push({ pattern: 'spread-operator', category: 'structure' });\n }\n\n // Optional chaining\n if (/\\?\\.[a-zA-Z]/.test(code)) {\n patterns.push({ pattern: 'optional-chaining', category: 'structure' });\n }\n\n // Nullish coalescing\n if (/\\?\\?/.test(code)) {\n patterns.push({ pattern: 'nullish-coalescing', category: 'structure' });\n }\n\n // Early returns\n if (/^\\s*if\\s*\\([^)]+\\)\\s*return\\b/m.test(code)) {\n patterns.push({ pattern: 'early-return', category: 'structure' });\n }\n\n // Guard clauses\n if (/if\\s*\\(\\s*!\\w+\\s*\\)\\s*(?:return|throw)/.test(code)) {\n patterns.push({ pattern: 'guard-clause', category: 'structure' });\n }\n\n return patterns;\n }\n\n /**\n * Extract import patterns\n */\n private extractImportPatterns(code: string): Array<{ pattern: string; category: 'import' }> {\n const patterns: Array<{ pattern: string; category: 'import' }> = [];\n\n // Named imports\n if (/import\\s*\\{[^}]+\\}\\s*from/.test(code)) {\n patterns.push({ pattern: 'named-imports', category: 'import' });\n }\n\n // Default imports\n if (/import\\s+\\w+\\s+from/.test(code)) {\n patterns.push({ pattern: 'default-import', category: 'import' });\n }\n\n // Namespace imports\n if (/import\\s+\\*\\s+as\\s+\\w+\\s+from/.test(code)) {\n patterns.push({ pattern: 'namespace-import', category: 'import' });\n }\n\n // Type-only imports\n if (/import\\s+type\\s+/.test(code)) {\n patterns.push({ pattern: 'type-only-import', category: 'import' });\n }\n\n // Relative imports\n if (/from\\s+['\"]\\.\\.?\\//.test(code)) {\n patterns.push({ pattern: 'relative-import', category: 'import' });\n }\n\n // Absolute/alias imports\n if (/from\\s+['\"]@\\//.test(code)) {\n patterns.push({ pattern: 'alias-import', category: 'import' });\n }\n\n return patterns;\n }\n\n /**\n * Extract error handling patterns\n */\n private extractErrorPatterns(code: string): Array<{ pattern: string; category: 'error_handling' }> {\n const patterns: Array<{ pattern: string; category: 'error_handling' }> = [];\n\n // Try-catch\n if (/try\\s*\\{[\\s\\S]*?\\}\\s*catch/.test(code)) {\n patterns.push({ pattern: 'try-catch', category: 'error_handling' });\n }\n\n // Try-catch-finally\n if (/try\\s*\\{[\\s\\S]*?\\}\\s*catch[\\s\\S]*?finally/.test(code)) {\n patterns.push({ pattern: 'try-catch-finally', category: 'error_handling' });\n }\n\n // Promise catch\n if (/\\.catch\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'promise-catch', category: 'error_handling' });\n }\n\n // Typed error handling\n if (/catch\\s*\\(\\s*\\w+:\\s*\\w+\\s*\\)/.test(code)) {\n patterns.push({ pattern: 'typed-catch', category: 'error_handling' });\n }\n\n // Error instanceof check\n if (/instanceof\\s+\\w*Error/.test(code)) {\n patterns.push({ pattern: 'error-instanceof', category: 'error_handling' });\n }\n\n // Custom error throw\n if (/throw\\s+new\\s+\\w+Error/.test(code)) {\n patterns.push({ pattern: 'custom-error-throw', category: 'error_handling' });\n }\n\n // Error logging\n if (/console\\.(error|warn)\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'error-logging', category: 'error_handling' });\n }\n\n return patterns;\n }\n\n /**\n * Extract async patterns\n */\n private extractAsyncPatterns(code: string): Array<{ pattern: string; category: 'async' }> {\n const patterns: Array<{ pattern: string; category: 'async' }> = [];\n\n // Async/await\n if (/async\\s+(?:function|\\()/.test(code) || /\\basync\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'async-function', category: 'async' });\n }\n if (/\\bawait\\s+/.test(code)) {\n patterns.push({ pattern: 'await-usage', category: 'async' });\n }\n\n // Promise.all\n if (/Promise\\.all\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'promise-all', category: 'async' });\n }\n\n // Promise.allSettled\n if (/Promise\\.allSettled\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'promise-allSettled', category: 'async' });\n }\n\n // Promise.race\n if (/Promise\\.race\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'promise-race', category: 'async' });\n }\n\n // Async IIFE\n if (/\\(\\s*async\\s*\\(\\s*\\)\\s*=>\\s*\\{/.test(code)) {\n patterns.push({ pattern: 'async-iife', category: 'async' });\n }\n\n // .then chain\n if (/\\.then\\s*\\([^)]+\\)\\s*\\.then/.test(code)) {\n patterns.push({ pattern: 'promise-chain', category: 'async' });\n }\n\n return patterns;\n }\n\n /**\n * Extract testing patterns\n */\n private extractTestingPatterns(code: string): Array<{ pattern: string; category: 'testing' }> {\n const patterns: Array<{ pattern: string; category: 'testing' }> = [];\n\n // describe blocks\n if (/describe\\s*\\(\\s*['\"]/.test(code)) {\n patterns.push({ pattern: 'describe-block', category: 'testing' });\n }\n\n // it/test blocks\n if (/(?:it|test)\\s*\\(\\s*['\"]/.test(code)) {\n patterns.push({ pattern: 'test-block', category: 'testing' });\n }\n\n // expect assertions\n if (/expect\\s*\\([^)]+\\)\\./.test(code)) {\n patterns.push({ pattern: 'expect-assertion', category: 'testing' });\n }\n\n // beforeEach/afterEach\n if (/(?:beforeEach|afterEach|beforeAll|afterAll)\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'test-hooks', category: 'testing' });\n }\n\n // Mock functions\n if (/(?:jest|vi)\\.(?:fn|mock|spyOn)\\s*\\(/.test(code)) {\n patterns.push({ pattern: 'mock-function', category: 'testing' });\n }\n\n // Async tests\n if (/(?:it|test)\\s*\\(\\s*['\"][^'\"]+['\"]\\s*,\\s*async/.test(code)) {\n patterns.push({ pattern: 'async-test', category: 'testing' });\n }\n\n return patterns;\n }\n\n /**\n * Update or create a pattern based on feedback\n */\n private updatePattern(\n extracted: { pattern: string; category: PatternSignature['category'] },\n accepted: boolean,\n edited: boolean\n ): void {\n let existing = this.patterns.find(p => p.pattern === extracted.pattern);\n\n if (!existing) {\n existing = {\n id: `pattern-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n pattern: extracted.pattern,\n type: 'positive',\n category: extracted.category,\n confidence: 0.5,\n examples: [],\n frequency: 0,\n acceptRate: 0,\n rejectRate: 0,\n lastSeen: new Date().toISOString(),\n };\n this.patterns.push(existing);\n }\n\n existing.frequency++;\n existing.lastSeen = new Date().toISOString();\n\n // Update accept/reject rates with exponential moving average\n const alpha = 0.1;\n if (accepted && !edited) {\n existing.acceptRate = existing.acceptRate * (1 - alpha) + 1 * alpha;\n existing.rejectRate = existing.rejectRate * (1 - alpha);\n } else if (accepted && edited) {\n existing.acceptRate = existing.acceptRate * (1 - alpha) + 0.5 * alpha;\n existing.rejectRate = existing.rejectRate * (1 - alpha) + 0.5 * alpha;\n } else {\n existing.acceptRate = existing.acceptRate * (1 - alpha);\n existing.rejectRate = existing.rejectRate * (1 - alpha) + 1 * alpha;\n }\n\n // Determine if pattern is positive or negative\n if (existing.frequency >= this.minFrequencyForPattern) {\n if (existing.acceptRate > 0.7) {\n existing.type = 'positive';\n existing.confidence = Math.min(1, existing.acceptRate);\n } else if (existing.rejectRate > 0.6) {\n existing.type = 'negative';\n existing.confidence = Math.min(1, existing.rejectRate);\n }\n }\n }\n\n /**\n * Prune low-value patterns\n */\n private prunePatterns(): void {\n this.patterns = this.patterns.filter(p => {\n // Keep patterns that are seen frequently\n if (p.frequency >= 10) return true;\n \n // Keep patterns with strong signal\n if (p.confidence > 0.7) return true;\n \n // Remove old patterns with no signal\n const lastSeen = new Date(p.lastSeen);\n const daysSinceLastSeen = (Date.now() - lastSeen.getTime()) / (1000 * 60 * 60 * 24);\n if (daysSinceLastSeen > 30 && p.frequency < 5) return false;\n \n return true;\n });\n }\n\n /**\n * Score a suggestion based on learned patterns\n */\n scorePatterns(suggestion: CodeSuggestion): { score: number; matchedPatterns: LearnedPattern[] } {\n const codePatterns = this.extractPatterns(suggestion.code);\n const matchedPatterns: LearnedPattern[] = [];\n let positiveScore = 0;\n let negativeScore = 0;\n let totalWeight = 0;\n\n for (const extracted of codePatterns) {\n const learned = this.patterns.find(p => p.pattern === extracted.pattern);\n if (learned && learned.frequency >= this.minFrequencyForPattern) {\n matchedPatterns.push(learned);\n const weight = learned.confidence * Math.log(learned.frequency + 1);\n totalWeight += weight;\n \n if (learned.type === 'positive') {\n positiveScore += weight;\n } else {\n negativeScore += weight;\n }\n }\n }\n\n if (totalWeight === 0) {\n return { score: 50, matchedPatterns }; // Neutral if no patterns match\n }\n\n const score = ((positiveScore - negativeScore) / totalWeight + 1) * 50;\n return { score: Math.max(0, Math.min(100, Math.round(score))), matchedPatterns };\n }\n\n /**\n * Get suggestions for improving code based on learned patterns\n */\n getSuggestions(code: string): string[] {\n const suggestions: string[] = [];\n const extracted = this.extractPatterns(code);\n const extractedSet = new Set(extracted.map(e => e.pattern));\n\n // Find highly positive patterns not in code\n const positivePatterns = this.patterns\n .filter(p => p.type === 'positive' && p.confidence > 0.7 && !extractedSet.has(p.pattern))\n .sort((a, b) => b.confidence - a.confidence)\n .slice(0, 3);\n\n for (const pattern of positivePatterns) {\n suggestions.push(`Consider using ${pattern.pattern} pattern (${Math.round(pattern.acceptRate * 100)}% acceptance rate)`);\n }\n\n // Find negative patterns in code\n const negativeMatches = this.patterns.filter(p => \n p.type === 'negative' && p.confidence > 0.6 && extractedSet.has(p.pattern)\n );\n\n for (const pattern of negativeMatches) {\n suggestions.push(`Consider avoiding ${pattern.pattern} pattern (${Math.round(pattern.rejectRate * 100)}% rejection rate)`);\n }\n\n return suggestions;\n }\n\n /**\n * Get learning statistics\n */\n getStats(): LearningStats {\n const positivePatterns = this.patterns.filter(p => p.type === 'positive' && p.frequency >= this.minFrequencyForPattern);\n const negativePatterns = this.patterns.filter(p => p.type === 'negative' && p.frequency >= this.minFrequencyForPattern);\n\n // Calculate accuracy improvement (simplified metric)\n const recentFeedback = this.feedbackHistory.slice(-100);\n const earlyFeedback = this.feedbackHistory.slice(0, 100);\n \n const recentAcceptRate = recentFeedback.length > 0 \n ? recentFeedback.filter(f => f.accepted).length / recentFeedback.length \n : 0;\n const earlyAcceptRate = earlyFeedback.length > 0 \n ? earlyFeedback.filter(f => f.accepted).length / earlyFeedback.length \n : 0;\n \n const accuracyImprovement = earlyAcceptRate > 0 \n ? ((recentAcceptRate - earlyAcceptRate) / earlyAcceptRate) * 100 \n : 0;\n\n return {\n totalFeedback: this.feedbackHistory.length,\n patternsLearned: positivePatterns.length + negativePatterns.length,\n positivePatterns: positivePatterns.length,\n negativePatterns: negativePatterns.length,\n accuracyImprovement: Math.round(accuracyImprovement),\n };\n }\n\n /**\n * Get all learned patterns\n */\n getPatterns(): LearnedPattern[] {\n return this.patterns.filter(p => p.frequency >= this.minFrequencyForPattern);\n }\n\n /**\n * Get positive patterns (good patterns to follow)\n */\n getPositivePatterns(): LearnedPattern[] {\n return this.patterns\n .filter(p => p.type === 'positive' && p.frequency >= this.minFrequencyForPattern)\n .sort((a, b) => b.confidence - a.confidence);\n }\n\n /**\n * Get negative patterns (anti-patterns to avoid)\n */\n getNegativePatterns(): LearnedPattern[] {\n return this.patterns\n .filter(p => p.type === 'negative' && p.frequency >= this.minFrequencyForPattern)\n .sort((a, b) => b.confidence - a.confidence);\n }\n\n /**\n * Export patterns for backup or sharing\n */\n exportPatterns(): string {\n return JSON.stringify({\n patterns: this.patterns,\n stats: this.getStats(),\n exportedAt: new Date().toISOString(),\n }, null, 2);\n }\n\n /**\n * Import patterns from backup\n */\n importPatterns(data: string): void {\n try {\n const imported = JSON.parse(data);\n if (imported.patterns && Array.isArray(imported.patterns)) {\n this.patterns = imported.patterns;\n this.savePatterns();\n }\n } catch (e) {\n console.error('Failed to import patterns:', e);\n }\n }\n\n private loadPatterns(): void {\n try {\n if (fs.existsSync(this.patternsPath)) {\n const data = JSON.parse(fs.readFileSync(this.patternsPath, 'utf-8'));\n this.patterns = data.patterns || [];\n this.feedbackHistory = data.feedbackHistory || [];\n }\n } catch (e) {\n console.error('Failed to load patterns:', e);\n }\n }\n\n private savePatterns(): void {\n try {\n const dir = path.dirname(this.patternsPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n \n fs.writeFileSync(this.patternsPath, JSON.stringify({\n patterns: this.patterns,\n feedbackHistory: this.feedbackHistory.slice(-1000), // Keep last 1000 feedbacks\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n } catch (e) {\n console.error('Failed to save patterns:', e);\n }\n }\n}\n","/**\n * Context Window Optimizer\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Smart context selection that maximizes relevant code in limited token budget\n * - Prioritizes definitions, types, and usage patterns that matter\n * - Uses semantic similarity and dependency graphs\n * - Adaptive chunking based on code structure\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport {\n ContextChunk,\n OptimizedContext,\n ContextCoverage,\n CodebaseKnowledge,\n} from './types';\n\nexport interface ContextRequest {\n targetFile: string;\n targetLine?: number;\n intent: string; // What the user is trying to do\n maxTokens: number; // Token budget\n preferredTypes?: ContextChunk['type'][];\n}\n\ninterface FileAnalysis {\n filePath: string;\n imports: string[];\n exports: string[];\n types: string[];\n functions: string[];\n dependencies: string[];\n relevanceScore: number;\n}\n\nexport class ContextOptimizer {\n private workspaceRoot: string;\n private knowledge: CodebaseKnowledge | null = null;\n private fileAnalysisCache: Map<string, FileAnalysis> = new Map();\n private avgCharsPerToken = 4; // Rough estimate\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n }\n\n /**\n * Optimize context selection for a request\n */\n async optimize(request: ContextRequest): Promise<OptimizedContext> {\n const chunks: ContextChunk[] = [];\n let totalTokens = 0;\n const tokenBudget = request.maxTokens;\n\n // Phase 1: Analyze target file and immediate context\n const targetAnalysis = await this.analyzeFile(request.targetFile);\n \n // Phase 2: Build relevance-scored chunk candidates\n const candidates = await this.buildCandidates(request, targetAnalysis);\n \n // Phase 3: Greedy selection with diversity\n const selectedChunks = this.greedySelect(candidates, tokenBudget, request.preferredTypes);\n \n // Phase 4: Calculate coverage metrics\n const coverage = this.calculateCoverage(selectedChunks, targetAnalysis);\n\n return {\n chunks: selectedChunks,\n totalTokens: selectedChunks.reduce((sum, c) => sum + c.tokens, 0),\n coverage,\n strategy: this.describeStrategy(request, selectedChunks),\n };\n }\n\n /**\n * Analyze a file for imports, exports, types, functions\n */\n private async analyzeFile(filePath: string): Promise<FileAnalysis> {\n const cached = this.fileAnalysisCache.get(filePath);\n if (cached) return cached;\n\n const fullPath = path.isAbsolute(filePath) \n ? filePath \n : path.join(this.workspaceRoot, filePath);\n\n if (!fs.existsSync(fullPath)) {\n return {\n filePath,\n imports: [],\n exports: [],\n types: [],\n functions: [],\n dependencies: [],\n relevanceScore: 0,\n };\n }\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n \n const analysis: FileAnalysis = {\n filePath,\n imports: this.extractImports(content),\n exports: this.extractExports(content),\n types: this.extractTypes(content),\n functions: this.extractFunctions(content),\n dependencies: [],\n relevanceScore: 1.0,\n };\n\n // Build dependency list from imports\n analysis.dependencies = analysis.imports.map(imp => {\n if (imp.startsWith('.')) {\n return path.resolve(path.dirname(fullPath), imp);\n }\n return imp;\n });\n\n this.fileAnalysisCache.set(filePath, analysis);\n return analysis;\n }\n\n /**\n * Build candidate chunks with relevance scores\n */\n private async buildCandidates(\n request: ContextRequest,\n targetAnalysis: FileAnalysis\n ): Promise<ContextChunk[]> {\n const candidates: ContextChunk[] = [];\n const visited = new Set<string>();\n\n // 1. Target file context (highest priority)\n const targetChunks = await this.chunkFile(request.targetFile, request.targetLine);\n for (const chunk of targetChunks) {\n chunk.relevanceScore = this.scoreRelevance(chunk, request, targetAnalysis, 1.5);\n candidates.push(chunk);\n }\n visited.add(request.targetFile);\n\n // 2. Direct dependencies (imports)\n for (const dep of targetAnalysis.dependencies) {\n if (visited.has(dep) || !dep.startsWith('.') && !dep.startsWith('/')) continue;\n \n const depChunks = await this.chunkFile(dep);\n for (const chunk of depChunks) {\n chunk.relevanceScore = this.scoreRelevance(chunk, request, targetAnalysis, 1.2);\n candidates.push(chunk);\n }\n visited.add(dep);\n }\n\n // 3. Type definition files\n const typeFiles = await this.findTypeFiles(targetAnalysis.types);\n for (const typeFile of typeFiles) {\n if (visited.has(typeFile)) continue;\n \n const typeChunks = await this.chunkFile(typeFile);\n for (const chunk of typeChunks) {\n chunk.type = 'type';\n chunk.relevanceScore = this.scoreRelevance(chunk, request, targetAnalysis, 1.1);\n candidates.push(chunk);\n }\n visited.add(typeFile);\n }\n\n // 4. Related test files\n const testFile = this.findTestFile(request.targetFile);\n if (testFile && !visited.has(testFile)) {\n const testChunks = await this.chunkFile(testFile);\n for (const chunk of testChunks) {\n chunk.type = 'test';\n chunk.relevanceScore = this.scoreRelevance(chunk, request, targetAnalysis, 0.8);\n candidates.push(chunk);\n }\n visited.add(testFile);\n }\n\n // 5. Usage examples (files that import target)\n const usageFiles = await this.findUsageFiles(request.targetFile);\n for (const usageFile of usageFiles.slice(0, 3)) {\n if (visited.has(usageFile)) continue;\n \n const usageChunks = await this.chunkFile(usageFile);\n for (const chunk of usageChunks) {\n chunk.type = 'usage';\n chunk.relevanceScore = this.scoreRelevance(chunk, request, targetAnalysis, 0.7);\n candidates.push(chunk);\n }\n visited.add(usageFile);\n }\n\n // 6. Config files (if relevant)\n if (request.intent.toLowerCase().includes('config') || \n request.intent.toLowerCase().includes('env') ||\n request.intent.toLowerCase().includes('setup')) {\n const configChunks = await this.getConfigChunks();\n for (const chunk of configChunks) {\n chunk.type = 'config';\n chunk.relevanceScore = 0.6;\n candidates.push(chunk);\n }\n }\n\n return candidates;\n }\n\n /**\n * Chunk a file into semantic segments\n */\n private async chunkFile(filePath: string, focusLine?: number): Promise<ContextChunk[]> {\n const fullPath = path.isAbsolute(filePath) \n ? filePath \n : path.join(this.workspaceRoot, filePath);\n\n if (!fs.existsSync(fullPath)) {\n return [];\n }\n\n const content = fs.readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n const chunks: ContextChunk[] = [];\n\n // Strategy: Chunk by logical boundaries\n let currentChunk: { start: number; end: number; type: ContextChunk['type'] } | null = null;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n\n // Detect chunk boundaries\n const isImport = /^import\\s/.test(line);\n const isExport = /^export\\s/.test(line);\n const isFunctionStart = /^(?:export\\s+)?(?:async\\s+)?function\\s+\\w+/.test(line) ||\n /^(?:export\\s+)?const\\s+\\w+\\s*=\\s*(?:async\\s*)?\\(/.test(line) ||\n /^(?:export\\s+)?const\\s+\\w+\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*=>/.test(line);\n const isClassStart = /^(?:export\\s+)?class\\s+\\w+/.test(line);\n const isInterfaceStart = /^(?:export\\s+)?(?:interface|type)\\s+\\w+/.test(line);\n const isEmptyLine = line.trim() === '';\n\n // Determine chunk type\n let chunkType: ContextChunk['type'] = 'usage';\n if (isImport) chunkType = 'import';\n else if (isInterfaceStart) chunkType = 'type';\n else if (isFunctionStart || isClassStart) chunkType = 'definition';\n\n // Start new chunk on boundaries\n if (isImport || isFunctionStart || isClassStart || isInterfaceStart) {\n if (currentChunk) {\n chunks.push(this.createChunk(filePath, lines, currentChunk.start, currentChunk.end, currentChunk.type));\n }\n currentChunk = { start: lineNum, end: lineNum, type: chunkType };\n } else if (currentChunk) {\n // Continue current chunk\n currentChunk.end = lineNum;\n \n // End chunk on double newline or closing brace at indent 0\n if ((isEmptyLine && i > 0 && lines[i - 1].trim() === '') ||\n (line.trim() === '}' && !line.startsWith(' ') && !line.startsWith('\\t'))) {\n chunks.push(this.createChunk(filePath, lines, currentChunk.start, currentChunk.end, currentChunk.type));\n currentChunk = null;\n }\n }\n }\n\n // Don't forget last chunk\n if (currentChunk) {\n chunks.push(this.createChunk(filePath, lines, currentChunk.start, currentChunk.end, currentChunk.type));\n }\n\n // Boost relevance of chunks near focus line\n if (focusLine) {\n for (const chunk of chunks) {\n const distance = Math.min(\n Math.abs(chunk.startLine - focusLine),\n Math.abs(chunk.endLine - focusLine)\n );\n if (distance === 0) {\n chunk.relevanceScore *= 2.0;\n } else if (distance < 10) {\n chunk.relevanceScore *= 1.5;\n } else if (distance < 30) {\n chunk.relevanceScore *= 1.2;\n }\n }\n }\n\n return chunks;\n }\n\n /**\n * Create a context chunk\n */\n private createChunk(\n filePath: string,\n lines: string[],\n start: number,\n end: number,\n type: ContextChunk['type']\n ): ContextChunk {\n const content = lines.slice(start - 1, end).join('\\n');\n const tokens = Math.ceil(content.length / this.avgCharsPerToken);\n\n return {\n id: `${filePath}:${start}-${end}`,\n filePath,\n content,\n startLine: start,\n endLine: end,\n relevanceScore: 1.0,\n tokens,\n type,\n };\n }\n\n /**\n * Score chunk relevance based on multiple factors\n */\n private scoreRelevance(\n chunk: ContextChunk,\n request: ContextRequest,\n targetAnalysis: FileAnalysis,\n baseMultiplier: number\n ): number {\n let score = baseMultiplier;\n\n // Boost for matching intent keywords\n const intentWords = request.intent.toLowerCase().split(/\\s+/);\n const chunkLower = chunk.content.toLowerCase();\n for (const word of intentWords) {\n if (word.length > 3 && chunkLower.includes(word)) {\n score *= 1.2;\n }\n }\n\n // Boost for containing referenced types\n for (const type of targetAnalysis.types) {\n if (chunk.content.includes(type)) {\n score *= 1.3;\n }\n }\n\n // Boost for containing referenced functions\n for (const func of targetAnalysis.functions) {\n if (chunk.content.includes(func)) {\n score *= 1.2;\n }\n }\n\n // Penalty for very long chunks (likely too general)\n if (chunk.tokens > 500) {\n score *= 0.7;\n }\n\n // Boost for type definitions\n if (chunk.type === 'type') {\n score *= 1.1;\n }\n\n // Boost for definitions over usage\n if (chunk.type === 'definition') {\n score *= 1.15;\n }\n\n return score;\n }\n\n /**\n * Greedy selection with diversity\n */\n private greedySelect(\n candidates: ContextChunk[],\n tokenBudget: number,\n preferredTypes?: ContextChunk['type'][]\n ): ContextChunk[] {\n // Sort by relevance score\n const sorted = [...candidates].sort((a, b) => b.relevanceScore - a.relevanceScore);\n \n const selected: ContextChunk[] = [];\n let usedTokens = 0;\n const selectedTypes = new Set<ContextChunk['type']>();\n const selectedFiles = new Set<string>();\n\n for (const chunk of sorted) {\n if (usedTokens + chunk.tokens > tokenBudget) {\n continue;\n }\n\n // Diversity bonus: prefer chunks from different files/types\n let diversityBonus = 1.0;\n if (!selectedFiles.has(chunk.filePath)) {\n diversityBonus *= 1.2;\n }\n if (!selectedTypes.has(chunk.type)) {\n diversityBonus *= 1.1;\n }\n\n // Preferred types bonus\n if (preferredTypes && preferredTypes.includes(chunk.type)) {\n diversityBonus *= 1.3;\n }\n\n // Apply diversity bonus to effective score\n const effectiveScore = chunk.relevanceScore * diversityBonus;\n\n // Check if this chunk is worth including\n if (effectiveScore > 0.3 || selected.length < 5) {\n selected.push(chunk);\n usedTokens += chunk.tokens;\n selectedTypes.add(chunk.type);\n selectedFiles.add(chunk.filePath);\n }\n }\n\n return selected;\n }\n\n /**\n * Calculate context coverage metrics\n */\n private calculateCoverage(chunks: ContextChunk[], targetAnalysis: FileAnalysis): ContextCoverage {\n const allContent = chunks.map(c => c.content).join('\\n');\n \n // Definition coverage\n const definitionChunks = chunks.filter(c => c.type === 'definition');\n const definitions = targetAnalysis.functions.length + targetAnalysis.exports.length;\n const coveredDefinitions = definitionChunks.length;\n\n // Type coverage\n const typeChunks = chunks.filter(c => c.type === 'type');\n const coveredTypes = targetAnalysis.types.filter(t => allContent.includes(t)).length;\n\n // Usage coverage\n const usageChunks = chunks.filter(c => c.type === 'usage');\n \n // Test coverage\n const testChunks = chunks.filter(c => c.type === 'test');\n\n return {\n definitions: definitions > 0 ? Math.round((coveredDefinitions / Math.max(definitions, 1)) * 100) : 100,\n types: targetAnalysis.types.length > 0 ? Math.round((coveredTypes / targetAnalysis.types.length) * 100) : 100,\n usages: Math.min(100, usageChunks.length * 33), // Max 3 usage examples = 100%\n tests: testChunks.length > 0 ? 100 : 0,\n };\n }\n\n /**\n * Describe the optimization strategy used\n */\n private describeStrategy(request: ContextRequest, chunks: ContextChunk[]): string {\n const typeBreakdown = chunks.reduce((acc, c) => {\n acc[c.type] = (acc[c.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n const fileCount = new Set(chunks.map(c => c.filePath)).size;\n \n return `Selected ${chunks.length} chunks from ${fileCount} files: ` +\n Object.entries(typeBreakdown)\n .map(([type, count]) => `${count} ${type}`)\n .join(', ');\n }\n\n /**\n * Helper: Extract imports from content\n */\n private extractImports(content: string): string[] {\n const imports: string[] = [];\n const importRegex = /import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n imports.push(match[1]);\n }\n return imports;\n }\n\n /**\n * Helper: Extract exports from content\n */\n private extractExports(content: string): string[] {\n const exports: string[] = [];\n const exportRegex = /export\\s+(?:const|let|var|function|class|interface|type|enum)\\s+(\\w+)/g;\n let match;\n while ((match = exportRegex.exec(content)) !== null) {\n exports.push(match[1]);\n }\n return exports;\n }\n\n /**\n * Helper: Extract type references\n */\n private extractTypes(content: string): string[] {\n const types: string[] = [];\n const typeRegex = /(?:interface|type)\\s+(\\w+)/g;\n const usageRegex = /:\\s*(\\w+)(?:<|>|\\[|\\]|\\s|,|;|\\))/g;\n \n let match;\n while ((match = typeRegex.exec(content)) !== null) {\n types.push(match[1]);\n }\n while ((match = usageRegex.exec(content)) !== null) {\n if (!['string', 'number', 'boolean', 'void', 'any', 'unknown', 'never'].includes(match[1])) {\n types.push(match[1]);\n }\n }\n return [...new Set(types)];\n }\n\n /**\n * Helper: Extract function names\n */\n private extractFunctions(content: string): string[] {\n const functions: string[] = [];\n const funcRegex = /(?:function|const|let|var)\\s+(\\w+)\\s*(?:=\\s*(?:async\\s*)?\\(|\\()/g;\n let match;\n while ((match = funcRegex.exec(content)) !== null) {\n functions.push(match[1]);\n }\n return functions;\n }\n\n /**\n * Find files containing type definitions\n */\n private async findTypeFiles(types: string[]): Promise<string[]> {\n const typeFiles: string[] = [];\n const typeDirs = ['types', 'interfaces', '@types', 'src/types'];\n\n for (const dir of typeDirs) {\n const fullDir = path.join(this.workspaceRoot, dir);\n if (fs.existsSync(fullDir)) {\n const files = fs.readdirSync(fullDir).filter(f => f.endsWith('.ts') || f.endsWith('.d.ts'));\n for (const file of files) {\n const filePath = path.join(dir, file);\n const content = fs.readFileSync(path.join(fullDir, file), 'utf-8');\n \n for (const type of types) {\n if (content.includes(`interface ${type}`) || content.includes(`type ${type}`)) {\n if (!typeFiles.includes(filePath)) {\n typeFiles.push(filePath);\n }\n }\n }\n }\n }\n }\n\n return typeFiles;\n }\n\n /**\n * Find test file for a source file\n */\n private findTestFile(sourceFile: string): string | null {\n const baseName = path.basename(sourceFile, path.extname(sourceFile));\n const dirName = path.dirname(sourceFile);\n \n const testPatterns = [\n `${baseName}.test.ts`,\n `${baseName}.spec.ts`,\n `${baseName}.test.tsx`,\n `${baseName}.spec.tsx`,\n `__tests__/${baseName}.ts`,\n `__tests__/${baseName}.tsx`,\n ];\n\n for (const pattern of testPatterns) {\n const testPath = path.join(dirName, pattern);\n const fullPath = path.join(this.workspaceRoot, testPath);\n if (fs.existsSync(fullPath)) {\n return testPath;\n }\n }\n\n return null;\n }\n\n /**\n * Find files that import the target file\n */\n private async findUsageFiles(targetFile: string): Promise<string[]> {\n const usageFiles: string[] = [];\n const targetName = path.basename(targetFile, path.extname(targetFile));\n \n // Simple search in src directory\n const searchDir = path.join(this.workspaceRoot, 'src');\n if (!fs.existsSync(searchDir)) return usageFiles;\n\n const searchFiles = (dir: string) => {\n const items = fs.readdirSync(dir, { withFileTypes: true });\n for (const item of items) {\n const fullPath = path.join(dir, item.name);\n if (item.isDirectory() && !item.name.startsWith('.') && item.name !== 'node_modules') {\n searchFiles(fullPath);\n } else if (item.isFile() && (item.name.endsWith('.ts') || item.name.endsWith('.tsx'))) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n if (content.includes(`from './${targetName}'`) || \n content.includes(`from '../${targetName}'`) ||\n content.includes(`from '${targetFile}'`)) {\n usageFiles.push(path.relative(this.workspaceRoot, fullPath));\n }\n }\n }\n };\n\n try {\n searchFiles(searchDir);\n } catch {\n // Ignore errors during search\n }\n\n return usageFiles.slice(0, 5); // Limit to 5 files\n }\n\n /**\n * Get config file chunks\n */\n private async getConfigChunks(): Promise<ContextChunk[]> {\n const configFiles = [\n 'package.json',\n 'tsconfig.json',\n '.env.example',\n 'vite.config.ts',\n 'next.config.js',\n 'webpack.config.js',\n ];\n\n const chunks: ContextChunk[] = [];\n \n for (const configFile of configFiles) {\n const fullPath = path.join(this.workspaceRoot, configFile);\n if (fs.existsSync(fullPath)) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n const tokens = Math.ceil(content.length / this.avgCharsPerToken);\n \n if (tokens < 500) { // Only include if reasonable size\n chunks.push({\n id: `config:${configFile}`,\n filePath: configFile,\n content,\n startLine: 1,\n endLine: content.split('\\n').length,\n relevanceScore: 0.5,\n tokens,\n type: 'config',\n });\n }\n }\n }\n\n return chunks;\n }\n\n /**\n * Update codebase knowledge\n */\n updateKnowledge(knowledge: CodebaseKnowledge): void {\n this.knowledge = knowledge;\n }\n\n /**\n * Clear file analysis cache\n */\n clearCache(): void {\n this.fileAnalysisCache.clear();\n }\n}\n","/**\n * Anti-Hallucination Engine - Main Orchestrator\n * \n * This is the unified interface that combines all anti-hallucination features:\n * - Semantic Verification\n * - Hallucination Fingerprinting\n * - Confidence Scoring\n * - Pattern Learning\n * - Context Optimization\n * \n * WHAT MAKES THIS BEST IN THE WORLD:\n * 1. Multi-layer validation - catches hallucinations at multiple levels\n * 2. Learning system - gets better with every accept/reject\n * 3. Confidence-based gating - prevents low-quality suggestions\n * 4. Smart context - maximizes relevant code in prompts\n * 5. Real-time feedback loop - adapts to your codebase\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { SemanticVerifier } from './SemanticVerifier';\nimport { HallucinationDetector, DetectionResult } from './HallucinationDetector';\nimport { ConfidenceScorer, ConfidenceScore } from './ConfidenceScorer';\nimport { PatternLearner, LearningStats } from './PatternLearner';\nimport { ContextOptimizer, ContextRequest } from './ContextOptimizer';\nimport { VibecheckVerifier, ContextSource, VerificationBadge } from './VibecheckVerifier';\nimport {\n CodeSuggestion,\n VerificationResult,\n OptimizedContext,\n CodebaseKnowledge,\n LearningFeedback,\n ContextChunk,\n} from './types';\n\nexport interface AnalysisResult {\n suggestion: CodeSuggestion;\n verification: VerificationResult;\n detection: DetectionResult;\n confidence: ConfidenceScore;\n patternScore: { score: number; matchedPatterns: any[] };\n shouldAccept: boolean;\n shouldReview: boolean;\n shouldReject: boolean;\n summary: AnalysisSummary;\n}\n\nexport interface AnalysisSummary {\n overallScore: number;\n grade: string;\n recommendation: 'accept' | 'review' | 'reject';\n topIssues: string[];\n topStrengths: string[];\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface EngineStats {\n totalAnalyzed: number;\n accepted: number;\n rejected: number;\n reviewed: number;\n averageConfidence: number;\n hallucinationsDetected: number;\n patternsLearned: number;\n accuracyImprovement: number;\n}\n\nexport class AntiHallucinationEngine {\n private workspaceRoot: string;\n private verifier: SemanticVerifier;\n private detector: HallucinationDetector;\n private scorer: ConfidenceScorer;\n private learner: PatternLearner;\n private optimizer: ContextOptimizer;\n private vibecheckVerifier: VibecheckVerifier;\n private knowledge: CodebaseKnowledge | null = null;\n private statsPath: string;\n private stats: EngineStats;\n private lastContextUsed: ContextSource[] = [];\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.statsPath = path.join(workspaceRoot, '.guardrail', 'engine-stats.json');\n \n // Initialize all components\n this.verifier = new SemanticVerifier(workspaceRoot);\n this.detector = new HallucinationDetector(workspaceRoot);\n this.scorer = new ConfidenceScorer(workspaceRoot);\n this.learner = new PatternLearner(workspaceRoot);\n this.optimizer = new ContextOptimizer(workspaceRoot);\n this.vibecheckVerifier = new VibecheckVerifier(workspaceRoot);\n \n this.stats = this.loadStats();\n }\n\n /**\n * Analyze a code suggestion through all anti-hallucination layers\n */\n async analyze(suggestion: CodeSuggestion): Promise<AnalysisResult> {\n // Layer 1: Semantic Verification\n const verification = await this.verifier.verify(suggestion);\n \n // Layer 2: Hallucination Fingerprint Detection\n const detection = this.detector.detect(suggestion.code);\n \n // Layer 3: Confidence Scoring\n const confidence = this.scorer.score(suggestion, this.knowledge || undefined);\n \n // Layer 4: Pattern-based Scoring\n const patternScore = this.learner.scorePatterns(suggestion);\n\n // Combine all scores into final recommendation\n const summary = this.generateSummary(verification, detection, confidence, patternScore);\n \n // Update stats\n this.stats.totalAnalyzed++;\n if (summary.recommendation === 'accept') this.stats.accepted++;\n else if (summary.recommendation === 'reject') this.stats.rejected++;\n else this.stats.reviewed++;\n \n this.stats.averageConfidence = \n (this.stats.averageConfidence * (this.stats.totalAnalyzed - 1) + summary.overallScore) / this.stats.totalAnalyzed;\n \n if (detection.detected) {\n this.stats.hallucinationsDetected++;\n }\n \n this.saveStats();\n\n return {\n suggestion,\n verification,\n detection,\n confidence,\n patternScore,\n shouldAccept: summary.recommendation === 'accept',\n shouldReview: summary.recommendation === 'review',\n shouldReject: summary.recommendation === 'reject',\n summary,\n };\n }\n\n /**\n * Quick check - fast path for obvious cases\n */\n quickCheck(code: string): { pass: boolean; issues: string[] } {\n const detection = this.detector.detect(code);\n \n if (detection.riskScore > 70) {\n return {\n pass: false,\n issues: detection.issues.slice(0, 3).map(i => i.message),\n };\n }\n\n return { pass: true, issues: [] };\n }\n\n /**\n * Record user feedback for learning\n */\n recordFeedback(feedback: LearningFeedback): void {\n // Feed to pattern learner\n this.learner.learn(feedback);\n \n // Feed to confidence scorer\n this.scorer.recordFeedback(\n { id: feedback.suggestionId, code: feedback.context, language: 'typescript', source: 'ai', timestamp: Date.now() },\n feedback.accepted,\n feedback.editedBefore,\n feedback.editDistance\n );\n\n // Update learning stats\n const learningStats = this.learner.getStats();\n this.stats.patternsLearned = learningStats.patternsLearned;\n this.stats.accuracyImprovement = learningStats.accuracyImprovement;\n this.saveStats();\n }\n\n /**\n * Get optimized context for a request and track it for Vibecheck badge\n */\n async getOptimizedContext(request: ContextRequest): Promise<OptimizedContext> {\n const context = await this.optimizer.optimize(request);\n \n // Track context for Vibecheck badge generation\n this.lastContextUsed = context.chunks.map(chunk => ({\n path: chunk.filePath,\n type: chunk.type === 'definition' || chunk.type === 'type' ? 'file' : 'file',\n relevance: chunk.relevanceScore,\n linesUsed: [{ start: chunk.startLine, end: chunk.endLine }],\n }));\n \n return context;\n }\n\n /**\n * Analyze and generate verified code with \"Verified by Vibecheck\" badge\n * This is the main method AI agents should use\n */\n async analyzeAndVerify(\n code: string,\n language: string,\n contextUsed?: ContextSource[]\n ): Promise<{\n analysis: AnalysisResult;\n verifiedCode: string;\n badge: VerificationBadge;\n }> {\n const suggestion: CodeSuggestion = {\n id: `suggestion-${Date.now()}`,\n code,\n language,\n source: 'ai',\n timestamp: Date.now(),\n };\n\n // Run full analysis\n const analysis = await this.analyze(suggestion);\n\n // Use provided context or last tracked context\n const context = contextUsed || this.lastContextUsed;\n\n // Generate Vibecheck badge\n const badge = this.vibecheckVerifier.generateBadge(\n code,\n analysis.summary.overallScore,\n analysis.summary.grade,\n context,\n analysis.summary.topIssues\n );\n\n // Add badge to code if verified\n const verifiedCode = this.vibecheckVerifier.addBadgeToCode(code, badge, language);\n\n return {\n analysis,\n verifiedCode,\n badge,\n };\n }\n\n /**\n * Generate a Vibecheck badge for already-analyzed code\n */\n generateVibecheckBadge(\n code: string,\n confidenceScore: number,\n confidenceGrade: string,\n contextUsed: ContextSource[],\n issues: string[] = []\n ): VerificationBadge {\n return this.vibecheckVerifier.generateBadge(\n code,\n confidenceScore,\n confidenceGrade,\n contextUsed,\n issues\n );\n }\n\n /**\n * Add Vibecheck badge to code\n */\n addVibecheckBadge(code: string, badge: VerificationBadge, language: string): string {\n return this.vibecheckVerifier.addBadgeToCode(code, badge, language);\n }\n\n /**\n * Check if code has a Vibecheck badge\n */\n hasVibecheckBadge(code: string): boolean {\n return this.vibecheckVerifier.hasVibecheckBadge(code);\n }\n\n /**\n * Verify the integrity of a Vibecheck badge in code\n */\n verifyVibecheckBadge(code: string): { valid: boolean; metadata?: any } {\n return this.vibecheckVerifier.verifyChecksum(code);\n }\n\n /**\n * Get Vibecheck verification statistics\n */\n getVibecheckStats(): {\n totalVerifications: number;\n verified: number;\n needsReview: number;\n avgConfidence: number;\n topContextSources: Array<{ path: string; count: number }>;\n } {\n return this.vibecheckVerifier.getStats();\n }\n\n /**\n * Update codebase knowledge (call after scanning)\n */\n updateKnowledge(knowledge: CodebaseKnowledge): void {\n this.knowledge = knowledge;\n this.verifier.updateKnowledge(knowledge);\n this.scorer.updateKnowledge(knowledge);\n this.optimizer.updateKnowledge(knowledge);\n }\n\n /**\n * Generate analysis summary\n */\n private generateSummary(\n verification: VerificationResult,\n detection: DetectionResult,\n confidence: ConfidenceScore,\n patternScore: { score: number; matchedPatterns: any[] }\n ): AnalysisSummary {\n // Calculate overall score (weighted combination)\n const weights = {\n verification: 0.30,\n detection: 0.25,\n confidence: 0.30,\n pattern: 0.15,\n };\n\n const verificationScore = verification.confidence;\n const detectionScore = 100 - detection.riskScore; // Invert risk score\n const confidenceScore = confidence.overall;\n const patternScoreValue = patternScore.score;\n\n const overallScore = Math.round(\n verificationScore * weights.verification +\n detectionScore * weights.detection +\n confidenceScore * weights.confidence +\n patternScoreValue * weights.pattern\n );\n\n // Determine grade\n let grade: string;\n if (overallScore >= 90) grade = 'A+';\n else if (overallScore >= 85) grade = 'A';\n else if (overallScore >= 80) grade = 'B+';\n else if (overallScore >= 75) grade = 'B';\n else if (overallScore >= 70) grade = 'C+';\n else if (overallScore >= 65) grade = 'C';\n else if (overallScore >= 60) grade = 'D';\n else grade = 'F';\n\n // Determine recommendation\n let recommendation: 'accept' | 'review' | 'reject';\n if (overallScore >= 80 && !verification.issues.some(i => i.severity === 'error')) {\n recommendation = 'accept';\n } else if (overallScore >= 60 || verification.issues.every(i => i.severity !== 'error')) {\n recommendation = 'review';\n } else {\n recommendation = 'reject';\n }\n\n // Hard reject conditions\n if (detection.riskScore > 80) {\n recommendation = 'reject';\n }\n if (verification.issues.filter(i => i.severity === 'error').length > 2) {\n recommendation = 'reject';\n }\n\n // Collect top issues\n const topIssues: string[] = [];\n \n // From verification\n verification.issues\n .filter(i => i.severity === 'error')\n .slice(0, 2)\n .forEach(i => topIssues.push(`❌ ${i.message}`));\n \n // From detection\n detection.issues\n .filter(i => i.severity === 'error')\n .slice(0, 2)\n .forEach(i => topIssues.push(`⚠️ ${i.message}`));\n \n // From confidence\n confidence.reasoning\n .filter(r => r.startsWith('⚠'))\n .slice(0, 2)\n .forEach(r => topIssues.push(r));\n\n // Collect top strengths\n const topStrengths: string[] = [];\n \n confidence.reasoning\n .filter(r => r.startsWith('✓'))\n .slice(0, 3)\n .forEach(r => topStrengths.push(r));\n \n if (verification.metrics.importVerification >= 90) {\n topStrengths.push('✓ All imports verified');\n }\n if (verification.metrics.apiVerification >= 90) {\n topStrengths.push('✓ API calls match signatures');\n }\n if (patternScore.score >= 70) {\n topStrengths.push('✓ Follows learned patterns');\n }\n\n // Determine risk level\n let riskLevel: 'low' | 'medium' | 'high' | 'critical';\n if (detection.riskScore > 70 || verification.issues.filter(i => i.severity === 'error').length > 3) {\n riskLevel = 'critical';\n } else if (detection.riskScore > 50 || verification.issues.filter(i => i.severity === 'error').length > 1) {\n riskLevel = 'high';\n } else if (detection.riskScore > 30 || verification.issues.some(i => i.severity === 'error')) {\n riskLevel = 'medium';\n } else {\n riskLevel = 'low';\n }\n\n return {\n overallScore,\n grade,\n recommendation,\n topIssues: topIssues.slice(0, 5),\n topStrengths: topStrengths.slice(0, 5),\n riskLevel,\n };\n }\n\n /**\n * Get engine statistics\n */\n getStats(): EngineStats {\n return { ...this.stats };\n }\n\n /**\n * Get detailed breakdown for dashboard\n */\n getDashboardData(): {\n stats: EngineStats;\n thresholds: { accept: number; review: number };\n recentHallucinations: { type: string; count: number }[];\n patternStats: LearningStats;\n confidenceHistory: { date: string; avgConfidence: number }[];\n } {\n const patternStats = this.learner.getStats();\n const thresholds = this.scorer.getThresholds();\n \n // Aggregate hallucination types\n const fingerprints = this.detector.getAllFingerprints();\n const hallucinationCounts = fingerprints\n .filter(f => f.frequency > 0)\n .reduce((acc, f) => {\n acc[f.type] = (acc[f.type] || 0) + Math.round(f.frequency * 100);\n return acc;\n }, {} as Record<string, number>);\n \n const recentHallucinations = Object.entries(hallucinationCounts)\n .map(([type, count]) => ({ type, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n\n return {\n stats: this.stats,\n thresholds,\n recentHallucinations,\n patternStats,\n confidenceHistory: [], // Would need historical tracking\n };\n }\n\n /**\n * Get improvement suggestions\n */\n getImprovementSuggestions(): string[] {\n const suggestions: string[] = [];\n \n // Based on stats\n if (this.stats.hallucinationsDetected > this.stats.totalAnalyzed * 0.3) {\n suggestions.push('High hallucination rate detected - consider using more specific prompts');\n }\n \n if (this.stats.averageConfidence < 60) {\n suggestions.push('Low average confidence - AI may not be familiar with your codebase patterns');\n }\n\n // Based on pattern learning\n const negativePatterns = this.learner.getNegativePatterns();\n if (negativePatterns.length > 0) {\n const topNegative = negativePatterns[0];\n suggestions.push(`Frequently rejected pattern: ${topNegative.pattern} - add to custom rules`);\n }\n\n // Based on confidence thresholds\n const thresholds = this.scorer.getThresholds();\n if (thresholds.accept > 80) {\n suggestions.push('High acceptance threshold - the system has learned to be strict based on your feedback');\n }\n\n return suggestions;\n }\n\n /**\n * Export all learned data for backup\n */\n exportLearnedData(): string {\n return JSON.stringify({\n patterns: this.learner.exportPatterns(),\n stats: this.stats,\n exportedAt: new Date().toISOString(),\n }, null, 2);\n }\n\n /**\n * Reset learning (use with caution)\n */\n resetLearning(): void {\n this.stats = {\n totalAnalyzed: 0,\n accepted: 0,\n rejected: 0,\n reviewed: 0,\n averageConfidence: 0,\n hallucinationsDetected: 0,\n patternsLearned: 0,\n accuracyImprovement: 0,\n };\n this.saveStats();\n \n // Clear guardrail directory files\n const files = ['learned-patterns.json', 'confidence-history.json', 'hallucination-fingerprints.json'];\n for (const file of files) {\n const filePath = path.join(this.workspaceRoot, '.guardrail', file);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n }\n\n private loadStats(): EngineStats {\n try {\n if (fs.existsSync(this.statsPath)) {\n return JSON.parse(fs.readFileSync(this.statsPath, 'utf-8'));\n }\n } catch (e) {\n console.error('Failed to load engine stats:', e);\n }\n \n return {\n totalAnalyzed: 0,\n accepted: 0,\n rejected: 0,\n reviewed: 0,\n averageConfidence: 0,\n hallucinationsDetected: 0,\n patternsLearned: 0,\n accuracyImprovement: 0,\n };\n }\n\n private saveStats(): void {\n try {\n const dir = path.dirname(this.statsPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.statsPath, JSON.stringify(this.stats, null, 2));\n } catch (e) {\n console.error('Failed to save engine stats:', e);\n }\n }\n}\n\n// Export a factory function for easy instantiation\nexport function createAntiHallucinationEngine(workspaceRoot: string): AntiHallucinationEngine {\n return new AntiHallucinationEngine(workspaceRoot);\n}\n","/**\n * Vibecheck Verification System\n * \n * Adds provenance tracking to AI-generated code:\n * - Marks verified code with \"Verified by Vibecheck\" badge\n * - Tracks which context folders/files were used\n * - Generates verification metadata for audit trails\n * - Embeds verification comments in generated code\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\n\nexport interface VerificationMetadata {\n id: string;\n timestamp: string;\n verified: boolean;\n confidenceScore: number;\n confidenceGrade: string;\n contextUsed: ContextSource[];\n issues: string[];\n checksum: string;\n}\n\nexport interface ContextSource {\n path: string;\n type: 'file' | 'folder';\n relevance: number;\n linesUsed?: { start: number; end: number }[];\n}\n\nexport interface VerificationBadge {\n comment: string;\n metadata: VerificationMetadata;\n}\n\nexport interface VerificationOptions {\n addComment: boolean;\n commentStyle: 'block' | 'line' | 'jsdoc';\n includeTimestamp: boolean;\n includeChecksum: boolean;\n includeContextPaths: boolean;\n includeConfidence: boolean;\n minConfidenceForBadge: number;\n}\n\nconst DEFAULT_OPTIONS: VerificationOptions = {\n addComment: true,\n commentStyle: 'block',\n includeTimestamp: true,\n includeChecksum: true,\n includeContextPaths: true,\n includeConfidence: true,\n minConfidenceForBadge: 60,\n};\n\nexport class VibecheckVerifier {\n private workspaceRoot: string;\n private verificationLog: VerificationMetadata[] = [];\n private logPath: string;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.logPath = path.join(workspaceRoot, '.guardrail', 'verification-log.json');\n this.loadLog();\n }\n\n /**\n * Generate a verification badge for code\n */\n generateBadge(\n code: string,\n confidenceScore: number,\n confidenceGrade: string,\n contextUsed: ContextSource[],\n issues: string[],\n options: Partial<VerificationOptions> = {}\n ): VerificationBadge {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n \n const metadata = this.createMetadata(\n code,\n confidenceScore,\n confidenceGrade,\n contextUsed,\n issues\n );\n\n // Only add badge if confidence meets threshold\n const verified = confidenceScore >= opts.minConfidenceForBadge;\n metadata.verified = verified;\n\n const comment = this.formatComment(metadata, opts);\n\n // Log the verification\n this.verificationLog.push(metadata);\n this.saveLog();\n\n return { comment, metadata };\n }\n\n /**\n * Add verification badge to code\n */\n addBadgeToCode(\n code: string,\n badge: VerificationBadge,\n language: string\n ): string {\n if (!badge.metadata.verified) {\n // Don't add badge if not verified\n return code;\n }\n\n const commentedBadge = this.wrapInComment(badge.comment, language);\n \n // Find the right insertion point (after any shebang or initial comments)\n const lines = code.split('\\n');\n let insertIndex = 0;\n\n // Skip shebang\n if (lines[0]?.startsWith('#!')) {\n insertIndex = 1;\n }\n\n // Skip initial block comment if present\n if (lines[insertIndex]?.trim().startsWith('/*')) {\n while (insertIndex < lines.length && !lines[insertIndex].includes('*/')) {\n insertIndex++;\n }\n insertIndex++; // Move past the closing */\n }\n\n // Insert the badge\n lines.splice(insertIndex, 0, commentedBadge, '');\n \n return lines.join('\\n');\n }\n\n /**\n * Check if code already has a Vibecheck badge\n */\n hasVibecheckBadge(code: string): boolean {\n return code.includes('Verified by Vibecheck') || \n code.includes('@vibecheck-verified') ||\n code.includes('VIBECHECK_ID:');\n }\n\n /**\n * Extract verification metadata from code with badge\n */\n extractBadgeMetadata(code: string): VerificationMetadata | null {\n const idMatch = code.match(/VIBECHECK_ID:\\s*([a-f0-9-]+)/);\n if (!idMatch) return null;\n\n const id = idMatch[1];\n return this.verificationLog.find(v => v.id === id) || null;\n }\n\n /**\n * Verify that code matches its checksum\n */\n verifyChecksum(code: string): { valid: boolean; metadata?: VerificationMetadata } {\n const metadata = this.extractBadgeMetadata(code);\n if (!metadata) {\n return { valid: false };\n }\n\n // Remove the badge comment to get original code\n const codeWithoutBadge = this.removeBadge(code);\n const currentChecksum = this.generateChecksum(codeWithoutBadge);\n\n return {\n valid: currentChecksum === metadata.checksum,\n metadata,\n };\n }\n\n /**\n * Generate verification report for a file\n */\n generateReport(filePath: string): {\n hasVerification: boolean;\n metadata?: VerificationMetadata;\n checksumValid?: boolean;\n contextStillExists?: boolean;\n } {\n const fullPath = path.isAbsolute(filePath) \n ? filePath \n : path.join(this.workspaceRoot, filePath);\n\n if (!fs.existsSync(fullPath)) {\n return { hasVerification: false };\n }\n\n const code = fs.readFileSync(fullPath, 'utf-8');\n \n if (!this.hasVibecheckBadge(code)) {\n return { hasVerification: false };\n }\n\n const { valid, metadata } = this.verifyChecksum(code);\n \n // Check if context sources still exist\n let contextStillExists = true;\n if (metadata?.contextUsed) {\n for (const ctx of metadata.contextUsed) {\n const ctxPath = path.join(this.workspaceRoot, ctx.path);\n if (!fs.existsSync(ctxPath)) {\n contextStillExists = false;\n break;\n }\n }\n }\n\n return {\n hasVerification: true,\n metadata,\n checksumValid: valid,\n contextStillExists,\n };\n }\n\n /**\n * Get all verified files in workspace\n */\n async getVerifiedFiles(): Promise<Array<{\n path: string;\n metadata: VerificationMetadata;\n status: 'valid' | 'modified' | 'context_missing';\n }>> {\n const results: Array<{\n path: string;\n metadata: VerificationMetadata;\n status: 'valid' | 'modified' | 'context_missing';\n }> = [];\n\n for (const verification of this.verificationLog) {\n // Find the file that contains this verification\n // This is a simplified version - in practice you'd track file paths\n const status = 'valid'; // Would need to verify each file\n results.push({\n path: verification.contextUsed[0]?.path || 'unknown',\n metadata: verification,\n status,\n });\n }\n\n return results;\n }\n\n /**\n * Create verification metadata\n */\n private createMetadata(\n code: string,\n confidenceScore: number,\n confidenceGrade: string,\n contextUsed: ContextSource[],\n issues: string[]\n ): VerificationMetadata {\n return {\n id: this.generateId(),\n timestamp: new Date().toISOString(),\n verified: false, // Will be set based on confidence\n confidenceScore,\n confidenceGrade,\n contextUsed,\n issues,\n checksum: this.generateChecksum(code),\n };\n }\n\n /**\n * Format the verification comment\n */\n private formatComment(\n metadata: VerificationMetadata,\n options: VerificationOptions\n ): string {\n const lines: string[] = [];\n\n if (metadata.verified) {\n lines.push('═══════════════════════════════════════════════════════════════');\n lines.push(' ✓ Verified by Vibecheck');\n lines.push('═══════════════════════════════════════════════════════════════');\n } else {\n lines.push('═══════════════════════════════════════════════════════════════');\n lines.push(' ⚠ Vibecheck: Review Recommended');\n lines.push('═══════════════════════════════════════════════════════════════');\n }\n\n lines.push('');\n lines.push(` VIBECHECK_ID: ${metadata.id}`);\n\n if (options.includeConfidence) {\n lines.push(` Confidence: ${metadata.confidenceScore}% (Grade: ${metadata.confidenceGrade})`);\n }\n\n if (options.includeTimestamp) {\n lines.push(` Verified: ${metadata.timestamp}`);\n }\n\n if (options.includeContextPaths && metadata.contextUsed.length > 0) {\n lines.push('');\n lines.push(' Context Used:');\n for (const ctx of metadata.contextUsed.slice(0, 5)) {\n const icon = ctx.type === 'folder' ? '📁' : '📄';\n lines.push(` ${icon} ${ctx.path} (${Math.round(ctx.relevance * 100)}% relevant)`);\n }\n if (metadata.contextUsed.length > 5) {\n lines.push(` ... and ${metadata.contextUsed.length - 5} more`);\n }\n }\n\n if (metadata.issues.length > 0) {\n lines.push('');\n lines.push(' Issues Found:');\n for (const issue of metadata.issues.slice(0, 3)) {\n lines.push(` ⚠ ${issue}`);\n }\n }\n\n if (options.includeChecksum) {\n lines.push('');\n lines.push(` Checksum: ${metadata.checksum.substring(0, 16)}...`);\n }\n\n lines.push('');\n lines.push('═══════════════════════════════════════════════════════════════');\n\n return lines.join('\\n');\n }\n\n /**\n * Wrap comment in language-appropriate comment syntax\n */\n private wrapInComment(content: string, language: string): string {\n const jsLangs = ['javascript', 'typescript', 'jsx', 'tsx', 'js', 'ts'];\n const pyLangs = ['python', 'py'];\n const htmlLangs = ['html', 'xml', 'svg'];\n const cssLangs = ['css', 'scss', 'sass', 'less'];\n const shellLangs = ['bash', 'sh', 'shell', 'zsh'];\n\n if (jsLangs.includes(language.toLowerCase())) {\n return `/**\\n${content.split('\\n').map(l => ` * ${l}`).join('\\n')}\\n */`;\n }\n \n if (pyLangs.includes(language.toLowerCase())) {\n return `\"\"\"\\n${content}\\n\"\"\"`;\n }\n\n if (htmlLangs.includes(language.toLowerCase())) {\n return `<!--\\n${content}\\n-->`;\n }\n\n if (cssLangs.includes(language.toLowerCase())) {\n return `/*\\n${content}\\n*/`;\n }\n\n if (shellLangs.includes(language.toLowerCase())) {\n return content.split('\\n').map(l => `# ${l}`).join('\\n');\n }\n\n // Default to block comment\n return `/*\\n${content}\\n*/`;\n }\n\n /**\n * Remove Vibecheck badge from code\n */\n private removeBadge(code: string): string {\n // Remove block comment badge\n const blockPattern = /\\/\\*\\*[\\s\\S]*?Verified by Vibecheck[\\s\\S]*?\\*\\/\\n*/;\n let cleaned = code.replace(blockPattern, '');\n\n // Remove Python docstring badge\n const pyPattern = /\"\"\"[\\s\\S]*?Verified by Vibecheck[\\s\\S]*?\"\"\"\\n*/;\n cleaned = cleaned.replace(pyPattern, '');\n\n // Remove HTML comment badge\n const htmlPattern = /<!--[\\s\\S]*?Verified by Vibecheck[\\s\\S]*?-->\\n*/;\n cleaned = cleaned.replace(htmlPattern, '');\n\n return cleaned;\n }\n\n /**\n * Generate unique verification ID\n */\n private generateId(): string {\n return `vc-${Date.now().toString(36)}-${crypto.randomBytes(4).toString('hex')}`;\n }\n\n /**\n * Generate checksum for code\n */\n private generateChecksum(code: string): string {\n return crypto.createHash('sha256').update(code).digest('hex');\n }\n\n /**\n * Load verification log from disk\n */\n private loadLog(): void {\n try {\n if (fs.existsSync(this.logPath)) {\n const data = JSON.parse(fs.readFileSync(this.logPath, 'utf-8'));\n this.verificationLog = data.verifications || [];\n }\n } catch (e) {\n console.error('Failed to load verification log:', e);\n }\n }\n\n /**\n * Save verification log to disk\n */\n private saveLog(): void {\n try {\n const dir = path.dirname(this.logPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n \n // Keep only last 1000 verifications\n const recentVerifications = this.verificationLog.slice(-1000);\n \n fs.writeFileSync(this.logPath, JSON.stringify({\n verifications: recentVerifications,\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n } catch (e) {\n console.error('Failed to save verification log:', e);\n }\n }\n\n /**\n * Get verification statistics\n */\n getStats(): {\n totalVerifications: number;\n verified: number;\n needsReview: number;\n avgConfidence: number;\n topContextSources: Array<{ path: string; count: number }>;\n } {\n const verified = this.verificationLog.filter(v => v.verified).length;\n const needsReview = this.verificationLog.filter(v => !v.verified).length;\n \n const avgConfidence = this.verificationLog.length > 0\n ? this.verificationLog.reduce((sum, v) => sum + v.confidenceScore, 0) / this.verificationLog.length\n : 0;\n\n // Count context source usage\n const contextCounts = new Map<string, number>();\n for (const v of this.verificationLog) {\n for (const ctx of v.contextUsed) {\n contextCounts.set(ctx.path, (contextCounts.get(ctx.path) || 0) + 1);\n }\n }\n\n const topContextSources = Array.from(contextCounts.entries())\n .map(([path, count]) => ({ path, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n totalVerifications: this.verificationLog.length,\n verified,\n needsReview,\n avgConfidence: Math.round(avgConfidence),\n topContextSources,\n };\n }\n\n /**\n * Clear all verification history\n */\n clearHistory(): void {\n this.verificationLog = [];\n this.saveLog();\n }\n}\n\n/**\n * Generate a simple Vibecheck badge comment for quick use\n */\nexport function generateQuickBadge(\n language: string,\n confidenceScore: number,\n contextPaths: string[]\n): string {\n const verifier = new VibecheckVerifier(process.cwd());\n \n const contextUsed: ContextSource[] = contextPaths.map(p => ({\n path: p,\n type: fs.existsSync(p) && fs.statSync(p).isDirectory() ? 'folder' : 'file',\n relevance: 1.0,\n }));\n\n const grade = confidenceScore >= 90 ? 'A' : \n confidenceScore >= 80 ? 'B' : \n confidenceScore >= 70 ? 'C' : \n confidenceScore >= 60 ? 'D' : 'F';\n\n const badge = verifier.generateBadge(\n '', // Code not needed for badge generation\n confidenceScore,\n grade,\n contextUsed,\n []\n );\n\n return verifier['wrapInComment'](badge.comment, language);\n}\n","/**\n * Code Quality Analyzer\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Deep static analysis of AI-generated code\n * - Complexity metrics and maintainability scores\n * - Security vulnerability detection\n * - Best practices enforcement\n * - Code smell detection\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QualityMetrics {\n complexity: ComplexityMetrics;\n maintainability: MaintainabilityMetrics;\n security: SecurityMetrics;\n bestPractices: BestPracticesMetrics;\n codeSmells: CodeSmell[];\n overallScore: number;\n grade: 'A' | 'B' | 'C' | 'D' | 'F';\n}\n\nexport interface ComplexityMetrics {\n cyclomaticComplexity: number;\n cognitiveComplexity: number;\n nestingDepth: number;\n linesOfCode: number;\n functionsCount: number;\n avgFunctionLength: number;\n score: number;\n}\n\nexport interface MaintainabilityMetrics {\n commentRatio: number;\n namingQuality: number;\n modularity: number;\n codeReuse: number;\n score: number;\n}\n\nexport interface SecurityMetrics {\n vulnerabilities: SecurityVulnerability[];\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n score: number;\n}\n\nexport interface SecurityVulnerability {\n type: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n line: number;\n message: string;\n fix?: string;\n}\n\nexport interface BestPracticesMetrics {\n violations: BestPracticeViolation[];\n adherenceScore: number;\n score: number;\n}\n\nexport interface BestPracticeViolation {\n rule: string;\n severity: 'info' | 'warning' | 'error';\n line: number;\n message: string;\n fix?: string;\n}\n\nexport interface CodeSmell {\n type: string;\n severity: 'minor' | 'major' | 'critical';\n location: { start: number; end: number };\n description: string;\n suggestion: string;\n}\n\nexport class CodeQualityAnalyzer {\n private workspaceRoot: string;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n }\n\n /**\n * Analyze code quality\n */\n analyze(code: string, language: string = 'typescript'): QualityMetrics {\n const complexity = this.analyzeComplexity(code);\n const maintainability = this.analyzeMaintainability(code);\n const security = this.analyzeSecurity(code);\n const bestPractices = this.analyzeBestPractices(code, language);\n const codeSmells = this.detectCodeSmells(code);\n\n // Calculate overall score\n const overallScore = Math.round(\n complexity.score * 0.25 +\n maintainability.score * 0.25 +\n security.score * 0.30 +\n bestPractices.score * 0.20\n );\n\n const grade = this.calculateGrade(overallScore);\n\n return {\n complexity,\n maintainability,\n security,\n bestPractices,\n codeSmells,\n overallScore,\n grade,\n };\n }\n\n /**\n * Analyze code complexity\n */\n private analyzeComplexity(code: string): ComplexityMetrics {\n const lines = code.split('\\n');\n const linesOfCode = lines.filter(l => l.trim() && !l.trim().startsWith('//')).length;\n\n // Count decision points for cyclomatic complexity\n const decisionPatterns = [\n /\\bif\\s*\\(/g,\n /\\belse\\s+if\\s*\\(/g,\n /\\bfor\\s*\\(/g,\n /\\bwhile\\s*\\(/g,\n /\\bswitch\\s*\\(/g,\n /\\bcase\\s+/g,\n /\\bcatch\\s*\\(/g,\n /\\?\\s*[^:]+\\s*:/g, // Ternary\n /&&/g,\n /\\|\\|/g,\n ];\n\n let cyclomaticComplexity = 1; // Base complexity\n for (const pattern of decisionPatterns) {\n const matches = code.match(pattern);\n if (matches) {\n cyclomaticComplexity += matches.length;\n }\n }\n\n // Calculate nesting depth\n let maxNestingDepth = 0;\n let currentDepth = 0;\n for (const char of code) {\n if (char === '{') {\n currentDepth++;\n maxNestingDepth = Math.max(maxNestingDepth, currentDepth);\n } else if (char === '}') {\n currentDepth = Math.max(0, currentDepth - 1);\n }\n }\n\n // Count functions\n const functionPatterns = [\n /function\\s+\\w+\\s*\\(/g,\n /const\\s+\\w+\\s*=\\s*(?:async\\s*)?\\(/g,\n /const\\s+\\w+\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*=>/g,\n /\\w+\\s*\\([^)]*\\)\\s*\\{/g,\n ];\n\n let functionsCount = 0;\n for (const pattern of functionPatterns) {\n const matches = code.match(pattern);\n if (matches) {\n functionsCount += matches.length;\n }\n }\n functionsCount = Math.max(1, functionsCount / 2); // Rough dedup\n\n const avgFunctionLength = functionsCount > 0 ? linesOfCode / functionsCount : linesOfCode;\n\n // Calculate cognitive complexity (simplified)\n let cognitiveComplexity = cyclomaticComplexity;\n cognitiveComplexity += maxNestingDepth * 2; // Nesting adds cognitive load\n \n // Penalize deeply nested code\n if (maxNestingDepth > 4) {\n cognitiveComplexity += (maxNestingDepth - 4) * 3;\n }\n\n // Calculate score (lower complexity = higher score)\n let score = 100;\n score -= Math.min(40, cyclomaticComplexity * 2);\n score -= Math.min(20, maxNestingDepth * 4);\n score -= Math.min(20, Math.max(0, avgFunctionLength - 20));\n score = Math.max(0, score);\n\n return {\n cyclomaticComplexity,\n cognitiveComplexity,\n nestingDepth: maxNestingDepth,\n linesOfCode,\n functionsCount: Math.round(functionsCount),\n avgFunctionLength: Math.round(avgFunctionLength),\n score,\n };\n }\n\n /**\n * Analyze maintainability\n */\n private analyzeMaintainability(code: string): MaintainabilityMetrics {\n const lines = code.split('\\n');\n const totalLines = lines.length;\n\n // Comment ratio\n const commentLines = lines.filter(l => \n l.trim().startsWith('//') || \n l.trim().startsWith('/*') || \n l.trim().startsWith('*')\n ).length;\n const commentRatio = totalLines > 0 ? commentLines / totalLines : 0;\n\n // Naming quality (check for descriptive names)\n const identifiers = code.match(/(?:const|let|var|function)\\s+([a-zA-Z_]\\w*)/g) || [];\n let goodNames = 0;\n for (const id of identifiers) {\n const name = id.split(/\\s+/).pop() || '';\n // Good names are descriptive (length > 2, not single letters except i,j,k,x,y)\n if (name.length > 2 || ['i', 'j', 'k', 'x', 'y', 'id'].includes(name)) {\n goodNames++;\n }\n }\n const namingQuality = identifiers.length > 0 ? goodNames / identifiers.length : 1;\n\n // Modularity (check for exports and imports)\n const hasExports = /export\\s+(const|function|class|interface|type)/.test(code);\n const hasImports = /import\\s+/.test(code);\n const modularity = (hasExports ? 0.5 : 0) + (hasImports ? 0.5 : 0);\n\n // Code reuse (check for function calls vs inline code)\n const functionCalls = (code.match(/\\w+\\s*\\([^)]*\\)/g) || []).length;\n const codeReuse = Math.min(1, functionCalls / (totalLines / 5));\n\n // Calculate score\n let score = 50;\n score += commentRatio * 20; // Up to 20 points for comments\n score += namingQuality * 15; // Up to 15 points for naming\n score += modularity * 10; // Up to 10 points for modularity\n score += codeReuse * 5; // Up to 5 points for reuse\n score = Math.min(100, Math.max(0, score));\n\n return {\n commentRatio: Math.round(commentRatio * 100) / 100,\n namingQuality: Math.round(namingQuality * 100) / 100,\n modularity: Math.round(modularity * 100) / 100,\n codeReuse: Math.round(codeReuse * 100) / 100,\n score: Math.round(score),\n };\n }\n\n /**\n * Analyze security vulnerabilities\n */\n private analyzeSecurity(code: string): SecurityMetrics {\n const vulnerabilities: SecurityVulnerability[] = [];\n const lines = code.split('\\n');\n\n // Security patterns to check\n const securityChecks = [\n {\n pattern: /eval\\s*\\(/,\n type: 'code_injection',\n severity: 'critical' as const,\n message: 'eval() can execute arbitrary code - major security risk',\n fix: 'Use JSON.parse() for JSON, or Function constructor with caution',\n },\n {\n pattern: /innerHTML\\s*=/,\n type: 'xss',\n severity: 'high' as const,\n message: 'innerHTML can lead to XSS attacks',\n fix: 'Use textContent or sanitize HTML with DOMPurify',\n },\n {\n pattern: /document\\.write\\s*\\(/,\n type: 'xss',\n severity: 'high' as const,\n message: 'document.write can be exploited for XSS',\n fix: 'Use DOM manipulation methods instead',\n },\n {\n pattern: /new\\s+Function\\s*\\(/,\n type: 'code_injection',\n severity: 'high' as const,\n message: 'Function constructor can execute arbitrary code',\n fix: 'Avoid dynamic code execution',\n },\n {\n pattern: /dangerouslySetInnerHTML/,\n type: 'xss',\n severity: 'medium' as const,\n message: 'dangerouslySetInnerHTML can lead to XSS if not sanitized',\n fix: 'Sanitize content with DOMPurify before using',\n },\n {\n pattern: /(password|secret|apiKey|api_key|token|privateKey)\\s*[=:]\\s*['\"][^'\"]{8,}['\"]/i,\n type: 'hardcoded_secret',\n severity: 'critical' as const,\n message: 'Hardcoded secret detected',\n fix: 'Use environment variables for secrets',\n },\n {\n pattern: /https?:\\/\\/[^\\s'\"]+/,\n type: 'hardcoded_url',\n severity: 'low' as const,\n message: 'Hardcoded URL - may cause issues in different environments',\n fix: 'Use environment variables or config for URLs',\n },\n {\n pattern: /\\bexec\\s*\\(/,\n type: 'command_injection',\n severity: 'critical' as const,\n message: 'exec() can lead to command injection',\n fix: 'Use execFile() or spawn() with argument arrays',\n },\n {\n pattern: /\\$\\{.*\\}/,\n type: 'template_injection',\n severity: 'medium' as const,\n message: 'Template literal may be vulnerable to injection if using user input',\n fix: 'Sanitize user input before using in template literals',\n },\n {\n pattern: /localStorage\\.setItem\\s*\\([^,]+,\\s*[^)]*password/i,\n type: 'insecure_storage',\n severity: 'high' as const,\n message: 'Storing sensitive data in localStorage is insecure',\n fix: 'Use secure HTTP-only cookies for sensitive data',\n },\n {\n pattern: /Math\\.random\\s*\\(\\)/,\n type: 'weak_random',\n severity: 'low' as const,\n message: 'Math.random() is not cryptographically secure',\n fix: 'Use crypto.getRandomValues() for security-sensitive operations',\n },\n {\n pattern: /http:\\/\\//,\n type: 'insecure_protocol',\n severity: 'medium' as const,\n message: 'HTTP is insecure - use HTTPS',\n fix: 'Change to HTTPS or use protocol-relative URLs',\n },\n ];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const check of securityChecks) {\n if (check.pattern.test(line)) {\n vulnerabilities.push({\n type: check.type,\n severity: check.severity,\n line: i + 1,\n message: check.message,\n fix: check.fix,\n });\n }\n }\n }\n\n // Calculate risk level\n const criticalCount = vulnerabilities.filter(v => v.severity === 'critical').length;\n const highCount = vulnerabilities.filter(v => v.severity === 'high').length;\n \n let riskLevel: SecurityMetrics['riskLevel'] = 'low';\n if (criticalCount > 0) riskLevel = 'critical';\n else if (highCount > 0) riskLevel = 'high';\n else if (vulnerabilities.length > 2) riskLevel = 'medium';\n\n // Calculate score\n let score = 100;\n score -= criticalCount * 30;\n score -= highCount * 20;\n score -= vulnerabilities.filter(v => v.severity === 'medium').length * 10;\n score -= vulnerabilities.filter(v => v.severity === 'low').length * 5;\n score = Math.max(0, score);\n\n return {\n vulnerabilities,\n riskLevel,\n score,\n };\n }\n\n /**\n * Analyze best practices\n */\n private analyzeBestPractices(code: string, language: string): BestPracticesMetrics {\n const violations: BestPracticeViolation[] = [];\n const lines = code.split('\\n');\n\n const bestPracticeChecks = [\n // TypeScript/JavaScript\n {\n pattern: /var\\s+\\w+/,\n rule: 'prefer-const-let',\n severity: 'warning' as const,\n message: 'Use const or let instead of var',\n fix: 'Replace var with const (if not reassigned) or let',\n },\n {\n pattern: /==(?!=)/,\n rule: 'strict-equality',\n severity: 'warning' as const,\n message: 'Use === instead of == for strict equality',\n fix: 'Replace == with ===',\n },\n {\n pattern: /!=(?!=)/,\n rule: 'strict-inequality',\n severity: 'warning' as const,\n message: 'Use !== instead of != for strict inequality',\n fix: 'Replace != with !==',\n },\n {\n pattern: /console\\.(log|warn|error|info|debug)\\s*\\(/,\n rule: 'no-console',\n severity: 'info' as const,\n message: 'Remove console statements in production code',\n fix: 'Use a proper logging library or remove',\n },\n {\n pattern: /debugger/,\n rule: 'no-debugger',\n severity: 'error' as const,\n message: 'Remove debugger statement',\n fix: 'Delete the debugger statement',\n },\n {\n pattern: /\\bany\\b/,\n rule: 'no-any',\n severity: 'warning' as const,\n message: 'Avoid using any type in TypeScript',\n fix: 'Use a more specific type or unknown',\n },\n {\n pattern: /\\/\\/\\s*TODO/i,\n rule: 'no-todo',\n severity: 'info' as const,\n message: 'TODO comment found - consider addressing',\n fix: 'Complete the TODO or create a ticket',\n },\n {\n pattern: /\\/\\/\\s*FIXME/i,\n rule: 'no-fixme',\n severity: 'warning' as const,\n message: 'FIXME comment found - needs attention',\n fix: 'Fix the issue or create a ticket',\n },\n {\n pattern: /\\.then\\s*\\([^)]*\\)\\s*\\.catch\\s*\\(\\s*\\)/,\n rule: 'empty-catch',\n severity: 'error' as const,\n message: 'Empty catch block swallows errors',\n fix: 'Handle the error or at least log it',\n },\n {\n pattern: /catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}/,\n rule: 'empty-catch-block',\n severity: 'error' as const,\n message: 'Empty catch block swallows errors',\n fix: 'Handle the error or at least log it',\n },\n {\n pattern: /async\\s+\\w+\\s*\\([^)]*\\)[^{]*\\{[^}]*\\}/,\n rule: 'async-no-await',\n severity: 'warning' as const,\n message: 'Async function without await',\n fix: 'Remove async or add await',\n },\n {\n pattern: /setTimeout\\s*\\([^,]+,\\s*0\\s*\\)/,\n rule: 'setTimeout-zero',\n severity: 'info' as const,\n message: 'setTimeout with 0 delay - consider using queueMicrotask',\n fix: 'Use queueMicrotask() for immediate async execution',\n },\n {\n pattern: /new\\s+Array\\s*\\(/,\n rule: 'prefer-array-literal',\n severity: 'info' as const,\n message: 'Prefer array literal syntax []',\n fix: 'Use [] instead of new Array()',\n },\n {\n pattern: /new\\s+Object\\s*\\(/,\n rule: 'prefer-object-literal',\n severity: 'info' as const,\n message: 'Prefer object literal syntax {}',\n fix: 'Use {} instead of new Object()',\n },\n ];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const check of bestPracticeChecks) {\n if (check.pattern.test(line)) {\n violations.push({\n rule: check.rule,\n severity: check.severity,\n line: i + 1,\n message: check.message,\n fix: check.fix,\n });\n }\n }\n }\n\n // Calculate adherence score\n const totalChecks = bestPracticeChecks.length;\n const violatedRules = new Set(violations.map(v => v.rule)).size;\n const adherenceScore = Math.round(((totalChecks - violatedRules) / totalChecks) * 100);\n\n // Calculate score\n let score = 100;\n score -= violations.filter(v => v.severity === 'error').length * 15;\n score -= violations.filter(v => v.severity === 'warning').length * 8;\n score -= violations.filter(v => v.severity === 'info').length * 3;\n score = Math.max(0, score);\n\n return {\n violations,\n adherenceScore,\n score: Math.round(score),\n };\n }\n\n /**\n * Detect code smells\n */\n private detectCodeSmells(code: string): CodeSmell[] {\n const smells: CodeSmell[] = [];\n const lines = code.split('\\n');\n\n // Long function detection\n let functionStart = -1;\n let braceCount = 0;\n let inFunction = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n if (/(?:function|=>)\\s*[{(]/.test(line) && !inFunction) {\n functionStart = i;\n inFunction = true;\n braceCount = 0;\n }\n\n if (inFunction) {\n braceCount += (line.match(/\\{/g) || []).length;\n braceCount -= (line.match(/\\}/g) || []).length;\n\n if (braceCount <= 0 && functionStart >= 0) {\n const functionLength = i - functionStart + 1;\n if (functionLength > 50) {\n smells.push({\n type: 'long-function',\n severity: functionLength > 100 ? 'critical' : 'major',\n location: { start: functionStart + 1, end: i + 1 },\n description: `Function is ${functionLength} lines long`,\n suggestion: 'Break into smaller functions (aim for < 30 lines)',\n });\n }\n inFunction = false;\n functionStart = -1;\n }\n }\n\n // Long line detection\n if (line.length > 120) {\n smells.push({\n type: 'long-line',\n severity: 'minor',\n location: { start: i + 1, end: i + 1 },\n description: `Line is ${line.length} characters long`,\n suggestion: 'Break line into multiple lines (max 120 chars)',\n });\n }\n\n // Magic number detection\n const magicNumbers = line.match(/(?<![\\w.])\\d{2,}(?![\\w])/g);\n if (magicNumbers) {\n for (const num of magicNumbers) {\n if (!['100', '1000', '60', '24', '365', '256', '1024'].includes(num)) {\n smells.push({\n type: 'magic-number',\n severity: 'minor',\n location: { start: i + 1, end: i + 1 },\n description: `Magic number ${num} detected`,\n suggestion: 'Extract to a named constant',\n });\n }\n }\n }\n\n // Deeply nested code\n const leadingSpaces = line.match(/^(\\s*)/)?.[1].length || 0;\n const indentLevel = Math.floor(leadingSpaces / 2);\n if (indentLevel > 5 && line.trim()) {\n smells.push({\n type: 'deep-nesting',\n severity: 'major',\n location: { start: i + 1, end: i + 1 },\n description: `Code is nested ${indentLevel} levels deep`,\n suggestion: 'Reduce nesting with early returns or extract functions',\n });\n }\n\n // Duplicate code patterns (simplified)\n if (i > 0 && lines[i - 1] && line.trim() === lines[i - 1].trim() && line.trim().length > 20) {\n smells.push({\n type: 'duplicate-code',\n severity: 'major',\n location: { start: i, end: i + 1 },\n description: 'Duplicate code detected',\n suggestion: 'Extract to a shared function or variable',\n });\n }\n\n // God object / too many parameters\n const paramMatch = line.match(/\\([^)]{100,}\\)/);\n if (paramMatch) {\n smells.push({\n type: 'too-many-parameters',\n severity: 'major',\n location: { start: i + 1, end: i + 1 },\n description: 'Function has too many parameters',\n suggestion: 'Use an options object instead',\n });\n }\n }\n\n return smells;\n }\n\n /**\n * Calculate grade from score\n */\n private calculateGrade(score: number): QualityMetrics['grade'] {\n if (score >= 90) return 'A';\n if (score >= 80) return 'B';\n if (score >= 70) return 'C';\n if (score >= 60) return 'D';\n return 'F';\n }\n\n /**\n * Generate quality report\n */\n generateReport(metrics: QualityMetrics): string {\n let report = `# Code Quality Report\\n\\n`;\n report += `**Overall Score:** ${metrics.overallScore}/100 (Grade: ${metrics.grade})\\n\\n`;\n\n report += `## Complexity\\n`;\n report += `- Cyclomatic Complexity: ${metrics.complexity.cyclomaticComplexity}\\n`;\n report += `- Cognitive Complexity: ${metrics.complexity.cognitiveComplexity}\\n`;\n report += `- Max Nesting Depth: ${metrics.complexity.nestingDepth}\\n`;\n report += `- Lines of Code: ${metrics.complexity.linesOfCode}\\n`;\n report += `- Functions: ${metrics.complexity.functionsCount}\\n`;\n report += `- Score: ${metrics.complexity.score}/100\\n\\n`;\n\n report += `## Maintainability\\n`;\n report += `- Comment Ratio: ${(metrics.maintainability.commentRatio * 100).toFixed(1)}%\\n`;\n report += `- Naming Quality: ${(metrics.maintainability.namingQuality * 100).toFixed(1)}%\\n`;\n report += `- Modularity: ${(metrics.maintainability.modularity * 100).toFixed(1)}%\\n`;\n report += `- Score: ${metrics.maintainability.score}/100\\n\\n`;\n\n report += `## Security\\n`;\n report += `- Risk Level: ${metrics.security.riskLevel.toUpperCase()}\\n`;\n report += `- Vulnerabilities: ${metrics.security.vulnerabilities.length}\\n`;\n report += `- Score: ${metrics.security.score}/100\\n`;\n if (metrics.security.vulnerabilities.length > 0) {\n report += `\\n### Vulnerabilities Found:\\n`;\n metrics.security.vulnerabilities.forEach(v => {\n report += `- [${v.severity.toUpperCase()}] Line ${v.line}: ${v.message}\\n`;\n });\n }\n report += '\\n';\n\n report += `## Best Practices\\n`;\n report += `- Adherence: ${metrics.bestPractices.adherenceScore}%\\n`;\n report += `- Violations: ${metrics.bestPractices.violations.length}\\n`;\n report += `- Score: ${metrics.bestPractices.score}/100\\n`;\n if (metrics.bestPractices.violations.length > 0) {\n report += `\\n### Violations:\\n`;\n metrics.bestPractices.violations.slice(0, 10).forEach(v => {\n report += `- [${v.severity.toUpperCase()}] Line ${v.line}: ${v.message}\\n`;\n });\n }\n report += '\\n';\n\n if (metrics.codeSmells.length > 0) {\n report += `## Code Smells (${metrics.codeSmells.length})\\n`;\n metrics.codeSmells.slice(0, 10).forEach(s => {\n report += `- [${s.severity.toUpperCase()}] ${s.type}: ${s.description}\\n`;\n report += ` Suggestion: ${s.suggestion}\\n`;\n });\n }\n\n return report;\n }\n}\n\nexport function createCodeQualityAnalyzer(workspaceRoot: string): CodeQualityAnalyzer {\n return new CodeQualityAnalyzer(workspaceRoot);\n}\n","/**\n * Prompt Optimizer\n * \n * WHAT NOBODY ELSE IS DOING:\n * - Automatically improves AI prompts to reduce hallucinations\n * - Adds context anchors and constraints\n * - Learns from successful/failed prompts\n * - Generates codebase-aware prompt enhancements\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface PromptAnalysis {\n original: string;\n issues: PromptIssue[];\n suggestions: PromptSuggestion[];\n score: number;\n optimized: string;\n}\n\nexport interface PromptIssue {\n type: 'vague' | 'no_context' | 'no_constraints' | 'too_broad' | 'missing_examples' | 'ambiguous';\n severity: 'low' | 'medium' | 'high';\n description: string;\n location?: { start: number; end: number };\n}\n\nexport interface PromptSuggestion {\n type: 'add_context' | 'add_constraint' | 'add_example' | 'be_specific' | 'add_format' | 'add_validation';\n priority: 'low' | 'medium' | 'high';\n suggestion: string;\n insertion?: string;\n}\n\nexport interface OptimizationOptions {\n addCodebaseContext: boolean;\n addTypeConstraints: boolean;\n addExamples: boolean;\n addValidation: boolean;\n maxContextTokens: number;\n style: 'minimal' | 'detailed' | 'comprehensive';\n}\n\nexport interface PromptTemplate {\n id: string;\n name: string;\n template: string;\n variables: string[];\n category: string;\n successRate: number;\n usageCount: number;\n}\n\nconst DEFAULT_OPTIONS: OptimizationOptions = {\n addCodebaseContext: true,\n addTypeConstraints: true,\n addExamples: true,\n addValidation: true,\n maxContextTokens: 2000,\n style: 'detailed',\n};\n\nexport class PromptOptimizer {\n private workspaceRoot: string;\n private templates: PromptTemplate[] = [];\n private promptHistory: Array<{ prompt: string; success: boolean; timestamp: string }> = [];\n private historyPath: string;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.historyPath = path.join(workspaceRoot, '.guardrail', 'prompt-history.json');\n this.loadHistory();\n this.initializeTemplates();\n }\n\n /**\n * Analyze and optimize a prompt\n */\n optimize(prompt: string, options: Partial<OptimizationOptions> = {}): PromptAnalysis {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n \n // Analyze the prompt\n const issues = this.analyzePrompt(prompt);\n const suggestions = this.generateSuggestions(prompt, issues, opts);\n \n // Calculate score\n const score = this.calculateScore(issues);\n \n // Generate optimized version\n const optimized = this.applyOptimizations(prompt, suggestions, opts);\n\n return {\n original: prompt,\n issues,\n suggestions,\n score,\n optimized,\n };\n }\n\n /**\n * Analyze prompt for issues\n */\n private analyzePrompt(prompt: string): PromptIssue[] {\n const issues: PromptIssue[] = [];\n const promptLower = prompt.toLowerCase();\n\n // Check for vague language\n const vaguePatterns = [\n { pattern: /make it better/i, desc: '\"make it better\" is vague - specify what to improve' },\n { pattern: /fix this/i, desc: '\"fix this\" without context - describe what\\'s wrong' },\n { pattern: /something like/i, desc: '\"something like\" is imprecise - be specific' },\n { pattern: /do the thing/i, desc: 'Unclear reference - specify what \"the thing\" is' },\n { pattern: /you know what i mean/i, desc: 'Assumption of understanding - be explicit' },\n { pattern: /make it work/i, desc: '\"make it work\" is vague - define working behavior' },\n { pattern: /clean up/i, desc: '\"clean up\" is subjective - specify clean up criteria' },\n { pattern: /improve/i, desc: '\"improve\" without metrics - define improvement criteria' },\n ];\n\n for (const { pattern, desc } of vaguePatterns) {\n if (pattern.test(prompt)) {\n issues.push({\n type: 'vague',\n severity: 'medium',\n description: desc,\n });\n }\n }\n\n // Check for missing context\n const hasFileReference = /`[^`]+\\.(ts|js|tsx|jsx|py|go|rs|java|cpp|c|h)`/.test(prompt);\n const hasCodeBlock = /```[\\s\\S]*```/.test(prompt);\n const hasFunctionName = /function\\s+\\w+|const\\s+\\w+\\s*=|def\\s+\\w+|fn\\s+\\w+/.test(prompt);\n\n if (!hasFileReference && !hasCodeBlock && !hasFunctionName && prompt.length > 50) {\n issues.push({\n type: 'no_context',\n severity: 'high',\n description: 'No code context provided - add file references or code blocks',\n });\n }\n\n // Check for missing constraints\n const hasConstraints = /must|should|require|constraint|limit|only|don't|avoid|never|always/i.test(prompt);\n if (!hasConstraints && prompt.length > 100) {\n issues.push({\n type: 'no_constraints',\n severity: 'medium',\n description: 'No constraints specified - add requirements or limitations',\n });\n }\n\n // Check if too broad\n const broadPatterns = [\n /create an? (?:app|application|system|platform)/i,\n /build an? (?:complete|full|entire)/i,\n /implement everything/i,\n /do all/i,\n ];\n\n for (const pattern of broadPatterns) {\n if (pattern.test(prompt)) {\n issues.push({\n type: 'too_broad',\n severity: 'high',\n description: 'Request is too broad - break into smaller, specific tasks',\n });\n break;\n }\n }\n\n // Check for missing examples\n const wantsFormat = /format|output|return|response|result/i.test(prompt);\n const hasExample = /example:|for example|e\\.g\\.|such as:|like this:/i.test(prompt);\n if (wantsFormat && !hasExample) {\n issues.push({\n type: 'missing_examples',\n severity: 'low',\n description: 'Requesting specific format without providing examples',\n });\n }\n\n // Check for ambiguous pronouns\n const ambiguousPronouns = prompt.match(/\\b(it|this|that|these|those)\\b/gi) || [];\n if (ambiguousPronouns.length > 3) {\n issues.push({\n type: 'ambiguous',\n severity: 'low',\n description: 'Multiple ambiguous pronouns - be more specific about references',\n });\n }\n\n return issues;\n }\n\n /**\n * Generate optimization suggestions\n */\n private generateSuggestions(\n prompt: string,\n issues: PromptIssue[],\n options: OptimizationOptions\n ): PromptSuggestion[] {\n const suggestions: PromptSuggestion[] = [];\n\n // Suggest adding context\n if (issues.some(i => i.type === 'no_context') && options.addCodebaseContext) {\n suggestions.push({\n type: 'add_context',\n priority: 'high',\n suggestion: 'Add relevant file paths and code context',\n insertion: this.generateContextInsertion(),\n });\n }\n\n // Suggest adding constraints\n if (issues.some(i => i.type === 'no_constraints') && options.addTypeConstraints) {\n suggestions.push({\n type: 'add_constraint',\n priority: 'medium',\n suggestion: 'Add specific constraints and requirements',\n insertion: this.generateConstraintInsertion(prompt),\n });\n }\n\n // Suggest adding examples\n if (issues.some(i => i.type === 'missing_examples') && options.addExamples) {\n suggestions.push({\n type: 'add_example',\n priority: 'medium',\n suggestion: 'Add example of expected output format',\n insertion: '\\n\\nExample output format:\\n```\\n// Your example here\\n```',\n });\n }\n\n // Suggest being more specific\n if (issues.some(i => i.type === 'vague')) {\n suggestions.push({\n type: 'be_specific',\n priority: 'high',\n suggestion: 'Replace vague language with specific requirements',\n });\n }\n\n // Suggest breaking down broad requests\n if (issues.some(i => i.type === 'too_broad')) {\n suggestions.push({\n type: 'be_specific',\n priority: 'high',\n suggestion: 'Break this into smaller, focused tasks',\n insertion: '\\n\\nLet\\'s start with step 1: [specific first task]',\n });\n }\n\n // Add validation suggestion\n if (options.addValidation) {\n suggestions.push({\n type: 'add_validation',\n priority: 'low',\n suggestion: 'Add validation criteria for the output',\n insertion: '\\n\\nValidation criteria:\\n- [ ] Code compiles without errors\\n- [ ] Types are correct\\n- [ ] Follows existing patterns',\n });\n }\n\n return suggestions;\n }\n\n /**\n * Apply optimizations to prompt\n */\n private applyOptimizations(\n prompt: string,\n suggestions: PromptSuggestion[],\n options: OptimizationOptions\n ): string {\n let optimized = prompt;\n\n // Apply insertions from high-priority suggestions\n const highPriority = suggestions.filter(s => s.priority === 'high' && s.insertion);\n for (const suggestion of highPriority) {\n if (suggestion.insertion) {\n optimized = this.insertSuggestion(optimized, suggestion);\n }\n }\n\n // Add codebase context header if needed\n if (options.addCodebaseContext && !optimized.includes('Context:')) {\n const contextHeader = this.generateContextHeader(options.style);\n optimized = contextHeader + '\\n\\n' + optimized;\n }\n\n // Add constraints footer if needed\n if (options.addTypeConstraints && !optimized.includes('Constraints:')) {\n const constraintsFooter = this.generateConstraintsFooter(options.style);\n optimized = optimized + '\\n\\n' + constraintsFooter;\n }\n\n // Add validation section if requested\n if (options.addValidation && !optimized.includes('Validation:')) {\n optimized += '\\n\\n' + this.generateValidationSection();\n }\n\n return optimized;\n }\n\n /**\n * Insert suggestion into prompt\n */\n private insertSuggestion(prompt: string, suggestion: PromptSuggestion): string {\n if (!suggestion.insertion) return prompt;\n\n switch (suggestion.type) {\n case 'add_context':\n return suggestion.insertion + '\\n\\n' + prompt;\n case 'add_constraint':\n case 'add_validation':\n case 'add_example':\n return prompt + suggestion.insertion;\n default:\n return prompt + '\\n' + suggestion.insertion;\n }\n }\n\n /**\n * Generate context insertion\n */\n private generateContextInsertion(): string {\n return `**Context:**\n- Working in: \\`${path.basename(this.workspaceRoot)}\\`\n- Refer to existing code patterns in the codebase\n- Use imports from existing modules where applicable`;\n }\n\n /**\n * Generate constraint insertion\n */\n private generateConstraintInsertion(prompt: string): string {\n const constraints: string[] = [];\n \n // Detect what kind of code is being requested\n if (/function|method|handler/i.test(prompt)) {\n constraints.push('- Function should be pure where possible');\n constraints.push('- Add proper TypeScript types');\n constraints.push('- Handle edge cases and errors');\n }\n \n if (/component|ui|view/i.test(prompt)) {\n constraints.push('- Use existing component patterns');\n constraints.push('- Add proper prop types');\n constraints.push('- Handle loading and error states');\n }\n\n if (/api|endpoint|route/i.test(prompt)) {\n constraints.push('- Follow REST conventions');\n constraints.push('- Add input validation');\n constraints.push('- Return appropriate status codes');\n }\n\n if (constraints.length === 0) {\n constraints.push('- Follow existing code style');\n constraints.push('- Add appropriate error handling');\n constraints.push('- Use TypeScript types');\n }\n\n return '\\n\\n**Constraints:**\\n' + constraints.join('\\n');\n }\n\n /**\n * Generate context header based on style\n */\n private generateContextHeader(style: OptimizationOptions['style']): string {\n if (style === 'minimal') {\n return `**Project:** ${path.basename(this.workspaceRoot)}`;\n }\n\n if (style === 'detailed') {\n return `**Context:**\n- Project: ${path.basename(this.workspaceRoot)}\n- Use existing patterns and imports from the codebase\n- Follow the established code style`;\n }\n\n return `**Context:**\n- Project: ${path.basename(this.workspaceRoot)}\n- Language: TypeScript\n- Use existing patterns and imports from the codebase\n- Follow the established code style and conventions\n- Ensure code integrates with existing architecture\n- Reference existing types and interfaces where applicable`;\n }\n\n /**\n * Generate constraints footer based on style\n */\n private generateConstraintsFooter(style: OptimizationOptions['style']): string {\n if (style === 'minimal') {\n return `**Requirements:** Use TypeScript, handle errors`;\n }\n\n if (style === 'detailed') {\n return `**Requirements:**\n- Use TypeScript with proper types\n- Handle errors appropriately\n- Follow existing patterns in the codebase\n- Add comments for complex logic`;\n }\n\n return `**Requirements:**\n- Use TypeScript with strict types (no \\`any\\`)\n- Handle errors with try/catch or Result types\n- Follow existing patterns in the codebase\n- Add JSDoc comments for public APIs\n- Ensure backward compatibility\n- Consider edge cases\n- Write testable code`;\n }\n\n /**\n * Generate validation section\n */\n private generateValidationSection(): string {\n return `**Before completing, verify:**\n- [ ] Code compiles without TypeScript errors\n- [ ] All imports exist and are correct\n- [ ] Types match existing definitions\n- [ ] Error handling is in place\n- [ ] Follows existing code patterns`;\n }\n\n /**\n * Calculate prompt quality score\n */\n private calculateScore(issues: PromptIssue[]): number {\n let score = 100;\n \n for (const issue of issues) {\n switch (issue.severity) {\n case 'high':\n score -= 20;\n break;\n case 'medium':\n score -= 10;\n break;\n case 'low':\n score -= 5;\n break;\n }\n }\n\n return Math.max(0, score);\n }\n\n /**\n * Record prompt result for learning\n */\n recordResult(prompt: string, success: boolean): void {\n this.promptHistory.push({\n prompt,\n success,\n timestamp: new Date().toISOString(),\n });\n \n // Keep only last 500 prompts\n if (this.promptHistory.length > 500) {\n this.promptHistory = this.promptHistory.slice(-500);\n }\n \n this.saveHistory();\n }\n\n /**\n * Get prompt templates\n */\n getTemplates(category?: string): PromptTemplate[] {\n if (category) {\n return this.templates.filter(t => t.category === category);\n }\n return this.templates;\n }\n\n /**\n * Apply a template\n */\n applyTemplate(templateId: string, variables: Record<string, string>): string {\n const template = this.templates.find(t => t.id === templateId);\n if (!template) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n let result = template.template;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n\n return result;\n }\n\n /**\n * Get prompt improvement suggestions based on history\n */\n getHistoricalInsights(): {\n successRate: number;\n commonIssues: string[];\n recommendations: string[];\n } {\n if (this.promptHistory.length === 0) {\n return {\n successRate: 0,\n commonIssues: [],\n recommendations: ['Start using prompt tracking to get insights'],\n };\n }\n\n const successRate = this.promptHistory.filter(p => p.success).length / this.promptHistory.length;\n\n // Analyze failed prompts\n const failedPrompts = this.promptHistory.filter(p => !p.success).map(p => p.prompt);\n const commonIssues: string[] = [];\n\n let vagueCount = 0;\n let noContextCount = 0;\n \n for (const prompt of failedPrompts) {\n if (/make it|fix this|something like/i.test(prompt)) vagueCount++;\n if (!(/`[^`]+\\.(ts|js)`/.test(prompt) || /```/.test(prompt))) noContextCount++;\n }\n\n if (vagueCount > failedPrompts.length * 0.3) {\n commonIssues.push('Vague language in prompts');\n }\n if (noContextCount > failedPrompts.length * 0.5) {\n commonIssues.push('Missing code context');\n }\n\n const recommendations: string[] = [];\n if (successRate < 0.5) {\n recommendations.push('Consider adding more specific context to prompts');\n }\n if (commonIssues.includes('Vague language in prompts')) {\n recommendations.push('Use specific, actionable language');\n }\n if (commonIssues.includes('Missing code context')) {\n recommendations.push('Include relevant code snippets or file references');\n }\n\n return {\n successRate: Math.round(successRate * 100),\n commonIssues,\n recommendations,\n };\n }\n\n /**\n * Initialize built-in templates\n */\n private initializeTemplates(): void {\n this.templates = [\n {\n id: 'create-function',\n name: 'Create Function',\n template: `Create a TypeScript function named \\`{{functionName}}\\` that {{description}}.\n\n**Requirements:**\n- Input: {{input}}\n- Output: {{output}}\n- Handle errors appropriately\n- Add JSDoc comments\n\n**Context:**\n{{context}}`,\n variables: ['functionName', 'description', 'input', 'output', 'context'],\n category: 'code',\n successRate: 0.85,\n usageCount: 0,\n },\n {\n id: 'fix-bug',\n name: 'Fix Bug',\n template: `Fix the following bug in \\`{{file}}\\`:\n\n**Current behavior:** {{currentBehavior}}\n**Expected behavior:** {{expectedBehavior}}\n\n**Relevant code:**\n\\`\\`\\`typescript\n{{code}}\n\\`\\`\\`\n\n**Constraints:**\n- Don't change the function signature\n- Maintain backward compatibility\n- Add a comment explaining the fix`,\n variables: ['file', 'currentBehavior', 'expectedBehavior', 'code'],\n category: 'debugging',\n successRate: 0.80,\n usageCount: 0,\n },\n {\n id: 'add-feature',\n name: 'Add Feature',\n template: `Add a new feature to {{component}}:\n\n**Feature:** {{featureDescription}}\n\n**Acceptance criteria:**\n{{acceptanceCriteria}}\n\n**Existing code to modify:**\n\\`\\`\\`typescript\n{{existingCode}}\n\\`\\`\\`\n\n**Requirements:**\n- Follow existing patterns\n- Add tests\n- Update types as needed`,\n variables: ['component', 'featureDescription', 'acceptanceCriteria', 'existingCode'],\n category: 'feature',\n successRate: 0.75,\n usageCount: 0,\n },\n {\n id: 'refactor',\n name: 'Refactor Code',\n template: `Refactor the following code in \\`{{file}}\\`:\n\n**Current code:**\n\\`\\`\\`typescript\n{{currentCode}}\n\\`\\`\\`\n\n**Refactoring goals:**\n{{goals}}\n\n**Constraints:**\n- Maintain the same external API\n- Improve readability and maintainability\n- Add types if missing`,\n variables: ['file', 'currentCode', 'goals'],\n category: 'refactoring',\n successRate: 0.82,\n usageCount: 0,\n },\n {\n id: 'write-test',\n name: 'Write Tests',\n template: `Write tests for \\`{{functionName}}\\` in \\`{{file}}\\`:\n\n**Function to test:**\n\\`\\`\\`typescript\n{{code}}\n\\`\\`\\`\n\n**Test cases to cover:**\n{{testCases}}\n\n**Requirements:**\n- Use {{testFramework}}\n- Test edge cases\n- Mock external dependencies`,\n variables: ['functionName', 'file', 'code', 'testCases', 'testFramework'],\n category: 'testing',\n successRate: 0.78,\n usageCount: 0,\n },\n ];\n }\n\n private loadHistory(): void {\n try {\n if (fs.existsSync(this.historyPath)) {\n const data = JSON.parse(fs.readFileSync(this.historyPath, 'utf-8'));\n this.promptHistory = data.history || [];\n }\n } catch (e) {\n console.error('Failed to load prompt history:', e);\n }\n }\n\n private saveHistory(): void {\n try {\n const dir = path.dirname(this.historyPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.historyPath, JSON.stringify({\n history: this.promptHistory,\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n } catch (e) {\n console.error('Failed to save prompt history:', e);\n }\n }\n}\n\nexport function createPromptOptimizer(workspaceRoot: string): PromptOptimizer {\n return new PromptOptimizer(workspaceRoot);\n}\n","/**\n * AST-Based Code Analyzer\n * \n * THE MOST COMPREHENSIVE HALLUCINATION DETECTION:\n * - Deep AST parsing for structural analysis\n * - Token-level validation\n * - Scope analysis for variable/function resolution\n * - Type inference and checking\n * - Import graph building and validation\n * - Dead code and unreachable path detection\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface ASTNode {\n type: string;\n name?: string;\n value?: any;\n children?: ASTNode[];\n location: { start: number; end: number; line: number; column: number };\n scope?: ScopeInfo;\n metadata?: Record<string, any>;\n}\n\nexport interface ScopeInfo {\n id: string;\n type: 'global' | 'function' | 'block' | 'class' | 'module';\n parent?: string;\n variables: Map<string, VariableInfo>;\n functions: Map<string, FunctionInfo>;\n types: Map<string, ASTTypeInfo>;\n imports: Map<string, ASTImportInfo>;\n}\n\nexport interface VariableInfo {\n name: string;\n type: string;\n definedAt: number;\n usedAt: number[];\n isConst: boolean;\n isExported: boolean;\n value?: any;\n}\n\nexport interface FunctionInfo {\n name: string;\n params: ParamInfo[];\n returnType: string;\n isAsync: boolean;\n isGenerator: boolean;\n isExported: boolean;\n definedAt: number;\n calledAt: number[];\n complexity: number;\n}\n\nexport interface ParamInfo {\n name: string;\n type: string;\n optional: boolean;\n defaultValue?: string;\n rest: boolean;\n}\n\nexport interface ASTTypeInfo {\n name: string;\n kind: 'interface' | 'type' | 'class' | 'enum';\n properties: Map<string, { type: string; optional: boolean }>;\n methods: Map<string, FunctionInfo>;\n extends?: string[];\n implements?: string[];\n}\n\nexport interface ASTImportInfo {\n source: string;\n specifiers: { name: string; alias?: string; isDefault: boolean; isNamespace: boolean }[];\n isTypeOnly: boolean;\n resolvedPath?: string;\n exists: boolean;\n}\n\nexport interface ASTAnalysisResult {\n isValid: boolean;\n errors: ASTError[];\n warnings: ASTWarning[];\n scopes: Map<string, ScopeInfo>;\n imports: ASTImportInfo[];\n exports: string[];\n unresolvedReferences: UnresolvedReference[];\n suspiciousPatterns: SuspiciousPattern[];\n metrics: CodeMetrics;\n}\n\nexport interface ASTError {\n type: string;\n message: string;\n location: { line: number; column: number };\n severity: 'error' | 'critical';\n fix?: string;\n}\n\nexport interface ASTWarning {\n type: string;\n message: string;\n location: { line: number; column: number };\n confidence: number;\n}\n\nexport interface UnresolvedReference {\n name: string;\n type: 'variable' | 'function' | 'type' | 'import';\n location: { line: number; column: number };\n possibleMatches: string[];\n}\n\nexport interface SuspiciousPattern {\n pattern: string;\n description: string;\n location: { line: number; column: number };\n confidence: number;\n category: 'hallucination' | 'bug' | 'smell' | 'security';\n}\n\nexport interface CodeMetrics {\n lines: number;\n statements: number;\n functions: number;\n classes: number;\n imports: number;\n exports: number;\n complexity: number;\n depth: number;\n maintainabilityIndex: number;\n}\n\nexport class ASTAnalyzer {\n private workspaceRoot: string;\n private scopeStack: ScopeInfo[] = [];\n private globalScope: ScopeInfo;\n private currentScopeId = 0;\n private knownGlobals: Set<string>;\n private knownBuiltins: Map<string, Set<string>>;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.globalScope = this.createScope('global');\n this.knownGlobals = this.initializeGlobals();\n this.knownBuiltins = this.initializeBuiltins();\n }\n\n /**\n * Analyze code and return comprehensive results\n */\n analyze(code: string, language: string = 'typescript'): ASTAnalysisResult {\n const errors: ASTError[] = [];\n const warnings: ASTWarning[] = [];\n const scopes = new Map<string, ScopeInfo>();\n const imports: ASTImportInfo[] = [];\n const exports: string[] = [];\n const unresolvedReferences: UnresolvedReference[] = [];\n const suspiciousPatterns: SuspiciousPattern[] = [];\n\n // Reset state\n this.scopeStack = [this.globalScope];\n scopes.set(this.globalScope.id, this.globalScope);\n\n const lines = code.split('\\n');\n\n // Phase 1: Extract imports and build import graph\n this.extractImports(code, imports, errors);\n\n // Phase 2: Extract declarations (variables, functions, types)\n this.extractDeclarations(code, lines, scopes, exports);\n\n // Phase 3: Analyze references and resolve them\n this.analyzeReferences(code, lines, scopes, unresolvedReferences, errors);\n\n // Phase 4: Detect suspicious patterns\n this.detectSuspiciousPatterns(code, lines, suspiciousPatterns, warnings);\n\n // Phase 5: Validate type consistency\n this.validateTypes(code, lines, scopes, errors, warnings);\n\n // Phase 6: Check for common hallucination patterns\n this.checkHallucinationPatterns(code, lines, errors, warnings, suspiciousPatterns);\n\n // Calculate metrics\n const metrics = this.calculateMetrics(code, lines, scopes);\n\n return {\n isValid: errors.filter(e => e.severity === 'critical').length === 0,\n errors,\n warnings,\n scopes,\n imports,\n exports,\n unresolvedReferences,\n suspiciousPatterns,\n metrics,\n };\n }\n\n /**\n * Extract and validate imports\n */\n private extractImports(code: string, imports: ASTImportInfo[], errors: ASTError[]): void {\n const importRegex = /import\\s+(?:type\\s+)?(?:(\\{[^}]+\\})|(\\*\\s+as\\s+\\w+)|(\\w+))?\\s*(?:,\\s*(?:(\\{[^}]+\\})|(\\w+)))?\\s*from\\s+['\"]([^'\"]+)['\"]/g;\n \n let match;\n while ((match = importRegex.exec(code)) !== null) {\n const [fullMatch, namedImports, namespaceImport, defaultImport, additionalNamed, additionalDefault, source] = match;\n const isTypeOnly = fullMatch.includes('import type');\n \n const specifiers: ASTImportInfo['specifiers'] = [];\n\n // Parse named imports\n if (namedImports) {\n const names = namedImports.replace(/[{}]/g, '').split(',').map(s => s.trim());\n for (const name of names) {\n if (name) {\n const [importName, alias] = name.split(/\\s+as\\s+/).map(s => s.trim());\n specifiers.push({ name: importName, alias, isDefault: false, isNamespace: false });\n }\n }\n }\n\n // Parse namespace import\n if (namespaceImport) {\n const alias = namespaceImport.replace('* as', '').trim();\n specifiers.push({ name: '*', alias, isDefault: false, isNamespace: true });\n }\n\n // Parse default import\n if (defaultImport) {\n specifiers.push({ name: defaultImport, isDefault: true, isNamespace: false });\n }\n\n // Validate import source\n const importInfo: ASTImportInfo = {\n source,\n specifiers,\n isTypeOnly,\n exists: this.validateImportSource(source),\n };\n\n // Check for suspicious import patterns\n if (this.isSuspiciousImport(source)) {\n errors.push({\n type: 'suspicious_import',\n message: `Suspicious import source: \"${source}\" - may be hallucinated`,\n location: this.getLocation(code, match.index),\n severity: 'error',\n fix: `Verify this package exists: npm info ${source}`,\n });\n }\n\n imports.push(importInfo);\n }\n }\n\n /**\n * Extract declarations from code\n */\n private extractDeclarations(\n code: string,\n lines: string[],\n scopes: Map<string, ScopeInfo>,\n exports: string[]\n ): void {\n // Extract variable declarations\n const varRegex = /(?:export\\s+)?(?:const|let|var)\\s+(\\w+)(?:\\s*:\\s*([^=]+))?\\s*=/g;\n let match;\n while ((match = varRegex.exec(code)) !== null) {\n const [fullMatch, name, type] = match;\n const isExported = fullMatch.startsWith('export');\n const isConst = fullMatch.includes('const');\n \n this.globalScope.variables.set(name, {\n name,\n type: type?.trim() || 'unknown',\n definedAt: this.getLineNumber(code, match.index),\n usedAt: [],\n isConst,\n isExported,\n });\n\n if (isExported) exports.push(name);\n }\n\n // Extract function declarations\n const funcRegex = /(?:export\\s+)?(?:async\\s+)?function\\s*(\\*?)\\s*(\\w+)\\s*\\(([^)]*)\\)(?:\\s*:\\s*([^\\{]+))?\\s*\\{/g;\n while ((match = funcRegex.exec(code)) !== null) {\n const [fullMatch, generator, name, params, returnType] = match;\n const isExported = fullMatch.startsWith('export');\n const isAsync = fullMatch.includes('async');\n const isGenerator = generator === '*';\n\n this.globalScope.functions.set(name, {\n name,\n params: this.parseParams(params),\n returnType: returnType?.trim() || 'void',\n isAsync,\n isGenerator,\n isExported,\n definedAt: this.getLineNumber(code, match.index),\n calledAt: [],\n complexity: this.calculateFunctionComplexity(code, match.index),\n });\n\n if (isExported) exports.push(name);\n }\n\n // Extract arrow function assignments\n const arrowRegex = /(?:export\\s+)?(?:const|let)\\s+(\\w+)\\s*(?::\\s*([^=]+))?\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*(?::\\s*([^\\s=>]+))?\\s*=>/g;\n while ((match = arrowRegex.exec(code)) !== null) {\n const [fullMatch, name, typeAnnotation, returnType] = match;\n const isExported = fullMatch.startsWith('export');\n const isAsync = fullMatch.includes('async');\n\n this.globalScope.functions.set(name, {\n name,\n params: [],\n returnType: returnType?.trim() || typeAnnotation?.trim() || 'unknown',\n isAsync,\n isGenerator: false,\n isExported,\n definedAt: this.getLineNumber(code, match.index),\n calledAt: [],\n complexity: 1,\n });\n\n if (isExported) exports.push(name);\n }\n\n // Extract type/interface declarations\n const typeRegex = /(?:export\\s+)?(?:interface|type)\\s+(\\w+)(?:<[^>]+>)?\\s*(?:extends\\s+([^{]+))?\\s*[={]/g;\n while ((match = typeRegex.exec(code)) !== null) {\n const [fullMatch, name, extendsClause] = match;\n const isExported = fullMatch.startsWith('export');\n const kind = fullMatch.includes('interface') ? 'interface' : 'type';\n\n this.globalScope.types.set(name, {\n name,\n kind: kind as 'interface' | 'type',\n properties: new Map(),\n methods: new Map(),\n extends: extendsClause?.split(',').map(s => s.trim()),\n });\n\n if (isExported) exports.push(name);\n }\n\n // Extract class declarations\n const classRegex = /(?:export\\s+)?class\\s+(\\w+)(?:<[^>]+>)?(?:\\s+extends\\s+(\\w+))?(?:\\s+implements\\s+([^{]+))?\\s*\\{/g;\n while ((match = classRegex.exec(code)) !== null) {\n const [fullMatch, name, extendsClass, implementsClause] = match;\n const isExported = fullMatch.startsWith('export');\n\n this.globalScope.types.set(name, {\n name,\n kind: 'class',\n properties: new Map(),\n methods: new Map(),\n extends: extendsClass ? [extendsClass] : undefined,\n implements: implementsClause?.split(',').map(s => s.trim()),\n });\n\n if (isExported) exports.push(name);\n }\n }\n\n /**\n * Analyze references and find unresolved ones\n */\n private analyzeReferences(\n code: string,\n lines: string[],\n scopes: Map<string, ScopeInfo>,\n unresolvedReferences: UnresolvedReference[],\n errors: ASTError[]\n ): void {\n // Find all identifiers used in the code\n const identifierRegex = /\\b([A-Z][a-zA-Z0-9]*|[a-z][a-zA-Z0-9]*)\\b/g;\n const usedIdentifiers = new Set<string>();\n \n let match;\n while ((match = identifierRegex.exec(code)) !== null) {\n usedIdentifiers.add(match[1]);\n }\n\n // Check each identifier against known declarations\n for (const identifier of usedIdentifiers) {\n // Skip keywords and known globals\n if (this.isKeyword(identifier) || this.knownGlobals.has(identifier)) {\n continue;\n }\n\n // Check if it's defined in any scope\n let found = false;\n for (const scope of scopes.values()) {\n if (scope.variables.has(identifier) || \n scope.functions.has(identifier) || \n scope.types.has(identifier)) {\n found = true;\n break;\n }\n // Check imports\n for (const imp of scope.imports.values()) {\n if (imp.specifiers.some(s => s.name === identifier || s.alias === identifier)) {\n found = true;\n break;\n }\n }\n }\n\n if (!found && identifier.length > 1) {\n // Find possible matches using fuzzy matching\n const possibleMatches = this.findSimilarIdentifiers(identifier, scopes);\n \n // Only report if it looks like it should be defined\n if (this.looksLikeReference(code, identifier)) {\n unresolvedReferences.push({\n name: identifier,\n type: this.guessReferenceType(code, identifier),\n location: this.getLocation(code, code.indexOf(identifier)),\n possibleMatches,\n });\n }\n }\n }\n }\n\n /**\n * Detect suspicious patterns that may indicate hallucination\n */\n private detectSuspiciousPatterns(\n code: string,\n lines: string[],\n suspiciousPatterns: SuspiciousPattern[],\n warnings: ASTWarning[]\n ): void {\n const patterns = [\n // Suspicious API calls\n { regex: /\\.\\s*(toJSON|fromJSON)\\s*\\(\\s*\\)/g, desc: 'Non-standard JSON method', category: 'hallucination' as const },\n { regex: /Array\\.(from|of|isArray)\\s*\\([^)]*\\)\\.(contains|remove|add)\\s*\\(/g, desc: 'Chained non-existent Array method', category: 'hallucination' as const },\n { regex: /Object\\.(keys|values|entries)\\s*\\([^)]*\\)\\.(contains|remove|add)\\s*\\(/g, desc: 'Chained non-existent Object method', category: 'hallucination' as const },\n \n // Mixing paradigms\n { regex: /await\\s+\\w+\\.then\\s*\\(/g, desc: 'Mixing await with .then()', category: 'bug' as const },\n { regex: /new\\s+Promise\\s*\\(\\s*async/g, desc: 'Async function in Promise constructor', category: 'bug' as const },\n \n // Type issues\n { regex: /:\\s*any\\[\\]/g, desc: 'Using any[] type', category: 'smell' as const },\n { regex: /as\\s+any\\b/g, desc: 'Type assertion to any', category: 'smell' as const },\n { regex: /@ts-ignore/g, desc: 'TypeScript ignore comment', category: 'smell' as const },\n \n // Security issues\n { regex: /eval\\s*\\(/g, desc: 'Use of eval()', category: 'security' as const },\n { regex: /innerHTML\\s*=/g, desc: 'Direct innerHTML assignment', category: 'security' as const },\n { regex: /document\\.write\\s*\\(/g, desc: 'Use of document.write()', category: 'security' as const },\n \n // Hallucinated hooks\n { regex: /use(Fetch|Data|API|Query|Cache|Auth|Session)\\s*\\(/g, desc: 'Potentially non-existent React hook', category: 'hallucination' as const },\n \n // Suspicious method chains\n { regex: /\\.\\s*map\\s*\\([^)]+\\)\\s*\\.\\s*flat\\s*\\(\\s*\\)\\s*\\.\\s*unique\\s*\\(/g, desc: 'Non-existent .unique() method', category: 'hallucination' as const },\n { regex: /\\.\\s*filter\\s*\\([^)]+\\)\\s*\\.\\s*first\\s*\\(/g, desc: 'Non-existent .first() method', category: 'hallucination' as const },\n { regex: /\\.\\s*find\\s*\\([^)]+\\)\\s*\\.\\s*orElse\\s*\\(/g, desc: 'Non-existent .orElse() method', category: 'hallucination' as const },\n ];\n\n for (const { regex, desc, category } of patterns) {\n let match;\n while ((match = regex.exec(code)) !== null) {\n suspiciousPatterns.push({\n pattern: match[0],\n description: desc,\n location: this.getLocation(code, match.index),\n confidence: 0.8,\n category,\n });\n }\n }\n }\n\n /**\n * Validate type consistency\n */\n private validateTypes(\n code: string,\n lines: string[],\n scopes: Map<string, ScopeInfo>,\n errors: ASTError[],\n warnings: ASTWarning[]\n ): void {\n // Check for type mismatches in assignments\n const assignmentRegex = /(\\w+)\\s*=\\s*([^;]+);/g;\n let match;\n \n while ((match = assignmentRegex.exec(code)) !== null) {\n const [, varName, value] = match;\n const varInfo = this.globalScope.variables.get(varName);\n \n if (varInfo && varInfo.type !== 'unknown') {\n const inferredType = this.inferType(value);\n if (inferredType !== 'unknown' && !this.typesCompatible(varInfo.type, inferredType)) {\n warnings.push({\n type: 'type_mismatch',\n message: `Possible type mismatch: ${varName} is ${varInfo.type} but assigned ${inferredType}`,\n location: this.getLocation(code, match.index),\n confidence: 0.7,\n });\n }\n }\n }\n }\n\n /**\n * Check for common hallucination patterns\n */\n private checkHallucinationPatterns(\n code: string,\n lines: string[],\n errors: ASTError[],\n warnings: ASTWarning[],\n suspiciousPatterns: SuspiciousPattern[]\n ): void {\n // Check for invented methods on built-in objects\n const builtinMethodChecks = [\n { obj: 'Array', fake: ['contains', 'remove', 'add', 'delete', 'insert', 'append', 'prepend', 'first', 'last', 'empty', 'clear', 'size', 'count', 'get', 'set', 'has', 'unique', 'distinct', 'compact', 'flatten', 'pluck', 'where', 'select', 'groupBy', 'orderBy', 'take', 'skip', 'any', 'all', 'none'] },\n { obj: 'String', fake: ['reverse', 'capitalize', 'camelCase', 'snakeCase', 'kebabCase', 'count', 'isEmpty', 'isBlank', 'format', 'printf', 'center', 'ljust', 'rjust', 'zfill', 'isNumeric', 'isAlpha', 'isAlphaNumeric', 'words', 'lines', 'chars', 'bytes', 'toArray', 'truncate', 'excerpt'] },\n { obj: 'Object', fake: ['length', 'size', 'isEmpty', 'isNotEmpty', 'merge', 'deepMerge', 'clone', 'deepClone', 'equals', 'deepEquals', 'get', 'set', 'has', 'delete', 'forEach', 'map', 'filter', 'reduce', 'pick', 'omit', 'invert', 'defaults'] },\n { obj: 'Promise', fake: ['wait', 'delay', 'sleep', 'timeout', 'retry', 'parallel', 'serial', 'map', 'filter', 'reduce', 'some', 'every', 'first', 'last', 'props', 'settle'] },\n { obj: 'Number', fake: ['isPositive', 'isNegative', 'isZero', 'isEven', 'isOdd', 'isPrime', 'abs', 'round', 'floor', 'ceil', 'clamp', 'between', 'times', 'upto', 'downto'] },\n { obj: 'Date', fake: ['format', 'addDays', 'addMonths', 'addYears', 'addHours', 'addMinutes', 'addSeconds', 'subtract', 'diff', 'isAfter', 'isBefore', 'isBetween', 'startOf', 'endOf', 'isToday', 'isTomorrow', 'isYesterday'] },\n { obj: 'Math', fake: ['clamp', 'lerp', 'map', 'constrain', 'normalize', 'distance', 'angle', 'degrees', 'radians', 'factorial', 'fibonacci', 'isPrime', 'gcd', 'lcm'] },\n { obj: 'JSON', fake: ['isValid', 'tryParse', 'prettify', 'minify', 'merge', 'diff', 'patch', 'clone', 'equals'] },\n { obj: 'console', fake: ['write', 'writeln', 'print', 'println', 'printf', 'debug', 'verbose', 'notice', 'critical', 'emergency', 'success', 'failure', 'color', 'style'] },\n { obj: 'window', fake: ['wait', 'delay', 'sleep', 'navigate', 'redirect', 'reload', 'refresh', 'back', 'forward', 'close', 'minimize', 'maximize', 'resize', 'move', 'center'] },\n { obj: 'document', fake: ['find', 'findAll', 'select', 'selectAll', 'get', 'getAll', 'query', 'queryAll', 'on', 'off', 'emit', 'trigger', 'ready', 'load', 'unload'] },\n { obj: 'fetch', fake: ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'json', 'text', 'blob', 'form', 'timeout', 'retry', 'cancel', 'abort'] },\n { obj: 'localStorage', fake: ['get', 'set', 'has', 'delete', 'keys', 'values', 'entries', 'forEach', 'map', 'filter', 'find', 'size', 'isEmpty', 'expire'] },\n { obj: 'sessionStorage', fake: ['get', 'set', 'has', 'delete', 'keys', 'values', 'entries', 'forEach', 'map', 'filter', 'find', 'size', 'isEmpty', 'expire'] },\n ];\n\n for (const { obj, fake } of builtinMethodChecks) {\n for (const method of fake) {\n const regex = new RegExp(`\\\\b${obj}\\\\s*\\\\.\\\\s*${method}\\\\s*\\\\(`, 'g');\n let match;\n while ((match = regex.exec(code)) !== null) {\n errors.push({\n type: 'hallucinated_method',\n message: `${obj}.${method}() does not exist - this is a hallucination`,\n location: this.getLocation(code, match.index),\n severity: 'error',\n fix: this.suggestAlternative(obj, method),\n });\n }\n }\n }\n\n // Check for hallucinated Node.js APIs\n const nodeAPIChecks = [\n { module: 'fs', fake: ['read', 'write', 'delete', 'remove', 'copy', 'move', 'rename', 'create', 'open', 'close', 'seek', 'tell', 'flush', 'sync', 'list', 'walk', 'glob', 'find', 'search', 'watch', 'touch', 'chmod', 'chown'] },\n { module: 'path', fake: ['exists', 'isFile', 'isDir', 'isDirectory', 'isAbsolute', 'isRelative', 'absolute', 'relative', 'parent', 'filename', 'name', 'stem', 'suffix', 'suffixes', 'parts', 'anchor', 'drive', 'root'] },\n { module: 'http', fake: ['fetch', 'get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'send', 'receive', 'listen', 'connect', 'disconnect', 'close', 'abort', 'timeout', 'retry'] },\n { module: 'crypto', fake: ['hash', 'encrypt', 'decrypt', 'sign', 'verify', 'generate', 'random', 'uuid', 'md5', 'sha1', 'sha256', 'sha512', 'hmac', 'aes', 'rsa', 'ecdsa'] },\n { module: 'util', fake: ['print', 'println', 'printf', 'format', 'log', 'error', 'warn', 'info', 'debug', 'trace', 'assert', 'check', 'validate', 'verify', 'test', 'bench', 'measure'] },\n ];\n\n for (const { module: mod, fake } of nodeAPIChecks) {\n for (const method of fake) {\n const regex = new RegExp(`\\\\b${mod}\\\\s*\\\\.\\\\s*${method}\\\\s*\\\\(`, 'g');\n let match;\n while ((match = regex.exec(code)) !== null) {\n warnings.push({\n type: 'suspicious_api',\n message: `${mod}.${method}() may not exist - verify this API`,\n location: this.getLocation(code, match.index),\n confidence: 0.85,\n });\n }\n }\n }\n }\n\n /**\n * Calculate code metrics\n */\n private calculateMetrics(code: string, lines: string[], scopes: Map<string, ScopeInfo>): CodeMetrics {\n const nonEmptyLines = lines.filter(l => l.trim()).length;\n const statements = (code.match(/;/g) || []).length;\n const functions = this.globalScope.functions.size;\n const classes = Array.from(this.globalScope.types.values()).filter(t => t.kind === 'class').length;\n const imports = this.globalScope.imports.size;\n const exports = Array.from(this.globalScope.variables.values()).filter(v => v.isExported).length +\n Array.from(this.globalScope.functions.values()).filter(f => f.isExported).length;\n\n // Calculate cyclomatic complexity\n let complexity = 1;\n const decisionPoints = ['if', 'else if', 'for', 'while', 'case', 'catch', '&&', '||', '?'];\n for (const point of decisionPoints) {\n const regex = new RegExp(`\\\\b${point.replace(/[|&?]/g, '\\\\$&')}\\\\b`, 'g');\n complexity += (code.match(regex) || []).length;\n }\n\n // Calculate max nesting depth\n let maxDepth = 0;\n let currentDepth = 0;\n for (const char of code) {\n if (char === '{') {\n currentDepth++;\n maxDepth = Math.max(maxDepth, currentDepth);\n } else if (char === '}') {\n currentDepth = Math.max(0, currentDepth - 1);\n }\n }\n\n // Calculate maintainability index (simplified)\n const halsteadVolume = nonEmptyLines * Math.log2(statements + 1);\n const maintainabilityIndex = Math.max(0, 171 - 5.2 * Math.log(halsteadVolume) - 0.23 * complexity - 16.2 * Math.log(nonEmptyLines));\n\n return {\n lines: lines.length,\n statements,\n functions,\n classes,\n imports,\n exports,\n complexity,\n depth: maxDepth,\n maintainabilityIndex: Math.round(maintainabilityIndex),\n };\n }\n\n // Helper methods\n\n private createScope(type: ScopeInfo['type']): ScopeInfo {\n return {\n id: `scope-${this.currentScopeId++}`,\n type,\n variables: new Map(),\n functions: new Map(),\n types: new Map(),\n imports: new Map(),\n };\n }\n\n private initializeGlobals(): Set<string> {\n return new Set([\n // JavaScript globals\n 'undefined', 'null', 'NaN', 'Infinity', 'globalThis', 'window', 'document', 'navigator',\n 'console', 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval', 'setImmediate',\n 'queueMicrotask', 'requestAnimationFrame', 'cancelAnimationFrame', 'fetch', 'Response',\n 'Request', 'Headers', 'URL', 'URLSearchParams', 'FormData', 'Blob', 'File', 'FileReader',\n 'ArrayBuffer', 'DataView', 'Int8Array', 'Uint8Array', 'Int16Array', 'Uint16Array',\n 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array', 'BigInt64Array', 'BigUint64Array',\n 'Map', 'Set', 'WeakMap', 'WeakSet', 'Symbol', 'Proxy', 'Reflect', 'Promise', 'Generator',\n 'Error', 'TypeError', 'ReferenceError', 'SyntaxError', 'RangeError', 'EvalError', 'URIError',\n 'JSON', 'Math', 'Date', 'RegExp', 'Array', 'Object', 'String', 'Number', 'Boolean', 'BigInt',\n 'Function', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI', 'decodeURIComponent',\n 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'alert', 'confirm', 'prompt',\n // Node.js globals\n 'process', 'Buffer', '__dirname', '__filename', 'module', 'exports', 'require', 'global',\n // TypeScript\n 'unknown', 'never', 'any', 'void', 'this', 'super', 'arguments',\n // Common types\n 'Partial', 'Required', 'Readonly', 'Record', 'Pick', 'Omit', 'Exclude', 'Extract',\n 'NonNullable', 'Parameters', 'ConstructorParameters', 'ReturnType', 'InstanceType',\n 'ThisParameterType', 'OmitThisParameter', 'ThisType', 'Awaited',\n // React\n 'React', 'ReactDOM', 'useState', 'useEffect', 'useContext', 'useReducer', 'useCallback',\n 'useMemo', 'useRef', 'useImperativeHandle', 'useLayoutEffect', 'useDebugValue', 'useId',\n 'useTransition', 'useDeferredValue', 'useSyncExternalStore', 'useInsertionEffect',\n // Common identifiers\n 'i', 'j', 'k', 'x', 'y', 'z', 'n', 'm', 'a', 'b', 'c', 'e', 'err', 'error', 'data', 'result',\n 'value', 'key', 'index', 'item', 'element', 'node', 'el', 'props', 'state', 'context',\n ]);\n }\n\n private initializeBuiltins(): Map<string, Set<string>> {\n return new Map([\n ['Array', new Set(['from', 'isArray', 'of', 'prototype'])],\n ['Object', new Set(['assign', 'create', 'defineProperty', 'defineProperties', 'entries', 'freeze', 'fromEntries', 'getOwnPropertyDescriptor', 'getOwnPropertyDescriptors', 'getOwnPropertyNames', 'getOwnPropertySymbols', 'getPrototypeOf', 'is', 'isExtensible', 'isFrozen', 'isSealed', 'keys', 'preventExtensions', 'seal', 'setPrototypeOf', 'values', 'prototype'])],\n ['String', new Set(['fromCharCode', 'fromCodePoint', 'raw', 'prototype'])],\n ['Number', new Set(['isFinite', 'isInteger', 'isNaN', 'isSafeInteger', 'parseFloat', 'parseInt', 'EPSILON', 'MAX_SAFE_INTEGER', 'MAX_VALUE', 'MIN_SAFE_INTEGER', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY', 'prototype'])],\n ['Math', new Set(['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'cbrt', 'ceil', 'clz32', 'cos', 'cosh', 'E', 'exp', 'expm1', 'floor', 'fround', 'hypot', 'imul', 'LN10', 'LN2', 'log', 'log10', 'log1p', 'log2', 'LOG10E', 'LOG2E', 'max', 'min', 'PI', 'pow', 'random', 'round', 'sign', 'sin', 'sinh', 'sqrt', 'SQRT1_2', 'SQRT2', 'tan', 'tanh', 'trunc'])],\n ['Promise', new Set(['all', 'allSettled', 'any', 'race', 'reject', 'resolve', 'prototype'])],\n ['JSON', new Set(['parse', 'stringify'])],\n ['Date', new Set(['now', 'parse', 'UTC', 'prototype'])],\n ['console', new Set(['assert', 'clear', 'count', 'countReset', 'debug', 'dir', 'dirxml', 'error', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 'timeLog', 'timeStamp', 'trace', 'warn'])],\n ]);\n }\n\n private isKeyword(word: string): boolean {\n const keywords = new Set([\n 'break', 'case', 'catch', 'continue', 'debugger', 'default', 'delete', 'do', 'else',\n 'finally', 'for', 'function', 'if', 'in', 'instanceof', 'new', 'return', 'switch',\n 'this', 'throw', 'try', 'typeof', 'var', 'void', 'while', 'with', 'class', 'const',\n 'enum', 'export', 'extends', 'import', 'super', 'implements', 'interface', 'let',\n 'package', 'private', 'protected', 'public', 'static', 'yield', 'async', 'await',\n 'of', 'as', 'from', 'get', 'set', 'type', 'declare', 'readonly', 'abstract',\n 'true', 'false', 'null', 'undefined',\n ]);\n return keywords.has(word);\n }\n\n private validateImportSource(source: string): boolean {\n // Check if it's a relative import\n if (source.startsWith('.')) {\n const resolvedPath = path.resolve(this.workspaceRoot, source);\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '.json', ''];\n for (const ext of extensions) {\n if (fs.existsSync(resolvedPath + ext)) return true;\n if (fs.existsSync(path.join(resolvedPath, 'index' + ext))) return true;\n }\n return false;\n }\n // For node_modules, we'd need to check package.json or node_modules\n return true; // Assume external packages exist for now\n }\n\n private isSuspiciousImport(source: string): boolean {\n const suspiciousPatterns = [\n /^react-native-[a-z]+-[a-z]+$/,\n /^@[a-z]+\\/[a-z]+-utils$/,\n /^simple-[a-z]+$/,\n /^easy-[a-z]+$/,\n /^super-[a-z]+$/,\n /^mega-[a-z]+$/,\n /^ultra-[a-z]+$/,\n /^fast-[a-z]+$/,\n /^better-[a-z]+$/,\n /^awesome-[a-z]+$/,\n ];\n return suspiciousPatterns.some(p => p.test(source));\n }\n\n private parseParams(params: string): ParamInfo[] {\n if (!params.trim()) return [];\n return params.split(',').map(p => {\n const parts = p.trim().split(':');\n const namePart = parts[0].trim();\n const rest = namePart.startsWith('...');\n const optional = namePart.includes('?');\n const name = namePart.replace(/[?.]/g, '').trim();\n const type = parts[1]?.trim() || 'any';\n return { name, type, optional, rest, defaultValue: undefined };\n });\n }\n\n private calculateFunctionComplexity(code: string, startIndex: number): number {\n let complexity = 1;\n let braceCount = 0;\n let started = false;\n \n for (let i = startIndex; i < code.length; i++) {\n const char = code[i];\n if (char === '{') {\n braceCount++;\n started = true;\n } else if (char === '}') {\n braceCount--;\n if (started && braceCount === 0) break;\n }\n \n // Count decision points\n const slice = code.slice(i, i + 10);\n if (/^if\\s*\\(/.test(slice) || /^else\\s+if/.test(slice) || /^for\\s*\\(/.test(slice) ||\n /^while\\s*\\(/.test(slice) || /^case\\s+/.test(slice) || /^catch\\s*\\(/.test(slice)) {\n complexity++;\n }\n if (code.slice(i, i + 2) === '&&' || code.slice(i, i + 2) === '||') {\n complexity++;\n }\n if (char === '?' && code[i + 1] !== '.') {\n complexity++;\n }\n }\n \n return complexity;\n }\n\n private getLocation(code: string, index: number): { line: number; column: number } {\n const lines = code.slice(0, index).split('\\n');\n return { line: lines.length, column: lines[lines.length - 1].length + 1 };\n }\n\n private getLineNumber(code: string, index: number): number {\n return code.slice(0, index).split('\\n').length;\n }\n\n private findSimilarIdentifiers(name: string, scopes: Map<string, ScopeInfo>): string[] {\n const similar: string[] = [];\n const allNames: string[] = [];\n \n for (const scope of scopes.values()) {\n allNames.push(...scope.variables.keys());\n allNames.push(...scope.functions.keys());\n allNames.push(...scope.types.keys());\n }\n \n for (const existing of allNames) {\n if (this.levenshteinDistance(name.toLowerCase(), existing.toLowerCase()) <= 2) {\n similar.push(existing);\n }\n }\n \n return similar.slice(0, 3);\n }\n\n private levenshteinDistance(a: string, b: string): number {\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n \n const matrix: number[][] = [];\n for (let i = 0; i <= b.length; i++) matrix[i] = [i];\n for (let j = 0; j <= a.length; j++) matrix[0][j] = j;\n \n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n matrix[i][j] = b[i - 1] === a[j - 1]\n ? matrix[i - 1][j - 1]\n : Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);\n }\n }\n \n return matrix[b.length][a.length];\n }\n\n private looksLikeReference(code: string, name: string): boolean {\n // Check if the identifier is used in a way that suggests it should be defined\n const patterns = [\n new RegExp(`${name}\\\\s*\\\\(`), // Function call\n new RegExp(`${name}\\\\s*\\\\.`), // Property access\n new RegExp(`new\\\\s+${name}`), // Constructor\n new RegExp(`:\\\\s*${name}\\\\b`), // Type annotation\n new RegExp(`<${name}>`), // Generic type\n new RegExp(`extends\\\\s+${name}`), // Class extension\n new RegExp(`implements\\\\s+${name}`), // Interface implementation\n ];\n return patterns.some(p => p.test(code));\n }\n\n private guessReferenceType(code: string, name: string): 'variable' | 'function' | 'type' | 'import' {\n if (new RegExp(`${name}\\\\s*\\\\(`).test(code)) return 'function';\n if (new RegExp(`:\\\\s*${name}\\\\b`).test(code) || /^[A-Z]/.test(name)) return 'type';\n if (new RegExp(`from\\\\s+['\"].*${name}`).test(code)) return 'import';\n return 'variable';\n }\n\n private inferType(value: string): string {\n value = value.trim();\n if (/^['\"`]/.test(value)) return 'string';\n if (/^\\d+$/.test(value)) return 'number';\n if (/^\\d+\\.\\d+$/.test(value)) return 'number';\n if (value === 'true' || value === 'false') return 'boolean';\n if (value === 'null') return 'null';\n if (value === 'undefined') return 'undefined';\n if (/^\\[/.test(value)) return 'array';\n if (/^\\{/.test(value)) return 'object';\n if (/^new\\s+\\w+/.test(value)) {\n const match = value.match(/^new\\s+(\\w+)/);\n return match ? match[1] : 'object';\n }\n return 'unknown';\n }\n\n private typesCompatible(declared: string, inferred: string): boolean {\n if (declared === inferred) return true;\n if (declared === 'any' || inferred === 'unknown') return true;\n if (declared === 'number' && inferred === 'number') return true;\n if (declared === 'string' && inferred === 'string') return true;\n if (declared.includes('[]') && inferred === 'array') return true;\n return false;\n }\n\n private suggestAlternative(obj: string, method: string): string {\n const alternatives: Record<string, Record<string, string>> = {\n Array: {\n contains: 'Use .includes() instead',\n remove: 'Use .filter() or .splice() instead',\n add: 'Use .push() instead',\n first: 'Use [0] or .at(0) instead',\n last: 'Use .at(-1) instead',\n empty: 'Use .length === 0 instead',\n clear: 'Set array.length = 0 instead',\n unique: 'Use [...new Set(array)] instead',\n },\n String: {\n reverse: 'Use .split(\\'\\').reverse().join(\\'\\') instead',\n capitalize: 'Use str[0].toUpperCase() + str.slice(1) instead',\n isEmpty: 'Use str.length === 0 instead',\n },\n Object: {\n isEmpty: 'Use Object.keys(obj).length === 0 instead',\n merge: 'Use Object.assign() or spread {...obj1, ...obj2} instead',\n clone: 'Use {...obj} or structuredClone(obj) instead',\n },\n Promise: {\n delay: 'Use new Promise(r => setTimeout(r, ms)) instead',\n sleep: 'Use new Promise(r => setTimeout(r, ms)) instead',\n wait: 'Use new Promise(r => setTimeout(r, ms)) instead',\n },\n };\n\n return alternatives[obj]?.[method] || `Check MDN docs for ${obj} methods`;\n }\n}\n\nexport function createASTAnalyzer(workspaceRoot: string): ASTAnalyzer {\n return new ASTAnalyzer(workspaceRoot);\n}\n","/**\n * Package & API Verifier\n * \n * THE MOST COMPREHENSIVE PACKAGE VERIFICATION:\n * - Verifies NPM packages exist\n * - Validates package exports\n * - Checks API signatures match documentation\n * - Detects deprecated APIs\n * - Validates version compatibility\n * - Maintains local cache of known packages\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface PackageInfo {\n name: string;\n version: string;\n exports: string[];\n types: string[];\n deprecated: boolean;\n lastVerified: string;\n}\n\nexport interface APISignature {\n name: string;\n type: 'function' | 'class' | 'constant' | 'type' | 'interface';\n params?: { name: string; type: string; optional: boolean }[];\n returnType?: string;\n isAsync?: boolean;\n deprecated?: boolean;\n since?: string;\n}\n\nexport interface VerificationResult {\n valid: boolean;\n packageExists: boolean;\n exportExists: boolean;\n signatureMatches: boolean;\n issues: VerificationIssue[];\n suggestions: string[];\n}\n\nexport interface VerificationIssue {\n type: 'package_not_found' | 'export_not_found' | 'signature_mismatch' | 'deprecated' | 'version_incompatible';\n message: string;\n severity: 'error' | 'warning';\n fix?: string;\n}\n\nexport class PackageVerifier {\n private workspaceRoot: string;\n private packageCache: Map<string, PackageInfo> = new Map();\n private knownPackages: Map<string, KnownPackage> = new Map();\n private cachePath: string;\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n this.cachePath = path.join(workspaceRoot, '.guardrail', 'package-cache.json');\n this.loadCache();\n this.initializeKnownPackages();\n }\n\n /**\n * Verify an import statement\n */\n verifyImport(source: string, specifiers: string[]): VerificationResult {\n const issues: VerificationIssue[] = [];\n const suggestions: string[] = [];\n\n // Check if package is known to be fake/hallucinated\n if (this.isKnownFakePackage(source)) {\n return {\n valid: false,\n packageExists: false,\n exportExists: false,\n signatureMatches: false,\n issues: [{\n type: 'package_not_found',\n message: `Package \"${source}\" is a known hallucinated package - it does not exist`,\n severity: 'error',\n fix: this.suggestRealPackage(source),\n }],\n suggestions: [this.suggestRealPackage(source)].filter(Boolean) as string[],\n };\n }\n\n // Check if it's a relative import\n if (source.startsWith('.')) {\n return this.verifyRelativeImport(source, specifiers);\n }\n\n // Check known packages\n const knownPkg = this.knownPackages.get(source);\n if (knownPkg) {\n return this.verifyKnownPackage(knownPkg, specifiers);\n }\n\n // Check node_modules\n const nodeModulesPath = path.join(this.workspaceRoot, 'node_modules', source);\n if (fs.existsSync(nodeModulesPath)) {\n return this.verifyInstalledPackage(source, specifiers, nodeModulesPath);\n }\n\n // Check if it's a Node.js built-in\n if (this.isNodeBuiltin(source)) {\n return this.verifyNodeBuiltin(source, specifiers);\n }\n\n // Package not found locally - might be hallucinated\n const similarPackages = this.findSimilarPackages(source);\n if (similarPackages.length > 0) {\n suggestions.push(`Did you mean: ${similarPackages.join(', ')}?`);\n }\n\n issues.push({\n type: 'package_not_found',\n message: `Package \"${source}\" not found - may be hallucinated or not installed`,\n severity: 'error',\n fix: `Run: npm install ${source}`,\n });\n\n return {\n valid: false,\n packageExists: false,\n exportExists: false,\n signatureMatches: false,\n issues,\n suggestions,\n };\n }\n\n /**\n * Verify a function call matches expected signature\n */\n verifyAPICall(packageName: string, functionName: string, args: any[]): VerificationResult {\n const issues: VerificationIssue[] = [];\n const suggestions: string[] = [];\n\n const knownPkg = this.knownPackages.get(packageName);\n if (!knownPkg) {\n return {\n valid: true, // Can't verify unknown packages\n packageExists: true,\n exportExists: true,\n signatureMatches: true,\n issues: [],\n suggestions: ['Consider adding this package to known packages for better verification'],\n };\n }\n\n const api = knownPkg.apis.get(functionName);\n if (!api) {\n // Check for similar API names (typos)\n const similar = this.findSimilarAPIs(knownPkg, functionName);\n if (similar.length > 0) {\n issues.push({\n type: 'export_not_found',\n message: `\"${functionName}\" is not exported from \"${packageName}\"`,\n severity: 'error',\n fix: `Did you mean: ${similar.join(', ')}?`,\n });\n return {\n valid: false,\n packageExists: true,\n exportExists: false,\n signatureMatches: false,\n issues,\n suggestions: [`Available exports: ${Array.from(knownPkg.apis.keys()).slice(0, 10).join(', ')}`],\n };\n }\n }\n\n if (api) {\n // Check deprecated\n if (api.deprecated) {\n issues.push({\n type: 'deprecated',\n message: `\"${functionName}\" is deprecated`,\n severity: 'warning',\n fix: api.replacement ? `Use \"${api.replacement}\" instead` : undefined,\n });\n }\n\n // Check argument count\n if (api.signature.params) {\n const required = api.signature.params.filter(p => !p.optional).length;\n const max = api.signature.params.length;\n \n if (args.length < required) {\n issues.push({\n type: 'signature_mismatch',\n message: `\"${functionName}\" requires at least ${required} arguments, got ${args.length}`,\n severity: 'error',\n fix: `Expected: ${api.signature.params.map(p => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join(', ')}`,\n });\n } else if (args.length > max) {\n issues.push({\n type: 'signature_mismatch',\n message: `\"${functionName}\" accepts at most ${max} arguments, got ${args.length}`,\n severity: 'warning',\n });\n }\n }\n }\n\n return {\n valid: issues.filter(i => i.severity === 'error').length === 0,\n packageExists: true,\n exportExists: !!api,\n signatureMatches: issues.filter(i => i.type === 'signature_mismatch').length === 0,\n issues,\n suggestions,\n };\n }\n\n /**\n * Get all exports for a package\n */\n getPackageExports(packageName: string): string[] {\n const knownPkg = this.knownPackages.get(packageName);\n if (knownPkg) {\n return Array.from(knownPkg.apis.keys());\n }\n return [];\n }\n\n /**\n * Check if a package export exists\n */\n exportExists(packageName: string, exportName: string): boolean {\n const knownPkg = this.knownPackages.get(packageName);\n if (knownPkg) {\n return knownPkg.apis.has(exportName);\n }\n return true; // Assume true for unknown packages\n }\n\n private verifyRelativeImport(source: string, specifiers: string[]): VerificationResult {\n const issues: VerificationIssue[] = [];\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '.json', ''];\n \n let found = false;\n let resolvedPath = '';\n \n for (const ext of extensions) {\n const tryPath = path.resolve(this.workspaceRoot, source + ext);\n if (fs.existsSync(tryPath)) {\n found = true;\n resolvedPath = tryPath;\n break;\n }\n const indexPath = path.join(path.resolve(this.workspaceRoot, source), 'index' + ext);\n if (fs.existsSync(indexPath)) {\n found = true;\n resolvedPath = indexPath;\n break;\n }\n }\n\n if (!found) {\n issues.push({\n type: 'package_not_found',\n message: `File \"${source}\" not found`,\n severity: 'error',\n fix: 'Check the file path is correct',\n });\n }\n\n return {\n valid: found,\n packageExists: found,\n exportExists: found, // Would need to parse file to check exports\n signatureMatches: true,\n issues,\n suggestions: [],\n };\n }\n\n private verifyKnownPackage(pkg: KnownPackage, specifiers: string[]): VerificationResult {\n const issues: VerificationIssue[] = [];\n const suggestions: string[] = [];\n\n for (const spec of specifiers) {\n if (!pkg.apis.has(spec) && spec !== 'default' && spec !== '*') {\n const similar = this.findSimilarAPIs(pkg, spec);\n issues.push({\n type: 'export_not_found',\n message: `\"${spec}\" is not exported from \"${pkg.name}\"`,\n severity: 'error',\n fix: similar.length > 0 ? `Did you mean: ${similar.join(', ')}?` : undefined,\n });\n }\n\n const api = pkg.apis.get(spec);\n if (api?.deprecated) {\n issues.push({\n type: 'deprecated',\n message: `\"${spec}\" is deprecated${api.replacement ? `, use \"${api.replacement}\" instead` : ''}`,\n severity: 'warning',\n });\n }\n }\n\n return {\n valid: issues.filter(i => i.severity === 'error').length === 0,\n packageExists: true,\n exportExists: issues.filter(i => i.type === 'export_not_found').length === 0,\n signatureMatches: true,\n issues,\n suggestions,\n };\n }\n\n private verifyInstalledPackage(name: string, specifiers: string[], pkgPath: string): VerificationResult {\n const issues: VerificationIssue[] = [];\n \n try {\n const pkgJsonPath = path.join(pkgPath, 'package.json');\n if (fs.existsSync(pkgJsonPath)) {\n const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));\n \n // Check for deprecated\n if (pkgJson.deprecated) {\n issues.push({\n type: 'deprecated',\n message: `Package \"${name}\" is deprecated: ${pkgJson.deprecated}`,\n severity: 'warning',\n });\n }\n }\n } catch {\n // Ignore parsing errors\n }\n\n return {\n valid: issues.filter(i => i.severity === 'error').length === 0,\n packageExists: true,\n exportExists: true, // Would need to parse to verify\n signatureMatches: true,\n issues,\n suggestions: [],\n };\n }\n\n private verifyNodeBuiltin(module: string, specifiers: string[]): VerificationResult {\n const nodeBuiltins = this.getNodeBuiltinAPIs(module);\n const issues: VerificationIssue[] = [];\n\n for (const spec of specifiers) {\n if (nodeBuiltins && !nodeBuiltins.has(spec) && spec !== 'default' && spec !== '*') {\n issues.push({\n type: 'export_not_found',\n message: `\"${spec}\" is not exported from Node.js \"${module}\" module`,\n severity: 'error',\n });\n }\n }\n\n return {\n valid: issues.length === 0,\n packageExists: true,\n exportExists: issues.length === 0,\n signatureMatches: true,\n issues,\n suggestions: [],\n };\n }\n\n private isNodeBuiltin(module: string): boolean {\n const builtins = new Set([\n 'assert', 'buffer', 'child_process', 'cluster', 'console', 'constants',\n 'crypto', 'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'https',\n 'module', 'net', 'os', 'path', 'perf_hooks', 'process', 'punycode',\n 'querystring', 'readline', 'repl', 'stream', 'string_decoder', 'sys',\n 'timers', 'tls', 'tty', 'url', 'util', 'v8', 'vm', 'worker_threads', 'zlib',\n 'node:assert', 'node:buffer', 'node:child_process', 'node:cluster',\n 'node:crypto', 'node:dgram', 'node:dns', 'node:events', 'node:fs',\n 'node:http', 'node:https', 'node:net', 'node:os', 'node:path',\n 'node:perf_hooks', 'node:process', 'node:querystring', 'node:readline',\n 'node:stream', 'node:string_decoder', 'node:timers', 'node:tls',\n 'node:tty', 'node:url', 'node:util', 'node:v8', 'node:vm',\n 'node:worker_threads', 'node:zlib',\n ]);\n return builtins.has(module);\n }\n\n private getNodeBuiltinAPIs(module: string): Set<string> | null {\n const apis: Record<string, string[]> = {\n fs: ['readFile', 'writeFile', 'readFileSync', 'writeFileSync', 'readdir', 'readdirSync', 'stat', 'statSync', 'lstat', 'lstatSync', 'mkdir', 'mkdirSync', 'rmdir', 'rmdirSync', 'unlink', 'unlinkSync', 'rename', 'renameSync', 'copyFile', 'copyFileSync', 'access', 'accessSync', 'chmod', 'chmodSync', 'chown', 'chownSync', 'createReadStream', 'createWriteStream', 'watch', 'watchFile', 'unwatchFile', 'existsSync', 'promises'],\n path: ['basename', 'dirname', 'extname', 'format', 'isAbsolute', 'join', 'normalize', 'parse', 'relative', 'resolve', 'sep', 'delimiter', 'posix', 'win32'],\n crypto: ['createHash', 'createHmac', 'createCipheriv', 'createDecipheriv', 'randomBytes', 'randomFillSync', 'randomUUID', 'scrypt', 'scryptSync', 'pbkdf2', 'pbkdf2Sync', 'generateKeyPair', 'generateKeyPairSync', 'publicEncrypt', 'privateDecrypt', 'sign', 'verify', 'createSign', 'createVerify'],\n util: ['promisify', 'callbackify', 'format', 'formatWithOptions', 'inspect', 'isDeepStrictEqual', 'deprecate', 'debuglog', 'types', 'TextDecoder', 'TextEncoder'],\n http: ['createServer', 'request', 'get', 'Agent', 'ClientRequest', 'Server', 'ServerResponse', 'IncomingMessage', 'OutgoingMessage', 'METHODS', 'STATUS_CODES'],\n https: ['createServer', 'request', 'get', 'Agent', 'Server'],\n events: ['EventEmitter', 'once', 'on', 'getEventListeners', 'setMaxListeners', 'listenerCount'],\n stream: ['Readable', 'Writable', 'Duplex', 'Transform', 'PassThrough', 'pipeline', 'finished', 'Stream'],\n buffer: ['Buffer', 'Blob', 'File', 'atob', 'btoa', 'isUtf8', 'isAscii', 'transcode', 'resolveObjectURL'],\n url: ['URL', 'URLSearchParams', 'parse', 'format', 'resolve', 'domainToASCII', 'domainToUnicode', 'fileURLToPath', 'pathToFileURL'],\n os: ['arch', 'cpus', 'freemem', 'homedir', 'hostname', 'loadavg', 'networkInterfaces', 'platform', 'release', 'tmpdir', 'totalmem', 'type', 'uptime', 'userInfo', 'EOL', 'constants'],\n child_process: ['exec', 'execSync', 'execFile', 'execFileSync', 'spawn', 'spawnSync', 'fork', 'ChildProcess'],\n };\n \n const mod = module.replace('node:', '');\n return apis[mod] ? new Set(apis[mod]) : null;\n }\n\n private isKnownFakePackage(source: string): boolean {\n const fakePackages = new Set([\n // Commonly hallucinated packages\n 'react-native-async', 'node-utils', 'simple-fetch', 'easy-api', 'super-query',\n 'fast-cache', 'mega-store', 'ultra-http', 'better-fetch', 'awesome-utils',\n 'react-use-fetch', 'react-use-api', 'react-use-query', 'react-use-data',\n 'express-utils', 'express-helpers', 'next-utils', 'next-helpers',\n 'typescript-utils', 'typescript-helpers', 'ts-utils', 'ts-helpers',\n 'lodash-utils', 'lodash-helpers', 'axios-utils', 'axios-helpers',\n 'mongodb-utils', 'mongoose-utils', 'prisma-utils', 'sequelize-utils',\n 'react-form-utils', 'react-state-utils', 'react-data-utils',\n 'vue-utils', 'vue-helpers', 'angular-utils', 'angular-helpers',\n 'node-crypto-utils', 'node-file-utils', 'node-http-utils',\n '@utils/common', '@helpers/core', '@tools/base', '@lib/utils',\n ]);\n return fakePackages.has(source);\n }\n\n private suggestRealPackage(fakePkg: string): string {\n const suggestions: Record<string, string> = {\n 'simple-fetch': 'Use native fetch() or axios instead',\n 'easy-api': 'Use axios, ky, or got instead',\n 'fast-cache': 'Use node-cache, lru-cache, or redis instead',\n 'react-use-fetch': 'Use react-query, swr, or useSWR instead',\n 'react-use-api': 'Use react-query or swr instead',\n 'react-use-query': 'Use @tanstack/react-query instead',\n 'express-utils': 'Express has built-in utilities',\n 'mongoose-utils': 'Use mongoose directly, it has all utilities built-in',\n };\n return suggestions[fakePkg] || 'Check npmjs.com for valid packages';\n }\n\n private findSimilarPackages(name: string): string[] {\n const allPackages = Array.from(this.knownPackages.keys());\n return allPackages\n .filter(pkg => this.similarity(name, pkg) > 0.6)\n .slice(0, 3);\n }\n\n private findSimilarAPIs(pkg: KnownPackage, name: string): string[] {\n return Array.from(pkg.apis.keys())\n .filter(api => this.similarity(name.toLowerCase(), api.toLowerCase()) > 0.6)\n .slice(0, 3);\n }\n\n private similarity(a: string, b: string): number {\n if (a === b) return 1;\n const longer = a.length > b.length ? a : b;\n const shorter = a.length > b.length ? b : a;\n if (longer.length === 0) return 1;\n \n const editDistance = this.levenshteinDistance(longer, shorter);\n return (longer.length - editDistance) / longer.length;\n }\n\n private levenshteinDistance(a: string, b: string): number {\n const matrix: number[][] = [];\n for (let i = 0; i <= b.length; i++) matrix[i] = [i];\n for (let j = 0; j <= a.length; j++) matrix[0][j] = j;\n \n for (let i = 1; i <= b.length; i++) {\n for (let j = 1; j <= a.length; j++) {\n matrix[i][j] = b[i - 1] === a[j - 1]\n ? matrix[i - 1][j - 1]\n : Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);\n }\n }\n return matrix[b.length][a.length];\n }\n\n private initializeKnownPackages(): void {\n // React\n this.knownPackages.set('react', {\n name: 'react',\n apis: new Map([\n ['useState', { signature: { name: 'useState', type: 'function', params: [{ name: 'initialState', type: 'T | () => T', optional: true }], returnType: '[T, Dispatch<SetStateAction<T>>]' } }],\n ['useEffect', { signature: { name: 'useEffect', type: 'function', params: [{ name: 'effect', type: 'EffectCallback', optional: false }, { name: 'deps', type: 'DependencyList', optional: true }], returnType: 'void' } }],\n ['useContext', { signature: { name: 'useContext', type: 'function', params: [{ name: 'context', type: 'Context<T>', optional: false }], returnType: 'T' } }],\n ['useReducer', { signature: { name: 'useReducer', type: 'function' } }],\n ['useCallback', { signature: { name: 'useCallback', type: 'function' } }],\n ['useMemo', { signature: { name: 'useMemo', type: 'function' } }],\n ['useRef', { signature: { name: 'useRef', type: 'function' } }],\n ['useImperativeHandle', { signature: { name: 'useImperativeHandle', type: 'function' } }],\n ['useLayoutEffect', { signature: { name: 'useLayoutEffect', type: 'function' } }],\n ['useDebugValue', { signature: { name: 'useDebugValue', type: 'function' } }],\n ['useId', { signature: { name: 'useId', type: 'function', returnType: 'string' } }],\n ['useTransition', { signature: { name: 'useTransition', type: 'function' } }],\n ['useDeferredValue', { signature: { name: 'useDeferredValue', type: 'function' } }],\n ['useSyncExternalStore', { signature: { name: 'useSyncExternalStore', type: 'function' } }],\n ['useInsertionEffect', { signature: { name: 'useInsertionEffect', type: 'function' } }],\n ['createElement', { signature: { name: 'createElement', type: 'function' } }],\n ['createContext', { signature: { name: 'createContext', type: 'function' } }],\n ['createRef', { signature: { name: 'createRef', type: 'function' } }],\n ['forwardRef', { signature: { name: 'forwardRef', type: 'function' } }],\n ['memo', { signature: { name: 'memo', type: 'function' } }],\n ['lazy', { signature: { name: 'lazy', type: 'function' } }],\n ['Suspense', { signature: { name: 'Suspense', type: 'class' } }],\n ['Fragment', { signature: { name: 'Fragment', type: 'class' } }],\n ['StrictMode', { signature: { name: 'StrictMode', type: 'class' } }],\n ['Component', { signature: { name: 'Component', type: 'class' } }],\n ['PureComponent', { signature: { name: 'PureComponent', type: 'class' } }],\n ['Children', { signature: { name: 'Children', type: 'constant' } }],\n ['cloneElement', { signature: { name: 'cloneElement', type: 'function' } }],\n ['isValidElement', { signature: { name: 'isValidElement', type: 'function' } }],\n ['version', { signature: { name: 'version', type: 'constant' } }],\n ]),\n });\n\n // Express\n this.knownPackages.set('express', {\n name: 'express',\n apis: new Map([\n ['default', { signature: { name: 'express', type: 'function', returnType: 'Application' } }],\n ['Router', { signature: { name: 'Router', type: 'function', returnType: 'Router' } }],\n ['json', { signature: { name: 'json', type: 'function' } }],\n ['urlencoded', { signature: { name: 'urlencoded', type: 'function' } }],\n ['static', { signature: { name: 'static', type: 'function' } }],\n ['raw', { signature: { name: 'raw', type: 'function' } }],\n ['text', { signature: { name: 'text', type: 'function' } }],\n ['query', { signature: { name: 'query', type: 'function' } }],\n ['Request', { signature: { name: 'Request', type: 'interface' } }],\n ['Response', { signature: { name: 'Response', type: 'interface' } }],\n ['NextFunction', { signature: { name: 'NextFunction', type: 'type' } }],\n ['Application', { signature: { name: 'Application', type: 'interface' } }],\n ]),\n });\n\n // Lodash\n this.knownPackages.set('lodash', {\n name: 'lodash',\n apis: new Map([\n ['debounce', { signature: { name: 'debounce', type: 'function' } }],\n ['throttle', { signature: { name: 'throttle', type: 'function' } }],\n ['cloneDeep', { signature: { name: 'cloneDeep', type: 'function' } }],\n ['isEqual', { signature: { name: 'isEqual', type: 'function' } }],\n ['merge', { signature: { name: 'merge', type: 'function' } }],\n ['omit', { signature: { name: 'omit', type: 'function' } }],\n ['pick', { signature: { name: 'pick', type: 'function' } }],\n ['get', { signature: { name: 'get', type: 'function' } }],\n ['set', { signature: { name: 'set', type: 'function' } }],\n ['has', { signature: { name: 'has', type: 'function' } }],\n ['uniq', { signature: { name: 'uniq', type: 'function' } }],\n ['uniqBy', { signature: { name: 'uniqBy', type: 'function' } }],\n ['groupBy', { signature: { name: 'groupBy', type: 'function' } }],\n ['sortBy', { signature: { name: 'sortBy', type: 'function' } }],\n ['orderBy', { signature: { name: 'orderBy', type: 'function' } }],\n ['keyBy', { signature: { name: 'keyBy', type: 'function' } }],\n ['mapValues', { signature: { name: 'mapValues', type: 'function' } }],\n ['mapKeys', { signature: { name: 'mapKeys', type: 'function' } }],\n ['isEmpty', { signature: { name: 'isEmpty', type: 'function' } }],\n ['isNil', { signature: { name: 'isNil', type: 'function' } }],\n ['isNull', { signature: { name: 'isNull', type: 'function' } }],\n ['isUndefined', { signature: { name: 'isUndefined', type: 'function' } }],\n ['isArray', { signature: { name: 'isArray', type: 'function' } }],\n ['isObject', { signature: { name: 'isObject', type: 'function' } }],\n ['isString', { signature: { name: 'isString', type: 'function' } }],\n ['isNumber', { signature: { name: 'isNumber', type: 'function' } }],\n ['isBoolean', { signature: { name: 'isBoolean', type: 'function' } }],\n ['isFunction', { signature: { name: 'isFunction', type: 'function' } }],\n ['chunk', { signature: { name: 'chunk', type: 'function' } }],\n ['flatten', { signature: { name: 'flatten', type: 'function' } }],\n ['flattenDeep', { signature: { name: 'flattenDeep', type: 'function' } }],\n ['compact', { signature: { name: 'compact', type: 'function' } }],\n ['difference', { signature: { name: 'difference', type: 'function' } }],\n ['intersection', { signature: { name: 'intersection', type: 'function' } }],\n ['union', { signature: { name: 'union', type: 'function' } }],\n ]),\n });\n\n // Axios\n this.knownPackages.set('axios', {\n name: 'axios',\n apis: new Map([\n ['default', { signature: { name: 'axios', type: 'function' } }],\n ['get', { signature: { name: 'get', type: 'function', isAsync: true } }],\n ['post', { signature: { name: 'post', type: 'function', isAsync: true } }],\n ['put', { signature: { name: 'put', type: 'function', isAsync: true } }],\n ['patch', { signature: { name: 'patch', type: 'function', isAsync: true } }],\n ['delete', { signature: { name: 'delete', type: 'function', isAsync: true } }],\n ['head', { signature: { name: 'head', type: 'function', isAsync: true } }],\n ['options', { signature: { name: 'options', type: 'function', isAsync: true } }],\n ['request', { signature: { name: 'request', type: 'function', isAsync: true } }],\n ['create', { signature: { name: 'create', type: 'function' } }],\n ['all', { signature: { name: 'all', type: 'function' } }],\n ['spread', { signature: { name: 'spread', type: 'function' } }],\n ['isAxiosError', { signature: { name: 'isAxiosError', type: 'function' } }],\n ['isCancel', { signature: { name: 'isCancel', type: 'function' } }],\n ['CancelToken', { signature: { name: 'CancelToken', type: 'class' } }],\n ['Axios', { signature: { name: 'Axios', type: 'class' } }],\n ['AxiosError', { signature: { name: 'AxiosError', type: 'class' } }],\n ['AxiosHeaders', { signature: { name: 'AxiosHeaders', type: 'class' } }],\n ]),\n });\n\n // More packages can be added...\n }\n\n private loadCache(): void {\n try {\n if (fs.existsSync(this.cachePath)) {\n const data = JSON.parse(fs.readFileSync(this.cachePath, 'utf-8'));\n this.packageCache = new Map(Object.entries(data.packages || {}));\n }\n } catch {\n // Ignore cache errors\n }\n }\n\n private saveCache(): void {\n try {\n const dir = path.dirname(this.cachePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.cachePath, JSON.stringify({\n packages: Object.fromEntries(this.packageCache),\n lastUpdated: new Date().toISOString(),\n }, null, 2));\n } catch {\n // Ignore cache errors\n }\n }\n}\n\ninterface KnownPackage {\n name: string;\n apis: Map<string, { \n signature: APISignature; \n deprecated?: boolean; \n replacement?: string;\n }>;\n}\n\nexport function createPackageVerifier(workspaceRoot: string): PackageVerifier {\n return new PackageVerifier(workspaceRoot);\n}\n","/**\n * Cross-File Consistency Analyzer\n * \n * THE MOST COMPREHENSIVE CROSS-FILE VERIFICATION:\n * - Tracks type definitions across files\n * - Validates import/export consistency\n * - Detects circular dependencies\n * - Verifies interface implementations\n * - Checks for duplicate definitions\n * - Analyzes call graph for dead code\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface FileAnalysis {\n path: string;\n exports: CFExportInfo[];\n imports: CFImportInfo[];\n types: TypeDefinition[];\n functions: FunctionDefinition[];\n dependencies: string[];\n dependents: string[];\n}\n\nexport interface CFExportInfo {\n name: string;\n type: 'function' | 'class' | 'type' | 'interface' | 'const' | 'let' | 'var' | 'enum' | 'default';\n isReExport: boolean;\n originalSource?: string;\n line: number;\n}\n\nexport interface CFImportInfo {\n source: string;\n specifiers: { name: string; alias?: string; isDefault: boolean }[];\n isTypeOnly: boolean;\n line: number;\n resolved: boolean;\n resolvedPath?: string;\n}\n\nexport interface TypeDefinition {\n name: string;\n kind: 'interface' | 'type' | 'class' | 'enum';\n properties: { name: string; type: string; optional: boolean }[];\n methods: { name: string; params: string; returnType: string }[];\n extends?: string[];\n implements?: string[];\n line: number;\n}\n\nexport interface FunctionDefinition {\n name: string;\n params: { name: string; type: string; optional: boolean }[];\n returnType: string;\n isAsync: boolean;\n isExported: boolean;\n line: number;\n calls: string[];\n calledBy: string[];\n}\n\nexport interface ConsistencyIssue {\n type: 'missing_export' | 'missing_import' | 'type_mismatch' | 'circular_dependency' | \n 'duplicate_definition' | 'dead_code' | 'inconsistent_signature' | 'missing_implementation';\n severity: 'error' | 'warning' | 'info';\n file: string;\n line?: number;\n message: string;\n relatedFiles?: string[];\n fix?: string;\n}\n\nexport interface CrossFileAnalysisResult {\n files: Map<string, FileAnalysis>;\n issues: ConsistencyIssue[];\n dependencyGraph: Map<string, Set<string>>;\n circularDependencies: string[][];\n unusedExports: { file: string; export: string }[];\n missingTypes: { file: string; type: string; referencedIn: string[] }[];\n duplicateDefinitions: { name: string; files: string[] }[];\n}\n\nexport class CrossFileAnalyzer {\n private workspaceRoot: string;\n private fileCache: Map<string, FileAnalysis> = new Map();\n private typeRegistry: Map<string, { file: string; definition: TypeDefinition }[]> = new Map();\n private exportRegistry: Map<string, { file: string; export: CFExportInfo }[]> = new Map();\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = workspaceRoot;\n }\n\n /**\n * Analyze multiple files for cross-file consistency\n */\n async analyzeProject(files: string[]): Promise<CrossFileAnalysisResult> {\n const fileAnalyses = new Map<string, FileAnalysis>();\n const issues: ConsistencyIssue[] = [];\n\n // Phase 1: Analyze each file\n for (const file of files) {\n try {\n const analysis = await this.analyzeFile(file);\n fileAnalyses.set(file, analysis);\n this.fileCache.set(file, analysis);\n } catch (e) {\n issues.push({\n type: 'missing_import',\n severity: 'error',\n file,\n message: `Failed to analyze file: ${e}`,\n });\n }\n }\n\n // Phase 2: Build registries\n this.buildTypeRegistry(fileAnalyses);\n this.buildExportRegistry(fileAnalyses);\n\n // Phase 3: Build dependency graph\n const dependencyGraph = this.buildDependencyGraph(fileAnalyses);\n\n // Phase 4: Detect circular dependencies\n const circularDependencies = this.detectCircularDependencies(dependencyGraph);\n for (const cycle of circularDependencies) {\n issues.push({\n type: 'circular_dependency',\n severity: 'warning',\n file: cycle[0],\n message: `Circular dependency detected: ${cycle.join(' -> ')}`,\n relatedFiles: cycle,\n fix: 'Consider extracting shared code to a separate module',\n });\n }\n\n // Phase 5: Validate imports\n issues.push(...this.validateImports(fileAnalyses));\n\n // Phase 6: Check for duplicate definitions\n const duplicateDefinitions = this.findDuplicateDefinitions();\n for (const dup of duplicateDefinitions) {\n issues.push({\n type: 'duplicate_definition',\n severity: 'warning',\n file: dup.files[0],\n message: `\"${dup.name}\" is defined in multiple files: ${dup.files.join(', ')}`,\n relatedFiles: dup.files,\n fix: 'Consider consolidating to a single definition',\n });\n }\n\n // Phase 7: Find unused exports\n const unusedExports = this.findUnusedExports(fileAnalyses);\n for (const unused of unusedExports) {\n issues.push({\n type: 'dead_code',\n severity: 'info',\n file: unused.file,\n message: `Export \"${unused.export}\" is not imported by any other file`,\n fix: 'Consider removing if not used externally',\n });\n }\n\n // Phase 8: Find missing types\n const missingTypes = this.findMissingTypes(fileAnalyses);\n for (const missing of missingTypes) {\n issues.push({\n type: 'type_mismatch',\n severity: 'error',\n file: missing.file,\n message: `Type \"${missing.type}\" is used but not defined or imported`,\n relatedFiles: missing.referencedIn,\n fix: `Import \"${missing.type}\" or define it locally`,\n });\n }\n\n // Phase 9: Validate interface implementations\n issues.push(...this.validateImplementations(fileAnalyses));\n\n return {\n files: fileAnalyses,\n issues,\n dependencyGraph,\n circularDependencies,\n unusedExports,\n missingTypes,\n duplicateDefinitions,\n };\n }\n\n /**\n * Analyze a single file\n */\n async analyzeFile(filePath: string): Promise<FileAnalysis> {\n const absolutePath = path.isAbsolute(filePath) \n ? filePath \n : path.resolve(this.workspaceRoot, filePath);\n \n const content = fs.readFileSync(absolutePath, 'utf-8');\n const lines = content.split('\\n');\n\n const exports = this.extractExports(content, lines);\n const imports = this.extractImports(content, lines, absolutePath);\n const types = this.extractTypes(content, lines);\n const functions = this.extractFunctions(content, lines);\n\n // Resolve dependencies\n const dependencies = imports.map(i => i.resolvedPath || i.source).filter(Boolean);\n \n return {\n path: absolutePath,\n exports,\n imports,\n types,\n functions,\n dependencies,\n dependents: [], // Will be filled in during cross-file analysis\n };\n }\n\n /**\n * Validate code snippet against project context\n */\n validateSnippet(code: string, targetFile: string): ConsistencyIssue[] {\n const issues: ConsistencyIssue[] = [];\n const lines = code.split('\\n');\n\n // Extract imports from snippet\n const snippetImports = this.extractImports(code, lines, targetFile);\n\n // Check each import against project\n for (const imp of snippetImports) {\n // Check if import source exists\n if (imp.source.startsWith('.')) {\n const resolvedPath = this.resolveImportPath(imp.source, targetFile);\n if (!resolvedPath || !this.fileCache.has(resolvedPath)) {\n issues.push({\n type: 'missing_import',\n severity: 'error',\n file: targetFile,\n line: imp.line,\n message: `Import source \"${imp.source}\" does not exist`,\n fix: 'Check the file path is correct',\n });\n continue;\n }\n\n // Check if specifiers exist in source file\n const sourceAnalysis = this.fileCache.get(resolvedPath);\n if (sourceAnalysis) {\n for (const spec of imp.specifiers) {\n const exportExists = sourceAnalysis.exports.some(e => \n e.name === spec.name || (spec.isDefault && e.type === 'default')\n );\n if (!exportExists) {\n issues.push({\n type: 'missing_export',\n severity: 'error',\n file: targetFile,\n line: imp.line,\n message: `\"${spec.name}\" is not exported from \"${imp.source}\"`,\n relatedFiles: [resolvedPath],\n fix: `Add export for \"${spec.name}\" in ${path.basename(resolvedPath)}`,\n });\n }\n }\n }\n }\n }\n\n // Extract type references and validate\n const typeRefs = this.extractTypeReferences(code);\n for (const typeRef of typeRefs) {\n // Check if type is defined locally or imported\n const isImported = snippetImports.some(i => \n i.specifiers.some(s => s.name === typeRef || s.alias === typeRef)\n );\n const isDefinedLocally = code.includes(`interface ${typeRef}`) || \n code.includes(`type ${typeRef}`) ||\n code.includes(`class ${typeRef}`) ||\n code.includes(`enum ${typeRef}`);\n\n if (!isImported && !isDefinedLocally && !this.isBuiltinType(typeRef)) {\n // Check if it exists in the project\n const existsInProject = this.typeRegistry.has(typeRef);\n if (!existsInProject) {\n issues.push({\n type: 'type_mismatch',\n severity: 'warning',\n file: targetFile,\n message: `Type \"${typeRef}\" is used but may not be defined in the project`,\n fix: `Define \"${typeRef}\" or import it from a module`,\n });\n }\n }\n }\n\n // Extract function calls and validate\n const functionCalls = this.extractFunctionCalls(code);\n for (const call of functionCalls) {\n // Check if function is imported or defined locally\n const isImported = snippetImports.some(i =>\n i.specifiers.some(s => s.name === call || s.alias === call)\n );\n const isDefinedLocally = new RegExp(`function\\\\s+${call}\\\\s*\\\\(`).test(code) ||\n new RegExp(`const\\\\s+${call}\\\\s*=`).test(code);\n\n if (!isImported && !isDefinedLocally && !this.isBuiltinFunction(call)) {\n issues.push({\n type: 'missing_import',\n severity: 'warning',\n file: targetFile,\n message: `Function \"${call}\" is called but may not be imported or defined`,\n fix: `Import \"${call}\" or define it locally`,\n });\n }\n }\n\n return issues;\n }\n\n // Extraction methods\n\n private extractExports(content: string, lines: string[]): CFExportInfo[] {\n const exports: CFExportInfo[] = [];\n\n // Named exports\n const namedExportRegex = /export\\s+(?:async\\s+)?(?:function|const|let|var|class|interface|type|enum)\\s+(\\w+)/g;\n let match;\n while ((match = namedExportRegex.exec(content)) !== null) {\n const type = this.getExportType(content, match.index);\n exports.push({\n name: match[1],\n type,\n isReExport: false,\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Default exports\n const defaultExportRegex = /export\\s+default\\s+(?:async\\s+)?(?:function\\s+)?(\\w+)?/g;\n while ((match = defaultExportRegex.exec(content)) !== null) {\n exports.push({\n name: match[1] || 'default',\n type: 'default',\n isReExport: false,\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Re-exports\n const reExportRegex = /export\\s+\\{([^}]+)\\}\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n while ((match = reExportRegex.exec(content)) !== null) {\n const names = match[1].split(',').map(s => s.trim().split(/\\s+as\\s+/)[0]);\n for (const name of names) {\n if (name) {\n exports.push({\n name,\n type: 'const', // Default, would need more analysis\n isReExport: true,\n originalSource: match[2],\n line: this.getLineNumber(content, match.index),\n });\n }\n }\n }\n\n // Export all\n const exportAllRegex = /export\\s+\\*\\s+(?:as\\s+(\\w+)\\s+)?from\\s+['\"]([^'\"]+)['\"]/g;\n while ((match = exportAllRegex.exec(content)) !== null) {\n exports.push({\n name: match[1] || '*',\n type: 'const',\n isReExport: true,\n originalSource: match[2],\n line: this.getLineNumber(content, match.index),\n });\n }\n\n return exports;\n }\n\n private extractImports(content: string, lines: string[], fromFile: string): CFImportInfo[] {\n const imports: CFImportInfo[] = [];\n\n const importRegex = /import\\s+(?:type\\s+)?(?:(\\{[^}]+\\})|(\\*\\s+as\\s+\\w+)|(\\w+))?\\s*(?:,\\s*(?:(\\{[^}]+\\})|(\\w+)))?\\s*from\\s+['\"]([^'\"]+)['\"]/g;\n \n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const [fullMatch, namedImports, namespaceImport, defaultImport, additionalNamed, additionalDefault, source] = match;\n const isTypeOnly = fullMatch.includes('import type');\n \n const specifiers: CFImportInfo['specifiers'] = [];\n\n if (namedImports) {\n const names = namedImports.replace(/[{}]/g, '').split(',').map(s => s.trim());\n for (const name of names) {\n if (name) {\n const [importName, alias] = name.split(/\\s+as\\s+/).map(s => s.trim());\n specifiers.push({ name: importName, alias, isDefault: false });\n }\n }\n }\n\n if (namespaceImport) {\n const alias = namespaceImport.replace('* as', '').trim();\n specifiers.push({ name: '*', alias, isDefault: false });\n }\n\n if (defaultImport) {\n specifiers.push({ name: defaultImport, isDefault: true });\n }\n\n if (additionalNamed) {\n const names = additionalNamed.replace(/[{}]/g, '').split(',').map(s => s.trim());\n for (const name of names) {\n if (name) {\n const [importName, alias] = name.split(/\\s+as\\s+/).map(s => s.trim());\n specifiers.push({ name: importName, alias, isDefault: false });\n }\n }\n }\n\n if (additionalDefault) {\n specifiers.push({ name: additionalDefault, isDefault: true });\n }\n\n const resolvedPath = this.resolveImportPath(source, fromFile);\n\n imports.push({\n source,\n specifiers,\n isTypeOnly,\n line: this.getLineNumber(content, match.index),\n resolved: !!resolvedPath,\n resolvedPath,\n });\n }\n\n return imports;\n }\n\n private extractTypes(content: string, lines: string[]): TypeDefinition[] {\n const types: TypeDefinition[] = [];\n\n // Interfaces\n const interfaceRegex = /interface\\s+(\\w+)(?:<[^>]+>)?(?:\\s+extends\\s+([^{]+))?\\s*\\{/g;\n let match;\n while ((match = interfaceRegex.exec(content)) !== null) {\n const [, name, extendsClause] = match;\n const body = this.extractBraceContent(content, match.index + match[0].length - 1);\n \n types.push({\n name,\n kind: 'interface',\n properties: this.parseTypeProperties(body),\n methods: this.parseTypeMethods(body),\n extends: extendsClause?.split(',').map(s => s.trim()),\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Type aliases\n const typeRegex = /type\\s+(\\w+)(?:<[^>]+>)?\\s*=/g;\n while ((match = typeRegex.exec(content)) !== null) {\n types.push({\n name: match[1],\n kind: 'type',\n properties: [],\n methods: [],\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Classes\n const classRegex = /class\\s+(\\w+)(?:<[^>]+>)?(?:\\s+extends\\s+(\\w+))?(?:\\s+implements\\s+([^{]+))?\\s*\\{/g;\n while ((match = classRegex.exec(content)) !== null) {\n const [, name, extendsClass, implementsClause] = match;\n const body = this.extractBraceContent(content, match.index + match[0].length - 1);\n\n types.push({\n name,\n kind: 'class',\n properties: this.parseClassProperties(body),\n methods: this.parseClassMethods(body),\n extends: extendsClass ? [extendsClass] : undefined,\n implements: implementsClause?.split(',').map(s => s.trim()),\n line: this.getLineNumber(content, match.index),\n });\n }\n\n // Enums\n const enumRegex = /enum\\s+(\\w+)\\s*\\{/g;\n while ((match = enumRegex.exec(content)) !== null) {\n types.push({\n name: match[1],\n kind: 'enum',\n properties: [],\n methods: [],\n line: this.getLineNumber(content, match.index),\n });\n }\n\n return types;\n }\n\n private extractFunctions(content: string, lines: string[]): FunctionDefinition[] {\n const functions: FunctionDefinition[] = [];\n\n // Regular functions\n const funcRegex = /(?:export\\s+)?(?:async\\s+)?function\\s*\\*?\\s*(\\w+)\\s*\\(([^)]*)\\)(?:\\s*:\\s*([^\\{]+))?\\s*\\{/g;\n let match;\n while ((match = funcRegex.exec(content)) !== null) {\n const [fullMatch, name, params, returnType] = match;\n const body = this.extractBraceContent(content, match.index + fullMatch.length - 1);\n\n functions.push({\n name,\n params: this.parseParams(params),\n returnType: returnType?.trim() || 'void',\n isAsync: fullMatch.includes('async'),\n isExported: fullMatch.includes('export'),\n line: this.getLineNumber(content, match.index),\n calls: this.extractFunctionCalls(body),\n calledBy: [],\n });\n }\n\n // Arrow functions assigned to const\n const arrowRegex = /(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*([^=]+))?\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*(?::\\s*([^\\s=>]+))?\\s*=>/g;\n while ((match = arrowRegex.exec(content)) !== null) {\n const [fullMatch, name, typeAnnotation, returnType] = match;\n \n functions.push({\n name,\n params: [],\n returnType: returnType?.trim() || typeAnnotation?.trim() || 'unknown',\n isAsync: fullMatch.includes('async'),\n isExported: fullMatch.includes('export'),\n line: this.getLineNumber(content, match.index),\n calls: [],\n calledBy: [],\n });\n }\n\n return functions;\n }\n\n // Analysis methods\n\n private buildTypeRegistry(files: Map<string, FileAnalysis>): void {\n this.typeRegistry.clear();\n \n for (const [filePath, analysis] of files) {\n for (const type of analysis.types) {\n if (!this.typeRegistry.has(type.name)) {\n this.typeRegistry.set(type.name, []);\n }\n this.typeRegistry.get(type.name)!.push({ file: filePath, definition: type });\n }\n }\n }\n\n private buildExportRegistry(files: Map<string, FileAnalysis>): void {\n this.exportRegistry.clear();\n\n for (const [filePath, analysis] of files) {\n for (const exp of analysis.exports) {\n if (!this.exportRegistry.has(exp.name)) {\n this.exportRegistry.set(exp.name, []);\n }\n this.exportRegistry.get(exp.name)!.push({ file: filePath, export: exp });\n }\n }\n }\n\n private buildDependencyGraph(files: Map<string, FileAnalysis>): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n\n for (const [filePath, analysis] of files) {\n const deps = new Set<string>();\n \n for (const imp of analysis.imports) {\n if (imp.resolvedPath && files.has(imp.resolvedPath)) {\n deps.add(imp.resolvedPath);\n }\n }\n\n graph.set(filePath, deps);\n }\n\n // Update dependents\n for (const [filePath, deps] of graph) {\n for (const dep of deps) {\n const depAnalysis = files.get(dep);\n if (depAnalysis) {\n depAnalysis.dependents.push(filePath);\n }\n }\n }\n\n return graph;\n }\n\n private detectCircularDependencies(graph: Map<string, Set<string>>): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const dfs = (node: string, currentPath: string[]): boolean => {\n visited.add(node);\n recursionStack.add(node);\n currentPath.push(node);\n\n const deps = graph.get(node) || new Set();\n for (const dep of deps) {\n if (!visited.has(dep)) {\n if (dfs(dep, currentPath)) return true;\n } else if (recursionStack.has(dep)) {\n // Found cycle\n const cycleStart = currentPath.indexOf(dep);\n const cycle = currentPath.slice(cycleStart);\n cycle.push(dep); // Complete the cycle\n cycles.push(cycle.map((p: string) => p.replace(this.workspaceRoot, '').replace(/^[/\\\\]/, '')));\n }\n }\n\n currentPath.pop();\n recursionStack.delete(node);\n return false;\n };\n\n for (const node of graph.keys()) {\n if (!visited.has(node)) {\n dfs(node, []);\n }\n }\n\n return cycles;\n }\n\n private validateImports(files: Map<string, FileAnalysis>): ConsistencyIssue[] {\n const issues: ConsistencyIssue[] = [];\n\n for (const [filePath, analysis] of files) {\n for (const imp of analysis.imports) {\n // Check if import can be resolved\n if (!imp.resolved && imp.source.startsWith('.')) {\n issues.push({\n type: 'missing_import',\n severity: 'error',\n file: filePath,\n line: imp.line,\n message: `Cannot resolve import \"${imp.source}\"`,\n fix: 'Check the file path is correct',\n });\n continue;\n }\n\n // Check if specifiers exist in source\n if (imp.resolvedPath && files.has(imp.resolvedPath)) {\n const sourceFile = files.get(imp.resolvedPath)!;\n \n for (const spec of imp.specifiers) {\n if (spec.isDefault) {\n const hasDefault = sourceFile.exports.some(e => e.type === 'default');\n if (!hasDefault) {\n issues.push({\n type: 'missing_export',\n severity: 'error',\n file: filePath,\n line: imp.line,\n message: `No default export in \"${imp.source}\"`,\n relatedFiles: [imp.resolvedPath],\n });\n }\n } else if (spec.name !== '*') {\n const hasExport = sourceFile.exports.some(e => e.name === spec.name);\n if (!hasExport) {\n issues.push({\n type: 'missing_export',\n severity: 'error',\n file: filePath,\n line: imp.line,\n message: `\"${spec.name}\" is not exported from \"${imp.source}\"`,\n relatedFiles: [imp.resolvedPath],\n fix: `Add \"export\" to \"${spec.name}\" in ${path.basename(imp.resolvedPath)}`,\n });\n }\n }\n }\n }\n }\n }\n\n return issues;\n }\n\n private findDuplicateDefinitions(): { name: string; files: string[] }[] {\n const duplicates: { name: string; files: string[] }[] = [];\n\n for (const [name, definitions] of this.typeRegistry) {\n if (definitions.length > 1) {\n duplicates.push({\n name,\n files: definitions.map(d => d.file),\n });\n }\n }\n\n return duplicates;\n }\n\n private findUnusedExports(files: Map<string, FileAnalysis>): { file: string; export: string }[] {\n const unused: { file: string; export: string }[] = [];\n const usedExports = new Set<string>();\n\n // Collect all used exports\n for (const analysis of files.values()) {\n for (const imp of analysis.imports) {\n for (const spec of imp.specifiers) {\n usedExports.add(`${imp.resolvedPath || imp.source}:${spec.name}`);\n }\n }\n }\n\n // Find unused\n for (const [filePath, analysis] of files) {\n for (const exp of analysis.exports) {\n const key = `${filePath}:${exp.name}`;\n if (!usedExports.has(key) && exp.name !== 'default') {\n unused.push({ file: filePath, export: exp.name });\n }\n }\n }\n\n return unused;\n }\n\n private findMissingTypes(files: Map<string, FileAnalysis>): { file: string; type: string; referencedIn: string[] }[] {\n // Would need full type reference tracking\n return [];\n }\n\n private validateImplementations(files: Map<string, FileAnalysis>): ConsistencyIssue[] {\n const issues: ConsistencyIssue[] = [];\n\n for (const [filePath, analysis] of files) {\n for (const type of analysis.types) {\n if (type.kind === 'class' && type.implements) {\n for (const interfaceName of type.implements) {\n const interfaceDefs = this.typeRegistry.get(interfaceName);\n if (!interfaceDefs) {\n issues.push({\n type: 'missing_implementation',\n severity: 'warning',\n file: filePath,\n line: type.line,\n message: `Class \"${type.name}\" implements \"${interfaceName}\" which is not found`,\n });\n }\n // Would need deeper analysis to check all members are implemented\n }\n }\n }\n }\n\n return issues;\n }\n\n // Helper methods\n\n private resolveImportPath(source: string, fromFile: string): string | undefined {\n if (!source.startsWith('.')) return undefined;\n\n const fromDir = path.dirname(fromFile);\n const extensions = ['.ts', '.tsx', '.js', '.jsx', ''];\n \n for (const ext of extensions) {\n const tryPath = path.resolve(fromDir, source + ext);\n if (fs.existsSync(tryPath)) return tryPath;\n \n const indexPath = path.join(path.resolve(fromDir, source), 'index' + ext);\n if (fs.existsSync(indexPath)) return indexPath;\n }\n\n return undefined;\n }\n\n private getExportType(content: string, index: number): CFExportInfo['type'] {\n const slice = content.slice(index, index + 50);\n if (/^export\\s+(?:async\\s+)?function/.test(slice)) return 'function';\n if (/^export\\s+class/.test(slice)) return 'class';\n if (/^export\\s+interface/.test(slice)) return 'interface';\n if (/^export\\s+type/.test(slice)) return 'type';\n if (/^export\\s+enum/.test(slice)) return 'enum';\n if (/^export\\s+const/.test(slice)) return 'const';\n if (/^export\\s+let/.test(slice)) return 'let';\n if (/^export\\s+var/.test(slice)) return 'var';\n return 'const';\n }\n\n private getLineNumber(content: string, index: number): number {\n return content.slice(0, index).split('\\n').length;\n }\n\n private extractBraceContent(content: string, startIndex: number): string {\n let depth = 0;\n let started = false;\n let endIndex = startIndex;\n\n for (let i = startIndex; i < content.length; i++) {\n if (content[i] === '{') {\n depth++;\n started = true;\n } else if (content[i] === '}') {\n depth--;\n if (started && depth === 0) {\n endIndex = i;\n break;\n }\n }\n }\n\n return content.slice(startIndex + 1, endIndex);\n }\n\n private parseParams(params: string): { name: string; type: string; optional: boolean }[] {\n if (!params.trim()) return [];\n \n return params.split(',').map(p => {\n const parts = p.trim().split(':');\n const namePart = parts[0].trim();\n const optional = namePart.includes('?');\n const name = namePart.replace(/[?]/g, '').trim();\n const type = parts[1]?.trim() || 'any';\n return { name, type, optional };\n });\n }\n\n private parseTypeProperties(body: string): { name: string; type: string; optional: boolean }[] {\n const props: { name: string; type: string; optional: boolean }[] = [];\n const propRegex = /(\\w+)(\\?)?:\\s*([^;]+);/g;\n \n let match;\n while ((match = propRegex.exec(body)) !== null) {\n props.push({\n name: match[1],\n type: match[3].trim(),\n optional: match[2] === '?',\n });\n }\n\n return props;\n }\n\n private parseTypeMethods(body: string): { name: string; params: string; returnType: string }[] {\n const methods: { name: string; params: string; returnType: string }[] = [];\n const methodRegex = /(\\w+)\\s*\\(([^)]*)\\)(?:\\s*:\\s*([^;]+))?;/g;\n\n let match;\n while ((match = methodRegex.exec(body)) !== null) {\n methods.push({\n name: match[1],\n params: match[2],\n returnType: match[3]?.trim() || 'void',\n });\n }\n\n return methods;\n }\n\n private parseClassProperties(body: string): { name: string; type: string; optional: boolean }[] {\n return this.parseTypeProperties(body);\n }\n\n private parseClassMethods(body: string): { name: string; params: string; returnType: string }[] {\n const methods: { name: string; params: string; returnType: string }[] = [];\n const methodRegex = /(?:public|private|protected)?\\s*(?:async\\s+)?(\\w+)\\s*\\(([^)]*)\\)(?:\\s*:\\s*([^\\{]+))?\\s*\\{/g;\n\n let match;\n while ((match = methodRegex.exec(body)) !== null) {\n methods.push({\n name: match[1],\n params: match[2],\n returnType: match[3]?.trim() || 'void',\n });\n }\n\n return methods;\n }\n\n private extractTypeReferences(code: string): string[] {\n const refs: string[] = [];\n const typeRefRegex = /:\\s*([A-Z][a-zA-Z0-9]*)/g;\n \n let match;\n while ((match = typeRefRegex.exec(code)) !== null) {\n refs.push(match[1]);\n }\n\n return [...new Set(refs)];\n }\n\n private extractFunctionCalls(code: string): string[] {\n const calls: string[] = [];\n const callRegex = /\\b([a-zA-Z_]\\w*)\\s*\\(/g;\n\n let match;\n while ((match = callRegex.exec(code)) !== null) {\n const name = match[1];\n if (!this.isKeyword(name) && !this.isBuiltinFunction(name)) {\n calls.push(name);\n }\n }\n\n return [...new Set(calls)];\n }\n\n private isBuiltinType(name: string): boolean {\n const builtins = new Set([\n 'string', 'number', 'boolean', 'object', 'any', 'unknown', 'never', 'void',\n 'null', 'undefined', 'symbol', 'bigint', 'Array', 'Object', 'String',\n 'Number', 'Boolean', 'Function', 'Promise', 'Map', 'Set', 'WeakMap',\n 'WeakSet', 'Date', 'RegExp', 'Error', 'Buffer', 'Partial', 'Required',\n 'Readonly', 'Record', 'Pick', 'Omit', 'Exclude', 'Extract', 'NonNullable',\n 'Parameters', 'ReturnType', 'InstanceType', 'Awaited', 'T', 'K', 'V', 'U',\n ]);\n return builtins.has(name);\n }\n\n private isBuiltinFunction(name: string): boolean {\n const builtins = new Set([\n 'console', 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',\n 'fetch', 'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'encodeURI',\n 'decodeURI', 'encodeURIComponent', 'decodeURIComponent', 'eval', 'alert',\n 'confirm', 'prompt', 'require', 'import', 'export', 'JSON', 'Math',\n 'Date', 'Array', 'Object', 'String', 'Number', 'Boolean', 'Promise',\n 'Map', 'Set', 'WeakMap', 'WeakSet', 'Error', 'TypeError', 'RangeError',\n 'if', 'for', 'while', 'switch', 'try', 'catch', 'return', 'throw',\n ]);\n return builtins.has(name);\n }\n\n private isKeyword(word: string): boolean {\n const keywords = new Set([\n 'break', 'case', 'catch', 'continue', 'debugger', 'default', 'delete',\n 'do', 'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof',\n 'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var',\n 'void', 'while', 'with', 'class', 'const', 'enum', 'export', 'extends',\n 'import', 'super', 'implements', 'interface', 'let', 'package', 'private',\n 'protected', 'public', 'static', 'yield', 'async', 'await',\n ]);\n return keywords.has(word);\n }\n}\n\nexport function createCrossFileAnalyzer(workspaceRoot: string): CrossFileAnalyzer {\n return new CrossFileAnalyzer(workspaceRoot);\n}\n"],"mappings":"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","names":["import_fast_glob","fs","path","fs","path","import_fast_glob","fs","path","import_fast_glob","fs","path","fs","path","fs","path","basename","fs","path","exports","fs","path","fs","path","fs","path","fs","path","exports","fs","path","fs","path","crypto","fs","path","DEFAULT_OPTIONS","fs","path","exports","fs","path","module","fs","path","exports"]}