@machina.ai/openapi-contract-tester 2.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 (431) hide show
  1. package/.env.example +91 -0
  2. package/README.md +472 -0
  3. package/dist/ai-engine/assertion-generator.d.ts +48 -0
  4. package/dist/ai-engine/assertion-generator.d.ts.map +1 -0
  5. package/dist/ai-engine/assertion-generator.js +166 -0
  6. package/dist/ai-engine/assertion-generator.js.map +1 -0
  7. package/dist/ai-engine/context-data-generator.d.ts +38 -0
  8. package/dist/ai-engine/context-data-generator.d.ts.map +1 -0
  9. package/dist/ai-engine/context-data-generator.js +146 -0
  10. package/dist/ai-engine/context-data-generator.js.map +1 -0
  11. package/dist/ai-engine/dataflow-detector.d.ts +53 -0
  12. package/dist/ai-engine/dataflow-detector.d.ts.map +1 -0
  13. package/dist/ai-engine/dataflow-detector.js +217 -0
  14. package/dist/ai-engine/dataflow-detector.js.map +1 -0
  15. package/dist/ai-engine/dependency-detector.d.ts +52 -0
  16. package/dist/ai-engine/dependency-detector.d.ts.map +1 -0
  17. package/dist/ai-engine/dependency-detector.js +241 -0
  18. package/dist/ai-engine/dependency-detector.js.map +1 -0
  19. package/dist/ai-engine/edge-case-suggester.d.ts +63 -0
  20. package/dist/ai-engine/edge-case-suggester.d.ts.map +1 -0
  21. package/dist/ai-engine/edge-case-suggester.js +177 -0
  22. package/dist/ai-engine/edge-case-suggester.js.map +1 -0
  23. package/dist/ai-engine/index.d.ts +13 -0
  24. package/dist/ai-engine/index.d.ts.map +1 -0
  25. package/dist/ai-engine/index.js +13 -0
  26. package/dist/ai-engine/index.js.map +1 -0
  27. package/dist/analyzers/ai-failure-analyzer.d.ts +41 -0
  28. package/dist/analyzers/ai-failure-analyzer.d.ts.map +1 -0
  29. package/dist/analyzers/ai-failure-analyzer.js +220 -0
  30. package/dist/analyzers/ai-failure-analyzer.js.map +1 -0
  31. package/dist/analyzers/comparison-utils.d.ts +31 -0
  32. package/dist/analyzers/comparison-utils.d.ts.map +1 -0
  33. package/dist/analyzers/comparison-utils.js +85 -0
  34. package/dist/analyzers/comparison-utils.js.map +1 -0
  35. package/dist/analyzers/context-analyzer.d.ts +49 -0
  36. package/dist/analyzers/context-analyzer.d.ts.map +1 -0
  37. package/dist/analyzers/context-analyzer.js +292 -0
  38. package/dist/analyzers/context-analyzer.js.map +1 -0
  39. package/dist/analyzers/dependency-analyzer.d.ts +44 -0
  40. package/dist/analyzers/dependency-analyzer.d.ts.map +1 -0
  41. package/dist/analyzers/dependency-analyzer.js +313 -0
  42. package/dist/analyzers/dependency-analyzer.js.map +1 -0
  43. package/dist/analyzers/failure-analyzer.d.ts +122 -0
  44. package/dist/analyzers/failure-analyzer.d.ts.map +1 -0
  45. package/dist/analyzers/failure-analyzer.js +140 -0
  46. package/dist/analyzers/failure-analyzer.js.map +1 -0
  47. package/dist/analyzers/failure-detectors/index.d.ts +33 -0
  48. package/dist/analyzers/failure-detectors/index.d.ts.map +1 -0
  49. package/dist/analyzers/failure-detectors/index.js +164 -0
  50. package/dist/analyzers/failure-detectors/index.js.map +1 -0
  51. package/dist/analyzers/failure-discrepancy-correlator.d.ts +111 -0
  52. package/dist/analyzers/failure-discrepancy-correlator.d.ts.map +1 -0
  53. package/dist/analyzers/failure-discrepancy-correlator.js +202 -0
  54. package/dist/analyzers/failure-discrepancy-correlator.js.map +1 -0
  55. package/dist/analyzers/index.d.ts +10 -0
  56. package/dist/analyzers/index.d.ts.map +1 -0
  57. package/dist/analyzers/index.js +10 -0
  58. package/dist/analyzers/index.js.map +1 -0
  59. package/dist/analyzers/semantic-matcher.d.ts +123 -0
  60. package/dist/analyzers/semantic-matcher.d.ts.map +1 -0
  61. package/dist/analyzers/semantic-matcher.js +297 -0
  62. package/dist/analyzers/semantic-matcher.js.map +1 -0
  63. package/dist/analyzers/source-comparator.d.ts +177 -0
  64. package/dist/analyzers/source-comparator.d.ts.map +1 -0
  65. package/dist/analyzers/source-comparator.js +225 -0
  66. package/dist/analyzers/source-comparator.js.map +1 -0
  67. package/dist/business-rules/business-rules-analyzer.d.ts +44 -0
  68. package/dist/business-rules/business-rules-analyzer.d.ts.map +1 -0
  69. package/dist/business-rules/business-rules-analyzer.js +363 -0
  70. package/dist/business-rules/business-rules-analyzer.js.map +1 -0
  71. package/dist/business-rules/business-rules-generator.d.ts +78 -0
  72. package/dist/business-rules/business-rules-generator.d.ts.map +1 -0
  73. package/dist/business-rules/business-rules-generator.js +357 -0
  74. package/dist/business-rules/business-rules-generator.js.map +1 -0
  75. package/dist/business-rules/extractors/rule-extractors.d.ts +50 -0
  76. package/dist/business-rules/extractors/rule-extractors.d.ts.map +1 -0
  77. package/dist/business-rules/extractors/rule-extractors.js +189 -0
  78. package/dist/business-rules/extractors/rule-extractors.js.map +1 -0
  79. package/dist/business-rules/value-generators.d.ts +70 -0
  80. package/dist/business-rules/value-generators.d.ts.map +1 -0
  81. package/dist/business-rules/value-generators.js +142 -0
  82. package/dist/business-rules/value-generators.js.map +1 -0
  83. package/dist/executor/auth-providers/auth-header-builder.d.ts +16 -0
  84. package/dist/executor/auth-providers/auth-header-builder.d.ts.map +1 -0
  85. package/dist/executor/auth-providers/auth-header-builder.js +47 -0
  86. package/dist/executor/auth-providers/auth-header-builder.js.map +1 -0
  87. package/dist/executor/auth-providers/oauth2-provider.d.ts +19 -0
  88. package/dist/executor/auth-providers/oauth2-provider.d.ts.map +1 -0
  89. package/dist/executor/auth-providers/oauth2-provider.js +114 -0
  90. package/dist/executor/auth-providers/oauth2-provider.js.map +1 -0
  91. package/dist/executor/http-client.d.ts +133 -0
  92. package/dist/executor/http-client.d.ts.map +1 -0
  93. package/dist/executor/http-client.js +172 -0
  94. package/dist/executor/http-client.js.map +1 -0
  95. package/dist/executor/http-request-builder.d.ts +69 -0
  96. package/dist/executor/http-request-builder.d.ts.map +1 -0
  97. package/dist/executor/http-request-builder.js +140 -0
  98. package/dist/executor/http-request-builder.js.map +1 -0
  99. package/dist/executor/http-response-parser.d.ts +28 -0
  100. package/dist/executor/http-response-parser.d.ts.map +1 -0
  101. package/dist/executor/http-response-parser.js +74 -0
  102. package/dist/executor/http-response-parser.js.map +1 -0
  103. package/dist/executor/response-handler.d.ts +66 -0
  104. package/dist/executor/response-handler.d.ts.map +1 -0
  105. package/dist/executor/response-handler.js +135 -0
  106. package/dist/executor/response-handler.js.map +1 -0
  107. package/dist/executor/result-processor.d.ts +27 -0
  108. package/dist/executor/result-processor.d.ts.map +1 -0
  109. package/dist/executor/result-processor.js +140 -0
  110. package/dist/executor/result-processor.js.map +1 -0
  111. package/dist/executor/result-utils.d.ts +21 -0
  112. package/dist/executor/result-utils.d.ts.map +1 -0
  113. package/dist/executor/result-utils.js +29 -0
  114. package/dist/executor/result-utils.js.map +1 -0
  115. package/dist/executor/test-executor.d.ts +49 -0
  116. package/dist/executor/test-executor.d.ts.map +1 -0
  117. package/dist/executor/test-executor.js +226 -0
  118. package/dist/executor/test-executor.js.map +1 -0
  119. package/dist/executor/test-runner.d.ts +85 -0
  120. package/dist/executor/test-runner.d.ts.map +1 -0
  121. package/dist/executor/test-runner.js +177 -0
  122. package/dist/executor/test-runner.js.map +1 -0
  123. package/dist/executor/token-detector/index.d.ts +7 -0
  124. package/dist/executor/token-detector/index.d.ts.map +1 -0
  125. package/dist/executor/token-detector/index.js +7 -0
  126. package/dist/executor/token-detector/index.js.map +1 -0
  127. package/dist/executor/token-detector/token-detector.d.ts +64 -0
  128. package/dist/executor/token-detector/token-detector.d.ts.map +1 -0
  129. package/dist/executor/token-detector/token-detector.js +140 -0
  130. package/dist/executor/token-detector/token-detector.js.map +1 -0
  131. package/dist/generators/business-rule-from-stories-generator.d.ts +30 -0
  132. package/dist/generators/business-rule-from-stories-generator.d.ts.map +1 -0
  133. package/dist/generators/business-rule-from-stories-generator.js +227 -0
  134. package/dist/generators/business-rule-from-stories-generator.js.map +1 -0
  135. package/dist/generators/data/ai-data-generator.d.ts +23 -0
  136. package/dist/generators/data/ai-data-generator.d.ts.map +1 -0
  137. package/dist/generators/data/ai-data-generator.js +41 -0
  138. package/dist/generators/data/ai-data-generator.js.map +1 -0
  139. package/dist/generators/data/base-generator.d.ts +121 -0
  140. package/dist/generators/data/base-generator.d.ts.map +1 -0
  141. package/dist/generators/data/base-generator.js +200 -0
  142. package/dist/generators/data/base-generator.js.map +1 -0
  143. package/dist/generators/data/heuristic-data-generator.d.ts +28 -0
  144. package/dist/generators/data/heuristic-data-generator.d.ts.map +1 -0
  145. package/dist/generators/data/heuristic-data-generator.js +49 -0
  146. package/dist/generators/data/heuristic-data-generator.js.map +1 -0
  147. package/dist/generators/data/index.d.ts +48 -0
  148. package/dist/generators/data/index.d.ts.map +1 -0
  149. package/dist/generators/data/index.js +201 -0
  150. package/dist/generators/data/index.js.map +1 -0
  151. package/dist/generators/data/schema-walker.d.ts +45 -0
  152. package/dist/generators/data/schema-walker.d.ts.map +1 -0
  153. package/dist/generators/data/schema-walker.js +103 -0
  154. package/dist/generators/data/schema-walker.js.map +1 -0
  155. package/dist/generators/data/type-strategies.d.ts +79 -0
  156. package/dist/generators/data/type-strategies.d.ts.map +1 -0
  157. package/dist/generators/data/type-strategies.js +394 -0
  158. package/dist/generators/data/type-strategies.js.map +1 -0
  159. package/dist/generators/data-generator.d.ts +11 -0
  160. package/dist/generators/data-generator.d.ts.map +1 -0
  161. package/dist/generators/data-generator.js +11 -0
  162. package/dist/generators/data-generator.js.map +1 -0
  163. package/dist/generators/edge-case-generator.d.ts +55 -0
  164. package/dist/generators/edge-case-generator.d.ts.map +1 -0
  165. package/dist/generators/edge-case-generator.js +327 -0
  166. package/dist/generators/edge-case-generator.js.map +1 -0
  167. package/dist/generators/edge-cases/boundary-analyzer.d.ts +26 -0
  168. package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -0
  169. package/dist/generators/edge-cases/boundary-analyzer.js +95 -0
  170. package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -0
  171. package/dist/generators/error-case-generator.d.ts +11 -0
  172. package/dist/generators/error-case-generator.d.ts.map +1 -0
  173. package/dist/generators/error-case-generator.js +11 -0
  174. package/dist/generators/error-case-generator.js.map +1 -0
  175. package/dist/generators/errors/auth-error-strategy.d.ts +36 -0
  176. package/dist/generators/errors/auth-error-strategy.d.ts.map +1 -0
  177. package/dist/generators/errors/auth-error-strategy.js +118 -0
  178. package/dist/generators/errors/auth-error-strategy.js.map +1 -0
  179. package/dist/generators/errors/business-error-strategy.d.ts +44 -0
  180. package/dist/generators/errors/business-error-strategy.d.ts.map +1 -0
  181. package/dist/generators/errors/business-error-strategy.js +152 -0
  182. package/dist/generators/errors/business-error-strategy.js.map +1 -0
  183. package/dist/generators/errors/error-strategy-factory.d.ts +27 -0
  184. package/dist/generators/errors/error-strategy-factory.d.ts.map +1 -0
  185. package/dist/generators/errors/error-strategy-factory.js +47 -0
  186. package/dist/generators/errors/error-strategy-factory.js.map +1 -0
  187. package/dist/generators/errors/error-strategy.d.ts +62 -0
  188. package/dist/generators/errors/error-strategy.d.ts.map +1 -0
  189. package/dist/generators/errors/error-strategy.js +69 -0
  190. package/dist/generators/errors/error-strategy.js.map +1 -0
  191. package/dist/generators/errors/index.d.ts +23 -0
  192. package/dist/generators/errors/index.d.ts.map +1 -0
  193. package/dist/generators/errors/index.js +73 -0
  194. package/dist/generators/errors/index.js.map +1 -0
  195. package/dist/generators/errors/validation-error-strategy.d.ts +25 -0
  196. package/dist/generators/errors/validation-error-strategy.d.ts.map +1 -0
  197. package/dist/generators/errors/validation-error-strategy.js +214 -0
  198. package/dist/generators/errors/validation-error-strategy.js.map +1 -0
  199. package/dist/generators/happy-path-generator.d.ts +93 -0
  200. package/dist/generators/happy-path-generator.d.ts.map +1 -0
  201. package/dist/generators/happy-path-generator.js +275 -0
  202. package/dist/generators/happy-path-generator.js.map +1 -0
  203. package/dist/generators/test-enricher.d.ts +44 -0
  204. package/dist/generators/test-enricher.d.ts.map +1 -0
  205. package/dist/generators/test-enricher.js +109 -0
  206. package/dist/generators/test-enricher.js.map +1 -0
  207. package/dist/index.d.ts +9 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +14 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/llm/ai-cache.d.ts +123 -0
  212. package/dist/llm/ai-cache.d.ts.map +1 -0
  213. package/dist/llm/ai-cache.js +220 -0
  214. package/dist/llm/ai-cache.js.map +1 -0
  215. package/dist/llm/ai-client.d.ts +92 -0
  216. package/dist/llm/ai-client.d.ts.map +1 -0
  217. package/dist/llm/ai-client.js +386 -0
  218. package/dist/llm/ai-client.js.map +1 -0
  219. package/dist/llm/data-generator-ai.d.ts +84 -0
  220. package/dist/llm/data-generator-ai.d.ts.map +1 -0
  221. package/dist/llm/data-generator-ai.js +284 -0
  222. package/dist/llm/data-generator-ai.js.map +1 -0
  223. package/dist/llm/index.d.ts +7 -0
  224. package/dist/llm/index.d.ts.map +1 -0
  225. package/dist/llm/index.js +7 -0
  226. package/dist/llm/index.js.map +1 -0
  227. package/dist/mcp/handlers/base-handler.d.ts +72 -0
  228. package/dist/mcp/handlers/base-handler.d.ts.map +1 -0
  229. package/dist/mcp/handlers/base-handler.js +86 -0
  230. package/dist/mcp/handlers/base-handler.js.map +1 -0
  231. package/dist/mcp/handlers/compare-sources.d.ts +91 -0
  232. package/dist/mcp/handlers/compare-sources.d.ts.map +1 -0
  233. package/dist/mcp/handlers/compare-sources.js +182 -0
  234. package/dist/mcp/handlers/compare-sources.js.map +1 -0
  235. package/dist/mcp/handlers/export-results.d.ts +53 -0
  236. package/dist/mcp/handlers/export-results.d.ts.map +1 -0
  237. package/dist/mcp/handlers/export-results.js +132 -0
  238. package/dist/mcp/handlers/export-results.js.map +1 -0
  239. package/dist/mcp/handlers/export-to-postman.d.ts +65 -0
  240. package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -0
  241. package/dist/mcp/handlers/export-to-postman.js +128 -0
  242. package/dist/mcp/handlers/export-to-postman.js.map +1 -0
  243. package/dist/mcp/handlers/generate-tests.d.ts +74 -0
  244. package/dist/mcp/handlers/generate-tests.d.ts.map +1 -0
  245. package/dist/mcp/handlers/generate-tests.js +519 -0
  246. package/dist/mcp/handlers/generate-tests.js.map +1 -0
  247. package/dist/mcp/handlers/index.d.ts +13 -0
  248. package/dist/mcp/handlers/index.d.ts.map +1 -0
  249. package/dist/mcp/handlers/index.js +12 -0
  250. package/dist/mcp/handlers/index.js.map +1 -0
  251. package/dist/mcp/handlers/run-tests.d.ts +89 -0
  252. package/dist/mcp/handlers/run-tests.d.ts.map +1 -0
  253. package/dist/mcp/handlers/run-tests.js +233 -0
  254. package/dist/mcp/handlers/run-tests.js.map +1 -0
  255. package/dist/mcp/handlers/types.d.ts +61 -0
  256. package/dist/mcp/handlers/types.d.ts.map +1 -0
  257. package/dist/mcp/handlers/types.js +9 -0
  258. package/dist/mcp/handlers/types.js.map +1 -0
  259. package/dist/mcp/server.d.ts +64 -0
  260. package/dist/mcp/server.d.ts.map +1 -0
  261. package/dist/mcp/server.js +200 -0
  262. package/dist/mcp/server.js.map +1 -0
  263. package/dist/mcp/services/file-service.d.ts +66 -0
  264. package/dist/mcp/services/file-service.d.ts.map +1 -0
  265. package/dist/mcp/services/file-service.js +143 -0
  266. package/dist/mcp/services/file-service.js.map +1 -0
  267. package/dist/mcp/services/llm-service.d.ts +70 -0
  268. package/dist/mcp/services/llm-service.d.ts.map +1 -0
  269. package/dist/mcp/services/llm-service.js +189 -0
  270. package/dist/mcp/services/llm-service.js.map +1 -0
  271. package/dist/mcp/services/postman-service.d.ts +128 -0
  272. package/dist/mcp/services/postman-service.d.ts.map +1 -0
  273. package/dist/mcp/services/postman-service.js +266 -0
  274. package/dist/mcp/services/postman-service.js.map +1 -0
  275. package/dist/mcp/services/report-service.d.ts +81 -0
  276. package/dist/mcp/services/report-service.d.ts.map +1 -0
  277. package/dist/mcp/services/report-service.js +210 -0
  278. package/dist/mcp/services/report-service.js.map +1 -0
  279. package/dist/mcp/services/spec-service.d.ts +58 -0
  280. package/dist/mcp/services/spec-service.d.ts.map +1 -0
  281. package/dist/mcp/services/spec-service.js +140 -0
  282. package/dist/mcp/services/spec-service.js.map +1 -0
  283. package/dist/parsers/endpoint-extractor.d.ts +32 -0
  284. package/dist/parsers/endpoint-extractor.d.ts.map +1 -0
  285. package/dist/parsers/endpoint-extractor.js +160 -0
  286. package/dist/parsers/endpoint-extractor.js.map +1 -0
  287. package/dist/parsers/openapi-parser.d.ts +120 -0
  288. package/dist/parsers/openapi-parser.d.ts.map +1 -0
  289. package/dist/parsers/openapi-parser.js +257 -0
  290. package/dist/parsers/openapi-parser.js.map +1 -0
  291. package/dist/parsers/visitors/auth-visitor.d.ts +28 -0
  292. package/dist/parsers/visitors/auth-visitor.d.ts.map +1 -0
  293. package/dist/parsers/visitors/auth-visitor.js +116 -0
  294. package/dist/parsers/visitors/auth-visitor.js.map +1 -0
  295. package/dist/prd/index.d.ts +10 -0
  296. package/dist/prd/index.d.ts.map +1 -0
  297. package/dist/prd/index.js +10 -0
  298. package/dist/prd/index.js.map +1 -0
  299. package/dist/prd/prd-reader.d.ts +124 -0
  300. package/dist/prd/prd-reader.d.ts.map +1 -0
  301. package/dist/prd/prd-reader.js +308 -0
  302. package/dist/prd/prd-reader.js.map +1 -0
  303. package/dist/prd/prd-storage.d.ts +232 -0
  304. package/dist/prd/prd-storage.d.ts.map +1 -0
  305. package/dist/prd/prd-storage.js +129 -0
  306. package/dist/prd/prd-storage.js.map +1 -0
  307. package/dist/repairers/test-auto-repairer.d.ts +61 -0
  308. package/dist/repairers/test-auto-repairer.d.ts.map +1 -0
  309. package/dist/repairers/test-auto-repairer.js +213 -0
  310. package/dist/repairers/test-auto-repairer.js.map +1 -0
  311. package/dist/reporters/comparison-report-generator.d.ts +58 -0
  312. package/dist/reporters/comparison-report-generator.d.ts.map +1 -0
  313. package/dist/reporters/comparison-report-generator.js +369 -0
  314. package/dist/reporters/comparison-report-generator.js.map +1 -0
  315. package/dist/reporters/gherkin-formatter.d.ts +34 -0
  316. package/dist/reporters/gherkin-formatter.d.ts.map +1 -0
  317. package/dist/reporters/gherkin-formatter.js +231 -0
  318. package/dist/reporters/gherkin-formatter.js.map +1 -0
  319. package/dist/reporters/html-report-generator.d.ts +174 -0
  320. package/dist/reporters/html-report-generator.d.ts.map +1 -0
  321. package/dist/reporters/html-report-generator.js +194 -0
  322. package/dist/reporters/html-report-generator.js.map +1 -0
  323. package/dist/reporters/report-charts.d.ts +23 -0
  324. package/dist/reporters/report-charts.d.ts.map +1 -0
  325. package/dist/reporters/report-charts.js +182 -0
  326. package/dist/reporters/report-charts.js.map +1 -0
  327. package/dist/reporters/report-sections.d.ts +34 -0
  328. package/dist/reporters/report-sections.d.ts.map +1 -0
  329. package/dist/reporters/report-sections.js +481 -0
  330. package/dist/reporters/report-sections.js.map +1 -0
  331. package/dist/reporters/report-styles.d.ts +12 -0
  332. package/dist/reporters/report-styles.d.ts.map +1 -0
  333. package/dist/reporters/report-styles.js +412 -0
  334. package/dist/reporters/report-styles.js.map +1 -0
  335. package/dist/reporters/report-test-details.d.ts +56 -0
  336. package/dist/reporters/report-test-details.d.ts.map +1 -0
  337. package/dist/reporters/report-test-details.js +328 -0
  338. package/dist/reporters/report-test-details.js.map +1 -0
  339. package/dist/reporters/report-utils.d.ts +40 -0
  340. package/dist/reporters/report-utils.d.ts.map +1 -0
  341. package/dist/reporters/report-utils.js +163 -0
  342. package/dist/reporters/report-utils.js.map +1 -0
  343. package/dist/types/ai-config.d.ts +63 -0
  344. package/dist/types/ai-config.d.ts.map +1 -0
  345. package/dist/types/ai-config.js +79 -0
  346. package/dist/types/ai-config.js.map +1 -0
  347. package/dist/types/business-rules.d.ts +235 -0
  348. package/dist/types/business-rules.d.ts.map +1 -0
  349. package/dist/types/business-rules.js +6 -0
  350. package/dist/types/business-rules.js.map +1 -0
  351. package/dist/types/config.d.ts +106 -0
  352. package/dist/types/config.d.ts.map +1 -0
  353. package/dist/types/config.js +6 -0
  354. package/dist/types/config.js.map +1 -0
  355. package/dist/types/core.d.ts +72 -0
  356. package/dist/types/core.d.ts.map +1 -0
  357. package/dist/types/core.js +6 -0
  358. package/dist/types/core.js.map +1 -0
  359. package/dist/types/index.d.ts +17 -0
  360. package/dist/types/index.d.ts.map +1 -0
  361. package/dist/types/index.js +10 -0
  362. package/dist/types/index.js.map +1 -0
  363. package/dist/types/openapi.d.ts +139 -0
  364. package/dist/types/openapi.d.ts.map +1 -0
  365. package/dist/types/openapi.js +6 -0
  366. package/dist/types/openapi.js.map +1 -0
  367. package/dist/types/pact.d.ts +101 -0
  368. package/dist/types/pact.d.ts.map +1 -0
  369. package/dist/types/pact.js +6 -0
  370. package/dist/types/pact.js.map +1 -0
  371. package/dist/types/reporting.d.ts +93 -0
  372. package/dist/types/reporting.d.ts.map +1 -0
  373. package/dist/types/reporting.js +6 -0
  374. package/dist/types/reporting.js.map +1 -0
  375. package/dist/types/test-case.d.ts +233 -0
  376. package/dist/types/test-case.d.ts.map +1 -0
  377. package/dist/types/test-case.js +6 -0
  378. package/dist/types/test-case.js.map +1 -0
  379. package/dist/types/test-execution.d.ts +80 -0
  380. package/dist/types/test-execution.d.ts.map +1 -0
  381. package/dist/types/test-execution.js +6 -0
  382. package/dist/types/test-execution.js.map +1 -0
  383. package/dist/utils/auth-generator.d.ts +30 -0
  384. package/dist/utils/auth-generator.d.ts.map +1 -0
  385. package/dist/utils/auth-generator.js +68 -0
  386. package/dist/utils/auth-generator.js.map +1 -0
  387. package/dist/utils/config.d.ts +181 -0
  388. package/dist/utils/config.d.ts.map +1 -0
  389. package/dist/utils/config.js +141 -0
  390. package/dist/utils/config.js.map +1 -0
  391. package/dist/utils/coverage-calculator.d.ts +81 -0
  392. package/dist/utils/coverage-calculator.d.ts.map +1 -0
  393. package/dist/utils/coverage-calculator.js +134 -0
  394. package/dist/utils/coverage-calculator.js.map +1 -0
  395. package/dist/utils/data-loader.d.ts +52 -0
  396. package/dist/utils/data-loader.d.ts.map +1 -0
  397. package/dist/utils/data-loader.js +192 -0
  398. package/dist/utils/data-loader.js.map +1 -0
  399. package/dist/utils/errors.d.ts +167 -0
  400. package/dist/utils/errors.d.ts.map +1 -0
  401. package/dist/utils/errors.js +257 -0
  402. package/dist/utils/errors.js.map +1 -0
  403. package/dist/utils/logger.d.ts +220 -0
  404. package/dist/utils/logger.d.ts.map +1 -0
  405. package/dist/utils/logger.js +325 -0
  406. package/dist/utils/logger.js.map +1 -0
  407. package/dist/utils/openapi-discovery.d.ts +31 -0
  408. package/dist/utils/openapi-discovery.d.ts.map +1 -0
  409. package/dist/utils/openapi-discovery.js +322 -0
  410. package/dist/utils/openapi-discovery.js.map +1 -0
  411. package/dist/utils/path-resolver.d.ts +101 -0
  412. package/dist/utils/path-resolver.d.ts.map +1 -0
  413. package/dist/utils/path-resolver.js +167 -0
  414. package/dist/utils/path-resolver.js.map +1 -0
  415. package/dist/utils/resilience.d.ts +181 -0
  416. package/dist/utils/resilience.d.ts.map +1 -0
  417. package/dist/utils/resilience.js +269 -0
  418. package/dist/utils/resilience.js.map +1 -0
  419. package/dist/validators/openapi-validator.d.ts +198 -0
  420. package/dist/validators/openapi-validator.d.ts.map +1 -0
  421. package/dist/validators/openapi-validator.js +349 -0
  422. package/dist/validators/openapi-validator.js.map +1 -0
  423. package/dist/validators/response-matcher.d.ts +84 -0
  424. package/dist/validators/response-matcher.d.ts.map +1 -0
  425. package/dist/validators/response-matcher.js +234 -0
  426. package/dist/validators/response-matcher.js.map +1 -0
  427. package/dist/validators/schema-validator.d.ts +174 -0
  428. package/dist/validators/schema-validator.d.ts.map +1 -0
  429. package/dist/validators/schema-validator.js +340 -0
  430. package/dist/validators/schema-validator.js.map +1 -0
  431. package/package.json +76 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Auth Inference Visitor
3
+ *
4
+ * Infers authentication configuration from OpenAPI security schemes.
5
+ * Implements the Visitor pattern for spec-level auth analysis.
6
+ *
7
+ * @module parsers/visitors/auth-visitor
8
+ */
9
+ import { extractSecuritySchemes } from '../endpoint-extractor.js';
10
+ /**
11
+ * Infers authentication configuration from OpenAPI security schemes.
12
+ *
13
+ * Automatically detects OAuth2, Bearer, API Key, and Basic auth from the spec
14
+ * and constructs the appropriate AuthConfig using provided credentials.
15
+ *
16
+ * @param spec - Parsed OpenAPI specification
17
+ * @param credentials - User-provided credentials
18
+ * @returns AuthConfig object or undefined if no auth detected
19
+ */
20
+ export function inferAuthFromSpec(spec, credentials) {
21
+ const securitySchemes = extractSecuritySchemes(spec);
22
+ if (Object.keys(securitySchemes).length === 0) {
23
+ return undefined;
24
+ }
25
+ const schemeName = Object.keys(securitySchemes)[0];
26
+ const scheme = securitySchemes[schemeName];
27
+ // OAuth2 - Extract tokenUrl from spec, use credentials from user
28
+ if (scheme.type === 'oauth2' && scheme.flows) {
29
+ const flows = scheme.flows;
30
+ if (flows.password && credentials?.username && credentials?.password) {
31
+ return {
32
+ type: 'oauth2',
33
+ oauth2: {
34
+ flow: 'password',
35
+ tokenUrl: flows.password.tokenUrl,
36
+ username: credentials.username,
37
+ password: credentials.password,
38
+ clientId: credentials.clientId,
39
+ clientSecret: credentials.clientSecret,
40
+ scopes: Object.keys(flows.password.scopes || {}),
41
+ }
42
+ };
43
+ }
44
+ if (flows.clientCredentials && credentials?.clientId && credentials?.clientSecret) {
45
+ return {
46
+ type: 'oauth2',
47
+ oauth2: {
48
+ flow: 'clientCredentials',
49
+ tokenUrl: flows.clientCredentials.tokenUrl,
50
+ clientId: credentials.clientId,
51
+ clientSecret: credentials.clientSecret,
52
+ scopes: Object.keys(flows.clientCredentials.scopes || {}),
53
+ }
54
+ };
55
+ }
56
+ if (flows.clientCredentials) {
57
+ return {
58
+ type: 'oauth2',
59
+ oauth2: {
60
+ flow: 'clientCredentials',
61
+ tokenUrl: flows.clientCredentials.tokenUrl,
62
+ clientId: credentials?.clientId || '',
63
+ clientSecret: credentials?.clientSecret || '',
64
+ scopes: Object.keys(flows.clientCredentials.scopes || {}),
65
+ }
66
+ };
67
+ }
68
+ if (flows.password) {
69
+ return {
70
+ type: 'oauth2',
71
+ oauth2: {
72
+ flow: 'password',
73
+ tokenUrl: flows.password.tokenUrl,
74
+ username: credentials?.username || '',
75
+ password: credentials?.password || '',
76
+ clientId: credentials?.clientId,
77
+ clientSecret: credentials?.clientSecret,
78
+ scopes: Object.keys(flows.password.scopes || {}),
79
+ }
80
+ };
81
+ }
82
+ }
83
+ // HTTP Bearer
84
+ if (scheme.type === 'http') {
85
+ const httpScheme = scheme;
86
+ if (httpScheme.scheme === 'bearer') {
87
+ return {
88
+ type: 'bearer',
89
+ token: credentials?.bearerToken || '',
90
+ };
91
+ }
92
+ if (httpScheme.scheme === 'basic') {
93
+ return {
94
+ type: 'basic',
95
+ basic: {
96
+ username: credentials?.username || '',
97
+ password: credentials?.password || '',
98
+ }
99
+ };
100
+ }
101
+ }
102
+ // API Key - Extract name and location from spec, use value from user
103
+ if (scheme.type === 'apiKey') {
104
+ const apiKeyScheme = scheme;
105
+ return {
106
+ type: 'api-key',
107
+ apiKey: {
108
+ name: apiKeyScheme.name,
109
+ in: apiKeyScheme.in === 'query' ? 'query' : 'header',
110
+ value: credentials?.apiKey || '',
111
+ }
112
+ };
113
+ }
114
+ return undefined;
115
+ }
116
+ //# sourceMappingURL=auth-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-visitor.js","sourceRoot":"","sources":["../../../src/parsers/visitors/auth-visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PRD Module
3
+ *
4
+ * Handles reading, normalizing, and storing Product Requirement Documents.
5
+ *
6
+ * @module prd
7
+ */
8
+ export * from './prd-reader.js';
9
+ export * from './prd-storage.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prd/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * PRD Module
3
+ *
4
+ * Handles reading, normalizing, and storing Product Requirement Documents.
5
+ *
6
+ * @module prd
7
+ */
8
+ export * from './prd-reader.js';
9
+ export * from './prd-storage.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prd/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * PRD Reader Module
3
+ *
4
+ * Reads and structures Product Requirement Documents (PRD) from various formats.
5
+ * This module handles the mechanical work of reading files - the LLM in the CLI
6
+ * does the intelligent analysis and normalization.
7
+ *
8
+ * Supported formats:
9
+ * - Markdown (.md)
10
+ * - Plain text (.txt)
11
+ * - JSON (.json)
12
+ * - YAML (.yml, .yaml)
13
+ * - Gherkin/Feature files (.feature)
14
+ *
15
+ * @module prd/prd-reader
16
+ */
17
+ /**
18
+ * Supported PRD file formats
19
+ */
20
+ export type PrdFormat = 'markdown' | 'text' | 'json' | 'yaml' | 'gherkin' | 'unknown';
21
+ /**
22
+ * Raw PRD content as read from file or input
23
+ */
24
+ export interface RawPrd {
25
+ /**
26
+ * Original content of the PRD
27
+ */
28
+ content: string;
29
+ /**
30
+ * Detected format of the PRD
31
+ */
32
+ format: PrdFormat;
33
+ /**
34
+ * Source file path if read from file
35
+ */
36
+ sourcePath?: string;
37
+ /**
38
+ * File name if read from file
39
+ */
40
+ fileName?: string;
41
+ /**
42
+ * Metadata extracted from the PRD (if any)
43
+ */
44
+ metadata?: Record<string, unknown>;
45
+ /**
46
+ * Sections found in the document (for structured formats)
47
+ */
48
+ sections?: PrdSection[];
49
+ }
50
+ /**
51
+ * A section within a PRD document
52
+ */
53
+ export interface PrdSection {
54
+ /**
55
+ * Section title/heading
56
+ */
57
+ title: string;
58
+ /**
59
+ * Section content
60
+ */
61
+ content: string;
62
+ /**
63
+ * Nesting level (1 = top level)
64
+ */
65
+ level: number;
66
+ /**
67
+ * Child sections
68
+ */
69
+ children?: PrdSection[];
70
+ }
71
+ /**
72
+ * Options for reading PRD
73
+ */
74
+ export interface ReadPrdOptions {
75
+ /**
76
+ * Extract sections from the document
77
+ */
78
+ extractSections?: boolean;
79
+ /**
80
+ * Maximum file size in bytes (default: 1MB)
81
+ */
82
+ maxFileSize?: number;
83
+ }
84
+ /**
85
+ * Reads a PRD from a file path
86
+ *
87
+ * @param filePath - Path to the PRD file
88
+ * @param options - Reading options
89
+ * @returns Raw PRD content and metadata
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const prd = await readPrdFromFile('./docs/requirements.md');
94
+ * console.log(prd.format); // 'markdown'
95
+ * console.log(prd.content); // File contents
96
+ * ```
97
+ */
98
+ export declare function readPrdFromFile(filePath: string, options?: ReadPrdOptions): Promise<RawPrd>;
99
+ /**
100
+ * Reads a PRD from raw text content
101
+ *
102
+ * @param content - Raw PRD content
103
+ * @param options - Reading options
104
+ * @returns Raw PRD content and metadata
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * const prd = readPrdFromContent(`
109
+ * # User Stories
110
+ * As a user, I want to login so I can access my account.
111
+ * `);
112
+ * console.log(prd.format); // 'markdown'
113
+ * ```
114
+ */
115
+ export declare function readPrdFromContent(content: string, options?: ReadPrdOptions): RawPrd;
116
+ /**
117
+ * Reads multiple PRD files from a directory
118
+ *
119
+ * @param dirPath - Path to directory containing PRD files
120
+ * @param options - Reading options
121
+ * @returns Array of raw PRD contents
122
+ */
123
+ export declare function readPrdFromDirectory(dirPath: string, options?: ReadPrdOptions): Promise<RawPrd[]>;
124
+ //# sourceMappingURL=prd-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-reader.d.ts","sourceRoot":"","sources":["../../src/prd/prd-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BnB"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * PRD Reader Module
3
+ *
4
+ * Reads and structures Product Requirement Documents (PRD) from various formats.
5
+ * This module handles the mechanical work of reading files - the LLM in the CLI
6
+ * does the intelligent analysis and normalization.
7
+ *
8
+ * Supported formats:
9
+ * - Markdown (.md)
10
+ * - Plain text (.txt)
11
+ * - JSON (.json)
12
+ * - YAML (.yml, .yaml)
13
+ * - Gherkin/Feature files (.feature)
14
+ *
15
+ * @module prd/prd-reader
16
+ */
17
+ import * as fs from 'fs';
18
+ import * as path from 'path';
19
+ import * as yaml from 'yaml';
20
+ import { createLogger } from '../utils/logger.js';
21
+ const log = createLogger('prd-reader');
22
+ /**
23
+ * Reads a PRD from a file path
24
+ *
25
+ * @param filePath - Path to the PRD file
26
+ * @param options - Reading options
27
+ * @returns Raw PRD content and metadata
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const prd = await readPrdFromFile('./docs/requirements.md');
32
+ * console.log(prd.format); // 'markdown'
33
+ * console.log(prd.content); // File contents
34
+ * ```
35
+ */
36
+ export async function readPrdFromFile(filePath, options = {}) {
37
+ const { maxFileSize = 1024 * 1024 } = options; // 1MB default
38
+ log.debug('Reading PRD from file', { filePath });
39
+ // Check file exists
40
+ if (!fs.existsSync(filePath)) {
41
+ throw new Error(`PRD file not found: ${filePath}`);
42
+ }
43
+ // Check file size
44
+ const stats = fs.statSync(filePath);
45
+ if (stats.size > maxFileSize) {
46
+ throw new Error(`PRD file too large: ${stats.size} bytes (max: ${maxFileSize})`);
47
+ }
48
+ // Read file content
49
+ const content = fs.readFileSync(filePath, 'utf-8');
50
+ const ext = path.extname(filePath).toLowerCase();
51
+ const format = detectFormat(ext, content);
52
+ log.info('PRD file read successfully', { filePath, format, size: stats.size });
53
+ const rawPrd = {
54
+ content,
55
+ format,
56
+ sourcePath: filePath,
57
+ fileName: path.basename(filePath),
58
+ };
59
+ // Extract metadata and sections based on format
60
+ if (format === 'yaml' || format === 'json') {
61
+ rawPrd.metadata = parseStructuredContent(content, format);
62
+ }
63
+ if (options.extractSections && (format === 'markdown' || format === 'text')) {
64
+ rawPrd.sections = extractMarkdownSections(content);
65
+ }
66
+ if (format === 'gherkin') {
67
+ rawPrd.sections = extractGherkinSections(content);
68
+ }
69
+ return rawPrd;
70
+ }
71
+ /**
72
+ * Reads a PRD from raw text content
73
+ *
74
+ * @param content - Raw PRD content
75
+ * @param options - Reading options
76
+ * @returns Raw PRD content and metadata
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * const prd = readPrdFromContent(`
81
+ * # User Stories
82
+ * As a user, I want to login so I can access my account.
83
+ * `);
84
+ * console.log(prd.format); // 'markdown'
85
+ * ```
86
+ */
87
+ export function readPrdFromContent(content, options = {}) {
88
+ log.debug('Reading PRD from content', { contentLength: content.length });
89
+ const format = detectFormatFromContent(content);
90
+ const rawPrd = {
91
+ content,
92
+ format,
93
+ };
94
+ // Extract metadata and sections based on format
95
+ if (format === 'yaml' || format === 'json') {
96
+ rawPrd.metadata = parseStructuredContent(content, format);
97
+ }
98
+ if (options.extractSections && (format === 'markdown' || format === 'text')) {
99
+ rawPrd.sections = extractMarkdownSections(content);
100
+ }
101
+ if (format === 'gherkin') {
102
+ rawPrd.sections = extractGherkinSections(content);
103
+ }
104
+ log.info('PRD content processed', { format, contentLength: content.length });
105
+ return rawPrd;
106
+ }
107
+ /**
108
+ * Reads multiple PRD files from a directory
109
+ *
110
+ * @param dirPath - Path to directory containing PRD files
111
+ * @param options - Reading options
112
+ * @returns Array of raw PRD contents
113
+ */
114
+ export async function readPrdFromDirectory(dirPath, options = {}) {
115
+ log.debug('Reading PRDs from directory', { dirPath });
116
+ if (!fs.existsSync(dirPath)) {
117
+ throw new Error(`PRD directory not found: ${dirPath}`);
118
+ }
119
+ const supportedExtensions = ['.md', '.txt', '.json', '.yml', '.yaml', '.feature'];
120
+ const files = fs.readdirSync(dirPath)
121
+ .filter(f => supportedExtensions.includes(path.extname(f).toLowerCase()));
122
+ const prds = [];
123
+ for (const file of files) {
124
+ const filePath = path.join(dirPath, file);
125
+ try {
126
+ const prd = await readPrdFromFile(filePath, options);
127
+ prds.push(prd);
128
+ }
129
+ catch (error) {
130
+ log.warn('Failed to read PRD file', { file, error });
131
+ }
132
+ }
133
+ log.info('PRDs read from directory', { dirPath, count: prds.length });
134
+ return prds;
135
+ }
136
+ /**
137
+ * Detects PRD format from file extension
138
+ */
139
+ function detectFormat(extension, content) {
140
+ switch (extension) {
141
+ case '.md':
142
+ case '.markdown':
143
+ return 'markdown';
144
+ case '.txt':
145
+ return 'text';
146
+ case '.json':
147
+ return 'json';
148
+ case '.yml':
149
+ case '.yaml':
150
+ return 'yaml';
151
+ case '.feature':
152
+ return 'gherkin';
153
+ default:
154
+ return detectFormatFromContent(content);
155
+ }
156
+ }
157
+ /**
158
+ * Detects PRD format from content analysis
159
+ */
160
+ function detectFormatFromContent(content) {
161
+ const trimmed = content.trim();
162
+ // Check for JSON
163
+ if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
164
+ try {
165
+ JSON.parse(trimmed);
166
+ return 'json';
167
+ }
168
+ catch {
169
+ // Not valid JSON
170
+ }
171
+ }
172
+ // Check for Gherkin
173
+ if (/^(Feature:|Scenario:|Given |When |Then |And |But )/m.test(trimmed)) {
174
+ return 'gherkin';
175
+ }
176
+ // Check for YAML (has key: value patterns without JSON brackets)
177
+ if (/^[\w-]+:\s*.+$/m.test(trimmed) && !trimmed.startsWith('{')) {
178
+ try {
179
+ yaml.parse(trimmed);
180
+ return 'yaml';
181
+ }
182
+ catch {
183
+ // Not valid YAML
184
+ }
185
+ }
186
+ // Check for Markdown (has headers or formatting)
187
+ if (/^#{1,6}\s+.+$/m.test(trimmed) || /\*\*.+\*\*|\[.+\]\(.+\)/.test(trimmed)) {
188
+ return 'markdown';
189
+ }
190
+ // Default to text
191
+ return 'text';
192
+ }
193
+ /**
194
+ * Parses structured content (JSON/YAML) and returns metadata
195
+ */
196
+ function parseStructuredContent(content, format) {
197
+ try {
198
+ if (format === 'json') {
199
+ return JSON.parse(content);
200
+ }
201
+ else if (format === 'yaml') {
202
+ return yaml.parse(content) || {};
203
+ }
204
+ }
205
+ catch (error) {
206
+ log.warn('Failed to parse structured content', { format, error });
207
+ }
208
+ return {};
209
+ }
210
+ /**
211
+ * Extracts sections from Markdown content
212
+ */
213
+ function extractMarkdownSections(content) {
214
+ const sections = [];
215
+ const lines = content.split('\n');
216
+ let currentSection = null;
217
+ let currentContent = [];
218
+ for (const line of lines) {
219
+ const headerMatch = line.match(/^(#{1,6})\s+(.+)$/);
220
+ if (headerMatch) {
221
+ // Save previous section
222
+ if (currentSection) {
223
+ currentSection.content = currentContent.join('\n').trim();
224
+ sections.push(currentSection);
225
+ }
226
+ // Start new section
227
+ const level = headerMatch[1].length;
228
+ const title = headerMatch[2].trim();
229
+ currentSection = { title, content: '', level };
230
+ currentContent = [];
231
+ }
232
+ else {
233
+ currentContent.push(line);
234
+ }
235
+ }
236
+ // Save last section
237
+ if (currentSection) {
238
+ currentSection.content = currentContent.join('\n').trim();
239
+ sections.push(currentSection);
240
+ }
241
+ return sections;
242
+ }
243
+ /**
244
+ * Extracts sections from Gherkin content
245
+ */
246
+ function extractGherkinSections(content) {
247
+ const sections = [];
248
+ const lines = content.split('\n');
249
+ let currentFeature = null;
250
+ let currentScenario = null;
251
+ let currentContent = [];
252
+ for (const line of lines) {
253
+ const trimmedLine = line.trim();
254
+ if (trimmedLine.startsWith('Feature:')) {
255
+ // Save previous scenario
256
+ if (currentScenario) {
257
+ currentScenario.content = currentContent.join('\n').trim();
258
+ if (currentFeature) {
259
+ currentFeature.children = currentFeature.children || [];
260
+ currentFeature.children.push(currentScenario);
261
+ }
262
+ }
263
+ // Save previous feature
264
+ if (currentFeature) {
265
+ sections.push(currentFeature);
266
+ }
267
+ // Start new feature
268
+ currentFeature = {
269
+ title: trimmedLine.replace('Feature:', '').trim(),
270
+ content: '',
271
+ level: 1,
272
+ children: []
273
+ };
274
+ currentScenario = null;
275
+ currentContent = [];
276
+ }
277
+ else if (trimmedLine.startsWith('Scenario:') || trimmedLine.startsWith('Scenario Outline:')) {
278
+ // Save previous scenario
279
+ if (currentScenario) {
280
+ currentScenario.content = currentContent.join('\n').trim();
281
+ if (currentFeature) {
282
+ currentFeature.children = currentFeature.children || [];
283
+ currentFeature.children.push(currentScenario);
284
+ }
285
+ }
286
+ // Start new scenario
287
+ const title = trimmedLine.replace('Scenario Outline:', '').replace('Scenario:', '').trim();
288
+ currentScenario = { title, content: '', level: 2 };
289
+ currentContent = [];
290
+ }
291
+ else {
292
+ currentContent.push(line);
293
+ }
294
+ }
295
+ // Save last scenario and feature
296
+ if (currentScenario) {
297
+ currentScenario.content = currentContent.join('\n').trim();
298
+ if (currentFeature) {
299
+ currentFeature.children = currentFeature.children || [];
300
+ currentFeature.children.push(currentScenario);
301
+ }
302
+ }
303
+ if (currentFeature) {
304
+ sections.push(currentFeature);
305
+ }
306
+ return sections;
307
+ }
308
+ //# sourceMappingURL=prd-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-reader.js","sourceRoot":"","sources":["../../src/prd/prd-reader.ts"],"names":[],"mappings":"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"}