spec-gen-cli 1.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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1078 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +109 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/drift.d.ts +21 -0
  8. package/dist/api/drift.d.ts.map +1 -0
  9. package/dist/api/drift.js +145 -0
  10. package/dist/api/drift.js.map +1 -0
  11. package/dist/api/generate.d.ts +18 -0
  12. package/dist/api/generate.d.ts.map +1 -0
  13. package/dist/api/generate.js +251 -0
  14. package/dist/api/generate.js.map +1 -0
  15. package/dist/api/index.d.ts +39 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +32 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/init.d.ts +18 -0
  20. package/dist/api/init.d.ts.map +1 -0
  21. package/dist/api/init.js +82 -0
  22. package/dist/api/init.js.map +1 -0
  23. package/dist/api/run.d.ts +19 -0
  24. package/dist/api/run.d.ts.map +1 -0
  25. package/dist/api/run.js +291 -0
  26. package/dist/api/run.js.map +1 -0
  27. package/dist/api/specs.d.ts +49 -0
  28. package/dist/api/specs.d.ts.map +1 -0
  29. package/dist/api/specs.js +136 -0
  30. package/dist/api/specs.js.map +1 -0
  31. package/dist/api/types.d.ts +176 -0
  32. package/dist/api/types.d.ts.map +1 -0
  33. package/dist/api/types.js +9 -0
  34. package/dist/api/types.js.map +1 -0
  35. package/dist/api/verify.d.ts +20 -0
  36. package/dist/api/verify.d.ts.map +1 -0
  37. package/dist/api/verify.js +117 -0
  38. package/dist/api/verify.js.map +1 -0
  39. package/dist/cli/commands/analyze.d.ts +27 -0
  40. package/dist/cli/commands/analyze.d.ts.map +1 -0
  41. package/dist/cli/commands/analyze.js +485 -0
  42. package/dist/cli/commands/analyze.js.map +1 -0
  43. package/dist/cli/commands/drift.d.ts +9 -0
  44. package/dist/cli/commands/drift.d.ts.map +1 -0
  45. package/dist/cli/commands/drift.js +540 -0
  46. package/dist/cli/commands/drift.js.map +1 -0
  47. package/dist/cli/commands/generate.d.ts +9 -0
  48. package/dist/cli/commands/generate.d.ts.map +1 -0
  49. package/dist/cli/commands/generate.js +633 -0
  50. package/dist/cli/commands/generate.js.map +1 -0
  51. package/dist/cli/commands/init.d.ts +9 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/init.js +171 -0
  54. package/dist/cli/commands/init.js.map +1 -0
  55. package/dist/cli/commands/mcp.d.ts +638 -0
  56. package/dist/cli/commands/mcp.d.ts.map +1 -0
  57. package/dist/cli/commands/mcp.js +574 -0
  58. package/dist/cli/commands/mcp.js.map +1 -0
  59. package/dist/cli/commands/run.d.ts +24 -0
  60. package/dist/cli/commands/run.d.ts.map +1 -0
  61. package/dist/cli/commands/run.js +546 -0
  62. package/dist/cli/commands/run.js.map +1 -0
  63. package/dist/cli/commands/verify.d.ts +9 -0
  64. package/dist/cli/commands/verify.d.ts.map +1 -0
  65. package/dist/cli/commands/verify.js +417 -0
  66. package/dist/cli/commands/verify.js.map +1 -0
  67. package/dist/cli/commands/view.d.ts +9 -0
  68. package/dist/cli/commands/view.d.ts.map +1 -0
  69. package/dist/cli/commands/view.js +511 -0
  70. package/dist/cli/commands/view.js.map +1 -0
  71. package/dist/cli/index.d.ts +9 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +83 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  76. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  77. package/dist/core/analyzer/architecture-writer.js +209 -0
  78. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  79. package/dist/core/analyzer/artifact-generator.d.ts +222 -0
  80. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  81. package/dist/core/analyzer/artifact-generator.js +726 -0
  82. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  83. package/dist/core/analyzer/call-graph.d.ts +83 -0
  84. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  85. package/dist/core/analyzer/call-graph.js +827 -0
  86. package/dist/core/analyzer/call-graph.js.map +1 -0
  87. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  88. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  89. package/dist/core/analyzer/code-shaper.js +149 -0
  90. package/dist/core/analyzer/code-shaper.js.map +1 -0
  91. package/dist/core/analyzer/dependency-graph.d.ts +179 -0
  92. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  93. package/dist/core/analyzer/dependency-graph.js +574 -0
  94. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  95. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  96. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  97. package/dist/core/analyzer/duplicate-detector.js +279 -0
  98. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  99. package/dist/core/analyzer/embedding-service.d.ts +50 -0
  100. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  101. package/dist/core/analyzer/embedding-service.js +104 -0
  102. package/dist/core/analyzer/embedding-service.js.map +1 -0
  103. package/dist/core/analyzer/file-walker.d.ts +78 -0
  104. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  105. package/dist/core/analyzer/file-walker.js +531 -0
  106. package/dist/core/analyzer/file-walker.js.map +1 -0
  107. package/dist/core/analyzer/import-parser.d.ts +91 -0
  108. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  109. package/dist/core/analyzer/import-parser.js +720 -0
  110. package/dist/core/analyzer/import-parser.js.map +1 -0
  111. package/dist/core/analyzer/index.d.ts +10 -0
  112. package/dist/core/analyzer/index.d.ts.map +1 -0
  113. package/dist/core/analyzer/index.js +10 -0
  114. package/dist/core/analyzer/index.js.map +1 -0
  115. package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
  116. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  117. package/dist/core/analyzer/refactor-analyzer.js +339 -0
  118. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  119. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  120. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  121. package/dist/core/analyzer/repository-mapper.js +731 -0
  122. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  123. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  124. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  125. package/dist/core/analyzer/signature-extractor.js +387 -0
  126. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  127. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  128. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  129. package/dist/core/analyzer/significance-scorer.js +407 -0
  130. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  131. package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
  132. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  133. package/dist/core/analyzer/subgraph-extractor.js +129 -0
  134. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  135. package/dist/core/analyzer/vector-index.d.ts +63 -0
  136. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  137. package/dist/core/analyzer/vector-index.js +169 -0
  138. package/dist/core/analyzer/vector-index.js.map +1 -0
  139. package/dist/core/drift/drift-detector.d.ts +102 -0
  140. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  141. package/dist/core/drift/drift-detector.js +597 -0
  142. package/dist/core/drift/drift-detector.js.map +1 -0
  143. package/dist/core/drift/git-diff.d.ts +55 -0
  144. package/dist/core/drift/git-diff.d.ts.map +1 -0
  145. package/dist/core/drift/git-diff.js +356 -0
  146. package/dist/core/drift/git-diff.js.map +1 -0
  147. package/dist/core/drift/index.d.ts +12 -0
  148. package/dist/core/drift/index.d.ts.map +1 -0
  149. package/dist/core/drift/index.js +9 -0
  150. package/dist/core/drift/index.js.map +1 -0
  151. package/dist/core/drift/spec-mapper.d.ts +73 -0
  152. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  153. package/dist/core/drift/spec-mapper.js +353 -0
  154. package/dist/core/drift/spec-mapper.js.map +1 -0
  155. package/dist/core/generator/adr-generator.d.ts +32 -0
  156. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  157. package/dist/core/generator/adr-generator.js +192 -0
  158. package/dist/core/generator/adr-generator.js.map +1 -0
  159. package/dist/core/generator/index.d.ts +9 -0
  160. package/dist/core/generator/index.d.ts.map +1 -0
  161. package/dist/core/generator/index.js +12 -0
  162. package/dist/core/generator/index.js.map +1 -0
  163. package/dist/core/generator/mapping-generator.d.ts +54 -0
  164. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  165. package/dist/core/generator/mapping-generator.js +239 -0
  166. package/dist/core/generator/mapping-generator.js.map +1 -0
  167. package/dist/core/generator/openspec-compat.d.ts +160 -0
  168. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  169. package/dist/core/generator/openspec-compat.js +523 -0
  170. package/dist/core/generator/openspec-compat.js.map +1 -0
  171. package/dist/core/generator/openspec-format-generator.d.ts +111 -0
  172. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  173. package/dist/core/generator/openspec-format-generator.js +817 -0
  174. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  175. package/dist/core/generator/openspec-writer.d.ts +131 -0
  176. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  177. package/dist/core/generator/openspec-writer.js +379 -0
  178. package/dist/core/generator/openspec-writer.js.map +1 -0
  179. package/dist/core/generator/prompts.d.ts +35 -0
  180. package/dist/core/generator/prompts.d.ts.map +1 -0
  181. package/dist/core/generator/prompts.js +212 -0
  182. package/dist/core/generator/prompts.js.map +1 -0
  183. package/dist/core/generator/spec-pipeline.d.ts +94 -0
  184. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  185. package/dist/core/generator/spec-pipeline.js +474 -0
  186. package/dist/core/generator/spec-pipeline.js.map +1 -0
  187. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  188. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  189. package/dist/core/generator/stages/stage1-survey.js +105 -0
  190. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  191. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  192. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  193. package/dist/core/generator/stages/stage2-entities.js +67 -0
  194. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  195. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  196. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  197. package/dist/core/generator/stages/stage3-services.js +75 -0
  198. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  199. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  200. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  201. package/dist/core/generator/stages/stage4-api.js +65 -0
  202. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  203. package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
  204. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  205. package/dist/core/generator/stages/stage5-architecture.js +62 -0
  206. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  207. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  208. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  209. package/dist/core/generator/stages/stage6-adr.js +41 -0
  210. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  211. package/dist/core/services/chat-agent.d.ts +45 -0
  212. package/dist/core/services/chat-agent.d.ts.map +1 -0
  213. package/dist/core/services/chat-agent.js +310 -0
  214. package/dist/core/services/chat-agent.js.map +1 -0
  215. package/dist/core/services/chat-tools.d.ts +32 -0
  216. package/dist/core/services/chat-tools.d.ts.map +1 -0
  217. package/dist/core/services/chat-tools.js +270 -0
  218. package/dist/core/services/chat-tools.js.map +1 -0
  219. package/dist/core/services/config-manager.d.ts +61 -0
  220. package/dist/core/services/config-manager.d.ts.map +1 -0
  221. package/dist/core/services/config-manager.js +143 -0
  222. package/dist/core/services/config-manager.js.map +1 -0
  223. package/dist/core/services/gitignore-manager.d.ts +29 -0
  224. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  225. package/dist/core/services/gitignore-manager.js +106 -0
  226. package/dist/core/services/gitignore-manager.js.map +1 -0
  227. package/dist/core/services/index.d.ts +8 -0
  228. package/dist/core/services/index.d.ts.map +1 -0
  229. package/dist/core/services/index.js +8 -0
  230. package/dist/core/services/index.js.map +1 -0
  231. package/dist/core/services/llm-service.d.ts +336 -0
  232. package/dist/core/services/llm-service.d.ts.map +1 -0
  233. package/dist/core/services/llm-service.js +1155 -0
  234. package/dist/core/services/llm-service.js.map +1 -0
  235. package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
  236. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  237. package/dist/core/services/mcp-handlers/analysis.js +300 -0
  238. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  239. package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
  240. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  241. package/dist/core/services/mcp-handlers/graph.js +509 -0
  242. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  243. package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
  244. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  245. package/dist/core/services/mcp-handlers/semantic.js +172 -0
  246. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  247. package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
  248. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  249. package/dist/core/services/mcp-handlers/utils.js +62 -0
  250. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  251. package/dist/core/services/project-detector.d.ts +32 -0
  252. package/dist/core/services/project-detector.d.ts.map +1 -0
  253. package/dist/core/services/project-detector.js +111 -0
  254. package/dist/core/services/project-detector.js.map +1 -0
  255. package/dist/core/verifier/index.d.ts +5 -0
  256. package/dist/core/verifier/index.d.ts.map +1 -0
  257. package/dist/core/verifier/index.js +5 -0
  258. package/dist/core/verifier/index.js.map +1 -0
  259. package/dist/core/verifier/verification-engine.d.ts +226 -0
  260. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  261. package/dist/core/verifier/verification-engine.js +681 -0
  262. package/dist/core/verifier/verification-engine.js.map +1 -0
  263. package/dist/types/index.d.ts +252 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +5 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/pipeline.d.ts +148 -0
  268. package/dist/types/pipeline.d.ts.map +1 -0
  269. package/dist/types/pipeline.js +5 -0
  270. package/dist/types/pipeline.js.map +1 -0
  271. package/dist/utils/errors.d.ts +51 -0
  272. package/dist/utils/errors.d.ts.map +1 -0
  273. package/dist/utils/errors.js +128 -0
  274. package/dist/utils/errors.js.map +1 -0
  275. package/dist/utils/logger.d.ts +149 -0
  276. package/dist/utils/logger.d.ts.map +1 -0
  277. package/dist/utils/logger.js +331 -0
  278. package/dist/utils/logger.js.map +1 -0
  279. package/dist/utils/progress.d.ts +142 -0
  280. package/dist/utils/progress.d.ts.map +1 -0
  281. package/dist/utils/progress.js +280 -0
  282. package/dist/utils/progress.js.map +1 -0
  283. package/dist/utils/prompts.d.ts +53 -0
  284. package/dist/utils/prompts.d.ts.map +1 -0
  285. package/dist/utils/prompts.js +199 -0
  286. package/dist/utils/prompts.js.map +1 -0
  287. package/dist/utils/shutdown.d.ts +89 -0
  288. package/dist/utils/shutdown.d.ts.map +1 -0
  289. package/dist/utils/shutdown.js +237 -0
  290. package/dist/utils/shutdown.js.map +1 -0
  291. package/package.json +114 -0
  292. package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
  293. package/src/viewer/app/index.html +17 -0
  294. package/src/viewer/app/main.jsx +13 -0
  295. package/src/viewer/components/ArchitectureView.jsx +177 -0
  296. package/src/viewer/components/ChatPanel.jsx +448 -0
  297. package/src/viewer/components/ClusterGraph.jsx +441 -0
  298. package/src/viewer/components/FilterBar.jsx +179 -0
  299. package/src/viewer/components/FlatGraph.jsx +275 -0
  300. package/src/viewer/components/MicroComponents.jsx +83 -0
  301. package/src/viewer/hooks/usePanZoom.js +79 -0
  302. package/src/viewer/utils/constants.js +47 -0
  303. package/src/viewer/utils/graph-helpers.js +291 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Git diff integration for drift detection
3
+ *
4
+ * Shells out to git to determine what files changed between the current
5
+ * working tree and a base ref (typically main/master).
6
+ */
7
+ import type { ChangedFile } from '../../types/index.js';
8
+ export interface GitDiffOptions {
9
+ rootPath: string;
10
+ baseRef: string;
11
+ pathFilter?: string[];
12
+ includeUnstaged: boolean;
13
+ }
14
+ export interface GitDiffResult {
15
+ resolvedBase: string;
16
+ files: ChangedFile[];
17
+ hasUnstagedChanges: boolean;
18
+ currentBranch: string;
19
+ }
20
+ /**
21
+ * Classify a file path as test/config/generated
22
+ */
23
+ export declare function classifyFile(filePath: string): Pick<ChangedFile, 'isTest' | 'isConfig' | 'isGenerated' | 'extension'>;
24
+ /**
25
+ * Check if a file is a skippable binary/lock file
26
+ */
27
+ export declare function isSkippableFile(filePath: string): boolean;
28
+ /**
29
+ * Check if the given path is a git repository
30
+ */
31
+ export declare function isGitRepository(rootPath: string): Promise<boolean>;
32
+ /**
33
+ * Get the current branch name
34
+ */
35
+ export declare function getCurrentBranch(rootPath: string): Promise<string>;
36
+ /**
37
+ * Validate a user-supplied git ref to prevent unexpected git argument injection.
38
+ * Allows branch/tag names, SHA hashes, relative refs (HEAD~1, @{upstream}), and
39
+ * the empty-tree SHA. Rejects refs containing shell metacharacters or null bytes.
40
+ */
41
+ export declare function validateGitRef(ref: string): void;
42
+ /**
43
+ * Resolve a base ref, falling back through main → master → HEAD~1
44
+ */
45
+ export declare function resolveBaseRef(rootPath: string, preferredRef: string): Promise<string>;
46
+ /**
47
+ * Get the unified diff content for a specific file against a base ref.
48
+ * Returns the diff text, truncated to maxChars to fit LLM context windows.
49
+ */
50
+ export declare function getFileDiff(rootPath: string, filePath: string, baseRef: string, maxChars?: number): Promise<string>;
51
+ /**
52
+ * Get changed files between working tree and a base ref
53
+ */
54
+ export declare function getChangedFiles(options: GitDiffOptions): Promise<GitDiffResult>;
55
+ //# sourceMappingURL=git-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-diff.d.ts","sourceRoot":"","sources":["../../../src/core/drift/git-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAWxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAuDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC,CAkBrH;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIzD;AAMD;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B5F;AA6ED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAa,GACtB,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkHrF"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Git diff integration for drift detection
3
+ *
4
+ * Shells out to git to determine what files changed between the current
5
+ * working tree and a base ref (typically main/master).
6
+ */
7
+ import { execFile } from 'node:child_process';
8
+ import { access } from 'node:fs/promises';
9
+ import { join, extname, basename } from 'node:path';
10
+ import { promisify } from 'node:util';
11
+ const execFileAsync = promisify(execFile);
12
+ /** Git's well-known empty tree SHA — used as base ref for single-commit repos */
13
+ const GIT_EMPTY_TREE_SHA = '4b825dc642cb6eb9a060e54bf899d15f71049056';
14
+ // ============================================================================
15
+ // FILE CLASSIFICATION (mirrors FileWalker heuristics)
16
+ // ============================================================================
17
+ const TEST_DIR_PATTERNS = [
18
+ /\/test\//,
19
+ /\/tests\//,
20
+ /\/__tests__\//,
21
+ /\/spec\//,
22
+ /\/specs\//,
23
+ /^test\//,
24
+ /^tests\//,
25
+ /^__tests__\//,
26
+ ];
27
+ const TEST_FILE_PATTERNS = [
28
+ /\.test\.[^.]+$/,
29
+ /\.spec\.[^.]+$/,
30
+ /_test\.[^.]+$/,
31
+ /_spec\.[^.]+$/,
32
+ /^test_.*\.[^.]+$/,
33
+ ];
34
+ const CONFIG_PATTERNS = [
35
+ /^\..*rc$/,
36
+ /^\..*rc\.(js|json|yaml|yml)$/,
37
+ /config\./,
38
+ /\.config\./,
39
+ /settings\./,
40
+ /^tsconfig.*\.json$/,
41
+ /^package\.json$/,
42
+ /^pyproject\.toml$/,
43
+ /^Cargo\.toml$/,
44
+ /^go\.mod$/,
45
+ /^Gemfile$/,
46
+ /^composer\.json$/,
47
+ ];
48
+ const SKIP_EXTENSIONS = new Set([
49
+ '.lock', '.lockb', '.map',
50
+ '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.bmp',
51
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
52
+ '.mp3', '.mp4', '.wav', '.avi', '.mov', '.webm',
53
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx',
54
+ '.zip', '.tar', '.gz', '.rar', '.7z',
55
+ '.pyc', '.pyo', '.class', '.o', '.so', '.dll', '.exe',
56
+ ]);
57
+ const SKIP_FILENAMES = new Set([
58
+ 'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock',
59
+ '.DS_Store', 'Thumbs.db',
60
+ ]);
61
+ /**
62
+ * Classify a file path as test/config/generated
63
+ */
64
+ export function classifyFile(filePath) {
65
+ const fileName = basename(filePath);
66
+ const ext = extname(filePath);
67
+ const isTest = TEST_DIR_PATTERNS.some(p => p.test(filePath)) ||
68
+ TEST_FILE_PATTERNS.some(p => p.test(fileName));
69
+ const isConfig = CONFIG_PATTERNS.some(p => p.test(fileName));
70
+ const isGenerated = fileName.endsWith('.d.ts') ||
71
+ fileName.endsWith('.generated.ts') ||
72
+ fileName.endsWith('.generated.js') ||
73
+ filePath.includes('/generated/') ||
74
+ filePath.includes('/__generated__/');
75
+ return { isTest, isConfig, isGenerated, extension: ext };
76
+ }
77
+ /**
78
+ * Check if a file is a skippable binary/lock file
79
+ */
80
+ export function isSkippableFile(filePath) {
81
+ const fileName = basename(filePath);
82
+ const ext = extname(filePath);
83
+ return SKIP_EXTENSIONS.has(ext) || SKIP_FILENAMES.has(fileName);
84
+ }
85
+ // ============================================================================
86
+ // GIT OPERATIONS
87
+ // ============================================================================
88
+ /**
89
+ * Check if the given path is a git repository
90
+ */
91
+ export async function isGitRepository(rootPath) {
92
+ try {
93
+ await access(join(rootPath, '.git'));
94
+ return true;
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ /**
101
+ * Get the current branch name
102
+ */
103
+ export async function getCurrentBranch(rootPath) {
104
+ try {
105
+ const { stdout } = await execFileAsync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: rootPath });
106
+ return stdout.trim();
107
+ }
108
+ catch {
109
+ return 'unknown';
110
+ }
111
+ }
112
+ /**
113
+ * Validate a user-supplied git ref to prevent unexpected git argument injection.
114
+ * Allows branch/tag names, SHA hashes, relative refs (HEAD~1, @{upstream}), and
115
+ * the empty-tree SHA. Rejects refs containing shell metacharacters or null bytes.
116
+ */
117
+ export function validateGitRef(ref) {
118
+ if (ref === GIT_EMPTY_TREE_SHA || ref === 'auto')
119
+ return;
120
+ // Allow: alphanumeric, -, _, ., /, ~, ^, @, {, }, :
121
+ if (!/^[\w\-./~^@{}:]+$/.test(ref)) {
122
+ throw new Error(`Invalid git ref: "${ref}". Refs must contain only alphanumeric characters and -_./ ~^@{}:`);
123
+ }
124
+ }
125
+ /**
126
+ * Resolve a base ref, falling back through main → master → HEAD~1
127
+ */
128
+ export async function resolveBaseRef(rootPath, preferredRef) {
129
+ if (preferredRef && preferredRef !== 'auto') {
130
+ validateGitRef(preferredRef);
131
+ try {
132
+ await execFileAsync('git', ['rev-parse', '--verify', preferredRef], { cwd: rootPath });
133
+ return preferredRef;
134
+ }
135
+ catch {
136
+ // Fall through to defaults
137
+ }
138
+ }
139
+ // Try common default branches
140
+ for (const ref of ['main', 'master']) {
141
+ try {
142
+ await execFileAsync('git', ['rev-parse', '--verify', ref], { cwd: rootPath });
143
+ return ref;
144
+ }
145
+ catch {
146
+ continue;
147
+ }
148
+ }
149
+ // Try HEAD~1 (previous commit)
150
+ try {
151
+ await execFileAsync('git', ['rev-parse', '--verify', 'HEAD~1'], { cwd: rootPath });
152
+ return 'HEAD~1';
153
+ }
154
+ catch {
155
+ // Single-commit repo or detached HEAD with no parent — use the empty tree SHA
156
+ // so git diff shows all files as "added"
157
+ return GIT_EMPTY_TREE_SHA;
158
+ }
159
+ }
160
+ /**
161
+ * Parse a git status character into a ChangedFile status
162
+ */
163
+ function parseGitStatus(statusChar) {
164
+ switch (statusChar) {
165
+ case 'A': return 'added';
166
+ case 'D': return 'deleted';
167
+ case 'M': return 'modified';
168
+ case 'R': return 'renamed';
169
+ case 'C': return 'added'; // copied = effectively added
170
+ default: return 'modified';
171
+ }
172
+ }
173
+ /**
174
+ * Parse git diff --name-status output into file entries
175
+ */
176
+ function parseNameStatus(output) {
177
+ const entries = [];
178
+ const lines = output.trim().split('\n').filter(Boolean);
179
+ for (const line of lines) {
180
+ const parts = line.split('\t');
181
+ if (parts.length < 2)
182
+ continue;
183
+ const statusRaw = parts[0].charAt(0); // R100 → R
184
+ const status = parseGitStatus(statusRaw);
185
+ if (statusRaw === 'R' && parts.length >= 3) {
186
+ entries.push({ path: parts[2], status: 'renamed', oldPath: parts[1] });
187
+ }
188
+ else {
189
+ entries.push({ path: parts[1], status });
190
+ }
191
+ }
192
+ return entries;
193
+ }
194
+ /**
195
+ * Parse git diff --numstat output into addition/deletion counts.
196
+ * Handles rename format: "10\t5\told/path => new/path" or "10\t5\t{dir => dir2}/file.ts"
197
+ */
198
+ function parseNumstat(output) {
199
+ const stats = new Map();
200
+ const lines = output.trim().split('\n').filter(Boolean);
201
+ for (const line of lines) {
202
+ const parts = line.split('\t');
203
+ if (parts.length < 3)
204
+ continue;
205
+ // Binary files show '-' for additions/deletions
206
+ const additions = parts[0] === '-' ? 0 : parseInt(parts[0], 10);
207
+ const deletions = parts[1] === '-' ? 0 : parseInt(parts[1], 10);
208
+ let filePath = parts.slice(2).join('\t'); // Rejoin in case path contained tabs
209
+ // Handle rename formats:
210
+ // "old/path => new/path" → extract "new/path"
211
+ // "{old => new}/file.ts" → expand to "new/file.ts"
212
+ if (filePath.includes(' => ')) {
213
+ const braceMatch = filePath.match(/^(.*?)\{[^}]* => ([^}]*)\}(.*)$/);
214
+ if (braceMatch) {
215
+ // "{old => new}/file.ts" format
216
+ filePath = braceMatch[1] + braceMatch[2] + braceMatch[3];
217
+ }
218
+ else {
219
+ // "old/path => new/path" format
220
+ filePath = filePath.split(' => ').pop();
221
+ }
222
+ }
223
+ stats.set(filePath, { additions, deletions });
224
+ }
225
+ return stats;
226
+ }
227
+ /**
228
+ * Get the unified diff content for a specific file against a base ref.
229
+ * Returns the diff text, truncated to maxChars to fit LLM context windows.
230
+ */
231
+ export async function getFileDiff(rootPath, filePath, baseRef, maxChars = 4000) {
232
+ // Try three-dot diff first (merge-base), fall back to two-dot
233
+ for (const separator of ['...', '..']) {
234
+ try {
235
+ const { stdout } = await execFileAsync('git', ['diff', `${baseRef}${separator}HEAD`, '--', filePath], { cwd: rootPath });
236
+ if (stdout.trim()) {
237
+ return stdout.length > maxChars
238
+ ? stdout.slice(0, maxChars) + '\n... (truncated)'
239
+ : stdout;
240
+ }
241
+ }
242
+ catch {
243
+ // Try next separator
244
+ }
245
+ }
246
+ // Fall back to unstaged/staged diff (for uncommitted changes)
247
+ try {
248
+ const { stdout } = await execFileAsync('git', ['diff', 'HEAD', '--', filePath], { cwd: rootPath });
249
+ if (stdout.trim()) {
250
+ return stdout.length > maxChars
251
+ ? stdout.slice(0, maxChars) + '\n... (truncated)'
252
+ : stdout;
253
+ }
254
+ }
255
+ catch {
256
+ // ignore
257
+ }
258
+ return '';
259
+ }
260
+ /**
261
+ * Get changed files between working tree and a base ref
262
+ */
263
+ export async function getChangedFiles(options) {
264
+ const { rootPath, baseRef, includeUnstaged } = options;
265
+ // Resolve base ref
266
+ const resolvedBase = await resolveBaseRef(rootPath, baseRef);
267
+ const currentBranch = await getCurrentBranch(rootPath);
268
+ const fileMap = new Map();
269
+ // Get committed changes on branch vs base
270
+ try {
271
+ const { stdout } = await execFileAsync('git', ['diff', '--name-status', '--diff-filter=ACDMR', `${resolvedBase}...HEAD`], { cwd: rootPath });
272
+ for (const entry of parseNameStatus(stdout)) {
273
+ fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
274
+ }
275
+ }
276
+ catch {
277
+ // If three-dot diff fails (e.g., no common ancestor), try two-dot
278
+ try {
279
+ const { stdout } = await execFileAsync('git', ['diff', '--name-status', '--diff-filter=ACDMR', `${resolvedBase}..HEAD`], { cwd: rootPath });
280
+ for (const entry of parseNameStatus(stdout)) {
281
+ fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
282
+ }
283
+ }
284
+ catch {
285
+ // If that also fails, fall through with empty committed changes
286
+ }
287
+ }
288
+ // Get unstaged + staged changes if requested
289
+ let hasUnstagedChanges = false;
290
+ if (includeUnstaged) {
291
+ // Staged changes
292
+ try {
293
+ const { stdout } = await execFileAsync('git', ['diff', '--cached', '--name-status', '--diff-filter=ACDMR'], { cwd: rootPath });
294
+ for (const entry of parseNameStatus(stdout)) {
295
+ if (!fileMap.has(entry.path)) {
296
+ fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
297
+ }
298
+ }
299
+ }
300
+ catch { /* ignore */ }
301
+ // Unstaged working tree changes
302
+ try {
303
+ const { stdout } = await execFileAsync('git', ['diff', '--name-status', '--diff-filter=ACDMR'], { cwd: rootPath });
304
+ const unstaged = parseNameStatus(stdout);
305
+ if (unstaged.length > 0) {
306
+ hasUnstagedChanges = true;
307
+ for (const entry of unstaged) {
308
+ if (!fileMap.has(entry.path)) {
309
+ fileMap.set(entry.path, { status: entry.status, oldPath: entry.oldPath });
310
+ }
311
+ }
312
+ }
313
+ }
314
+ catch { /* ignore */ }
315
+ }
316
+ // Get line-level stats
317
+ let numstatMap = new Map();
318
+ try {
319
+ const { stdout } = await execFileAsync('git', ['diff', '--numstat', `${resolvedBase}...HEAD`], { cwd: rootPath });
320
+ numstatMap = parseNumstat(stdout);
321
+ }
322
+ catch {
323
+ try {
324
+ const { stdout } = await execFileAsync('git', ['diff', '--numstat', `${resolvedBase}..HEAD`], { cwd: rootPath });
325
+ numstatMap = parseNumstat(stdout);
326
+ }
327
+ catch { /* ignore */ }
328
+ }
329
+ // Build ChangedFile list
330
+ const files = [];
331
+ for (const [path, { status, oldPath }] of fileMap) {
332
+ if (isSkippableFile(path))
333
+ continue;
334
+ const stats = numstatMap.get(path) ?? { additions: 0, deletions: 0 };
335
+ const classification = classifyFile(path);
336
+ files.push({
337
+ path,
338
+ status,
339
+ oldPath,
340
+ additions: stats.additions,
341
+ deletions: stats.deletions,
342
+ ...classification,
343
+ });
344
+ }
345
+ // Apply path filter if provided
346
+ const filtered = options.pathFilter?.length
347
+ ? files.filter(f => options.pathFilter.some(p => f.path.startsWith(p) || f.path === p))
348
+ : files;
349
+ return {
350
+ resolvedBase,
351
+ files: filtered,
352
+ hasUnstagedChanges,
353
+ currentBranch,
354
+ };
355
+ }
356
+ //# sourceMappingURL=git-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../src/core/drift/git-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Drift detection module
3
+ *
4
+ * Detects when code changes diverge from existing OpenSpec specifications.
5
+ */
6
+ export { getChangedFiles, getFileDiff, isGitRepository, getCurrentBranch, resolveBaseRef, classifyFile } from './git-diff.js';
7
+ export type { GitDiffOptions, GitDiffResult } from './git-diff.js';
8
+ export { buildSpecMap, matchFileToDomains, getSpecContent, parseSpecHeader, parseSpecReferences, inferDomainFromPath, buildADRMap, parseADRRelated } from './spec-mapper.js';
9
+ export type { SpecMapperOptions, ADRMapping, ADRMap } from './spec-mapper.js';
10
+ export { detectDrift, detectGaps, detectStaleSpecs, detectUncoveredFiles, detectOrphanedSpecs, isSpecRelevantChange, computeSeverity, extractChangedSpecDomains, enhanceGapsWithLLM, detectADRGaps, detectADROrphaned, extractChangedADRIds } from './drift-detector.js';
11
+ export type { DriftDetectorOptions } from './drift-detector.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/drift/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9H,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC7K,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzQ,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Drift detection module
3
+ *
4
+ * Detects when code changes diverge from existing OpenSpec specifications.
5
+ */
6
+ export { getChangedFiles, getFileDiff, isGitRepository, getCurrentBranch, resolveBaseRef, classifyFile } from './git-diff.js';
7
+ export { buildSpecMap, matchFileToDomains, getSpecContent, parseSpecHeader, parseSpecReferences, inferDomainFromPath, buildADRMap, parseADRRelated } from './spec-mapper.js';
8
+ export { detectDrift, detectGaps, detectStaleSpecs, detectUncoveredFiles, detectOrphanedSpecs, isSpecRelevantChange, computeSeverity, extractChangedSpecDomains, enhanceGapsWithLLM, detectADRGaps, detectADROrphaned, extractChangedADRIds } from './drift-detector.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/drift/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG9H,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG7K,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Spec-to-File Mapper
3
+ *
4
+ * Reads existing OpenSpec specs and builds a bidirectional mapping
5
+ * between spec domains and source files. This is the core data structure
6
+ * that enables drift detection.
7
+ */
8
+ import type { SpecMap } from '../../types/index.js';
9
+ export interface SpecMapperOptions {
10
+ rootPath: string;
11
+ openspecPath: string;
12
+ repoStructurePath?: string;
13
+ }
14
+ /**
15
+ * Extract source files from the spec header line:
16
+ * > Source files: src/foo.ts, src/bar.ts
17
+ */
18
+ export declare function parseSpecHeader(content: string): {
19
+ sourceFiles: string[];
20
+ generatedDate: string | null;
21
+ };
22
+ /**
23
+ * Extract file references, requirements, and entities from spec body
24
+ */
25
+ export declare function parseSpecReferences(content: string): {
26
+ files: string[];
27
+ requirements: string[];
28
+ entities: string[];
29
+ };
30
+ /**
31
+ * Try to infer a domain for a file path based on directory structure.
32
+ * Uses word-boundary matching to avoid false positives (e.g., domain "auth"
33
+ * should match "auth-service.ts" but not "authorize.ts").
34
+ */
35
+ export declare function inferDomainFromPath(filePath: string, knownDomains: string[]): string | null;
36
+ /**
37
+ * Build a bidirectional map between spec domains and source files
38
+ */
39
+ export declare function buildSpecMap(options: SpecMapperOptions): Promise<SpecMap>;
40
+ /**
41
+ * Load spec content for a domain, reading the spec file from disk.
42
+ * Returns the markdown content truncated to maxChars, or null if unavailable.
43
+ */
44
+ export declare function getSpecContent(domain: string, specMap: SpecMap, rootPath: string, maxChars?: number): Promise<string | null>;
45
+ /**
46
+ * Find which domains a file maps to, using direct lookup + directory inference
47
+ */
48
+ export declare function matchFileToDomains(filePath: string, specMap: SpecMap): string[];
49
+ export interface ADRMapping {
50
+ id: string;
51
+ title: string;
52
+ adrPath: string;
53
+ relatedDomains: string[];
54
+ relatedLayers: string[];
55
+ status: string;
56
+ }
57
+ export interface ADRMap {
58
+ byId: Map<string, ADRMapping>;
59
+ byDomain: Map<string, string[]>;
60
+ }
61
+ /**
62
+ * Parse the ## Related section from an ADR file to extract domains and layers.
63
+ */
64
+ export declare function parseADRRelated(content: string): {
65
+ domains: string[];
66
+ layers: string[];
67
+ };
68
+ /**
69
+ * Build an ADR map by reading all ADR files from the decisions directory.
70
+ * Returns null if no decisions directory exists.
71
+ */
72
+ export declare function buildADRMap(options: SpecMapperOptions): Promise<ADRMap | null>;
73
+ //# sourceMappingURL=spec-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-mapper.d.ts","sourceRoot":"","sources":["../../../src/core/drift/spec-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAe,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAOjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAwBxG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAgDA;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA8B3F;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8G/E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAa,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAe/E;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAexF;AA0BD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqDpF"}