@maycombhq/atticus 0.0.0-stage → 2.0.0-beta.3

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 (475) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +17 -2
  3. package/THIRD-PARTY-LICENSES.txt +2607 -0
  4. package/dist/bin.js +47 -0
  5. package/dist/chunk-23W7VWKR.js +2609 -0
  6. package/dist/chunk-2C5B464C.js +106 -0
  7. package/dist/chunk-2LLFKP7C.js +53 -0
  8. package/dist/chunk-2MD7TXSG.js +166 -0
  9. package/dist/chunk-2UIQBDJO.js +131 -0
  10. package/dist/chunk-32MPK524.js +378 -0
  11. package/dist/chunk-3ALD2W2A.js +95 -0
  12. package/dist/chunk-3G4YI4ZU.js +16 -0
  13. package/dist/chunk-4AK7IBVP.js +915 -0
  14. package/dist/chunk-4BMDGTED.js +69 -0
  15. package/dist/chunk-4NDAAFQT.js +103 -0
  16. package/dist/chunk-4Q3NN7VF.js +32 -0
  17. package/dist/chunk-4RS5KZQD.js +25 -0
  18. package/dist/chunk-4SKZDI62.js +22 -0
  19. package/dist/chunk-55YODD3N.js +385 -0
  20. package/dist/chunk-56YQ6ROQ.js +3479 -0
  21. package/dist/chunk-5A5L3T2U.js +583 -0
  22. package/dist/chunk-5FEOD73Z.js +374 -0
  23. package/dist/chunk-5GDRCDQB.js +32 -0
  24. package/dist/chunk-5WS2YOGD.js +95 -0
  25. package/dist/chunk-65NYPGRC.js +766 -0
  26. package/dist/chunk-6BVONWJ7.js +50 -0
  27. package/dist/chunk-6D4FRTFF.js +53 -0
  28. package/dist/chunk-6GPJOFV4.js +149 -0
  29. package/dist/chunk-6JCPI55B.js +92 -0
  30. package/dist/chunk-6JUBZBMW.js +56 -0
  31. package/dist/chunk-6SCVQZX5.js +2522 -0
  32. package/dist/chunk-6TACQN3N.js +41 -0
  33. package/dist/chunk-72TXNLOC.js +496 -0
  34. package/dist/chunk-76WKMA4J.js +14 -0
  35. package/dist/chunk-7EFILTCI.js +67 -0
  36. package/dist/chunk-7EKXJZ2Y.js +2902 -0
  37. package/dist/chunk-7EOBHUMC.js +133 -0
  38. package/dist/chunk-7JUKDRSZ.js +1726 -0
  39. package/dist/chunk-7NN5VWDC.js +43 -0
  40. package/dist/chunk-7UFQZXZA.js +5949 -0
  41. package/dist/chunk-A3KPZJ5M.js +131 -0
  42. package/dist/chunk-A6AC72A5.js +48 -0
  43. package/dist/chunk-A7KZKIZX.js +166 -0
  44. package/dist/chunk-ABWHYWNI.js +101 -0
  45. package/dist/chunk-AFFIK6JI.js +46 -0
  46. package/dist/chunk-AHOQZ4OK.js +37 -0
  47. package/dist/chunk-AVJDSJ2F.js +18 -0
  48. package/dist/chunk-AXXCPAP6.js +203 -0
  49. package/dist/chunk-AY3QXYMB.js +41 -0
  50. package/dist/chunk-B2OKWJIU.js +143 -0
  51. package/dist/chunk-B632FH3I.js +251 -0
  52. package/dist/chunk-BLW4SXCU.js +38 -0
  53. package/dist/chunk-BVS2K73A.js +33 -0
  54. package/dist/chunk-BWZ77RQT.js +25 -0
  55. package/dist/chunk-BYBUDX4T.js +163 -0
  56. package/dist/chunk-BYZCY6SP.js +230 -0
  57. package/dist/chunk-C6EKFH7J.js +169 -0
  58. package/dist/chunk-C6MZFGN7.js +271 -0
  59. package/dist/chunk-CAQZUNOH.js +1150 -0
  60. package/dist/chunk-CD4XHYGY.js +856 -0
  61. package/dist/chunk-CEZQOLEO.js +1217 -0
  62. package/dist/chunk-CHWTETW7.js +128 -0
  63. package/dist/chunk-CMV7TGU6.js +31 -0
  64. package/dist/chunk-CNUKCS2T.js +2741 -0
  65. package/dist/chunk-CP3L3FH7.js +549 -0
  66. package/dist/chunk-CPGCA6GZ.js +41 -0
  67. package/dist/chunk-CWM6KM5G.js +315 -0
  68. package/dist/chunk-CXDSTRUJ.js +873 -0
  69. package/dist/chunk-D3PO4DOZ.js +261 -0
  70. package/dist/chunk-DFBCSHVT.js +69 -0
  71. package/dist/chunk-DHPACDG7.js +104 -0
  72. package/dist/chunk-DPC5Y5DL.js +3898 -0
  73. package/dist/chunk-DPUYDDQG.js +164 -0
  74. package/dist/chunk-DQN7TF5D.js +325 -0
  75. package/dist/chunk-EADP3PEN.js +450 -0
  76. package/dist/chunk-ED2LWWIP.js +878 -0
  77. package/dist/chunk-EHVTK3UE.js +116 -0
  78. package/dist/chunk-EPTBZ3GP.js +101 -0
  79. package/dist/chunk-EXIMEJ2X.js +545 -0
  80. package/dist/chunk-EYWIDJFU.js +130 -0
  81. package/dist/chunk-F44OMYIN.js +54 -0
  82. package/dist/chunk-F7HYOUFF.js +287 -0
  83. package/dist/chunk-FALXWAMD.js +182 -0
  84. package/dist/chunk-FBNPE7HS.js +49 -0
  85. package/dist/chunk-FSWUD5QB.js +108 -0
  86. package/dist/chunk-FVQISWPW.js +296 -0
  87. package/dist/chunk-G2B4ZQGH.js +240 -0
  88. package/dist/chunk-GK6XK5SP.js +1227 -0
  89. package/dist/chunk-GLEBK5L3.js +34 -0
  90. package/dist/chunk-GNB5QDDI.js +25 -0
  91. package/dist/chunk-GQ4N4WKF.js +1142 -0
  92. package/dist/chunk-GRMR5TRQ.js +119 -0
  93. package/dist/chunk-HC6XKREB.js +334 -0
  94. package/dist/chunk-HFQCFSJR.js +60 -0
  95. package/dist/chunk-HJDICQA4.js +102 -0
  96. package/dist/chunk-HLJAXMM4.js +233 -0
  97. package/dist/chunk-HVIMMDVB.js +162 -0
  98. package/dist/chunk-HZVLAPN5.js +32 -0
  99. package/dist/chunk-I3E7CX4H.js +155 -0
  100. package/dist/chunk-IQFTZ37C.js +2919 -0
  101. package/dist/chunk-ITY3VJRX.js +285 -0
  102. package/dist/chunk-JBTK5OP2.js +55 -0
  103. package/dist/chunk-JPGCERE2.js +26 -0
  104. package/dist/chunk-JQDNHIBC.js +38 -0
  105. package/dist/chunk-JRBCWLOR.js +307 -0
  106. package/dist/chunk-JRZQA2JM.js +212 -0
  107. package/dist/chunk-KCBJCA66.js +45 -0
  108. package/dist/chunk-KJPMEAI4.js +705 -0
  109. package/dist/chunk-KQDZXGNR.js +14 -0
  110. package/dist/chunk-KUUQR4HA.js +264 -0
  111. package/dist/chunk-L24C55VN.js +7923 -0
  112. package/dist/chunk-L3BX5ZIB.js +400 -0
  113. package/dist/chunk-L6SGQIR3.js +471 -0
  114. package/dist/chunk-LBENYT3H.js +66 -0
  115. package/dist/chunk-LNAJW6FB.js +47 -0
  116. package/dist/chunk-MC3H7736.js +19910 -0
  117. package/dist/chunk-MMOSZPWJ.js +273 -0
  118. package/dist/chunk-MXCHWULV.js +285 -0
  119. package/dist/chunk-N3E56YPN.js +344 -0
  120. package/dist/chunk-NHFQMOVK.js +180 -0
  121. package/dist/chunk-NQU6KNQF.js +27 -0
  122. package/dist/chunk-OIK5YPTN.js +391 -0
  123. package/dist/chunk-OLWFG75W.js +4330 -0
  124. package/dist/chunk-ONPUIE7Y.js +29 -0
  125. package/dist/chunk-OW7D2PJL.js +376 -0
  126. package/dist/chunk-P63VL4HE.js +2357 -0
  127. package/dist/chunk-PA4YNUMU.js +45 -0
  128. package/dist/chunk-PAMPPUR6.js +4500 -0
  129. package/dist/chunk-PBS3OFNN.js +113 -0
  130. package/dist/chunk-PFT3VTS4.js +214 -0
  131. package/dist/chunk-PFTA6BZF.js +49 -0
  132. package/dist/chunk-PNN5KLAY.js +119 -0
  133. package/dist/chunk-PRPPGYZG.js +104 -0
  134. package/dist/chunk-PUKEZ37F.js +666 -0
  135. package/dist/chunk-Q3HOFXZJ.js +76 -0
  136. package/dist/chunk-Q5AMFEWD.js +119 -0
  137. package/dist/chunk-QKRNMBJO.js +80 -0
  138. package/dist/chunk-QSU47IQ5.js +36 -0
  139. package/dist/chunk-QSXK2RGH.js +688 -0
  140. package/dist/chunk-QXNWYUYI.js +52 -0
  141. package/dist/chunk-R6RY4Q5T.js +51 -0
  142. package/dist/chunk-RCU3MPY2.js +1496 -0
  143. package/dist/chunk-RLIB4JUN.js +174 -0
  144. package/dist/chunk-RYSCLMU3.js +1991 -0
  145. package/dist/chunk-RZUZ4RJJ.js +415 -0
  146. package/dist/chunk-S2A7YC3Q.js +41433 -0
  147. package/dist/chunk-S2FBBX7D.js +540 -0
  148. package/dist/chunk-S34B4QPI.js +430 -0
  149. package/dist/chunk-SETWVXOJ.js +2078 -0
  150. package/dist/chunk-SMA4N4AC.js +211 -0
  151. package/dist/chunk-SP2I63OO.js +252 -0
  152. package/dist/chunk-STHSY74Q.js +242 -0
  153. package/dist/chunk-STUPFGXY.js +3206 -0
  154. package/dist/chunk-T5I4S2W3.js +34 -0
  155. package/dist/chunk-T6AIP7H5.js +3851 -0
  156. package/dist/chunk-TANFV3MZ.js +531 -0
  157. package/dist/chunk-TAVDMUV3.js +189 -0
  158. package/dist/chunk-TBSQJ6IV.js +324 -0
  159. package/dist/chunk-TIZHP7KE.js +408 -0
  160. package/dist/chunk-TV45EUGM.js +51 -0
  161. package/dist/chunk-TW2KPPUC.js +4087 -0
  162. package/dist/chunk-V2YTAIQO.js +1075 -0
  163. package/dist/chunk-V5PKHHQQ.js +1963 -0
  164. package/dist/chunk-VF4IOZZO.js +184 -0
  165. package/dist/chunk-VJTINHZI.js +48 -0
  166. package/dist/chunk-VKLILA2D.js +205 -0
  167. package/dist/chunk-VOGCSYOI.js +16 -0
  168. package/dist/chunk-VPTTCYOC.js +16101 -0
  169. package/dist/chunk-WY6PP6AA.js +53 -0
  170. package/dist/chunk-WYFIXP54.js +174 -0
  171. package/dist/chunk-WZ2BXIGG.js +34 -0
  172. package/dist/chunk-XJNDSYGO.js +147 -0
  173. package/dist/chunk-XPCM366L.js +70 -0
  174. package/dist/chunk-XSQKGVYA.js +69 -0
  175. package/dist/chunk-XUPVB7TL.js +207 -0
  176. package/dist/chunk-XZRON6IV.js +131 -0
  177. package/dist/chunk-Y4NG2FP5.js +94 -0
  178. package/dist/chunk-YEDDOYSC.js +27809 -0
  179. package/dist/chunk-YGMCXNTY.js +41 -0
  180. package/dist/chunk-YJKPTX6J.js +228 -0
  181. package/dist/chunk-YMZ3TNYB.js +18 -0
  182. package/dist/chunk-Z6LF7HQN.js +22 -0
  183. package/dist/chunk-Z7SG32ZY.js +55 -0
  184. package/dist/chunk-ZDPAS56H.js +76 -0
  185. package/dist/chunk-ZJSP24X4.js +1247 -0
  186. package/dist/chunk-ZMAINWBW.js +18 -0
  187. package/dist/chunk-ZMFPW66A.js +22 -0
  188. package/dist/chunk-ZUIAOKXI.js +1611 -0
  189. package/dist/chunk-ZVM6AKKM.js +47 -0
  190. package/dist/files.json +1888 -0
  191. package/dist/fixtures/forge/README.md +19 -0
  192. package/dist/fixtures/forge/expected/discrepancies.yaml +54 -0
  193. package/dist/fixtures/forge/expected/inputs.yaml +38 -0
  194. package/dist/fixtures/forge/expected/scan.yaml +342 -0
  195. package/dist/fixtures/forge/inputs/diagrams/forge-context.drawio +23 -0
  196. package/dist/fixtures/forge/inputs/partner-specs/northwind-pay-openapi.yaml +11 -0
  197. package/dist/fixtures/forge/inputs/tickets/ado-stories.json +4 -0
  198. package/dist/fixtures/forge/inputs/tickets/closed-service-requests.json +5 -0
  199. package/dist/fixtures/forge/inputs/wiki/integration-patterns.md +11 -0
  200. package/dist/fixtures/forge/inputs/wiki/ledger-solution-spec.md +9 -0
  201. package/dist/fixtures/forge/inputs/wiki/snow-firewall-request.md +4 -0
  202. package/dist/fixtures/forge/metarepo/judgments/reaches/84af5b6af24f7ca8c23013f3.yaml +17 -0
  203. package/dist/fixtures/forge/metarepo/judgments/reaches/c3917555edebddce8cecb647.yaml +17 -0
  204. package/dist/fixtures/forge/metarepo/judgments/reaches/c5fafd6601f8ca9e34e0bbd0.yaml +17 -0
  205. package/dist/fixtures/forge/metarepo/org-pack/agents/architecture-critic.yaml +9 -0
  206. package/dist/fixtures/forge/metarepo/org-pack/agents/story-writer.yaml +10 -0
  207. package/dist/fixtures/forge/metarepo/org-pack/checklists/architecture.yaml +115 -0
  208. package/dist/fixtures/forge/metarepo/org-pack/dialects/forge.yaml +111 -0
  209. package/dist/fixtures/forge/metarepo/org-pack/gates.yaml +22 -0
  210. package/dist/fixtures/forge/metarepo/org-pack/pack.yaml +11 -0
  211. package/dist/fixtures/forge/metarepo/org-pack/patterns/A.EB.PUB.yaml +12 -0
  212. package/dist/fixtures/forge/metarepo/org-pack/patterns/D.JDBC.yaml +12 -0
  213. package/dist/fixtures/forge/metarepo/org-pack/patterns/S.DIR.BFF.yaml +12 -0
  214. package/dist/fixtures/forge/metarepo/org-pack/patterns/S.GW.SOR.yaml +13 -0
  215. package/dist/fixtures/forge/metarepo/org-pack/patterns/S.GW.VND.yaml +14 -0
  216. package/dist/fixtures/forge/metarepo/org-pack/process/change-templates/feature.md +37 -0
  217. package/dist/fixtures/forge/metarepo/org-pack/process/skills/add-forge-endpoint/SKILL.md +17 -0
  218. package/dist/fixtures/forge/metarepo/org-pack/process/snow/firewall-rule.yaml +14 -0
  219. package/dist/fixtures/forge/metarepo/org-pack/process/snow/gateway-route.yaml +13 -0
  220. package/dist/fixtures/forge/metarepo/org-pack/profiles/forge/profile.yaml +12 -0
  221. package/dist/fixtures/forge/metarepo/org-pack/profiles/forge/repos.manifest.yaml +44 -0
  222. package/dist/fixtures/forge/metarepo/org-pack/roles.yaml +14 -0
  223. package/dist/fixtures/forge/metarepo/org-pack/runtime.yaml +14 -0
  224. package/dist/fixtures/forge/metarepo/org-pack/sources.yaml +3 -0
  225. package/dist/fixtures/forge/repos/forge-events/topics/payments.initiated.yaml +4 -0
  226. package/dist/fixtures/forge/repos/forge-events/topics/transfers.completed.yaml +4 -0
  227. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/ledger-v1.xml +3 -0
  228. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/policies/SpikeArrest.xml +3 -0
  229. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/policies/VerifyOAuth.xml +4 -0
  230. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/proxies/default.xml +14 -0
  231. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/targets/ledger.xml +5 -0
  232. package/dist/fixtures/forge/repos/forge-infra/alerts/ledger-api.yaml +5 -0
  233. package/dist/fixtures/forge/repos/forge-infra/k8s/ledger-api.yaml +15 -0
  234. package/dist/fixtures/forge/repos/forge-infra/k8s/portal-bff.yaml +7 -0
  235. package/dist/fixtures/forge/repos/forge-infra/terraform/ledger-db.tf +9 -0
  236. package/dist/fixtures/forge/repos/forge-ledger/api/ledger-openapi.yaml +31 -0
  237. package/dist/fixtures/forge/repos/forge-ledger/forge.yaml +4 -0
  238. package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/LedgerEndpoints.java +13 -0
  239. package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/LedgerEvents.java +11 -0
  240. package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/NorthwindClient.java +10 -0
  241. package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/application.yml +3 -0
  242. package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/db/migration/V1__create_account.sql +5 -0
  243. package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/db/migration/V2__create_entry.sql +7 -0
  244. package/dist/fixtures/forge/repos/forge-portal-bff/pom.xml +1 -0
  245. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/AuditPublisher.java +12 -0
  246. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/BalanceController.java +16 -0
  247. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/LedgerClient.java +13 -0
  248. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/PaymentEvents.java +13 -0
  249. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/resources/application.yml +8 -0
  250. package/dist/fixtures/forge/repos/forge-portal-ui/package.json +1 -0
  251. package/dist/fixtures/forge/repos/forge-portal-ui/src/api/balance.ts +5 -0
  252. package/dist/fixtures/forge/repos/forge-reports-job/src/main/java/forge/reports/DailyEntriesJob.java +19 -0
  253. package/dist/fixtures/forge/repos/forge-reports-job/src/main/resources/application.yml +3 -0
  254. package/dist/fixtures/forge-change/README.md +41 -0
  255. package/dist/fixtures/forge-change/expected/findings.yaml +301 -0
  256. package/dist/fixtures/forge-change/expected/stories.yaml +101 -0
  257. package/dist/fixtures/forge-change/judgments/personal-data/0b5f3dbf5257a22275d8c74b.yaml +18 -0
  258. package/dist/fixtures/forge-change/judgments/personal-data/2759a66770134c417440bf2d.yaml +18 -0
  259. package/dist/fixtures/forge-change/judgments/personal-data/31b1ea2f14d0737f1aca79fd.yaml +18 -0
  260. package/dist/fixtures/forge-change/judgments/personal-data/49afd70c08228e65ad6ca1ed.yaml +18 -0
  261. package/dist/fixtures/forge-change/judgments/personal-data/761cabcb8a39f5e5866d2dd6.yaml +18 -0
  262. package/dist/fixtures/forge-change/judgments/personal-data/adae902b90cc8ffa0c765145.yaml +18 -0
  263. package/dist/fixtures/forge-change/judgments/personal-data/ba11bb933105ec9493e065dd.yaml +18 -0
  264. package/dist/fixtures/forge-change/judgments/personal-data/bdbcd1cdac3021c68063c3e7.yaml +18 -0
  265. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/brief.md +35 -0
  266. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/change.yaml +120 -0
  267. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/data.md +18 -0
  268. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/design.md +29 -0
  269. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/interfaces.md +17 -0
  270. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/mappings.md +26 -0
  271. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/proposal.md +35 -0
  272. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/snow.md +12 -0
  273. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/specs/transfer-limits/spec.md +19 -0
  274. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s1-refuse-over-limit.md +17 -0
  275. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s2-show-remaining.md +16 -0
  276. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s3-audit-refusals.md +18 -0
  277. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s4-velocity-check.md +16 -0
  278. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories.md +8 -0
  279. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/tasks.md +12 -0
  280. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/ux.md +7 -0
  281. package/dist/fixtures/forge-change/org-pack/agents/code-and-test-critic.yaml +13 -0
  282. package/dist/fixtures/forge-change/org-pack/agents/complete-critic.yaml +12 -0
  283. package/dist/fixtures/forge-change/org-pack/agents/safe-critic.yaml +12 -0
  284. package/dist/fixtures/forge-change/org-pack/agents/ship-critic.yaml +11 -0
  285. package/dist/fixtures/forge-change/org-pack/agents/true-critic.yaml +11 -0
  286. package/dist/fixtures/forge-change/org-pack/checklists/review.yaml +54 -0
  287. package/dist/fixtures/forge-change/org-pack/gates.yaml +25 -0
  288. package/dist/fixtures/forge-change/org-pack/teams/team-ledger/checklists/ledger-team.yaml +227 -0
  289. package/dist/fixtures/forge-change/recordings/complete-critic/2ad84f84bf39c1d5412697e69fe23034d6983ec45a00314bf0975e627589a3c5.json +12 -0
  290. package/dist/fixtures/forge-change/recordings/complete-critic/417c98d8e54a4387d0fd93441c49f44c2868958739070d855c1dce0c41e24db3.json +12 -0
  291. package/dist/fixtures/forge-change/recordings/complete-critic/50203ee22e9cb3ef047295edb6538fe7d5695e1e4b139f3c929013dc6ce47021.json +12 -0
  292. package/dist/fixtures/forge-change/recordings/complete-critic/89f18d67f5d9c325bf35e2a9e020f9ddb6ee13b8523315037f0905cc57c040b1.json +12 -0
  293. package/dist/fixtures/forge-change/recordings/complete-critic/b4097867d26ae8eadc8b9efa8cdd86897013358035f0b40086c299a59c4ba121.json +12 -0
  294. package/dist/fixtures/forge-change/recordings/safe-critic/302d06f49664dd67ad2e21ab9cf74c1b0f7d3f750709c6ed8eff2b70983274e2.json +12 -0
  295. package/dist/fixtures/forge-change/recordings/safe-critic/32f1049c9a5ab4a759543290db4644ec6e221cc45fdfdcf06193837c6a8ce0b9.json +12 -0
  296. package/dist/fixtures/forge-change/recordings/safe-critic/4e4a84bfc04b9f26ca4250319a879901ff7a1c081c71e46a117675fee05026b0.json +12 -0
  297. package/dist/fixtures/forge-change/recordings/safe-critic/604af0fcdd6df6b76208fa88305fdc15c37606c2a4d1ae816477e46ac8c2dd04.json +12 -0
  298. package/dist/fixtures/forge-change/recordings/safe-critic/f0bf50af11f14c50d07904f0dffe1c8c20fb0cd89770645a8824c1d30a443955.json +12 -0
  299. package/dist/fixtures/forge-change/recordings/ship-critic/350954b58833b2c04880c67db45a1b328b7fd541d9f0d943b63905b8875488a6.json +12 -0
  300. package/dist/fixtures/forge-change/recordings/ship-critic/4af95c6c96a206777cec9de1f9c2d8c55a36ddc9b8db2f81d6eb83217b835efa.json +12 -0
  301. package/dist/fixtures/forge-change/recordings/ship-critic/76c34522a49cf7587a4e5689a5030d384603fa780b8aba97d27815cbc829683e.json +12 -0
  302. package/dist/fixtures/forge-change/recordings/ship-critic/a3b2cd1ace48587e5994333db03b34c3a0f9dec4f1932f1730ddfb687f6918c8.json +12 -0
  303. package/dist/fixtures/forge-change/recordings/ship-critic/de288a4fa64d0fc20890f9a787080ce6eac5203b7b9b72d884df11e8cf111835.json +12 -0
  304. package/dist/fixtures/forge-change/recordings/story-writer/1ddb00eac2aaf91a5ec5d9dfd220116be9f75aec6546a4a3a3b050ed89af2864.json +12 -0
  305. package/dist/packages/assistant-kit/frameworks-kit/README.md +86 -0
  306. package/dist/packages/assistant-kit/frameworks-kit/checklist.md +11 -0
  307. package/dist/packages/assistant-kit/frameworks-kit/examples/tide-lantern.yaml +56 -0
  308. package/dist/packages/assistant-kit/frameworks-kit/examples/tide-platform.yaml +43 -0
  309. package/dist/packages/assistant-kit/frameworks-kit/prompts/write-framework-model.md +12 -0
  310. package/dist/packages/assistant-kit/kit/README.md +98 -0
  311. package/dist/packages/assistant-kit/kit/c2-reference.md +334 -0
  312. package/dist/packages/assistant-kit/kit/checklist.md +39 -0
  313. package/dist/packages/assistant-kit/kit/examples/house-http-client.yaml +102 -0
  314. package/dist/packages/assistant-kit/kit/examples/tide-apigee.yaml +56 -0
  315. package/dist/packages/assistant-kit/kit/examples/tide-apim.yaml +32 -0
  316. package/dist/packages/assistant-kit/kit/examples/tide-kong.yaml +44 -0
  317. package/dist/packages/assistant-kit/kit/prompts/write-dialect.md +34 -0
  318. package/dist/packages/assistant-kit/kit/worked-example.md +198 -0
  319. package/dist/packages/conformance/sample/README.md +4 -0
  320. package/dist/packages/conformance/sample/inputs/notes.md +3 -0
  321. package/dist/packages/conformance/sample/inputs/systems.csv +3 -0
  322. package/dist/packages/conformance/sample/repo/api/greeter.proto +6 -0
  323. package/dist/packages/conformance/sample/repo/api/openapi.yaml +10 -0
  324. package/dist/packages/conformance/sample/repo/api/schema.graphql +3 -0
  325. package/dist/packages/conformance/sample/repo/db/V1__create_greeting.sql +4 -0
  326. package/dist/packages/conformance/sample/repo/package.json +7 -0
  327. package/dist/packages/conformance/sample/repo/src/main/java/sample/HelloController.java +10 -0
  328. package/dist/packages/conformance/sample/repo/web/app.ts +4 -0
  329. package/dist/packages/evals/datasets/critic-lenses.yaml +62 -0
  330. package/dist/packages/evals/datasets/dialect-writer.yaml +14 -0
  331. package/dist/packages/evals/datasets/feature-namer.yaml +34 -0
  332. package/dist/packages/evals/datasets/glossary-definer.yaml +25 -0
  333. package/dist/packages/evals/datasets/story-writer.yaml +13 -0
  334. package/dist/packages/evals/datasets/template-writer.yaml +16 -0
  335. package/dist/packages/evals/datasets/test-writer.yaml +18 -0
  336. package/dist/packages/executors/reference/reference-executor.mjs +233 -0
  337. package/dist/packages/extractors/dialects/argocd.yaml +45 -0
  338. package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/AccountResource.java +47 -0
  339. package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/AuditClient.java +12 -0
  340. package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/LedgerClient.java +17 -0
  341. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/LedgerClient.java +14 -0
  342. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/RatesClient.java +11 -0
  343. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/StatementController.java +36 -0
  344. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/resources/application.yml +7 -0
  345. package/dist/packages/extractors/dialects/fixtures/quarkus-reactive-messaging/fraud-service/src/main/java/forge/fraud/FraudScorer.java +27 -0
  346. package/dist/packages/extractors/dialects/fixtures/quarkus-reactive-messaging/fraud-service/src/main/resources/application.properties +4 -0
  347. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/api.tf +38 -0
  348. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/main.tf +95 -0
  349. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/terraform.tfvars +1 -0
  350. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/variables.tf +4 -0
  351. package/dist/packages/extractors/dialects/fixtures/terraform-azure/forge-azure-infra/main.tf +102 -0
  352. package/dist/packages/extractors/dialects/fixtures/terraform-gcp/forge-gcp-infra/main.tf +51 -0
  353. package/dist/packages/extractors/dialects/harness.yaml +101 -0
  354. package/dist/packages/extractors/dialects/jaxrs.yaml +155 -0
  355. package/dist/packages/extractors/dialects/micronaut.yaml +207 -0
  356. package/dist/packages/extractors/dialects/quarkus-reactive-messaging.yaml +158 -0
  357. package/dist/packages/extractors/dialects/tekton.yaml +71 -0
  358. package/dist/packages/extractors/dialects/terraform-aws.yaml +267 -0
  359. package/dist/packages/extractors/dialects/terraform-azure.yaml +212 -0
  360. package/dist/packages/extractors/dialects/terraform-gcp.yaml +109 -0
  361. package/dist/packages/extractors/grammars/README.md +11 -0
  362. package/dist/packages/extractors/grammars/tree-sitter-groovy.LICENSE +21 -0
  363. package/dist/packages/extractors/grammars/tree-sitter-groovy.wasm +0 -0
  364. package/dist/packages/extractors/grammars/vendored.json +11 -0
  365. package/dist/packages/learn/lessons/architect-diagrams-and-code.yaml +69 -0
  366. package/dist/packages/learn/lessons/business-analyst-story-bar.yaml +94 -0
  367. package/dist/packages/learn/lessons/delivery-lead-release-readiness.yaml +44 -0
  368. package/dist/packages/learn/lessons/designer-features-in-user-words.yaml +57 -0
  369. package/dist/packages/learn/lessons/developer-find-your-way.yaml +60 -0
  370. package/dist/packages/learn/lessons/everyone-first-hour.yaml +74 -0
  371. package/dist/packages/learn/lessons/platform-lead-coverage-and-defences.yaml +58 -0
  372. package/dist/packages/learn/lessons/product-owner-first-change.yaml +167 -0
  373. package/dist/packages/learn/lessons/qa-tests-and-trace.yaml +53 -0
  374. package/dist/packages/learn/lessons/team-lead-initiative.yaml +146 -0
  375. package/dist/packages/naysayer/constitution/constitution.yaml +286 -0
  376. package/dist/packages/naysayer/starter/review.yaml +256 -0
  377. package/dist/packages/sdk/npm/index.js +8892 -0
  378. package/dist/packages/speckit/rules/drift.yaml +78 -0
  379. package/dist/packages/taskrun/rules/conform.yaml +38 -0
  380. package/dist/packages/testgen/rules/trace.yaml +49 -0
  381. package/dist/packages/ui/dist/assets/elk-api-tma0MCuh.js +2 -0
  382. package/dist/packages/ui/dist/assets/elk-worker.min--dAJroGl.js +6401 -0
  383. package/dist/packages/ui/dist/assets/elk-worker.min-DdYmS5kP.js +2 -0
  384. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
  385. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
  386. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
  387. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
  388. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
  389. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
  390. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
  391. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
  392. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
  393. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
  394. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
  395. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
  396. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
  397. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
  398. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
  399. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
  400. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
  401. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
  402. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  403. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  404. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  405. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  406. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  407. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  408. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
  409. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
  410. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
  411. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
  412. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
  413. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
  414. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
  415. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
  416. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
  417. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
  418. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
  419. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
  420. package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +29 -0
  421. package/dist/packages/ui/dist/assets/index-DD_hufQz.css +1 -0
  422. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  423. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  424. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
  425. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  426. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  427. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  428. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
  429. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  430. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  431. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  432. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  433. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  434. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  435. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  436. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  437. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
  438. package/dist/packages/ui/dist/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  439. package/dist/packages/ui/dist/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
  440. package/dist/packages/ui/dist/assets/rajdhani-devanagari-600-normal-BtY48IV_.woff +0 -0
  441. package/dist/packages/ui/dist/assets/rajdhani-devanagari-600-normal-DhS7ScYx.woff2 +0 -0
  442. package/dist/packages/ui/dist/assets/rajdhani-devanagari-700-normal-BQQOj9BB.woff2 +0 -0
  443. package/dist/packages/ui/dist/assets/rajdhani-devanagari-700-normal-DBRwWuxA.woff +0 -0
  444. package/dist/packages/ui/dist/assets/rajdhani-latin-600-normal-CXCVEoA9.woff2 +0 -0
  445. package/dist/packages/ui/dist/assets/rajdhani-latin-600-normal-Dx02qI2_.woff +0 -0
  446. package/dist/packages/ui/dist/assets/rajdhani-latin-700-normal-BPDUZo87.woff2 +0 -0
  447. package/dist/packages/ui/dist/assets/rajdhani-latin-700-normal-e0Uj8ZlN.woff +0 -0
  448. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-600-normal-BleIgkPp.woff +0 -0
  449. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-600-normal-C9ZjJQAt.woff2 +0 -0
  450. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-700-normal-BPaQ7tlD.woff +0 -0
  451. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-700-normal-S6aYESQK.woff2 +0 -0
  452. package/dist/packages/ui/dist/favicon.svg +1 -0
  453. package/dist/packages/ui/dist/index.html +15 -0
  454. package/dist/third-party.json +575 -0
  455. package/dist/vendor/@fission-ai/openspec/bin/openspec.js +85986 -0
  456. package/dist/vendor/@fission-ai/openspec/package.json +82 -0
  457. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/schema.yaml +248 -0
  458. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/design.md +21 -0
  459. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/proposal.md +34 -0
  460. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/spec.md +13 -0
  461. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/tasks.md +11 -0
  462. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-c_sharp.wasm +0 -0
  463. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-go.wasm +0 -0
  464. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-java.wasm +0 -0
  465. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-javascript.wasm +0 -0
  466. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-kotlin.wasm +0 -0
  467. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-php.wasm +0 -0
  468. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-python.wasm +0 -0
  469. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-ruby.wasm +0 -0
  470. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-rust.wasm +0 -0
  471. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-scala.wasm +0 -0
  472. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-tsx.wasm +0 -0
  473. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-typescript.wasm +0 -0
  474. package/dist/vendor/web-tree-sitter/tree-sitter.wasm +0 -0
  475. package/package.json +36 -3
@@ -0,0 +1,4 @@
1
+ variable "env" {
2
+ type = string
3
+ default = "dev"
4
+ }
@@ -0,0 +1,102 @@
1
+ # Forge's Azure estate (invented). One resource of each type the terraform-azure dialect reads,
2
+ # and some it leaves to built-in readers (the storage container) or to no record (the AKS cluster).
3
+
4
+ variable "env" {
5
+ default = "prod"
6
+ }
7
+
8
+ # ---- messaging
9
+ resource "azurerm_servicebus_queue" "orders_in" {
10
+ name = "orders-in"
11
+ namespace_id = azurerm_servicebus_namespace.main.id
12
+ }
13
+
14
+ resource "azurerm_servicebus_topic" "order_events" {
15
+ name = "order-events"
16
+ namespace_id = azurerm_servicebus_namespace.main.id
17
+ }
18
+
19
+ resource "azurerm_eventhub" "telemetry" {
20
+ name = "device-telemetry"
21
+ namespace_name = "forge-hubs"
22
+ partition_count = 4
23
+ message_retention = 1
24
+ }
25
+
26
+ # ---- compute
27
+ resource "azurerm_linux_function_app" "billing" {
28
+ name = "billing-func"
29
+ tags = {
30
+ env = var.env
31
+ }
32
+ }
33
+
34
+ resource "azurerm_windows_function_app" "legacy_billing" {
35
+ name = "legacy-billing-func"
36
+ }
37
+
38
+ resource "azurerm_function_app" "notifier" {
39
+ name = "notifier-func"
40
+ }
41
+
42
+ resource "azurerm_linux_web_app" "portal" {
43
+ name = "portal-web"
44
+ tags = {
45
+ env = var.env
46
+ }
47
+ }
48
+
49
+ resource "azurerm_windows_web_app" "backoffice" {
50
+ name = "backoffice-web"
51
+ }
52
+
53
+ resource "azurerm_app_service" "statements" {
54
+ name = "statements-web"
55
+ }
56
+
57
+ resource "azurerm_kubernetes_cluster" "main" {
58
+ name = "forge-aks"
59
+ }
60
+
61
+ # ---- gateway
62
+ resource "azurerm_api_management_api" "orders" {
63
+ name = "orders-api"
64
+ api_management_name = "forge-apim"
65
+ display_name = "Orders API"
66
+ path = "orders"
67
+ service_url = "https://orders.forge.internal"
68
+ revision = "1"
69
+ }
70
+
71
+ # ---- data
72
+ resource "azurerm_cosmosdb_account" "catalog" {
73
+ name = "forge-catalog"
74
+ offer_type = "Standard"
75
+ }
76
+
77
+ resource "azurerm_mssql_server" "reports" {
78
+ name = "forge-reports-sql"
79
+ version = "12.0"
80
+ }
81
+
82
+ resource "azurerm_postgresql_flexible_server" "ledger" {
83
+ name = "forge-ledger-pg"
84
+ version = "16"
85
+ }
86
+
87
+ resource "azurerm_postgresql_server" "legacy" {
88
+ name = "forge-legacy-pg"
89
+ }
90
+
91
+ resource "azurerm_mysql_flexible_server" "loyalty" {
92
+ name = "forge-loyalty-mysql"
93
+ }
94
+
95
+ resource "azurerm_redis_cache" "sessions" {
96
+ name = "forge-sessions"
97
+ }
98
+
99
+ # Read by the cloud-stores extractor, not by the dialect.
100
+ resource "azurerm_storage_container" "statements" {
101
+ name = "statements"
102
+ }
@@ -0,0 +1,51 @@
1
+ # Forge's Google Cloud estate (invented). The terraform-gcp dialect reads the databases, caches
2
+ # and task queues; Cloud Run, Pub/Sub, Cloud Functions, buckets, BigQuery and IAM stay with the
3
+ # built-in gcp, serverless and cloud-stores readers, and a GKE cluster gives no record.
4
+
5
+ variable "region" {
6
+ default = "europe-west1"
7
+ }
8
+
9
+ resource "google_sql_database_instance" "ledger" {
10
+ name = "ledger-db"
11
+ database_version = "POSTGRES_15"
12
+ region = var.region
13
+ }
14
+
15
+ resource "google_sql_database_instance" "loyalty" {
16
+ name = "loyalty-db"
17
+ database_version = "MYSQL_8_0"
18
+ }
19
+
20
+ resource "google_sql_database_instance" "reporting" {
21
+ name = "reporting-db"
22
+ database_version = "SQLSERVER_2019_STANDARD"
23
+ }
24
+
25
+ resource "google_sql_database_instance" "scratch" {
26
+ name = "scratch-db"
27
+ }
28
+
29
+ resource "google_redis_instance" "sessions" {
30
+ name = "forge-sessions"
31
+ memory_size_gb = 1
32
+ }
33
+
34
+ resource "google_cloud_tasks_queue" "emails" {
35
+ name = "forge-emails"
36
+ location = var.region
37
+ }
38
+
39
+ resource "google_spanner_database" "accounts" {
40
+ instance = "forge-spanner"
41
+ name = "accounts"
42
+ }
43
+
44
+ resource "google_container_cluster" "main" {
45
+ name = "forge-gke"
46
+ }
47
+
48
+ # Read by the gcp extractor, not by the dialect.
49
+ resource "google_pubsub_topic" "orders" {
50
+ name = "orders"
51
+ }
@@ -0,0 +1,101 @@
1
+ # Harness CD and CI pipelines (ADR 0062). Shipped with Atticus (C2). A pipeline in .harness/
2
+ # is a pipeline QualityAsset, described the way the built-in pipeline readers describe one:
3
+ # its stages, the environments its deploy stages target, the deploy steps (as Atticus's words:
4
+ # kubernetes, helm, terraform...), the steps that run tests, and the org templates it uses
5
+ # (a pipeline model, ADR 0062, says what a template does). Runtime inputs (<+input>) aren't
6
+ # values. Triggers live in their own files and aren't joined to their pipeline yet.
7
+ schemaVersion: 1
8
+ name: harness
9
+ version: 1.0.0
10
+ description: Harness pipelines as pipeline QualityAssets, with stages, environments, deploy targets, test steps and templates.
11
+ appliesTo:
12
+ repoTypes: ["*"]
13
+ marker: "**/.harness/**/*.y*ml"
14
+ rules:
15
+ - id: pipeline
16
+ description: A Harness pipeline file is a pipeline, with what its stages and steps say.
17
+ match:
18
+ jsonPath: "$.pipeline"
19
+ files: ["**/.harness/**/*.yaml", "**/.harness/**/*.yml"]
20
+ contains: "pipeline:"
21
+ emit:
22
+ kind: QualityAsset
23
+ id: "${repo.component}.pipeline.${attr.identifier | slug}"
24
+ fields:
25
+ component: "${repo.component}"
26
+ assetKind: pipeline
27
+ details:
28
+ tool: harness
29
+ name: "${attr.name}"
30
+ stages:
31
+ - { each: "@.stages[*].stage", value: "${item.name}" }
32
+ - { each: "@.stages[*].parallel[*].stage", value: "${item.name}" }
33
+ environments:
34
+ - each: "@..environment"
35
+ value: "${item.environmentRef | lower}"
36
+ where: [{ value: "${item.environmentRef}", matches: "^[^<]" }]
37
+ deployTargets:
38
+ - each: "@..step"
39
+ value: "${item.type | map('K8sRollingDeploy=kubernetes,K8sCanaryDeploy=kubernetes,K8sBlueGreenDeploy=kubernetes,K8sApply=kubernetes,HelmDeploy=helm,NativeHelmDeploy=helm,TerraformApply=terraform,TerraformCloudRun=terraform,ServerlessAwsLambdaDeploy=aws-lambda,AwsLambdaDeploy=aws-lambda,ECSRollingDeploy=aws-ecs,AzureWebAppSlotDeployment=azure-web-app,AzureFunctionDeploy=azure-functions,GoogleCloudRunDeploy=cloud-run,TanzuCommand=tanzu')}"
40
+ testSteps:
41
+ - each: "@..step"
42
+ value: "${item.name}"
43
+ where: [{ value: "${item.type}", matches: "^RunTests$" }]
44
+ - each: "@..step"
45
+ value: "${item.spec.command}"
46
+ where:
47
+ - { value: "${item.type}", matches: "^Run$" }
48
+ - {
49
+ value: "${item.spec.command}",
50
+ matches: "\\b(test|tests|verify|pytest|jest|vitest)\\b",
51
+ }
52
+ templates:
53
+ - { each: "@..template", value: "${item.templateRef}" }
54
+ evidence: { source: pipeline, side: definition }
55
+ confidence: verified
56
+ tests:
57
+ - name: a CI stage with tests, a deploy stage to prod, and a stage from an org template
58
+ files:
59
+ .harness/pipelines/cards_deploy.yaml: |
60
+ pipeline:
61
+ name: Cards build and deploy
62
+ identifier: cards_deploy
63
+ stages:
64
+ - stage:
65
+ name: Build
66
+ type: CI
67
+ spec:
68
+ execution:
69
+ steps:
70
+ - step: { type: Run, name: Unit tests, spec: { command: mvn -B verify } }
71
+ - step: { type: Run, name: Package, spec: { command: mvn -B package -DskipTests } }
72
+ - step: { type: RunTests, name: Contract tests }
73
+ - stage:
74
+ name: Deploy prod
75
+ type: Deployment
76
+ spec:
77
+ environment: { environmentRef: Prod }
78
+ execution:
79
+ steps:
80
+ - step: { type: K8sRollingDeploy, name: Rollout }
81
+ - step: { type: ShellScript, name: Notify }
82
+ - stage:
83
+ name: Deploy uat
84
+ type: Deployment
85
+ spec:
86
+ environment: { environmentRef: <+input> }
87
+ - stage:
88
+ name: Release notes
89
+ template: { templateRef: org.tide_release, versionLabel: v2 }
90
+ expect:
91
+ - kind: QualityAsset
92
+ id: dialect-test.pipeline.cards_deploy
93
+ assetKind: pipeline
94
+ details:
95
+ tool: harness
96
+ name: Cards build and deploy
97
+ stages: [Build, Deploy prod, Deploy uat, Release notes]
98
+ environments: [prod]
99
+ deployTargets: [kubernetes]
100
+ testSteps: [Contract tests, mvn -B verify]
101
+ templates: [org.tide_release]
@@ -0,0 +1,155 @@
1
+ # JAX-RS (Jakarta REST) resources and MicroProfile REST clients. Shipped with Atticus (C2).
2
+ #
3
+ # A JAX-RS endpoint is a class-level @Path, a method-level @Path and an HTTP-method
4
+ # annotation that sit side by side, in either order. Annotation matches only see the matched
5
+ # annotation and the enclosing class, so these rules use regular expressions with lookbehinds
6
+ # for the class (groups are numbered as they appear, lookbehinds included).
7
+ #
8
+ # Limits, by design: the component is the repo id (C2 has no template value for the manifest's
9
+ # component); @ApplicationPath prefixes and sub-resource locators are not followed; a client's
10
+ # host is its configKey (the usual convention is to name the target service), because a
11
+ # template can't look a config key up by a name it has just matched. normalizedPath is left to
12
+ # merge, which derives it from pathOrTopic.
13
+ schemaVersion: 1
14
+ name: jaxrs
15
+ version: 1.0.0
16
+ description: JAX-RS resource methods as REST endpoints, and MicroProfile REST client methods as HTTP calls.
17
+ extends: []
18
+ appliesTo:
19
+ repoTypes: []
20
+ layout:
21
+ sourceRoots: [src/main/java]
22
+ configFiles: []
23
+ rules:
24
+ - id: resource-method
25
+ description: >-
26
+ A method with an HTTP-method annotation and its own @Path, in a class with a @Path that
27
+ is not a @RegisterRestClient interface, serves the class path joined with the method path.
28
+ match:
29
+ regex: '(?=@(?:Path|GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?<!@RegisterRestClient[\s\S]*)(?<=@Path\(\s*"/?([^"]*?)/?"\s*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:(?:public|abstract|final)\s+)*class\s+(\w+)\b[\s\S]*)(?:@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b(?:\s*@(?!Path\b)[\w.]+(?:\([^)]*\))?)*\s*@Path\(\s*"/?([^"]*?)/?"\s*\)|@Path\(\s*"/?([^"]*?)/?"\s*\)(?:\s*@(?!(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)[\w.]+(?:\([^)]*\))?)*\s*@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?:\s*@[\w.]+(?:\([^)]*\))?)*\s*(?:(?:public|protected|private|static|final|synchronized|abstract|default)\s+)*[\w.$]+(?:<[^;{}()]*>)?(?:\[\])*\s+(\w+)\s*\('
30
+ files: ["**/src/main/java/**/*.java"]
31
+ emit:
32
+ kind: Endpoint
33
+ id: "${repo.name}.${match.2 | slug}.${match.3 | lower}${match.6 | lower}-${match.7 | slug}"
34
+ fields:
35
+ component: "${repo.name}"
36
+ endpointType: rest
37
+ method: "${match.3}${match.6}"
38
+ pathOrTopic: "/${match.1}/${match.4}${match.5}"
39
+ evidence: { source: code, side: callee }
40
+ confidence: verified
41
+
42
+ - id: resource-method-without-path
43
+ description: >-
44
+ A method with an HTTP-method annotation and no @Path of its own, in a class with a @Path,
45
+ serves the class path.
46
+ match:
47
+ regex: '(?=@(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?<!@RegisterRestClient[\s\S]*)(?<=@Path\(\s*"/?([^"]*?)/?"\s*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:(?:public|abstract|final)\s+)*class\s+(\w+)\b[\s\S]*)(?<!@Path\([^)]*\)(?:\s*@[\w.]+(?:\([^)]*\))?)*\s*)@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b(?:\s*@(?!Path\b)[\w.]+(?:\([^)]*\))?)*\s*(?=[^@\s])(?:(?:public|protected|private|static|final|synchronized|abstract|default)\s+)*[\w.$]+(?:<[^;{}()]*>)?(?:\[\])*\s+(\w+)\s*\('
48
+ files: ["**/src/main/java/**/*.java"]
49
+ emit:
50
+ kind: Endpoint
51
+ id: "${repo.name}.${match.2 | slug}.${match.3 | lower}-${match.4 | slug}"
52
+ fields:
53
+ component: "${repo.name}"
54
+ endpointType: rest
55
+ method: "${match.3}"
56
+ pathOrTopic: "/${match.1}"
57
+ evidence: { source: code, side: callee }
58
+ confidence: verified
59
+
60
+ - id: rest-client-call
61
+ description: >-
62
+ A method with an HTTP-method annotation and a @Path in a @RegisterRestClient(configKey)
63
+ interface that has its own @Path calls http://<configKey>/<interface path>/<method path>.
64
+ match:
65
+ regex: '(?=@(?:Path|GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?<=@RegisterRestClient\([^)]*configKey\s*=\s*"([^"]+)"[^)]*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+)?interface\s+(\w+)\b[\s\S]*)(?<=@Path\(\s*"/?([^"]*?)/?"\s*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+)?interface\s[\s\S]*)(?:@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b(?:\s*@(?!Path\b)[\w.]+(?:\([^)]*\))?)*\s*@Path\(\s*"/?([^"]*?)/?"\s*\)|@Path\(\s*"/?([^"]*?)/?"\s*\)(?:\s*@(?!(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)[\w.]+(?:\([^)]*\))?)*\s*@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?:\s*@[\w.]+(?:\([^)]*\))?)*\s*(?:(?:public|protected|private|static|final|synchronized|abstract|default)\s+)*[\w.$]+(?:<[^;{}()]*>)?(?:\[\])*\s+(\w+)\s*\('
66
+ files: ["**/src/main/java/**/*.java"]
67
+ emit:
68
+ kind: Unresolved
69
+ id: "${repo.name}.call.${match.1 | slug}.${match.4 | lower}${match.7 | lower}-${match.8 | slug}"
70
+ fields:
71
+ unresolvedKind: http-call
72
+ raw: "${match.4}${match.7} http://${match.1}/${match.3}/${match.5}${match.6}"
73
+ owner: "${repo.name}"
74
+ evidence: { source: code, side: caller }
75
+ confidence: inferred
76
+
77
+ - id: rest-client-call-without-interface-path
78
+ description: >-
79
+ The same in a @RegisterRestClient(configKey) interface with no @Path of its own: the call
80
+ goes to http://<configKey>/<method path>.
81
+ match:
82
+ regex: '(?=@(?:Path|GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?<=@RegisterRestClient\([^)]*configKey\s*=\s*"([^"]+)"[^)]*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+)?interface\s+(\w+)\b[\s\S]*)(?<!@Path\(\s*"/?([^"]*?)/?"\s*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+)?interface\s[\s\S]*)(?:@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b(?:\s*@(?!Path\b)[\w.]+(?:\([^)]*\))?)*\s*@Path\(\s*"/?([^"]*?)/?"\s*\)|@Path\(\s*"/?([^"]*?)/?"\s*\)(?:\s*@(?!(?:GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)[\w.]+(?:\([^)]*\))?)*\s*@(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b)(?:\s*@[\w.]+(?:\([^)]*\))?)*\s*(?:(?:public|protected|private|static|final|synchronized|abstract|default)\s+)*[\w.$]+(?:<[^;{}()]*>)?(?:\[\])*\s+(\w+)\s*\('
83
+ files: ["**/src/main/java/**/*.java"]
84
+ emit:
85
+ kind: Unresolved
86
+ id: "${repo.name}.call.${match.1 | slug}.${match.4 | lower}${match.7 | lower}-${match.8 | slug}"
87
+ fields:
88
+ unresolvedKind: http-call
89
+ raw: "${match.4}${match.7} http://${match.1}/${match.5}${match.6}"
90
+ owner: "${repo.name}"
91
+ evidence: { source: code, side: caller }
92
+ confidence: inferred
93
+
94
+ tests:
95
+ - name: resources and MicroProfile clients in accounts-service
96
+ fixture: fixtures/jaxrs/accounts-service
97
+ expect:
98
+ - kind: Endpoint
99
+ id: accounts-service.accountresource.get-list
100
+ component: accounts-service
101
+ method: GET
102
+ pathOrTopic: /accounts
103
+ - kind: Endpoint
104
+ id: accounts-service.accountresource.get-get
105
+ method: GET
106
+ pathOrTopic: /accounts/{id}
107
+ - kind: Endpoint
108
+ id: accounts-service.accountresource.post-placehold
109
+ method: POST
110
+ pathOrTopic: /accounts/{id}/holds
111
+ - kind: Endpoint
112
+ id: accounts-service.accountresource.delete-close
113
+ method: DELETE
114
+ pathOrTopic: /accounts/{id}
115
+ - kind: Endpoint
116
+ id: accounts-service.accountresource.put-rename
117
+ method: PUT
118
+ pathOrTopic: /accounts/{id}/owner
119
+ - kind: Endpoint
120
+ id: accounts-service.accountresource.get-count
121
+ method: GET
122
+ pathOrTopic: /accounts
123
+ - kind: Unresolved
124
+ id: accounts-service.call.ledger-api.get-balance
125
+ unresolvedKind: http-call
126
+ raw: GET http://ledger-api/ledger/v1/accounts/{id}/balance
127
+ owner: accounts-service
128
+ - kind: Unresolved
129
+ id: accounts-service.call.ledger-api.post-transfer
130
+ raw: POST http://ledger-api/ledger/v1/transfers
131
+ - kind: Unresolved
132
+ id: accounts-service.call.audit-svc.post-record
133
+ raw: POST http://audit-svc/audit/events
134
+ absent:
135
+ - accounts-service.ledgerclient.get-balance
136
+ - accounts-service.ledgerclient.post-transfer
137
+ - accounts-service.auditclient.post-record
138
+ - name: a class without a class-level @Path (a sub-resource) gives nothing
139
+ files:
140
+ src/main/java/x/HoldResource.java: |
141
+ public class HoldResource {
142
+ @GET
143
+ @Path("/{holdId}")
144
+ public Hold get(@PathParam("holdId") String holdId) { return null; }
145
+ }
146
+ expect: []
147
+ - name: test sources are not scanned
148
+ files:
149
+ src/test/java/x/FakeResource.java: |
150
+ @Path("/fake")
151
+ public class FakeResource {
152
+ @GET
153
+ public String get() { return ""; }
154
+ }
155
+ expect: []
@@ -0,0 +1,207 @@
1
+ # Micronaut HTTP controllers and declarative clients. Shipped with Atticus (C2).
2
+ #
3
+ # Controllers: the HTTP-method annotation carries the method path, so plain annotation rules
4
+ # work; the controller's path comes from the enclosing @Controller. The id uses that path, so a
5
+ # @Get in a class without @Controller("...") (a declarative client) fails to fill and is skipped.
6
+ # A @Controller with no path is skipped for the same reason.
7
+ #
8
+ # Declarative clients (@Client on an interface or abstract class): a service id becomes the
9
+ # host (http://<id>), with @Client(path) as a base path; an absolute URL is used as written.
10
+ # Placeholders like @Client("${ledger.url}") are not followed. The component is the configured
11
+ # micronaut.application.name; a repo without one gives no records.
12
+ schemaVersion: 1
13
+ name: micronaut
14
+ version: 1.0.0
15
+ description: Micronaut controllers as REST endpoints, and declarative @Client methods as HTTP calls.
16
+ extends: []
17
+ appliesTo:
18
+ repoTypes: []
19
+ layout:
20
+ sourceRoots: [src/main/java]
21
+ configFiles:
22
+ - "**/src/main/resources/application.yml"
23
+ - "**/src/main/resources/application.yaml"
24
+ - "**/src/main/resources/application.properties"
25
+ rules:
26
+ - id: controller-get
27
+ description: A @Get method in a @Controller class serves GET on the controller path joined with the method path.
28
+ match: { annotation: Get, target: method, files: ["**/src/main/java/**/*.java"] }
29
+ emit:
30
+ kind: Endpoint
31
+ id: "${config:micronaut.application.name}.${annotation.Controller.value | slug}.get-${member.name | slug}"
32
+ fields:
33
+ component: "${config:micronaut.application.name}"
34
+ endpointType: rest
35
+ method: GET
36
+ pathOrTopic: "${annotation.Controller.value}${attr.value | default('')}${attr.uri | default('')}"
37
+ normalizedPath: "${annotation.Controller.value | normalizePath}${attr.value | default('') | normalizePath}${attr.uri | default('') | normalizePath}"
38
+ evidence: { source: code, side: callee }
39
+ confidence: verified
40
+
41
+ - id: controller-post
42
+ description: A @Post method in a @Controller class serves POST.
43
+ match: { annotation: Post, target: method, files: ["**/src/main/java/**/*.java"] }
44
+ emit:
45
+ kind: Endpoint
46
+ id: "${config:micronaut.application.name}.${annotation.Controller.value | slug}.post-${member.name | slug}"
47
+ fields:
48
+ component: "${config:micronaut.application.name}"
49
+ endpointType: rest
50
+ method: POST
51
+ pathOrTopic: "${annotation.Controller.value}${attr.value | default('')}${attr.uri | default('')}"
52
+ normalizedPath: "${annotation.Controller.value | normalizePath}${attr.value | default('') | normalizePath}${attr.uri | default('') | normalizePath}"
53
+ evidence: { source: code, side: callee }
54
+ confidence: verified
55
+
56
+ - id: controller-put
57
+ description: A @Put method in a @Controller class serves PUT.
58
+ match: { annotation: Put, target: method, files: ["**/src/main/java/**/*.java"] }
59
+ emit:
60
+ kind: Endpoint
61
+ id: "${config:micronaut.application.name}.${annotation.Controller.value | slug}.put-${member.name | slug}"
62
+ fields:
63
+ component: "${config:micronaut.application.name}"
64
+ endpointType: rest
65
+ method: PUT
66
+ pathOrTopic: "${annotation.Controller.value}${attr.value | default('')}${attr.uri | default('')}"
67
+ normalizedPath: "${annotation.Controller.value | normalizePath}${attr.value | default('') | normalizePath}${attr.uri | default('') | normalizePath}"
68
+ evidence: { source: code, side: callee }
69
+ confidence: verified
70
+
71
+ - id: controller-delete
72
+ description: A @Delete method in a @Controller class serves DELETE.
73
+ match: { annotation: Delete, target: method, files: ["**/src/main/java/**/*.java"] }
74
+ emit:
75
+ kind: Endpoint
76
+ id: "${config:micronaut.application.name}.${annotation.Controller.value | slug}.delete-${member.name | slug}"
77
+ fields:
78
+ component: "${config:micronaut.application.name}"
79
+ endpointType: rest
80
+ method: DELETE
81
+ pathOrTopic: "${annotation.Controller.value}${attr.value | default('')}${attr.uri | default('')}"
82
+ normalizedPath: "${annotation.Controller.value | normalizePath}${attr.value | default('') | normalizePath}${attr.uri | default('') | normalizePath}"
83
+ evidence: { source: code, side: callee }
84
+ confidence: verified
85
+
86
+ - id: controller-patch
87
+ description: A @Patch method in a @Controller class serves PATCH.
88
+ match: { annotation: Patch, target: method, files: ["**/src/main/java/**/*.java"] }
89
+ emit:
90
+ kind: Endpoint
91
+ id: "${config:micronaut.application.name}.${annotation.Controller.value | slug}.patch-${member.name | slug}"
92
+ fields:
93
+ component: "${config:micronaut.application.name}"
94
+ endpointType: rest
95
+ method: PATCH
96
+ pathOrTopic: "${annotation.Controller.value}${attr.value | default('')}${attr.uri | default('')}"
97
+ normalizedPath: "${annotation.Controller.value | normalizePath}${attr.value | default('') | normalizePath}${attr.uri | default('') | normalizePath}"
98
+ evidence: { source: code, side: callee }
99
+ confidence: verified
100
+
101
+ - id: client-call-service-id
102
+ description: >-
103
+ An HTTP-method annotation in an interface (or abstract class) annotated @Client with a
104
+ service id calls http://<service id><@Client path><method path>.
105
+ match:
106
+ regex: '(?=@(?:Get|Post|Put|Delete|Patch|Head|Options)\b)(?<=@Client\((?=(?:[^)]*\bpath\s*=\s*"([^"]*)")?)\s*(?:[^)]*\b(?:id|value)\s*=\s*)?"([\w.-]+)"[^)]*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+)?(?:interface|abstract\s+class)\s+(\w+)\b[\s\S]*)@(Get|Post|Put|Delete|Patch|Head|Options)\b(?:\(\s*(?:(?:value|uri)\s*=\s*)?"([^"]*)"[^)]*\)|\([^)]*\))?(?:\s*@[\w.]+(?:\([^)]*\))?)*\s*(?:(?:public|protected|private|static|final|synchronized|abstract|default)\s+)*[\w.$]+(?:<[^;{}()]*>)?(?:\[\])*\s+(\w+)\s*\('
107
+ files: ["**/src/main/java/**/*.java"]
108
+ emit:
109
+ kind: Unresolved
110
+ id: "${config:micronaut.application.name}.call.${match.2 | slug}.${match.4 | lower}-${match.6 | slug}"
111
+ fields:
112
+ unresolvedKind: http-call
113
+ raw: "${match.4 | upper} http://${match.2}${match.1}${match.5}"
114
+ owner: "${config:micronaut.application.name}"
115
+ evidence: { source: code, side: caller }
116
+ confidence: inferred
117
+
118
+ - id: client-call-url
119
+ description: An HTTP-method annotation in an interface annotated @Client with an absolute URL calls that URL joined with the method path.
120
+ match:
121
+ regex: '(?=@(?:Get|Post|Put|Delete|Patch|Head|Options)\b)(?<=@Client\(\s*(?:value\s*=\s*)?"(https?://[^"]*?)/?"[^)]*\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+)?(?:interface|abstract\s+class)\s+(\w+)\b[\s\S]*)@(Get|Post|Put|Delete|Patch|Head|Options)\b(?:\(\s*(?:(?:value|uri)\s*=\s*)?"([^"]*)"[^)]*\)|\([^)]*\))?(?:\s*@[\w.]+(?:\([^)]*\))?)*\s*(?:(?:public|protected|private|static|final|synchronized|abstract|default)\s+)*[\w.$]+(?:<[^;{}()]*>)?(?:\[\])*\s+(\w+)\s*\('
122
+ files: ["**/src/main/java/**/*.java"]
123
+ emit:
124
+ kind: Unresolved
125
+ id: "${config:micronaut.application.name}.call.${match.2 | slug}.${match.3 | lower}-${match.5 | slug}"
126
+ fields:
127
+ unresolvedKind: http-call
128
+ raw: "${match.3 | upper} ${match.1}${match.4}"
129
+ owner: "${config:micronaut.application.name}"
130
+ evidence: { source: code, side: caller }
131
+ confidence: inferred
132
+
133
+ tests:
134
+ - name: controller endpoints and declarative clients in statements-service
135
+ fixture: fixtures/micronaut/statements-service
136
+ expect:
137
+ - kind: Endpoint
138
+ id: statements-service.statements.get-get
139
+ component: statements-service
140
+ method: GET
141
+ pathOrTopic: /statements/{id}
142
+ normalizedPath: /statements/{}
143
+ - kind: Endpoint
144
+ id: statements-service.statements.get-list
145
+ method: GET
146
+ pathOrTopic: /statements
147
+ normalizedPath: /statements
148
+ - kind: Endpoint
149
+ id: statements-service.statements.post-send
150
+ method: POST
151
+ pathOrTopic: /statements/{id}/send
152
+ normalizedPath: /statements/{}/send
153
+ - kind: Endpoint
154
+ id: statements-service.statements.delete-remove
155
+ method: DELETE
156
+ pathOrTopic: /statements/{id}
157
+ - kind: Unresolved
158
+ id: statements-service.call.ledger-api.get-balance
159
+ unresolvedKind: http-call
160
+ raw: GET http://ledger-api/ledger/v1/accounts/{id}/balance
161
+ owner: statements-service
162
+ - kind: Unresolved
163
+ id: statements-service.call.ledger-api.post-transfer
164
+ raw: POST http://ledger-api/ledger/v1/transfers
165
+ - kind: Unresolved
166
+ id: statements-service.call.ratesclient.get-rate
167
+ raw: GET https://rates.northwind-pay.example/v2/fx/{currency}
168
+ - name: a client whose target is a placeholder, and a controller without an application name, give nothing
169
+ files:
170
+ src/main/java/x/LedgerClient.java: |
171
+ @Client("${ledger.url}")
172
+ public interface LedgerClient {
173
+ @Get("/accounts")
174
+ List<Account> accounts();
175
+ }
176
+ src/main/java/x/PingController.java: |
177
+ @Controller("/ping")
178
+ public class PingController {
179
+ @Get
180
+ public String ping() { return "pong"; }
181
+ }
182
+ expect: []
183
+ - name: PUT and PATCH methods, with the path as value or uri
184
+ files:
185
+ src/main/resources/application.yml: |
186
+ micronaut:
187
+ application:
188
+ name: limits-service
189
+ src/main/java/x/LimitsController.java: |
190
+ @Controller("/limits")
191
+ public class LimitsController {
192
+ @Put("/{id}")
193
+ public Limit replace(String id, Limit l) { return l; }
194
+ @Patch(uri = "/{id}/amount")
195
+ public Limit adjust(String id, int amount) { return null; }
196
+ }
197
+ expect:
198
+ - kind: Endpoint
199
+ id: limits-service.limits.put-replace
200
+ method: PUT
201
+ pathOrTopic: /limits/{id}
202
+ normalizedPath: /limits/{}
203
+ - kind: Endpoint
204
+ id: limits-service.limits.patch-adjust
205
+ method: PATCH
206
+ pathOrTopic: /limits/{id}/amount
207
+ normalizedPath: /limits/{}/amount