@revealui/mcp 0.0.1-pre.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/.env.example +9 -0
  2. package/MCP_MAINTENANCE.md +265 -0
  3. package/README.md +260 -0
  4. package/__tests__/crdt.integration.test.ts +156 -0
  5. package/configs/README.md +77 -0
  6. package/configs/claude-template.json +54 -0
  7. package/dist/packages/core/src/database/ssl-config.d.ts +9 -0
  8. package/dist/packages/core/src/database/ssl-config.d.ts.map +1 -0
  9. package/dist/packages/core/src/database/ssl-config.js +8 -0
  10. package/dist/packages/core/src/database/ssl-config.js.map +1 -0
  11. package/dist/packages/core/src/features.d.ts +86 -0
  12. package/dist/packages/core/src/features.d.ts.map +1 -0
  13. package/dist/packages/core/src/features.js +93 -0
  14. package/dist/packages/core/src/features.js.map +1 -0
  15. package/dist/packages/core/src/license.d.ts +75 -0
  16. package/dist/packages/core/src/license.d.ts.map +1 -0
  17. package/dist/packages/core/src/license.js +174 -0
  18. package/dist/packages/core/src/license.js.map +1 -0
  19. package/dist/packages/core/src/monitoring/alerts.d.ts +118 -0
  20. package/dist/packages/core/src/monitoring/alerts.d.ts.map +1 -0
  21. package/dist/packages/core/src/monitoring/alerts.js +325 -0
  22. package/dist/packages/core/src/monitoring/alerts.js.map +1 -0
  23. package/dist/packages/core/src/monitoring/cleanup-manager.d.ts +71 -0
  24. package/dist/packages/core/src/monitoring/cleanup-manager.d.ts.map +1 -0
  25. package/dist/packages/core/src/monitoring/cleanup-manager.js +227 -0
  26. package/dist/packages/core/src/monitoring/cleanup-manager.js.map +1 -0
  27. package/dist/packages/core/src/monitoring/health-monitor.d.ts +22 -0
  28. package/dist/packages/core/src/monitoring/health-monitor.d.ts.map +1 -0
  29. package/dist/packages/core/src/monitoring/health-monitor.js +143 -0
  30. package/dist/packages/core/src/monitoring/health-monitor.js.map +1 -0
  31. package/dist/packages/core/src/monitoring/index.d.ts +14 -0
  32. package/dist/packages/core/src/monitoring/index.d.ts.map +1 -0
  33. package/dist/packages/core/src/monitoring/index.js +18 -0
  34. package/dist/packages/core/src/monitoring/index.js.map +1 -0
  35. package/dist/packages/core/src/monitoring/process-registry.d.ts +97 -0
  36. package/dist/packages/core/src/monitoring/process-registry.d.ts.map +1 -0
  37. package/dist/packages/core/src/monitoring/process-registry.js +223 -0
  38. package/dist/packages/core/src/monitoring/process-registry.js.map +1 -0
  39. package/dist/packages/core/src/monitoring/types.d.ts +231 -0
  40. package/dist/packages/core/src/monitoring/types.d.ts.map +1 -0
  41. package/dist/packages/core/src/monitoring/types.js +43 -0
  42. package/dist/packages/core/src/monitoring/types.js.map +1 -0
  43. package/dist/packages/core/src/monitoring/zombie-detector.d.ts +81 -0
  44. package/dist/packages/core/src/monitoring/zombie-detector.d.ts.map +1 -0
  45. package/dist/packages/core/src/monitoring/zombie-detector.js +232 -0
  46. package/dist/packages/core/src/monitoring/zombie-detector.js.map +1 -0
  47. package/dist/packages/core/src/observability/logger.d.ts +47 -0
  48. package/dist/packages/core/src/observability/logger.d.ts.map +1 -0
  49. package/dist/packages/core/src/observability/logger.js +141 -0
  50. package/dist/packages/core/src/observability/logger.js.map +1 -0
  51. package/dist/packages/core/src/utils/logger-server.d.ts +32 -0
  52. package/dist/packages/core/src/utils/logger-server.d.ts.map +1 -0
  53. package/dist/packages/core/src/utils/logger-server.js +69 -0
  54. package/dist/packages/core/src/utils/logger-server.js.map +1 -0
  55. package/dist/packages/core/src/utils/request-context.d.ts +143 -0
  56. package/dist/packages/core/src/utils/request-context.d.ts.map +1 -0
  57. package/dist/packages/core/src/utils/request-context.js +169 -0
  58. package/dist/packages/core/src/utils/request-context.js.map +1 -0
  59. package/dist/packages/dev/src/code-validator/index.d.ts +20 -0
  60. package/dist/packages/dev/src/code-validator/index.d.ts.map +1 -0
  61. package/dist/packages/dev/src/code-validator/index.js +20 -0
  62. package/dist/packages/dev/src/code-validator/index.js.map +1 -0
  63. package/dist/packages/dev/src/code-validator/types.d.ts +67 -0
  64. package/dist/packages/dev/src/code-validator/types.d.ts.map +1 -0
  65. package/dist/packages/dev/src/code-validator/types.js +7 -0
  66. package/dist/packages/dev/src/code-validator/types.js.map +1 -0
  67. package/dist/packages/dev/src/code-validator/validator.d.ts +48 -0
  68. package/dist/packages/dev/src/code-validator/validator.d.ts.map +1 -0
  69. package/dist/packages/dev/src/code-validator/validator.js +176 -0
  70. package/dist/packages/dev/src/code-validator/validator.js.map +1 -0
  71. package/dist/packages/mcp/src/adapters/db.d.ts +46 -0
  72. package/dist/packages/mcp/src/adapters/db.d.ts.map +1 -0
  73. package/dist/packages/mcp/src/adapters/db.js +127 -0
  74. package/dist/packages/mcp/src/adapters/db.js.map +1 -0
  75. package/dist/packages/mcp/src/config/index.d.ts +11 -0
  76. package/dist/packages/mcp/src/config/index.d.ts.map +1 -0
  77. package/dist/packages/mcp/src/config/index.js +18 -0
  78. package/dist/packages/mcp/src/config/index.js.map +1 -0
  79. package/dist/packages/mcp/src/contracts.d.ts +131 -0
  80. package/dist/packages/mcp/src/contracts.d.ts.map +1 -0
  81. package/dist/packages/mcp/src/contracts.js +153 -0
  82. package/dist/packages/mcp/src/contracts.js.map +1 -0
  83. package/dist/packages/mcp/src/hypervisor.d.ts +132 -0
  84. package/dist/packages/mcp/src/hypervisor.d.ts.map +1 -0
  85. package/dist/packages/mcp/src/hypervisor.js +359 -0
  86. package/dist/packages/mcp/src/hypervisor.js.map +1 -0
  87. package/dist/packages/mcp/src/index.d.ts +25 -0
  88. package/dist/packages/mcp/src/index.d.ts.map +1 -0
  89. package/dist/packages/mcp/src/index.js +41 -0
  90. package/dist/packages/mcp/src/index.js.map +1 -0
  91. package/dist/packages/mcp/src/servers/adapter.d.ts +199 -0
  92. package/dist/packages/mcp/src/servers/adapter.d.ts.map +1 -0
  93. package/dist/packages/mcp/src/servers/adapter.js +487 -0
  94. package/dist/packages/mcp/src/servers/adapter.js.map +1 -0
  95. package/dist/packages/mcp/src/servers/code-validator.d.ts +24 -0
  96. package/dist/packages/mcp/src/servers/code-validator.d.ts.map +1 -0
  97. package/dist/packages/mcp/src/servers/code-validator.js +156 -0
  98. package/dist/packages/mcp/src/servers/code-validator.js.map +1 -0
  99. package/dist/packages/mcp/src/servers/neon.d.ts +11 -0
  100. package/dist/packages/mcp/src/servers/neon.d.ts.map +1 -0
  101. package/dist/packages/mcp/src/servers/neon.js +90 -0
  102. package/dist/packages/mcp/src/servers/neon.js.map +1 -0
  103. package/dist/packages/mcp/src/servers/next-devtools.d.ts +11 -0
  104. package/dist/packages/mcp/src/servers/next-devtools.d.ts.map +1 -0
  105. package/dist/packages/mcp/src/servers/next-devtools.js +215 -0
  106. package/dist/packages/mcp/src/servers/next-devtools.js.map +1 -0
  107. package/dist/packages/mcp/src/servers/playwright.d.ts +11 -0
  108. package/dist/packages/mcp/src/servers/playwright.d.ts.map +1 -0
  109. package/dist/packages/mcp/src/servers/playwright.js +68 -0
  110. package/dist/packages/mcp/src/servers/playwright.js.map +1 -0
  111. package/dist/packages/mcp/src/servers/stripe.d.ts +11 -0
  112. package/dist/packages/mcp/src/servers/stripe.d.ts.map +1 -0
  113. package/dist/packages/mcp/src/servers/stripe.js +86 -0
  114. package/dist/packages/mcp/src/servers/stripe.js.map +1 -0
  115. package/dist/packages/mcp/src/servers/supabase.d.ts +11 -0
  116. package/dist/packages/mcp/src/servers/supabase.d.ts.map +1 -0
  117. package/dist/packages/mcp/src/servers/supabase.js +144 -0
  118. package/dist/packages/mcp/src/servers/supabase.js.map +1 -0
  119. package/dist/packages/mcp/src/servers/vercel.d.ts +11 -0
  120. package/dist/packages/mcp/src/servers/vercel.d.ts.map +1 -0
  121. package/dist/packages/mcp/src/servers/vercel.js +87 -0
  122. package/dist/packages/mcp/src/servers/vercel.js.map +1 -0
  123. package/dist/packages/mcp/src/servers/vultr-test.d.ts +3 -0
  124. package/dist/packages/mcp/src/servers/vultr-test.d.ts.map +1 -0
  125. package/dist/packages/mcp/src/servers/vultr-test.js +82 -0
  126. package/dist/packages/mcp/src/servers/vultr-test.js.map +1 -0
  127. package/dist/scripts/lib/analyzers/console-analyzer.d.ts +188 -0
  128. package/dist/scripts/lib/analyzers/console-analyzer.d.ts.map +1 -0
  129. package/dist/scripts/lib/analyzers/console-analyzer.js +432 -0
  130. package/dist/scripts/lib/analyzers/console-analyzer.js.map +1 -0
  131. package/dist/scripts/lib/analyzers/index.d.ts +11 -0
  132. package/dist/scripts/lib/analyzers/index.d.ts.map +1 -0
  133. package/dist/scripts/lib/analyzers/index.js +11 -0
  134. package/dist/scripts/lib/analyzers/index.js.map +1 -0
  135. package/dist/scripts/lib/args.d.ts +104 -0
  136. package/dist/scripts/lib/args.d.ts.map +1 -0
  137. package/dist/scripts/lib/args.js +304 -0
  138. package/dist/scripts/lib/args.js.map +1 -0
  139. package/dist/scripts/lib/cache.d.ts +185 -0
  140. package/dist/scripts/lib/cache.d.ts.map +1 -0
  141. package/dist/scripts/lib/cache.js +390 -0
  142. package/dist/scripts/lib/cache.js.map +1 -0
  143. package/dist/scripts/lib/cli/dispatch.d.ts +116 -0
  144. package/dist/scripts/lib/cli/dispatch.d.ts.map +1 -0
  145. package/dist/scripts/lib/cli/dispatch.js +206 -0
  146. package/dist/scripts/lib/cli/dispatch.js.map +1 -0
  147. package/dist/scripts/lib/cli/index.d.ts +10 -0
  148. package/dist/scripts/lib/cli/index.d.ts.map +1 -0
  149. package/dist/scripts/lib/cli/index.js +10 -0
  150. package/dist/scripts/lib/cli/index.js.map +1 -0
  151. package/dist/scripts/lib/database/ssl-config.d.ts +26 -0
  152. package/dist/scripts/lib/database/ssl-config.d.ts.map +1 -0
  153. package/dist/scripts/lib/database/ssl-config.js +47 -0
  154. package/dist/scripts/lib/database/ssl-config.js.map +1 -0
  155. package/dist/scripts/lib/errors.d.ts +218 -0
  156. package/dist/scripts/lib/errors.d.ts.map +1 -0
  157. package/dist/scripts/lib/errors.js +543 -0
  158. package/dist/scripts/lib/errors.js.map +1 -0
  159. package/dist/scripts/lib/exec.d.ts +107 -0
  160. package/dist/scripts/lib/exec.d.ts.map +1 -0
  161. package/dist/scripts/lib/exec.js +232 -0
  162. package/dist/scripts/lib/exec.js.map +1 -0
  163. package/dist/scripts/lib/index.d.ts +50 -0
  164. package/dist/scripts/lib/index.d.ts.map +1 -0
  165. package/dist/scripts/lib/index.js +65 -0
  166. package/dist/scripts/lib/index.js.map +1 -0
  167. package/dist/scripts/lib/logger.d.ts +50 -0
  168. package/dist/scripts/lib/logger.d.ts.map +1 -0
  169. package/dist/scripts/lib/logger.js +159 -0
  170. package/dist/scripts/lib/logger.js.map +1 -0
  171. package/dist/scripts/lib/output.d.ts +149 -0
  172. package/dist/scripts/lib/output.d.ts.map +1 -0
  173. package/dist/scripts/lib/output.js +263 -0
  174. package/dist/scripts/lib/output.js.map +1 -0
  175. package/dist/scripts/lib/parallel.d.ts +164 -0
  176. package/dist/scripts/lib/parallel.d.ts.map +1 -0
  177. package/dist/scripts/lib/parallel.js +355 -0
  178. package/dist/scripts/lib/parallel.js.map +1 -0
  179. package/dist/scripts/lib/paths.d.ts +92 -0
  180. package/dist/scripts/lib/paths.d.ts.map +1 -0
  181. package/dist/scripts/lib/paths.js +171 -0
  182. package/dist/scripts/lib/paths.js.map +1 -0
  183. package/dist/scripts/lib/state/adapters/memory.d.ts +42 -0
  184. package/dist/scripts/lib/state/adapters/memory.d.ts.map +1 -0
  185. package/dist/scripts/lib/state/adapters/memory.js +110 -0
  186. package/dist/scripts/lib/state/adapters/memory.js.map +1 -0
  187. package/dist/scripts/lib/state/adapters/pglite.d.ts +46 -0
  188. package/dist/scripts/lib/state/adapters/pglite.d.ts.map +1 -0
  189. package/dist/scripts/lib/state/adapters/pglite.js +256 -0
  190. package/dist/scripts/lib/state/adapters/pglite.js.map +1 -0
  191. package/dist/scripts/lib/state/index.d.ts +16 -0
  192. package/dist/scripts/lib/state/index.d.ts.map +1 -0
  193. package/dist/scripts/lib/state/index.js +16 -0
  194. package/dist/scripts/lib/state/index.js.map +1 -0
  195. package/dist/scripts/lib/state/types.d.ts +111 -0
  196. package/dist/scripts/lib/state/types.d.ts.map +1 -0
  197. package/dist/scripts/lib/state/types.js +8 -0
  198. package/dist/scripts/lib/state/types.js.map +1 -0
  199. package/dist/scripts/lib/state/workflow-state.d.ts +110 -0
  200. package/dist/scripts/lib/state/workflow-state.d.ts.map +1 -0
  201. package/dist/scripts/lib/state/workflow-state.js +331 -0
  202. package/dist/scripts/lib/state/workflow-state.js.map +1 -0
  203. package/dist/scripts/lib/telemetry.d.ts +194 -0
  204. package/dist/scripts/lib/telemetry.d.ts.map +1 -0
  205. package/dist/scripts/lib/telemetry.js +394 -0
  206. package/dist/scripts/lib/telemetry.js.map +1 -0
  207. package/dist/scripts/lib/utils.d.ts +270 -0
  208. package/dist/scripts/lib/utils.d.ts.map +1 -0
  209. package/dist/scripts/lib/utils.js +473 -0
  210. package/dist/scripts/lib/utils.js.map +1 -0
  211. package/dist/scripts/lib/validation/database.d.ts +83 -0
  212. package/dist/scripts/lib/validation/database.d.ts.map +1 -0
  213. package/dist/scripts/lib/validation/database.js +199 -0
  214. package/dist/scripts/lib/validation/database.js.map +1 -0
  215. package/dist/scripts/lib/validation/env.d.ts +80 -0
  216. package/dist/scripts/lib/validation/env.d.ts.map +1 -0
  217. package/dist/scripts/lib/validation/env.js +246 -0
  218. package/dist/scripts/lib/validation/env.js.map +1 -0
  219. package/dist/scripts/lib/validation/index.d.ts +16 -0
  220. package/dist/scripts/lib/validation/index.d.ts.map +1 -0
  221. package/dist/scripts/lib/validation/index.js +16 -0
  222. package/dist/scripts/lib/validation/index.js.map +1 -0
  223. package/dist/scripts/lib/validation/post-execution.d.ts +74 -0
  224. package/dist/scripts/lib/validation/post-execution.d.ts.map +1 -0
  225. package/dist/scripts/lib/validation/post-execution.js +110 -0
  226. package/dist/scripts/lib/validation/post-execution.js.map +1 -0
  227. package/dist/scripts/lib/validation/pre-execution.d.ts +165 -0
  228. package/dist/scripts/lib/validation/pre-execution.d.ts.map +1 -0
  229. package/dist/scripts/lib/validation/pre-execution.js +466 -0
  230. package/dist/scripts/lib/validation/pre-execution.js.map +1 -0
  231. package/dist/scripts/lib/validators/documentation-validator.d.ts +242 -0
  232. package/dist/scripts/lib/validators/documentation-validator.d.ts.map +1 -0
  233. package/dist/scripts/lib/validators/documentation-validator.js +584 -0
  234. package/dist/scripts/lib/validators/documentation-validator.js.map +1 -0
  235. package/dist/scripts/lib/validators/index.d.ts +11 -0
  236. package/dist/scripts/lib/validators/index.d.ts.map +1 -0
  237. package/dist/scripts/lib/validators/index.js +11 -0
  238. package/dist/scripts/lib/validators/index.js.map +1 -0
  239. package/docker-compose.yml +46 -0
  240. package/docs/INDEX.md +88 -0
  241. package/docs/README.md +774 -0
  242. package/docs/SETUP.md +264 -0
  243. package/docs/servers/code-validator.md +586 -0
  244. package/eslint.config.js +7 -0
  245. package/migrations/0001_add_crdt_columns.sql +8 -0
  246. package/migrations/0001_rollback.sql +6 -0
  247. package/migrations/005_performance_indexes.sql +190 -0
  248. package/migrations/backfill_crdt_meta.js +45 -0
  249. package/package.json +21 -85
  250. package/src/__tests__/hypervisor.test.ts +212 -0
  251. package/src/adapters/db.ts +180 -0
  252. package/src/config/config.json +49 -0
  253. package/src/config/index.ts +30 -0
  254. package/src/contracts.ts +221 -0
  255. package/src/hypervisor.ts +464 -0
  256. package/src/index.ts +87 -0
  257. package/src/servers/adapter.ts +643 -0
  258. package/src/servers/code-validator.ts +188 -0
  259. package/src/servers/neon.ts +103 -0
  260. package/src/servers/next-devtools.ts +230 -0
  261. package/src/servers/playwright.ts +77 -0
  262. package/src/servers/stripe.ts +99 -0
  263. package/src/servers/supabase.ts +161 -0
  264. package/src/servers/vercel.ts +100 -0
  265. package/src/servers/vultr-test.ts +97 -0
  266. package/tsconfig.json +12 -0
  267. package/vitest.config.ts +22 -0
  268. package/LICENSE +0 -202
  269. package/dist/index.js +0 -10990
  270. package/dist/index.js.map +0 -1
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Request Context Management
3
+ *
4
+ * Provides request ID generation and context propagation for distributed tracing.
5
+ * Request IDs enable tracking a single request across multiple services and logs.
6
+ *
7
+ * WARNING: This module uses Node.js-specific APIs (async_hooks, crypto).
8
+ * Do NOT import in client-side code or edge runtime.
9
+ */
10
+ /**
11
+ * Request context data stored in AsyncLocalStorage
12
+ */
13
+ export interface RequestContext {
14
+ /** Unique request identifier */
15
+ requestId: string;
16
+ /** Request start timestamp */
17
+ startTime: number;
18
+ /** User ID (if authenticated) */
19
+ userId?: string;
20
+ /** IP address */
21
+ ip?: string;
22
+ /** User agent */
23
+ userAgent?: string;
24
+ /** Request path */
25
+ path?: string;
26
+ /** Request method */
27
+ method?: string;
28
+ /** Additional metadata */
29
+ metadata?: Record<string, unknown>;
30
+ }
31
+ /**
32
+ * Generate a new request ID
33
+ * Uses UUID v4 for guaranteed uniqueness
34
+ */
35
+ export declare function generateRequestId(): string;
36
+ /**
37
+ * Get the current request context
38
+ * Returns undefined if not in a request context
39
+ */
40
+ export declare function getRequestContext(): RequestContext | undefined;
41
+ /**
42
+ * Get the current request ID
43
+ * Returns undefined if not in a request context
44
+ */
45
+ export declare function getRequestId(): string | undefined;
46
+ /**
47
+ * Run a function within a request context
48
+ *
49
+ * @param context - Request context data
50
+ * @param fn - Function to run within the context
51
+ * @returns Result of the function
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * await runInRequestContext(
56
+ * {
57
+ * requestId: generateRequestId(),
58
+ * startTime: Date.now(),
59
+ * userId: 'user-123',
60
+ * path: '/api/users',
61
+ * method: 'GET',
62
+ * },
63
+ * async () => {
64
+ * // All code here has access to request context
65
+ * const requestId = getRequestId()
66
+ * logger.info('Processing request', { requestId })
67
+ * }
68
+ * )
69
+ * ```
70
+ */
71
+ export declare function runInRequestContext<T>(context: RequestContext, fn: () => T): T;
72
+ /**
73
+ * Update the current request context with additional data
74
+ *
75
+ * @param updates - Partial context updates to merge
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * updateRequestContext({ userId: 'user-123' })
80
+ * ```
81
+ */
82
+ export declare function updateRequestContext(updates: Partial<RequestContext>): void;
83
+ /**
84
+ * Extract request ID from various header formats
85
+ *
86
+ * Checks multiple common header names:
87
+ * - x-request-id (standard)
88
+ * - x-correlation-id (correlation pattern)
89
+ * - x-trace-id (OpenTelemetry)
90
+ * - request-id (simple)
91
+ *
92
+ * @param headers - Request headers (any format)
93
+ * @returns Request ID or undefined
94
+ */
95
+ export declare function extractRequestId(headers: Record<string, string | string[] | undefined>): string | undefined;
96
+ /**
97
+ * Create request context from HTTP request
98
+ *
99
+ * @param options - Request information
100
+ * @returns Request context
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * const context = createRequestContext({
105
+ * headers: request.headers,
106
+ * path: request.url,
107
+ * method: request.method,
108
+ * ip: request.ip,
109
+ * })
110
+ * ```
111
+ */
112
+ export declare function createRequestContext(options: {
113
+ headers?: Record<string, string | string[] | undefined>;
114
+ path?: string;
115
+ method?: string;
116
+ ip?: string;
117
+ userId?: string;
118
+ }): RequestContext;
119
+ /**
120
+ * Get request duration in milliseconds
121
+ *
122
+ * @returns Duration in ms, or undefined if not in request context
123
+ */
124
+ export declare function getRequestDuration(): number | undefined;
125
+ /**
126
+ * Request context headers for propagating across services
127
+ *
128
+ * Use these when making HTTP requests to other services to maintain trace continuity
129
+ *
130
+ * @returns Headers object with request ID
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * const response = await fetch('https://api.example.com/users', {
135
+ * headers: {
136
+ * ...getRequestHeaders(),
137
+ * 'Authorization': 'Bearer token',
138
+ * }
139
+ * })
140
+ * ```
141
+ */
142
+ export declare function getRequestHeaders(): Record<string, string>;
143
+ //# sourceMappingURL=request-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../../../../../core/src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAA;IAEjB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAA;IAEjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,iBAAiB;IACjB,EAAE,CAAC,EAAE,MAAM,CAAA;IAEX,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE9E;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAK3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GACrD,MAAM,GAAG,SAAS,CAWpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;IACvD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,cAAc,CAajB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAKvD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO1D"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Request Context Management
3
+ *
4
+ * Provides request ID generation and context propagation for distributed tracing.
5
+ * Request IDs enable tracking a single request across multiple services and logs.
6
+ *
7
+ * WARNING: This module uses Node.js-specific APIs (async_hooks, crypto).
8
+ * Do NOT import in client-side code or edge runtime.
9
+ */
10
+ import { AsyncLocalStorage } from 'node:async_hooks';
11
+ import { randomUUID } from 'node:crypto';
12
+ /**
13
+ * AsyncLocalStorage for request context
14
+ * Provides request-scoped storage without passing context through every function
15
+ */
16
+ const requestContextStorage = new AsyncLocalStorage();
17
+ /**
18
+ * Generate a new request ID
19
+ * Uses UUID v4 for guaranteed uniqueness
20
+ */
21
+ export function generateRequestId() {
22
+ return randomUUID();
23
+ }
24
+ /**
25
+ * Get the current request context
26
+ * Returns undefined if not in a request context
27
+ */
28
+ export function getRequestContext() {
29
+ return requestContextStorage.getStore();
30
+ }
31
+ /**
32
+ * Get the current request ID
33
+ * Returns undefined if not in a request context
34
+ */
35
+ export function getRequestId() {
36
+ return getRequestContext()?.requestId;
37
+ }
38
+ /**
39
+ * Run a function within a request context
40
+ *
41
+ * @param context - Request context data
42
+ * @param fn - Function to run within the context
43
+ * @returns Result of the function
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * await runInRequestContext(
48
+ * {
49
+ * requestId: generateRequestId(),
50
+ * startTime: Date.now(),
51
+ * userId: 'user-123',
52
+ * path: '/api/users',
53
+ * method: 'GET',
54
+ * },
55
+ * async () => {
56
+ * // All code here has access to request context
57
+ * const requestId = getRequestId()
58
+ * logger.info('Processing request', { requestId })
59
+ * }
60
+ * )
61
+ * ```
62
+ */
63
+ export function runInRequestContext(context, fn) {
64
+ return requestContextStorage.run(context, fn);
65
+ }
66
+ /**
67
+ * Update the current request context with additional data
68
+ *
69
+ * @param updates - Partial context updates to merge
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * updateRequestContext({ userId: 'user-123' })
74
+ * ```
75
+ */
76
+ export function updateRequestContext(updates) {
77
+ const current = getRequestContext();
78
+ if (current) {
79
+ Object.assign(current, updates);
80
+ }
81
+ }
82
+ /**
83
+ * Extract request ID from various header formats
84
+ *
85
+ * Checks multiple common header names:
86
+ * - x-request-id (standard)
87
+ * - x-correlation-id (correlation pattern)
88
+ * - x-trace-id (OpenTelemetry)
89
+ * - request-id (simple)
90
+ *
91
+ * @param headers - Request headers (any format)
92
+ * @returns Request ID or undefined
93
+ */
94
+ export function extractRequestId(headers) {
95
+ const headerNames = ['x-request-id', 'x-correlation-id', 'x-trace-id', 'request-id'];
96
+ for (const name of headerNames) {
97
+ const value = headers[name];
98
+ if (value) {
99
+ return Array.isArray(value) ? value[0] : value;
100
+ }
101
+ }
102
+ return undefined;
103
+ }
104
+ /**
105
+ * Create request context from HTTP request
106
+ *
107
+ * @param options - Request information
108
+ * @returns Request context
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const context = createRequestContext({
113
+ * headers: request.headers,
114
+ * path: request.url,
115
+ * method: request.method,
116
+ * ip: request.ip,
117
+ * })
118
+ * ```
119
+ */
120
+ export function createRequestContext(options) {
121
+ // Try to extract existing request ID from headers, or generate new one
122
+ const requestId = options.headers ? extractRequestId(options.headers) : undefined;
123
+ return {
124
+ requestId: requestId || generateRequestId(),
125
+ startTime: Date.now(),
126
+ path: options.path,
127
+ method: options.method,
128
+ ip: options.ip,
129
+ userId: options.userId,
130
+ userAgent: options.headers?.['user-agent'],
131
+ };
132
+ }
133
+ /**
134
+ * Get request duration in milliseconds
135
+ *
136
+ * @returns Duration in ms, or undefined if not in request context
137
+ */
138
+ export function getRequestDuration() {
139
+ const context = getRequestContext();
140
+ if (!context)
141
+ return undefined;
142
+ return Date.now() - context.startTime;
143
+ }
144
+ /**
145
+ * Request context headers for propagating across services
146
+ *
147
+ * Use these when making HTTP requests to other services to maintain trace continuity
148
+ *
149
+ * @returns Headers object with request ID
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const response = await fetch('https://api.example.com/users', {
154
+ * headers: {
155
+ * ...getRequestHeaders(),
156
+ * 'Authorization': 'Bearer token',
157
+ * }
158
+ * })
159
+ * ```
160
+ */
161
+ export function getRequestHeaders() {
162
+ const requestId = getRequestId();
163
+ if (!requestId)
164
+ return {};
165
+ return {
166
+ 'x-request-id': requestId,
167
+ };
168
+ }
169
+ //# sourceMappingURL=request-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../../../../../core/src/utils/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AA+BxC;;;GAGG;AACH,MAAM,qBAAqB,GAAG,IAAI,iBAAiB,EAAkB,CAAA;AAErE;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,EAAE,CAAA;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,QAAQ,EAAE,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,iBAAiB,EAAE,EAAE,SAAS,CAAA;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,mBAAmB,CAAI,OAAuB,EAAE,EAAW;IACzE,OAAO,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgC;IACnE,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAsD;IAEtD,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,CAAC,CAAA;IAEpF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAChD,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAMpC;IACC,uEAAuE;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEjF,OAAO;QACL,SAAS,EAAE,SAAS,IAAI,iBAAiB,EAAE;QAC3C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,YAAY,CAAuB;KACjE,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAE9B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAA;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAA;IAEzB,OAAO;QACL,cAAc,EAAE,SAAS;KAC1B,CAAA;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Code Validator
3
+ *
4
+ * AI Code Standards Enforcer - Prevents technical debt in AI-generated code
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { createValidator } from 'dev/code-validator'
9
+ *
10
+ * const validator = await createValidator('.revealui/code-standards.json')
11
+ * const result = validator.validate(code, { filePath: 'src/foo.ts' })
12
+ *
13
+ * if (!result.valid) {
14
+ * process.stdout.write(validator.formatResult(result))
15
+ * }
16
+ * ```
17
+ */
18
+ export * from './types';
19
+ export * from './validator';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../dev/src/code-validator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Code Validator
3
+ *
4
+ * AI Code Standards Enforcer - Prevents technical debt in AI-generated code
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { createValidator } from 'dev/code-validator'
9
+ *
10
+ * const validator = await createValidator('.revealui/code-standards.json')
11
+ * const result = validator.validate(code, { filePath: 'src/foo.ts' })
12
+ *
13
+ * if (!result.valid) {
14
+ * process.stdout.write(validator.formatResult(result))
15
+ * }
16
+ * ```
17
+ */
18
+ export * from './types';
19
+ export * from './validator';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../dev/src/code-validator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Code Validator Types
3
+ *
4
+ * Type definitions for the AI code standards enforcer
5
+ */
6
+ export interface ValidationRule {
7
+ id: string;
8
+ name: string;
9
+ pattern: string;
10
+ severity: 'error' | 'warning' | 'info';
11
+ message: string;
12
+ suggestedFix?: string;
13
+ exemptions?: {
14
+ paths?: string[];
15
+ comments?: string[];
16
+ };
17
+ }
18
+ export interface AutoFixRule {
19
+ id: string;
20
+ find: string;
21
+ replace: string;
22
+ }
23
+ export interface CodeStandards {
24
+ $schema?: string;
25
+ title: string;
26
+ description: string;
27
+ version: string;
28
+ rules: ValidationRule[];
29
+ autoFix?: {
30
+ enabled: boolean;
31
+ rules: AutoFixRule[];
32
+ };
33
+ reporting?: {
34
+ format: 'detailed' | 'summary';
35
+ showContext: boolean;
36
+ contextLines: number;
37
+ };
38
+ }
39
+ export interface ValidationViolation {
40
+ ruleId: string;
41
+ ruleName: string;
42
+ severity: 'error' | 'warning' | 'info';
43
+ message: string;
44
+ line: number;
45
+ column: number;
46
+ lineContent: string;
47
+ context?: string[];
48
+ suggestedFix?: string;
49
+ }
50
+ export interface ValidationResult {
51
+ valid: boolean;
52
+ violations: ValidationViolation[];
53
+ errors: number;
54
+ warnings: number;
55
+ info: number;
56
+ stats: {
57
+ linesScanned: number;
58
+ rulesApplied: number;
59
+ exemptionsApplied: number;
60
+ };
61
+ }
62
+ export interface ValidateCodeOptions {
63
+ filePath?: string;
64
+ autoFix?: boolean;
65
+ exemptionComments?: string[];
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../dev/src/code-validator/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE;QACR,OAAO,EAAE,OAAO,CAAA;QAChB,KAAK,EAAE,WAAW,EAAE,CAAA;KACrB,CAAA;IACD,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,UAAU,GAAG,SAAS,CAAA;QAC9B,WAAW,EAAE,OAAO,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAA;QACpB,YAAY,EAAE,MAAM,CAAA;QACpB,iBAAiB,EAAE,MAAM,CAAA;KAC1B,CAAA;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC7B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Code Validator Types
3
+ *
4
+ * Type definitions for the AI code standards enforcer
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../dev/src/code-validator/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Code Validator
3
+ *
4
+ * Core validation logic for AI-generated code
5
+ */
6
+ import type { CodeStandards, ValidateCodeOptions, ValidationResult } from './types.ts';
7
+ export declare class CodeValidator {
8
+ private standards;
9
+ constructor(standards: CodeStandards);
10
+ /**
11
+ * Validate code content against standards
12
+ */
13
+ validate(code: string, options?: ValidateCodeOptions): ValidationResult;
14
+ /**
15
+ * Auto-fix violations (if enabled)
16
+ */
17
+ autoFix(code: string): {
18
+ code: string;
19
+ fixesApplied: number;
20
+ };
21
+ /**
22
+ * Check if file path is exempted from rule
23
+ */
24
+ private isPathExempted;
25
+ /**
26
+ * Check if line has exemption comment
27
+ */
28
+ private hasExemptionComment;
29
+ /**
30
+ * Get context lines around a violation
31
+ */
32
+ private getContext;
33
+ /**
34
+ * Format validation result for display
35
+ */
36
+ formatResult(result: ValidationResult, options?: {
37
+ colors?: boolean;
38
+ }): string;
39
+ }
40
+ /**
41
+ * Load code standards from JSON file
42
+ */
43
+ export declare function loadStandards(filePath: string): Promise<CodeStandards>;
44
+ /**
45
+ * Create validator instance with standards
46
+ */
47
+ export declare function createValidator(standardsPath: string): Promise<CodeValidator>;
48
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../../../../dev/src/code-validator/validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAGjB,MAAM,YAAY,CAAA;AAEnB,qBAAa,aAAa;IACZ,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,aAAa;IAE5C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,gBAAgB;IA+D3E;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAoB7D;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,MAAM;CAqDnF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAI5E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGnF"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Code Validator
3
+ *
4
+ * Core validation logic for AI-generated code
5
+ */
6
+ import { minimatch } from 'minimatch';
7
+ export class CodeValidator {
8
+ standards;
9
+ constructor(standards) {
10
+ this.standards = standards;
11
+ }
12
+ /**
13
+ * Validate code content against standards
14
+ */
15
+ validate(code, options = {}) {
16
+ const violations = [];
17
+ const lines = code.split('\n');
18
+ let exemptionsApplied = 0;
19
+ for (const rule of this.standards.rules) {
20
+ // Check if file path is exempted
21
+ if (options.filePath && this.isPathExempted(options.filePath, rule)) {
22
+ exemptionsApplied++;
23
+ continue;
24
+ }
25
+ const regex = new RegExp(rule.pattern, 'g');
26
+ for (let i = 0; i < lines.length; i++) {
27
+ const line = lines[i];
28
+ if (!line)
29
+ continue;
30
+ const lineNumber = i + 1;
31
+ // Check if line has exemption comment
32
+ if (this.hasExemptionComment(line, rule, options.exemptionComments)) {
33
+ exemptionsApplied++;
34
+ continue;
35
+ }
36
+ // Check for violations
37
+ let match;
38
+ // biome-ignore lint/suspicious/noAssignInExpressions: Standard regex iteration pattern
39
+ while ((match = regex.exec(line)) !== null) {
40
+ violations.push({
41
+ ruleId: rule.id,
42
+ ruleName: rule.name,
43
+ severity: rule.severity,
44
+ message: rule.message,
45
+ line: lineNumber,
46
+ column: match.index + 1,
47
+ lineContent: line.trim(),
48
+ context: this.getContext(lines, i),
49
+ suggestedFix: rule.suggestedFix,
50
+ });
51
+ }
52
+ }
53
+ }
54
+ const errors = violations.filter((v) => v.severity === 'error').length;
55
+ const warnings = violations.filter((v) => v.severity === 'warning').length;
56
+ const info = violations.filter((v) => v.severity === 'info').length;
57
+ return {
58
+ valid: errors === 0,
59
+ violations,
60
+ errors,
61
+ warnings,
62
+ info,
63
+ stats: {
64
+ linesScanned: lines.length,
65
+ rulesApplied: this.standards.rules.length,
66
+ exemptionsApplied,
67
+ },
68
+ };
69
+ }
70
+ /**
71
+ * Auto-fix violations (if enabled)
72
+ */
73
+ autoFix(code) {
74
+ if (!(this.standards.autoFix?.enabled && this.standards.autoFix.rules)) {
75
+ return { code, fixesApplied: 0 };
76
+ }
77
+ let fixedCode = code;
78
+ let fixesApplied = 0;
79
+ for (const fixRule of this.standards.autoFix.rules) {
80
+ const regex = new RegExp(fixRule.find, 'g');
81
+ const matches = fixedCode.match(regex);
82
+ if (matches) {
83
+ fixedCode = fixedCode.replace(regex, fixRule.replace);
84
+ fixesApplied += matches.length;
85
+ }
86
+ }
87
+ return { code: fixedCode, fixesApplied };
88
+ }
89
+ /**
90
+ * Check if file path is exempted from rule
91
+ */
92
+ isPathExempted(filePath, rule) {
93
+ if (!rule.exemptions?.paths)
94
+ return false;
95
+ return rule.exemptions.paths.some((pattern) => minimatch(filePath, pattern));
96
+ }
97
+ /**
98
+ * Check if line has exemption comment
99
+ */
100
+ hasExemptionComment(line, rule, additionalComments) {
101
+ const exemptionComments = [...(rule.exemptions?.comments || []), ...(additionalComments || [])];
102
+ return exemptionComments.some((comment) => line.includes(comment));
103
+ }
104
+ /**
105
+ * Get context lines around a violation
106
+ */
107
+ getContext(lines, index) {
108
+ const contextLines = this.standards.reporting?.contextLines || 2;
109
+ if (!this.standards.reporting?.showContext)
110
+ return undefined;
111
+ const start = Math.max(0, index - contextLines);
112
+ const end = Math.min(lines.length, index + contextLines + 1);
113
+ return lines.slice(start, end).map((line, i) => {
114
+ const lineNumber = start + i + 1;
115
+ const marker = lineNumber === index + 1 ? '>' : ' ';
116
+ return `${marker} ${lineNumber.toString().padStart(4)} | ${line}`;
117
+ });
118
+ }
119
+ /**
120
+ * Format validation result for display
121
+ */
122
+ formatResult(result, options = {}) {
123
+ const { colors = true } = options;
124
+ const lines = [];
125
+ // Summary
126
+ if (result.violations.length === 0) {
127
+ lines.push(colors ? '\x1b[32m✓ Code passes all standards\x1b[0m' : '✓ Code passes all standards');
128
+ return lines.join('\n');
129
+ }
130
+ lines.push(colors ? '\x1b[31m✗ Code violations found\x1b[0m' : '✗ Code violations found');
131
+ lines.push('');
132
+ // Violations
133
+ for (const violation of result.violations) {
134
+ const severityColor = colors
135
+ ? violation.severity === 'error'
136
+ ? '\x1b[31m'
137
+ : violation.severity === 'warning'
138
+ ? '\x1b[33m'
139
+ : '\x1b[36m'
140
+ : '';
141
+ const reset = colors ? '\x1b[0m' : '';
142
+ lines.push(`${severityColor}${violation.severity.toUpperCase()}${reset} [${violation.ruleId}] ${violation.ruleName}`);
143
+ lines.push(` at line ${violation.line}:${violation.column}`);
144
+ lines.push(` ${violation.message}`);
145
+ if (violation.context && this.standards.reporting?.showContext) {
146
+ lines.push('');
147
+ lines.push(...violation.context.map((line) => ` ${line}`));
148
+ }
149
+ if (violation.suggestedFix) {
150
+ lines.push(` ${colors ? '\x1b[36m' : ''}Suggested fix:${reset}`);
151
+ lines.push(` ${violation.suggestedFix}`);
152
+ }
153
+ lines.push('');
154
+ }
155
+ // Stats
156
+ lines.push(`Summary: ${result.errors} errors, ${result.warnings} warnings, ${result.info} info`);
157
+ lines.push(`Scanned ${result.stats.linesScanned} lines with ${result.stats.rulesApplied} rules (${result.stats.exemptionsApplied} exemptions)`);
158
+ return lines.join('\n');
159
+ }
160
+ }
161
+ /**
162
+ * Load code standards from JSON file
163
+ */
164
+ export async function loadStandards(filePath) {
165
+ const fs = await import('node:fs/promises');
166
+ const content = await fs.readFile(filePath, 'utf-8');
167
+ return JSON.parse(content);
168
+ }
169
+ /**
170
+ * Create validator instance with standards
171
+ */
172
+ export async function createValidator(standardsPath) {
173
+ const standards = await loadStandards(standardsPath);
174
+ return new CodeValidator(standards);
175
+ }
176
+ //# sourceMappingURL=validator.js.map