forgecraft-mcp 1.4.0 → 1.7.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 (418) hide show
  1. package/LICENSE +67 -0
  2. package/README.md +527 -525
  3. package/dist/analyzers/anchors/anchor-loader.d.ts +47 -0
  4. package/dist/analyzers/anchors/anchor-loader.d.ts.map +1 -0
  5. package/dist/analyzers/anchors/anchor-loader.js +113 -0
  6. package/dist/analyzers/anchors/anchor-loader.js.map +1 -0
  7. package/dist/analyzers/anti-pattern.d.ts.map +1 -1
  8. package/dist/analyzers/anti-pattern.js +38 -26
  9. package/dist/analyzers/anti-pattern.js.map +1 -1
  10. package/dist/analyzers/completeness-helpers.d.ts +5 -0
  11. package/dist/analyzers/completeness-helpers.d.ts.map +1 -1
  12. package/dist/analyzers/completeness-helpers.js +17 -0
  13. package/dist/analyzers/completeness-helpers.js.map +1 -1
  14. package/dist/analyzers/completeness.d.ts.map +1 -1
  15. package/dist/analyzers/completeness.js +4 -4
  16. package/dist/analyzers/completeness.js.map +1 -1
  17. package/dist/analyzers/gs-scorer.d.ts +3 -1
  18. package/dist/analyzers/gs-scorer.d.ts.map +1 -1
  19. package/dist/analyzers/gs-scorer.js +5 -2
  20. package/dist/analyzers/gs-scorer.js.map +1 -1
  21. package/dist/analyzers/package-json.d.ts.map +1 -1
  22. package/dist/analyzers/package-json.js +194 -34
  23. package/dist/analyzers/package-json.js.map +1 -1
  24. package/dist/analyzers/scorers/composable-scorer.d.ts +4 -2
  25. package/dist/analyzers/scorers/composable-scorer.d.ts.map +1 -1
  26. package/dist/analyzers/scorers/composable-scorer.js +50 -2
  27. package/dist/analyzers/scorers/composable-scorer.js.map +1 -1
  28. package/dist/analyzers/scorers/executable-scorer.d.ts +3 -2
  29. package/dist/analyzers/scorers/executable-scorer.d.ts.map +1 -1
  30. package/dist/analyzers/scorers/executable-scorer.js +64 -4
  31. package/dist/analyzers/scorers/executable-scorer.js.map +1 -1
  32. package/dist/analyzers/scorers/scorer-utils.d.ts +5 -3
  33. package/dist/analyzers/scorers/scorer-utils.d.ts.map +1 -1
  34. package/dist/analyzers/scorers/scorer-utils.js +34 -9
  35. package/dist/analyzers/scorers/scorer-utils.js.map +1 -1
  36. package/dist/analyzers/scorers/self-describing-scorer.d.ts +7 -4
  37. package/dist/analyzers/scorers/self-describing-scorer.d.ts.map +1 -1
  38. package/dist/analyzers/scorers/self-describing-scorer.js +17 -18
  39. package/dist/analyzers/scorers/self-describing-scorer.js.map +1 -1
  40. package/dist/cli/help.js +51 -51
  41. package/dist/disciplines/catalog.d.ts +16 -0
  42. package/dist/disciplines/catalog.d.ts.map +1 -0
  43. package/dist/disciplines/catalog.js +196 -0
  44. package/dist/disciplines/catalog.js.map +1 -0
  45. package/dist/disciplines/runner.d.ts +13 -0
  46. package/dist/disciplines/runner.d.ts.map +1 -0
  47. package/dist/disciplines/runner.js +35 -0
  48. package/dist/disciplines/runner.js.map +1 -0
  49. package/dist/registry/composer.d.ts.map +1 -1
  50. package/dist/registry/composer.js +9 -4
  51. package/dist/registry/composer.js.map +1 -1
  52. package/dist/registry/loader-tag.d.ts.map +1 -1
  53. package/dist/registry/loader-tag.js +1 -0
  54. package/dist/registry/loader-tag.js.map +1 -1
  55. package/dist/registry/remote-gates.js +1 -1
  56. package/dist/registry/remote-gates.js.map +1 -1
  57. package/dist/registry/renderer-skeletons.js +92 -92
  58. package/dist/registry/sentinel-renderer.js +299 -20
  59. package/dist/registry/sentinel-renderer.js.map +1 -1
  60. package/dist/sentinel/detect.d.ts +41 -0
  61. package/dist/sentinel/detect.d.ts.map +1 -0
  62. package/dist/sentinel/detect.js +122 -0
  63. package/dist/sentinel/detect.js.map +1 -0
  64. package/dist/sentinel/write.d.ts +54 -0
  65. package/dist/sentinel/write.d.ts.map +1 -0
  66. package/dist/sentinel/write.js +75 -0
  67. package/dist/sentinel/write.js.map +1 -0
  68. package/dist/shared/cnt-health.d.ts +16 -0
  69. package/dist/shared/cnt-health.d.ts.map +1 -1
  70. package/dist/shared/cnt-health.js +55 -8
  71. package/dist/shared/cnt-health.js.map +1 -1
  72. package/dist/shared/config.d.ts +14 -0
  73. package/dist/shared/config.d.ts.map +1 -1
  74. package/dist/shared/config.js +45 -0
  75. package/dist/shared/config.js.map +1 -1
  76. package/dist/shared/gs-score-logger.js +6 -6
  77. package/dist/shared/hook-installer.d.ts +58 -0
  78. package/dist/shared/hook-installer.d.ts.map +1 -0
  79. package/dist/shared/hook-installer.js +316 -0
  80. package/dist/shared/hook-installer.js.map +1 -0
  81. package/dist/shared/project-gates-helpers.d.ts +9 -0
  82. package/dist/shared/project-gates-helpers.d.ts.map +1 -1
  83. package/dist/shared/project-gates-helpers.js +35 -0
  84. package/dist/shared/project-gates-helpers.js.map +1 -1
  85. package/dist/shared/types/config.d.ts +7 -1
  86. package/dist/shared/types/config.d.ts.map +1 -1
  87. package/dist/shared/types/gates.d.ts +34 -0
  88. package/dist/shared/types/gates.d.ts.map +1 -1
  89. package/dist/shared/types/project.d.ts +68 -2
  90. package/dist/shared/types/project.d.ts.map +1 -1
  91. package/dist/shared/types/project.js +1 -0
  92. package/dist/shared/types/project.js.map +1 -1
  93. package/dist/shared/types/templates.d.ts +8 -1
  94. package/dist/shared/types/templates.d.ts.map +1 -1
  95. package/dist/shared/types/verify.d.ts +51 -1
  96. package/dist/shared/types/verify.d.ts.map +1 -1
  97. package/dist/shared/types/verify.js +37 -1
  98. package/dist/shared/types/verify.js.map +1 -1
  99. package/dist/tools/add-hook.d.ts.map +1 -1
  100. package/dist/tools/add-hook.js +8 -1
  101. package/dist/tools/add-hook.js.map +1 -1
  102. package/dist/tools/add-module.js +123 -123
  103. package/dist/tools/advice-registry.d.ts.map +1 -1
  104. package/dist/tools/advice-registry.js +108 -18
  105. package/dist/tools/advice-registry.js.map +1 -1
  106. package/dist/tools/advise-session-advisor.d.ts +16 -0
  107. package/dist/tools/advise-session-advisor.d.ts.map +1 -0
  108. package/dist/tools/advise-session-advisor.js +89 -0
  109. package/dist/tools/advise-session-advisor.js.map +1 -0
  110. package/dist/tools/advise-session-signals.d.ts +21 -0
  111. package/dist/tools/advise-session-signals.d.ts.map +1 -0
  112. package/dist/tools/advise-session-signals.js +113 -0
  113. package/dist/tools/advise-session-signals.js.map +1 -0
  114. package/dist/tools/advise-session.d.ts +22 -0
  115. package/dist/tools/advise-session.d.ts.map +1 -0
  116. package/dist/tools/advise-session.js +31 -0
  117. package/dist/tools/advise-session.js.map +1 -0
  118. package/dist/tools/analyze-harness.d.ts +18 -0
  119. package/dist/tools/analyze-harness.d.ts.map +1 -0
  120. package/dist/tools/analyze-harness.js +298 -0
  121. package/dist/tools/analyze-harness.js.map +1 -0
  122. package/dist/tools/audit.d.ts.map +1 -1
  123. package/dist/tools/audit.js +19 -0
  124. package/dist/tools/audit.js.map +1 -1
  125. package/dist/tools/change-request.d.ts +53 -0
  126. package/dist/tools/change-request.d.ts.map +1 -0
  127. package/dist/tools/change-request.js +395 -0
  128. package/dist/tools/change-request.js.map +1 -0
  129. package/dist/tools/check-cascade-contracts.d.ts +13 -0
  130. package/dist/tools/check-cascade-contracts.d.ts.map +1 -1
  131. package/dist/tools/check-cascade-contracts.js +73 -2
  132. package/dist/tools/check-cascade-contracts.js.map +1 -1
  133. package/dist/tools/check-cascade-report.js +64 -64
  134. package/dist/tools/check-cascade-steps.d.ts +3 -0
  135. package/dist/tools/check-cascade-steps.d.ts.map +1 -1
  136. package/dist/tools/check-cascade-steps.js +104 -15
  137. package/dist/tools/check-cascade-steps.js.map +1 -1
  138. package/dist/tools/check-cascade.d.ts +4 -3
  139. package/dist/tools/check-cascade.d.ts.map +1 -1
  140. package/dist/tools/check-cascade.js +30 -12
  141. package/dist/tools/check-cascade.js.map +1 -1
  142. package/dist/tools/check-derivation-chain.d.ts +37 -0
  143. package/dist/tools/check-derivation-chain.d.ts.map +1 -0
  144. package/dist/tools/check-derivation-chain.js +418 -0
  145. package/dist/tools/check-derivation-chain.js.map +1 -0
  146. package/dist/tools/check-spec-consistency.d.ts +25 -0
  147. package/dist/tools/check-spec-consistency.d.ts.map +1 -0
  148. package/dist/tools/check-spec-consistency.js +339 -0
  149. package/dist/tools/check-spec-consistency.js.map +1 -0
  150. package/dist/tools/check-t4.d.ts +54 -0
  151. package/dist/tools/check-t4.d.ts.map +1 -0
  152. package/dist/tools/check-t4.js +305 -0
  153. package/dist/tools/check-t4.js.map +1 -0
  154. package/dist/tools/close-cycle.d.ts +11 -0
  155. package/dist/tools/close-cycle.d.ts.map +1 -1
  156. package/dist/tools/close-cycle.js +364 -4
  157. package/dist/tools/close-cycle.js.map +1 -1
  158. package/dist/tools/cnt-add-routing.d.ts +31 -0
  159. package/dist/tools/cnt-add-routing.d.ts.map +1 -0
  160. package/dist/tools/cnt-add-routing.js +99 -0
  161. package/dist/tools/cnt-add-routing.js.map +1 -0
  162. package/dist/tools/configure-mcp.d.ts.map +1 -1
  163. package/dist/tools/configure-mcp.js +52 -2
  164. package/dist/tools/configure-mcp.js.map +1 -1
  165. package/dist/tools/consolidate-status.d.ts +31 -0
  166. package/dist/tools/consolidate-status.d.ts.map +1 -1
  167. package/dist/tools/consolidate-status.js +105 -0
  168. package/dist/tools/consolidate-status.js.map +1 -1
  169. package/dist/tools/executable-gates.d.ts +52 -0
  170. package/dist/tools/executable-gates.d.ts.map +1 -0
  171. package/dist/tools/executable-gates.js +333 -0
  172. package/dist/tools/executable-gates.js.map +1 -0
  173. package/dist/tools/extract-adrs-from-spec.d.ts +33 -0
  174. package/dist/tools/extract-adrs-from-spec.d.ts.map +1 -0
  175. package/dist/tools/extract-adrs-from-spec.js +410 -0
  176. package/dist/tools/extract-adrs-from-spec.js.map +1 -0
  177. package/dist/tools/extract-adrs-history.d.ts +47 -0
  178. package/dist/tools/extract-adrs-history.d.ts.map +1 -0
  179. package/dist/tools/extract-adrs-history.js +265 -0
  180. package/dist/tools/extract-adrs-history.js.map +1 -0
  181. package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
  182. package/dist/tools/forgecraft-dispatch-extended.js +137 -0
  183. package/dist/tools/forgecraft-dispatch-extended.js.map +1 -1
  184. package/dist/tools/forgecraft-dispatch.d.ts.map +1 -1
  185. package/dist/tools/forgecraft-dispatch.js +16 -0
  186. package/dist/tools/forgecraft-dispatch.js.map +1 -1
  187. package/dist/tools/forgecraft-schema-params.d.ts +174 -2
  188. package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
  189. package/dist/tools/forgecraft-schema-params.js +197 -0
  190. package/dist/tools/forgecraft-schema-params.js.map +1 -1
  191. package/dist/tools/forgecraft-schema.d.ts +179 -7
  192. package/dist/tools/forgecraft-schema.d.ts.map +1 -1
  193. package/dist/tools/forgecraft-schema.js +37 -0
  194. package/dist/tools/forgecraft-schema.js.map +1 -1
  195. package/dist/tools/generate-adr.js +6 -6
  196. package/dist/tools/generate-adr.js.map +1 -1
  197. package/dist/tools/generate-decision.d.ts +77 -0
  198. package/dist/tools/generate-decision.d.ts.map +1 -0
  199. package/dist/tools/generate-decision.js +162 -0
  200. package/dist/tools/generate-decision.js.map +1 -0
  201. package/dist/tools/generate-env-probe.d.ts +49 -0
  202. package/dist/tools/generate-env-probe.d.ts.map +1 -0
  203. package/dist/tools/generate-env-probe.js +365 -0
  204. package/dist/tools/generate-env-probe.js.map +1 -0
  205. package/dist/tools/generate-harness.d.ts +53 -0
  206. package/dist/tools/generate-harness.d.ts.map +1 -0
  207. package/dist/tools/generate-harness.js +395 -0
  208. package/dist/tools/generate-harness.js.map +1 -0
  209. package/dist/tools/generate-roadmap.d.ts +1 -1
  210. package/dist/tools/generate-roadmap.d.ts.map +1 -1
  211. package/dist/tools/generate-roadmap.js +38 -4
  212. package/dist/tools/generate-roadmap.js.map +1 -1
  213. package/dist/tools/generate-session-prompt.d.ts +3 -3
  214. package/dist/tools/generate-session-prompt.d.ts.map +1 -1
  215. package/dist/tools/generate-session-prompt.js +9 -1
  216. package/dist/tools/generate-session-prompt.js.map +1 -1
  217. package/dist/tools/generate-slo-probe.d.ts +53 -0
  218. package/dist/tools/generate-slo-probe.d.ts.map +1 -0
  219. package/dist/tools/generate-slo-probe.js +366 -0
  220. package/dist/tools/generate-slo-probe.js.map +1 -0
  221. package/dist/tools/layer-status-gates.d.ts +24 -0
  222. package/dist/tools/layer-status-gates.d.ts.map +1 -0
  223. package/dist/tools/layer-status-gates.js +151 -0
  224. package/dist/tools/layer-status-gates.js.map +1 -0
  225. package/dist/tools/layer-status.d.ts +126 -0
  226. package/dist/tools/layer-status.d.ts.map +1 -0
  227. package/dist/tools/layer-status.js +647 -0
  228. package/dist/tools/layer-status.js.map +1 -0
  229. package/dist/tools/list.d.ts.map +1 -1
  230. package/dist/tools/list.js +9 -5
  231. package/dist/tools/list.js.map +1 -1
  232. package/dist/tools/postcondition-coverage.d.ts +57 -0
  233. package/dist/tools/postcondition-coverage.d.ts.map +1 -0
  234. package/dist/tools/postcondition-coverage.js +256 -0
  235. package/dist/tools/postcondition-coverage.js.map +1 -0
  236. package/dist/tools/probe-runners.d.ts +21 -0
  237. package/dist/tools/probe-runners.d.ts.map +1 -0
  238. package/dist/tools/probe-runners.js +246 -0
  239. package/dist/tools/probe-runners.js.map +1 -0
  240. package/dist/tools/probe-templates.d.ts +27 -0
  241. package/dist/tools/probe-templates.d.ts.map +1 -0
  242. package/dist/tools/probe-templates.js +279 -0
  243. package/dist/tools/probe-templates.js.map +1 -0
  244. package/dist/tools/propose-session.d.ts +28 -0
  245. package/dist/tools/propose-session.d.ts.map +1 -0
  246. package/dist/tools/propose-session.js +333 -0
  247. package/dist/tools/propose-session.js.map +1 -0
  248. package/dist/tools/refresh-output.js +14 -14
  249. package/dist/tools/review-stubs.d.ts +29 -0
  250. package/dist/tools/review-stubs.d.ts.map +1 -0
  251. package/dist/tools/review-stubs.js +173 -0
  252. package/dist/tools/review-stubs.js.map +1 -0
  253. package/dist/tools/roadmap-builder.d.ts +49 -1
  254. package/dist/tools/roadmap-builder.d.ts.map +1 -1
  255. package/dist/tools/roadmap-builder.js +210 -5
  256. package/dist/tools/roadmap-builder.js.map +1 -1
  257. package/dist/tools/run-env-probe.d.ts +57 -0
  258. package/dist/tools/run-env-probe.d.ts.map +1 -0
  259. package/dist/tools/run-env-probe.js +270 -0
  260. package/dist/tools/run-env-probe.js.map +1 -0
  261. package/dist/tools/run-harness.d.ts +52 -0
  262. package/dist/tools/run-harness.d.ts.map +1 -0
  263. package/dist/tools/run-harness.js +279 -0
  264. package/dist/tools/run-harness.js.map +1 -0
  265. package/dist/tools/run-slo-probe.d.ts +50 -0
  266. package/dist/tools/run-slo-probe.d.ts.map +1 -0
  267. package/dist/tools/run-slo-probe.js +281 -0
  268. package/dist/tools/run-slo-probe.js.map +1 -0
  269. package/dist/tools/scaffold-spec-stubs.js +115 -115
  270. package/dist/tools/scaffold-templates.js +62 -62
  271. package/dist/tools/scaffold-writer.d.ts.map +1 -1
  272. package/dist/tools/scaffold-writer.js +9 -0
  273. package/dist/tools/scaffold-writer.js.map +1 -1
  274. package/dist/tools/score-rubric.d.ts +19 -0
  275. package/dist/tools/score-rubric.d.ts.map +1 -0
  276. package/dist/tools/score-rubric.js +411 -0
  277. package/dist/tools/score-rubric.js.map +1 -0
  278. package/dist/tools/session-prompt-builders.d.ts +20 -0
  279. package/dist/tools/session-prompt-builders.d.ts.map +1 -1
  280. package/dist/tools/session-prompt-builders.js +78 -5
  281. package/dist/tools/session-prompt-builders.js.map +1 -1
  282. package/dist/tools/session-prompt-sections.d.ts +4 -2
  283. package/dist/tools/session-prompt-sections.d.ts.map +1 -1
  284. package/dist/tools/session-prompt-sections.js +22 -10
  285. package/dist/tools/session-prompt-sections.js.map +1 -1
  286. package/dist/tools/setup-artifact-writers.d.ts +69 -4
  287. package/dist/tools/setup-artifact-writers.d.ts.map +1 -1
  288. package/dist/tools/setup-artifact-writers.js +681 -5
  289. package/dist/tools/setup-artifact-writers.js.map +1 -1
  290. package/dist/tools/setup-cnt-builders.d.ts.map +1 -1
  291. package/dist/tools/setup-cnt-builders.js +162 -34
  292. package/dist/tools/setup-cnt-builders.js.map +1 -1
  293. package/dist/tools/setup-monitoring.d.ts +41 -0
  294. package/dist/tools/setup-monitoring.d.ts.map +1 -0
  295. package/dist/tools/setup-monitoring.js +364 -0
  296. package/dist/tools/setup-monitoring.js.map +1 -0
  297. package/dist/tools/setup-phase1.d.ts.map +1 -1
  298. package/dist/tools/setup-phase1.js +14 -1
  299. package/dist/tools/setup-phase1.js.map +1 -1
  300. package/dist/tools/setup-phase2.d.ts +14 -0
  301. package/dist/tools/setup-phase2.d.ts.map +1 -1
  302. package/dist/tools/setup-phase2.js +130 -3
  303. package/dist/tools/setup-phase2.js.map +1 -1
  304. package/dist/tools/setup-project.d.ts +8 -0
  305. package/dist/tools/setup-project.d.ts.map +1 -1
  306. package/dist/tools/setup-project.js +52 -2
  307. package/dist/tools/setup-project.js.map +1 -1
  308. package/dist/tools/spec-parser-tags.d.ts.map +1 -1
  309. package/dist/tools/spec-parser-tags.js +1 -0
  310. package/dist/tools/spec-parser-tags.js.map +1 -1
  311. package/dist/tools/verify-formatter.d.ts.map +1 -1
  312. package/dist/tools/verify-formatter.js +15 -1
  313. package/dist/tools/verify-formatter.js.map +1 -1
  314. package/dist/tools/verify.d.ts.map +1 -1
  315. package/dist/tools/verify.js +3 -0
  316. package/dist/tools/verify.js.map +1 -1
  317. package/package.json +98 -89
  318. package/templates/analytics/instructions.yaml +37 -37
  319. package/templates/analytics/mcp-servers.yaml +11 -11
  320. package/templates/analytics/structure.yaml +25 -25
  321. package/templates/api/harness/uc-template.hurl +20 -0
  322. package/templates/api/instructions.yaml +231 -231
  323. package/templates/api/mcp-servers.yaml +22 -22
  324. package/templates/api/nfr.yaml +23 -23
  325. package/templates/api/review.yaml +103 -103
  326. package/templates/api/structure.yaml +34 -34
  327. package/templates/api/verification.yaml +132 -132
  328. package/templates/cli/instructions.yaml +31 -31
  329. package/templates/cli/mcp-servers.yaml +11 -11
  330. package/templates/cli/review.yaml +53 -53
  331. package/templates/cli/structure.yaml +16 -16
  332. package/templates/data-lineage/instructions.yaml +28 -28
  333. package/templates/data-lineage/mcp-servers.yaml +22 -22
  334. package/templates/data-pipeline/instructions.yaml +84 -84
  335. package/templates/data-pipeline/mcp-servers.yaml +13 -13
  336. package/templates/data-pipeline/nfr.yaml +39 -39
  337. package/templates/data-pipeline/structure.yaml +23 -23
  338. package/templates/docs-manifest.yaml +227 -0
  339. package/templates/fintech/hooks.yaml +55 -55
  340. package/templates/fintech/instructions.yaml +112 -112
  341. package/templates/fintech/mcp-servers.yaml +13 -13
  342. package/templates/fintech/nfr.yaml +46 -46
  343. package/templates/fintech/playbook.yaml +210 -210
  344. package/templates/fintech/verification.yaml +239 -239
  345. package/templates/game/harness/uc-template.sim.ts +29 -0
  346. package/templates/game/instructions.yaml +289 -289
  347. package/templates/game/mcp-servers.yaml +38 -38
  348. package/templates/game/nfr.yaml +64 -64
  349. package/templates/game/playbook.yaml +214 -214
  350. package/templates/game/review.yaml +97 -97
  351. package/templates/game/structure.yaml +67 -67
  352. package/templates/game/verification.yaml +174 -174
  353. package/templates/healthcare/instructions.yaml +42 -42
  354. package/templates/healthcare/mcp-servers.yaml +13 -13
  355. package/templates/healthcare/nfr.yaml +47 -47
  356. package/templates/hipaa/instructions.yaml +41 -41
  357. package/templates/hipaa/mcp-servers.yaml +13 -13
  358. package/templates/infra/instructions.yaml +104 -104
  359. package/templates/infra/mcp-servers.yaml +20 -20
  360. package/templates/infra/nfr.yaml +46 -46
  361. package/templates/infra/review.yaml +65 -65
  362. package/templates/infra/structure.yaml +25 -25
  363. package/templates/library/instructions.yaml +36 -36
  364. package/templates/library/mcp-servers.yaml +20 -20
  365. package/templates/library/review.yaml +56 -56
  366. package/templates/library/structure.yaml +19 -19
  367. package/templates/medallion-architecture/instructions.yaml +41 -41
  368. package/templates/medallion-architecture/mcp-servers.yaml +22 -22
  369. package/templates/ml/instructions.yaml +85 -85
  370. package/templates/ml/mcp-servers.yaml +11 -11
  371. package/templates/ml/nfr.yaml +39 -39
  372. package/templates/ml/structure.yaml +25 -25
  373. package/templates/ml/verification.yaml +156 -156
  374. package/templates/mobile/instructions.yaml +44 -44
  375. package/templates/mobile/mcp-servers.yaml +11 -11
  376. package/templates/mobile/nfr.yaml +49 -49
  377. package/templates/mobile/structure.yaml +27 -27
  378. package/templates/mobile/verification.yaml +121 -121
  379. package/templates/observability-xray/instructions.yaml +40 -40
  380. package/templates/observability-xray/mcp-servers.yaml +15 -15
  381. package/templates/realtime/instructions.yaml +42 -42
  382. package/templates/realtime/mcp-servers.yaml +13 -13
  383. package/templates/soc2/instructions.yaml +41 -41
  384. package/templates/soc2/mcp-servers.yaml +24 -24
  385. package/templates/social/instructions.yaml +43 -43
  386. package/templates/social/mcp-servers.yaml +24 -24
  387. package/templates/state-machine/instructions.yaml +42 -42
  388. package/templates/state-machine/mcp-servers.yaml +11 -11
  389. package/templates/tools-registry.yaml +164 -164
  390. package/templates/universal/claude-md-blocks/layer-navigation.md +20 -0
  391. package/templates/universal/claude-md-blocks/nfr-contracts.md +22 -0
  392. package/templates/universal/hooks.yaml +879 -723
  393. package/templates/universal/instructions.yaml +1692 -1692
  394. package/templates/universal/mcp-servers.yaml +50 -50
  395. package/templates/universal/nfr.yaml +197 -197
  396. package/templates/universal/reference.yaml +326 -326
  397. package/templates/universal/review.yaml +204 -204
  398. package/templates/universal/skills.yaml +262 -262
  399. package/templates/universal/structure.yaml +67 -67
  400. package/templates/universal/verification.yaml +416 -416
  401. package/templates/web-next/hooks.yaml +114 -0
  402. package/templates/web-next/instructions.yaml +106 -0
  403. package/templates/web-react/harness/uc-template.spec.ts +35 -0
  404. package/templates/web-react/hooks.yaml +156 -44
  405. package/templates/web-react/instructions.yaml +296 -207
  406. package/templates/web-react/mcp-servers.yaml +20 -20
  407. package/templates/web-react/nfr.yaml +27 -27
  408. package/templates/web-react/review.yaml +94 -94
  409. package/templates/web-react/structure.yaml +46 -46
  410. package/templates/web-react/verification.yaml +126 -126
  411. package/templates/web-static/hooks.yaml +85 -0
  412. package/templates/web-static/instructions.yaml +204 -115
  413. package/templates/web-static/mcp-servers.yaml +20 -20
  414. package/templates/web3/instructions.yaml +44 -44
  415. package/templates/web3/mcp-servers.yaml +11 -11
  416. package/templates/web3/verification.yaml +159 -159
  417. package/templates/zero-trust/instructions.yaml +41 -41
  418. package/templates/zero-trust/mcp-servers.yaml +15 -15
@@ -0,0 +1,410 @@
1
+ /**
2
+ * extract_adrs_from_spec tool handler.
3
+ *
4
+ * Reads a project specification file and derives ADR stubs from technology
5
+ * decisions described within it. Unlike extract_adrs_from_history (which walks
6
+ * git log for brownfield projects), this tool is for greenfield projects where
7
+ * all architectural decisions are encoded in the spec before implementation begins.
8
+ *
9
+ * Each generated ADR includes the actual spec excerpt as context — making the
10
+ * artifact genuinely derived from the spec, not a generic placeholder.
11
+ */
12
+ import { z } from "zod";
13
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, } from "node:fs";
14
+ import { join } from "node:path";
15
+ // ── Schema ───────────────────────────────────────────────────────────
16
+ export const extractAdrsFromSpecSchema = z.object({
17
+ project_dir: z
18
+ .string()
19
+ .describe("Absolute path to the project root directory."),
20
+ spec_path: z
21
+ .string()
22
+ .optional()
23
+ .describe("Path to the specification file. Auto-detected from docs/PRD.md, docs/TechSpec.md, " +
24
+ "docs/spec.md if omitted."),
25
+ max_adrs: z
26
+ .number()
27
+ .int()
28
+ .min(1)
29
+ .max(20)
30
+ .optional()
31
+ .describe("Maximum number of ADR files to generate. Default: 10."),
32
+ });
33
+ // ── Spec discovery ───────────────────────────────────────────────────
34
+ const SPEC_CANDIDATE_PATHS = [
35
+ "docs/PRD.md",
36
+ "docs/TechSpec.md",
37
+ "docs/tech-spec.md",
38
+ "docs/functional-spec.md",
39
+ "docs/spec.md",
40
+ "SPEC.md",
41
+ ];
42
+ function resolveSpecPath(projectDir, specPath) {
43
+ if (specPath) {
44
+ const full = specPath.startsWith("/") || specPath.match(/^[A-Za-z]:/)
45
+ ? specPath
46
+ : join(projectDir, specPath);
47
+ return existsSync(full) ? full : null;
48
+ }
49
+ for (const p of SPEC_CANDIDATE_PATHS) {
50
+ const full = join(projectDir, p);
51
+ if (existsSync(full))
52
+ return full;
53
+ }
54
+ return null;
55
+ }
56
+ // ── ADR directory resolution ─────────────────────────────────────────
57
+ function resolveAdrDir(projectDir) {
58
+ const active = join(projectDir, "docs", "adrs", "active");
59
+ if (existsSync(active))
60
+ return active;
61
+ const legacy = join(projectDir, "docs", "adrs");
62
+ if (existsSync(legacy))
63
+ return legacy;
64
+ const adr = join(projectDir, "docs", "adr");
65
+ if (existsSync(adr))
66
+ return adr;
67
+ return join(projectDir, "docs", "adrs", "active");
68
+ }
69
+ function nextAdrNumber(adrDir) {
70
+ if (!existsSync(adrDir))
71
+ return 1;
72
+ const files = readdirSync(adrDir).filter((f) => /^\d/.test(f) || /^adr/i.test(f));
73
+ if (files.length === 0)
74
+ return 1;
75
+ const nums = files
76
+ .map((f) => parseInt(f.replace(/\D.*/, ""), 10))
77
+ .filter((n) => !isNaN(n));
78
+ return nums.length > 0 ? Math.max(...nums) + 1 : 1;
79
+ }
80
+ function slugExists(adrDir, slug) {
81
+ if (!existsSync(adrDir))
82
+ return false;
83
+ return readdirSync(adrDir).some((f) => f.includes(slug));
84
+ }
85
+ // ── Spec parsing ─────────────────────────────────────────────────────
86
+ /** Extract a section and its content up to the next same-or-higher-level header. */
87
+ function extractSection(content, headerPattern) {
88
+ const match = content.match(headerPattern);
89
+ if (!match || match.index === undefined)
90
+ return null;
91
+ const start = match.index;
92
+ const level = (match[1] ?? "#").length; // heading level from the hash count
93
+ const afterStart = content.slice(start + match[0].length);
94
+ // Find next header of same or higher level
95
+ const nextHeader = new RegExp(`^#{1,${level}}\\s`, "m");
96
+ const end = afterStart.search(nextHeader);
97
+ return end >= 0
98
+ ? content.slice(start, start + match[0].length + end).trim()
99
+ : content.slice(start).trim();
100
+ }
101
+ function parseTechTable(sectionText) {
102
+ const rows = [];
103
+ const lines = sectionText.split("\n");
104
+ for (const line of lines) {
105
+ if (!line.startsWith("|"))
106
+ continue;
107
+ const cells = line
108
+ .split("|")
109
+ .map((c) => c.trim())
110
+ .filter(Boolean);
111
+ if (cells.length < 2)
112
+ continue;
113
+ if (cells[0]?.match(/^[-:]+$/))
114
+ continue; // separator row
115
+ if (cells[0]?.toLowerCase() === "layer" ||
116
+ cells[0]?.toLowerCase() === "component")
117
+ continue;
118
+ rows.push({
119
+ layer: cells[0] ?? "",
120
+ technology: cells[1] ?? "",
121
+ notes: cells[2] ?? "",
122
+ });
123
+ }
124
+ return rows;
125
+ }
126
+ const DECISION_PATTERNS = [
127
+ /(?:we\s+)?(?:chose|selected|adopted|use|using|decided\s+(?:on|to\s+use))\s+([\w/+.-]+(?:\s+[\w/+.-]+)?)\s+(?:because|for|over|instead|as)\s+(.{10,120})/gi,
128
+ /([\w/+.-]+)\s+(?:over|instead\s+of)\s+([\w/+.-]+)\s+because\s+(.{10,120})/gi,
129
+ ];
130
+ function extractExplicitDecisions(content) {
131
+ const decisions = [];
132
+ for (const pattern of DECISION_PATTERNS) {
133
+ pattern.lastIndex = 0;
134
+ let m;
135
+ while ((m = pattern.exec(content)) !== null) {
136
+ decisions.push({
137
+ sentence: m[0].slice(0, 200).trim(),
138
+ technology: (m[1] ?? "").trim(),
139
+ rationale: (m[2] ?? m[3] ?? "").trim(),
140
+ });
141
+ }
142
+ }
143
+ return decisions.slice(0, 5);
144
+ }
145
+ // ── ADR candidate builder ─────────────────────────────────────────────
146
+ /**
147
+ * Technology clusters: map technology keywords to ADR categories.
148
+ * First matching cluster wins.
149
+ */
150
+ const TECH_CLUSTERS = [
151
+ {
152
+ slug: "ai-integration",
153
+ titleTemplate: (t) => `AI/LLM Integration — ${t.slice(0, 2).join(" + ")}`,
154
+ keywords: /\b(openai|anthropic|claude|gpt|llm|langchain|hugging\s?face|embedding|vector|pgvector|rag|ai\s*\/?\s*llm)\b/i,
155
+ category: "AI and LLM integration",
156
+ },
157
+ {
158
+ slug: "auth-strategy",
159
+ titleTemplate: (t) => `Authentication Strategy — ${t.slice(0, 2).join(" + ")}`,
160
+ keywords: /\b(jwt|auth|oauth|sso|identity|nextauth|clerk|supabase\s+auth|cognito|auth0|bcrypt|session)\b/i,
161
+ category: "authentication and authorization",
162
+ },
163
+ {
164
+ slug: "database",
165
+ titleTemplate: (t) => `Database Selection — ${t.slice(0, 2).join(" + ")}`,
166
+ keywords: /\b(postgresql|mysql|mongodb|redis|sqlite|supabase|prisma|drizzle|typeorm|sequelize|firebase|dynamo|neon|planetscale)\b/i,
167
+ category: "database and persistence",
168
+ },
169
+ {
170
+ slug: "deployment",
171
+ titleTemplate: (t) => `Deployment Strategy — ${t.slice(0, 2).join(" + ")}`,
172
+ keywords: /\b(railway|vercel|fly\.io|render|heroku|aws|gcp|azure|docker|kubernetes|k8s|cloudflare|lambda)\b/i,
173
+ category: "deployment and infrastructure",
174
+ },
175
+ {
176
+ slug: "testing-strategy",
177
+ titleTemplate: (t) => `Testing Strategy — ${t.slice(0, 2).join(" + ")}`,
178
+ keywords: /\b(vitest|jest|playwright|cypress|testing-library|storybook|mocha|supertest|hurl)\b/i,
179
+ category: "testing tools and approach",
180
+ },
181
+ ];
182
+ const STACK_KEYWORDS = /\b(next\.?js|nestjs|express|fastify|react|vue|angular|svelte|nuxt|remix|django|flask|fastapi|rails|spring|laravel|node\.?js|typescript|python|go|rust|java|kotlin)\b/i;
183
+ function buildAdrCandidates(tableRows, explicitDecisions, specExcerpt, specRelPath) {
184
+ const candidates = [];
185
+ // Group table rows by cluster
186
+ const clusterBuckets = new Map();
187
+ const stackRows = [];
188
+ for (const row of tableRows) {
189
+ const combined = `${row.layer} ${row.technology} ${row.notes}`;
190
+ let matched = false;
191
+ for (const cluster of TECH_CLUSTERS) {
192
+ if (cluster.keywords.test(combined)) {
193
+ if (!clusterBuckets.has(cluster.slug))
194
+ clusterBuckets.set(cluster.slug, []);
195
+ clusterBuckets.get(cluster.slug).push(row);
196
+ matched = true;
197
+ break;
198
+ }
199
+ }
200
+ if (!matched && STACK_KEYWORDS.test(combined)) {
201
+ stackRows.push(row);
202
+ }
203
+ }
204
+ // Stack selection ADR (covers frontend + backend layers not captured by specific clusters)
205
+ const stackEntries = [...stackRows];
206
+ if (stackEntries.length > 0) {
207
+ const techs = stackEntries
208
+ .map((r) => r.technology.split(/[+,]/)[0].trim())
209
+ .slice(0, 4);
210
+ const tableMarkdown = stackEntries
211
+ .map((r) => `| ${r.layer} | ${r.technology} | ${r.notes} |`)
212
+ .join("\n");
213
+ candidates.push({
214
+ slug: "stack-selection",
215
+ title: `Stack Selection — ${techs.join(" + ")}`,
216
+ context: [
217
+ `This decision was identified from the project specification (${specRelPath}).`,
218
+ `The following technology layers were declared in the spec:`,
219
+ "",
220
+ "| Layer | Technology | Notes |",
221
+ "|-------|-----------|-------|",
222
+ tableMarkdown,
223
+ ].join("\n"),
224
+ decision: `The project uses ${techs.join(", ")} as stated in the specification.`,
225
+ consequences: [
226
+ "**Positive:** technology choices are explicit and captured before implementation begins.",
227
+ "**Risk:** any deviation from these choices requires a superseding ADR.",
228
+ "**Action:** verify these choices still hold before implementation — update this ADR if the spec was updated after scaffold.",
229
+ ].join("\n"),
230
+ specExcerpt,
231
+ });
232
+ }
233
+ // One ADR per detected cluster
234
+ for (const cluster of TECH_CLUSTERS) {
235
+ const rows = clusterBuckets.get(cluster.slug) ?? [];
236
+ if (rows.length === 0)
237
+ continue;
238
+ const techs = rows.map((r) => r.technology.split(/[+,]/)[0].trim());
239
+ const tableMarkdown = rows
240
+ .map((r) => `| ${r.layer} | ${r.technology} | ${r.notes} |`)
241
+ .join("\n");
242
+ candidates.push({
243
+ slug: cluster.slug,
244
+ title: cluster.titleTemplate(techs),
245
+ context: [
246
+ `This decision concerns ${cluster.category} in this project.`,
247
+ `Source: ${specRelPath}`,
248
+ "",
249
+ "| Layer | Technology | Notes |",
250
+ "|-------|-----------|-------|",
251
+ tableMarkdown,
252
+ ].join("\n"),
253
+ decision: rows
254
+ .map((r) => `- **${r.layer}:** ${r.technology}${r.notes ? ` (${r.notes})` : ""}`)
255
+ .join("\n"),
256
+ consequences: [
257
+ `**Positive:** ${cluster.category} is explicitly documented before implementation.`,
258
+ "**Risk:** changing these choices mid-project requires updating dependent ADRs and tests.",
259
+ "**Action:** verify these choices against current project state.",
260
+ ].join("\n"),
261
+ specExcerpt,
262
+ });
263
+ }
264
+ // One ADR per explicit decision sentence (if not already captured)
265
+ for (const d of explicitDecisions) {
266
+ if (candidates.some((c) => c.slug.includes(d.technology.toLowerCase().slice(0, 6))))
267
+ continue;
268
+ candidates.push({
269
+ slug: `decision-${d.technology
270
+ .toLowerCase()
271
+ .replace(/[^a-z0-9]/g, "-")
272
+ .slice(0, 30)}`,
273
+ title: `Decision — ${d.technology}`,
274
+ context: `Explicitly stated in the specification (${specRelPath}):\n\n> "${d.sentence}"`,
275
+ decision: `${d.technology}: ${d.rationale}`,
276
+ consequences: [
277
+ "**Positive:** explicit decision recorded before implementation.",
278
+ "**Action:** verify this decision is still current.",
279
+ ].join("\n"),
280
+ specExcerpt: d.sentence,
281
+ });
282
+ }
283
+ return candidates;
284
+ }
285
+ // ── ADR file writer ───────────────────────────────────────────────────
286
+ function buildAdrContent(num, candidate, date) {
287
+ const numStr = String(num).padStart(4, "0");
288
+ return [
289
+ `# ADR-${numStr}: ${candidate.title}`,
290
+ "",
291
+ `**Status:** Retroactive`,
292
+ `**Date:** ${date}`,
293
+ `**Deciders:** Project team`,
294
+ `**Source:** Derived from specification`,
295
+ "",
296
+ "---",
297
+ "",
298
+ "## Context",
299
+ "",
300
+ candidate.context,
301
+ "",
302
+ "## Decision",
303
+ "",
304
+ candidate.decision,
305
+ "",
306
+ "## Consequences",
307
+ "",
308
+ candidate.consequences,
309
+ "",
310
+ "## Spec Excerpt",
311
+ "",
312
+ "```",
313
+ candidate.specExcerpt.slice(0, 400).trim(),
314
+ "```",
315
+ "",
316
+ "> This ADR was retroactively recorded from the project specification.",
317
+ "> Review and expand with team context before implementation begins.",
318
+ "",
319
+ ].join("\n");
320
+ }
321
+ // ── Handler ──────────────────────────────────────────────────────────
322
+ export async function extractAdrsFromSpecHandler(args) {
323
+ const { project_dir, spec_path, max_adrs = 10 } = args;
324
+ const specFile = resolveSpecPath(project_dir, spec_path);
325
+ if (!specFile) {
326
+ return {
327
+ content: [
328
+ {
329
+ type: "text",
330
+ text: "No specification file found. Pass `spec_path` or create one of: " +
331
+ SPEC_CANDIDATE_PATHS.join(", "),
332
+ },
333
+ ],
334
+ };
335
+ }
336
+ const specContent = readFileSync(specFile, "utf-8");
337
+ const specRelPath = specFile
338
+ .replace(project_dir.replace(/\\/g, "/"), "")
339
+ .replace(/\\/g, "/")
340
+ .replace(/^\//, "");
341
+ // Find tech stack section
342
+ const techSectionPattern = /^(#{1,3})\s+(?:\d+\.\s+)?(?:tech(?:nology)?(?:\s+stack)?|stack|architecture|infrastructure|frameworks?)\s*$/im;
343
+ const techSection = extractSection(specContent, techSectionPattern) ?? "";
344
+ const tableRows = parseTechTable(techSection || specContent.slice(0, 3000));
345
+ const explicitDecisions = extractExplicitDecisions(specContent);
346
+ // Use first 1000 chars of tech section as the common spec excerpt
347
+ const specExcerpt = (techSection || specContent).slice(0, 1000).trim();
348
+ const candidates = buildAdrCandidates(tableRows, explicitDecisions, specExcerpt, specRelPath).slice(0, max_adrs);
349
+ if (candidates.length === 0) {
350
+ return {
351
+ content: [
352
+ {
353
+ type: "text",
354
+ text: `No technology decisions detected in ${specRelPath}.\n\n` +
355
+ "ForgeCraft looks for: tech stack tables, bullet lists in architecture sections, " +
356
+ "and explicit 'chose X because Y' language.\n\n" +
357
+ "Consider using `generate_adr` to write ADRs manually from the spec.",
358
+ },
359
+ ],
360
+ };
361
+ }
362
+ const adrDir = resolveAdrDir(project_dir);
363
+ mkdirSync(adrDir, { recursive: true });
364
+ const date = new Date().toISOString().split("T")[0];
365
+ const written = [];
366
+ const skipped = [];
367
+ let nextNum = nextAdrNumber(adrDir);
368
+ for (const candidate of candidates) {
369
+ if (slugExists(adrDir, candidate.slug)) {
370
+ skipped.push(candidate.slug);
371
+ continue;
372
+ }
373
+ const numStr = String(nextNum).padStart(4, "0");
374
+ const filename = `${numStr}-${candidate.slug}.md`;
375
+ const filepath = join(adrDir, filename);
376
+ writeFileSync(filepath, buildAdrContent(nextNum, candidate, date), "utf-8");
377
+ written.push(filename);
378
+ nextNum++;
379
+ }
380
+ const adrRelDir = adrDir
381
+ .replace(project_dir.replace(/\\/g, "/"), "")
382
+ .replace(/\\/g, "/")
383
+ .replace(/^\//, "");
384
+ const lines = [
385
+ `## ADRs Extracted from Spec`,
386
+ "",
387
+ `**Source:** \`${specRelPath}\``,
388
+ `**Output:** \`${adrRelDir}/\``,
389
+ "",
390
+ written.length > 0
391
+ ? `**Created (${written.length}):**\n${written.map((f) => `- \`${f}\``).join("\n")}`
392
+ : "**Created:** none",
393
+ "",
394
+ skipped.length > 0
395
+ ? `**Skipped (${skipped.length}, already exist):**\n${skipped.map((s) => `- \`${s}\``).join("\n")}`
396
+ : "",
397
+ "",
398
+ "Each ADR contains the spec excerpt as context and is marked **Retroactive**.",
399
+ "Review and expand with team rationale before implementation begins.",
400
+ "",
401
+ "**Next steps:**",
402
+ "1. Open each ADR and confirm the decision is still current",
403
+ "2. Add alternatives considered and rejection rationale",
404
+ "3. Run `check_cascade` — ADRs now satisfy cascade step 4",
405
+ ].filter((l) => l !== undefined);
406
+ return {
407
+ content: [{ type: "text", text: lines.join("\n") }],
408
+ };
409
+ }
410
+ //# sourceMappingURL=extract-adrs-from-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-adrs-from-spec.js","sourceRoot":"","sources":["../../src/tools/extract-adrs-from-spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * extract_adrs_from_history tool handler.
3
+ *
4
+ * Scans git log for architectural decision candidates and emits
5
+ * retroactive ADR stubs into docs/adrs/active/.
6
+ *
7
+ * Uses heuristics:
8
+ * - Commit message keywords: "switch to", "replace", "adopt", "migrate",
9
+ * "chose", "use X instead", "move from", "change from", "refactor to"
10
+ * - Large feat/refactor commits (≥ threshold files changed)
11
+ * - Merge commit PR titles that describe architectural choices
12
+ *
13
+ * Each stub has Status: Retroactive and the commit date/message pre-filled.
14
+ * Practitioners resolve [NEEDS CLARIFICATION] sections after review.
15
+ *
16
+ * Idempotent: skips commits whose slug already exists in docs/adrs/active/.
17
+ */
18
+ import type { ToolResult } from "../shared/types.js";
19
+ export interface CommitCandidate {
20
+ readonly hash: string;
21
+ readonly date: string;
22
+ readonly subject: string;
23
+ readonly filesChanged: number;
24
+ readonly reason: string;
25
+ }
26
+ export interface ExtractAdrsHistoryInput {
27
+ readonly project_dir: string;
28
+ /** Max candidates to return (default 10, to avoid flooding). */
29
+ readonly max_candidates?: number;
30
+ /** Min files changed to flag a large commit (default 5). */
31
+ readonly large_commit_threshold?: number;
32
+ /** Branch or ref to walk (default: HEAD). */
33
+ readonly ref?: string;
34
+ }
35
+ /**
36
+ * Run git log and return candidates for architectural decisions.
37
+ * Non-throwing — returns empty array when not a git repo or git unavailable.
38
+ */
39
+ export declare function findArchDecisionCandidates(projectDir: string, maxCandidates: number, largeCommitThreshold: number, ref: string): CommitCandidate[];
40
+ /**
41
+ * Scan git history for architectural decisions and emit retroactive ADR stubs.
42
+ *
43
+ * @param args - Input with project_dir and optional config
44
+ * @returns MCP tool result with written/skipped counts and candidate list
45
+ */
46
+ export declare function extractAdrsFromHistoryHandler(args: ExtractAdrsHistoryInput): Promise<ToolResult>;
47
+ //# sourceMappingURL=extract-adrs-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-adrs-history.d.ts","sourceRoot":"","sources":["../../src/tools/extract-adrs-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAuCD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,oBAAoB,EAAE,MAAM,EAC5B,GAAG,EAAE,MAAM,GACV,eAAe,EAAE,CAsDnB;AAwFD;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,UAAU,CAAC,CAuHrB"}