@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,1075 @@
1
+ import { createRequire as __atticusCreateRequire } from "node:module";
2
+ import { fileURLToPath as __atticusFileURLToPath } from "node:url";
3
+ var require = __atticusCreateRequire(import.meta.url);
4
+ var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
5
+ var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
+ import {
7
+ clientFor,
8
+ inputsSha256,
9
+ loadExecutors
10
+ } from "./chunk-QSXK2RGH.js";
11
+ import {
12
+ runDialectTests
13
+ } from "./chunk-MC3H7736.js";
14
+ import {
15
+ fsRepo,
16
+ scanRepo
17
+ } from "./chunk-GQ4N4WKF.js";
18
+ import {
19
+ AI_SCHEMA_VERSION,
20
+ API_VERSION,
21
+ CHANGE_SCHEMA_VERSION,
22
+ COMPONENT_TYPES,
23
+ DIALECT_SCHEMA_VERSION,
24
+ Dialect,
25
+ EXECUTOR_SCHEMA_VERSION,
26
+ ExecutorsFile,
27
+ FACT_KINDS,
28
+ ORGPACK_SCHEMA_VERSION,
29
+ RECORD_KINDS,
30
+ REVIEW_SCHEMA_VERSION,
31
+ RunResult,
32
+ STORE_TYPES,
33
+ SUPPORTED_SCHEMA_VERSIONS,
34
+ System,
35
+ WORKSPACE_SCHEMA_VERSION,
36
+ catalogDirOf,
37
+ external_exports,
38
+ loadOrgPack,
39
+ orgPackDirOf,
40
+ parseRecord,
41
+ recordPath,
42
+ recordReferences,
43
+ require_dist,
44
+ serializeRecord
45
+ } from "./chunk-S2A7YC3Q.js";
46
+ import {
47
+ SCHEMA_VERSION
48
+ } from "./chunk-D3PO4DOZ.js";
49
+ import {
50
+ __toESM
51
+ } from "./chunk-TV45EUGM.js";
52
+
53
+ // packages/cli/dist/u1-commands.js
54
+ import { resolve } from "node:path";
55
+
56
+ // packages/conformance/dist/report.js
57
+ var Results = class {
58
+ list = [];
59
+ pass(check, message, file) {
60
+ this.list.push({ check, status: "pass", message, ...file ? { file } : {} });
61
+ }
62
+ fail(check, message, file) {
63
+ this.list.push({ check, status: "fail", message, ...file ? { file } : {} });
64
+ }
65
+ warn(check, message, file) {
66
+ this.list.push({ check, status: "warn", message, ...file ? { file } : {} });
67
+ }
68
+ /** A check that held for every item gets one pass line instead of one per item. */
69
+ passUnlessFailed(check, message) {
70
+ if (!this.list.some((r) => r.check === check && r.status === "fail"))
71
+ this.pass(check, message);
72
+ }
73
+ report(kind, target) {
74
+ const count = (s) => this.list.filter((r) => r.status === s).length;
75
+ const summary = { pass: count("pass"), fail: count("fail"), warn: count("warn") };
76
+ return {
77
+ kind,
78
+ target,
79
+ specVersion: SPEC_VERSION,
80
+ passed: summary.fail === 0,
81
+ results: this.list,
82
+ summary
83
+ };
84
+ }
85
+ };
86
+ var SPEC_VERSION = "0.1.0";
87
+
88
+ // packages/conformance/dist/catalog.js
89
+ var import_yaml = __toESM(require_dist(), 1);
90
+ import { readdir, readFile, stat } from "node:fs/promises";
91
+ import { join, relative, sep } from "node:path";
92
+ var isDir = async (p) => (await stat(p).catch(() => void 0))?.isDirectory() ?? false;
93
+ async function yamlFiles(dir) {
94
+ const out = [];
95
+ async function walk(d) {
96
+ const entries = await readdir(d, { withFileTypes: true }).catch(() => []);
97
+ for (const e of entries.sort((a, b) => a.name.localeCompare(b.name))) {
98
+ const full = join(d, e.name);
99
+ if (e.isDirectory())
100
+ await walk(full);
101
+ else if (/\.ya?ml$/.test(e.name))
102
+ out.push(full);
103
+ }
104
+ }
105
+ await walk(dir);
106
+ return out;
107
+ }
108
+ async function catalogFolder(target) {
109
+ if (await isDir(join(target, "generated")) || await isDir(join(target, "curated")))
110
+ return target;
111
+ return catalogDirOf(target);
112
+ }
113
+ async function checkCatalog(target) {
114
+ const res = new Results();
115
+ const dir = await catalogFolder(target);
116
+ const hasGenerated = await isDir(join(dir, "generated"));
117
+ const hasCurated = await isDir(join(dir, "curated"));
118
+ if (!hasGenerated && !hasCurated) {
119
+ res.fail("catalog.layout", `No generated/ or curated/ folder in ${dir}.`);
120
+ return res.report("catalog", target);
121
+ }
122
+ res.pass("catalog.layout", "The catalog has generated/ and curated/ folders where present.");
123
+ const records = [];
124
+ for (const full of await yamlFiles(dir)) {
125
+ const file = relative(dir, full).split(sep).join("/");
126
+ const folder = file.split("/")[0];
127
+ if (folder !== "generated" && folder !== "curated")
128
+ continue;
129
+ const text = await readFile(full, "utf8");
130
+ let data;
131
+ try {
132
+ data = (0, import_yaml.parse)(text);
133
+ } catch (e) {
134
+ res.fail("catalog.yaml", `Not valid YAML: ${e.message.split("\n")[0]}`, file);
135
+ continue;
136
+ }
137
+ const kind = data?.kind;
138
+ if (typeof kind !== "string" || !RECORD_KINDS.includes(kind)) {
139
+ res.warn("catalog.kind", "Not a catalog record (no known kind); ignored.", file);
140
+ continue;
141
+ }
142
+ const p = parseRecord(data);
143
+ if (!p.ok) {
144
+ res.fail("catalog.schema", `Doesn't match C1: ${p.issues.map((i) => `${i.path || "(record)"}: ${i.message}`).join("; ")}`, file);
145
+ continue;
146
+ }
147
+ const rec = p.record;
148
+ if (data.schemaVersion !== SCHEMA_VERSION)
149
+ res.fail("catalog.version", `Written at schema version ${String(data.schemaVersion)}; the current version is ${SCHEMA_VERSION} (run atticus catalog migrate).`, file);
150
+ else if (serializeRecord(rec) !== text)
151
+ res.fail("catalog.canonical", "Not in canonical form (key order, defaults or quoting).", file);
152
+ const want = `${folder}/${recordPath(rec)}`;
153
+ if (file !== want)
154
+ res.fail("catalog.path", `Should be at ${want}.`, file);
155
+ if (folder === "curated" && rec.kind !== "CuratedDecision")
156
+ res.fail("catalog.folder", "Only curated decisions belong in curated/.", file);
157
+ if (folder === "generated" && rec.kind === "CuratedDecision")
158
+ res.fail("catalog.folder", "A curated decision belongs in curated/.", file);
159
+ if (rec.kind !== "CuratedDecision" && rec.evidence.length === 0)
160
+ res.fail("catalog.evidence", "A generated record needs at least one piece of evidence.", file);
161
+ for (const e of rec.evidence)
162
+ if (!e.path && !e.by)
163
+ res.warn("catalog.evidence", `Evidence from ${e.source} names no file and no person.`, file);
164
+ records.push({ rec, file });
165
+ }
166
+ for (const c of ["catalog.version", "catalog.canonical", "catalog.path", "catalog.folder"])
167
+ res.passUnlessFailed(c, CHECK_PASS[c]);
168
+ const seen = /* @__PURE__ */ new Map();
169
+ for (const { rec, file } of records) {
170
+ const key = `${rec.kind}|${rec.id}`;
171
+ const first = seen.get(key);
172
+ if (first)
173
+ res.fail("catalog.unique-id", `Same ${rec.kind} id as ${first}.`, file);
174
+ else
175
+ seen.set(key, file);
176
+ }
177
+ res.passUnlessFailed("catalog.unique-id", "Every id is unique within its kind.");
178
+ const ids = new Set(records.map((r) => r.rec.id));
179
+ for (const { rec, file } of records) {
180
+ const refs = rec.kind === "CuratedDecision" ? [{ field: "target", id: rec.target }] : recordReferences(rec);
181
+ for (const r of refs)
182
+ if (!ids.has(r.id))
183
+ res.warn("catalog.references", `${r.field} points at ${r.id}, which isn't in this catalog.`, file);
184
+ }
185
+ if (!res.list.some((r) => r.check === "catalog.references"))
186
+ res.pass("catalog.references", "Every reference resolves to a record in the catalog.");
187
+ res.passUnlessFailed("catalog.evidence", "Every generated record carries evidence.");
188
+ res.pass("catalog.count", `${records.length} record${records.length === 1 ? "" : "s"} read.`);
189
+ return res.report("catalog", target);
190
+ }
191
+ var CHECK_PASS = {
192
+ "catalog.version": "Every record is written at the current schema version.",
193
+ "catalog.canonical": "Every record file is in canonical form.",
194
+ "catalog.path": "Every file is at <folder>/<kind>/<id>.yaml.",
195
+ "catalog.folder": "Generated records and curated decisions are in their own folders."
196
+ };
197
+
198
+ // packages/conformance/dist/dialect.js
199
+ var import_yaml2 = __toESM(require_dist(), 1);
200
+ import { readdir as readdir2, readFile as readFile2 } from "node:fs/promises";
201
+ import { dirname, join as join2 } from "node:path";
202
+ async function checkDialect(file) {
203
+ const res = new Results();
204
+ let data;
205
+ try {
206
+ data = (0, import_yaml2.parse)(await readFile2(file, "utf8"));
207
+ } catch (e) {
208
+ res.fail("dialect.yaml", `Can't read this file as YAML: ${e.message.split("\n")[0]}`);
209
+ return res.report("dialect", file);
210
+ }
211
+ const p = Dialect.safeParse(data);
212
+ if (!p.success) {
213
+ for (const i of p.error.issues)
214
+ res.fail("dialect.schema", `${i.path.join(".") || "(file)"}: ${i.message}`);
215
+ return res.report("dialect", file);
216
+ }
217
+ const d = p.data;
218
+ res.pass("dialect.schema", `Dialect ${d.name} ${d.version} matches C2.`);
219
+ const parents = /* @__PURE__ */ new Map();
220
+ const dir = dirname(file);
221
+ for (const n of (await readdir2(dir).catch(() => [])).filter((x) => /\.ya?ml$/.test(x))) {
222
+ try {
223
+ const other = Dialect.safeParse((0, import_yaml2.parse)(await readFile2(join2(dir, n), "utf8")));
224
+ if (other.success && other.data.name !== d.name)
225
+ parents.set(other.data.name, other.data);
226
+ } catch {
227
+ }
228
+ }
229
+ const missing = d.extends.filter((x) => !parents.has(x));
230
+ if (missing.length > 0)
231
+ res.fail("dialect.extends", `Extends ${missing.join(", ")}, which isn't in the same folder.`);
232
+ else if (d.extends.length > 0)
233
+ res.pass("dialect.extends", `Extends ${d.extends.join(", ")}.`);
234
+ if (d.tests.length === 0)
235
+ res.fail("dialect.tests", "A dialect must ship at least one test.");
236
+ else if (missing.length > 0)
237
+ res.fail("dialect.tests", "Tests not run: they need the dialects it extends.");
238
+ else {
239
+ const failures = await runDialectTests(d, dir, parents);
240
+ for (const f of failures)
241
+ res.fail("dialect.tests", `${f.test}: ${f.message}`);
242
+ res.passUnlessFailed("dialect.tests", `All ${d.tests.length} tests pass.`);
243
+ }
244
+ return res.report("dialect", file);
245
+ }
246
+
247
+ // packages/conformance/dist/executor.js
248
+ var import_yaml3 = __toESM(require_dist(), 1);
249
+ import { readFile as readFile3 } from "node:fs/promises";
250
+ var AT = "2026-01-01T00:00:00Z";
251
+ async function configOf(target, o) {
252
+ if (o.config)
253
+ return { cfg: o.config };
254
+ let executors;
255
+ if (/\.ya?ml$/.test(target)) {
256
+ try {
257
+ const r = ExecutorsFile.safeParse((0, import_yaml3.parse)(await readFile3(target, "utf8")));
258
+ if (!r.success)
259
+ return {
260
+ problem: r.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")
261
+ };
262
+ executors = r.data.executors;
263
+ } catch (e) {
264
+ return { problem: `Can't read ${target}: ${e.message.split("\n")[0]}` };
265
+ }
266
+ } else {
267
+ const loaded = await loadExecutors(target);
268
+ if (loaded.problems.length > 0)
269
+ return { problem: loaded.problems.join("; ") };
270
+ executors = loaded.executors;
271
+ }
272
+ const cfg = o.executor ? executors.find((e) => e.name === o.executor) : executors[0];
273
+ return cfg ? { cfg } : { problem: o.executor ? `No executor named ${o.executor}.` : "No executors configured." };
274
+ }
275
+ async function checkExecutor(target, o = {}) {
276
+ const res = new Results();
277
+ const { cfg, problem } = await configOf(target, o);
278
+ if (!cfg) {
279
+ res.fail("executor.config", problem ?? "No executor.");
280
+ return res.report("executor", target);
281
+ }
282
+ res.pass("executor.config", `Executor ${cfg.name} over ${cfg.transport}.`);
283
+ const client = (o.client ?? clientFor)(cfg);
284
+ const nonce = `${cfg.name}-${process.pid}-${Math.floor(Math.random() * 1e9)}`;
285
+ let pong;
286
+ try {
287
+ pong = await client.ping();
288
+ res.pass("executor.ping", `Answers a ping: ${pong.name} ${pong.version}.`);
289
+ } catch (e) {
290
+ res.fail("executor.ping", `Doesn't answer a ping: ${e.message}`);
291
+ return res.report("executor", target);
292
+ }
293
+ const named = [
294
+ ...cfg.procedures,
295
+ ...pong.procedures.filter((p) => cfg.transport !== "mcp" || p.includes("/"))
296
+ ];
297
+ const first = (named[0] ?? "firewall-rule/submit-request").split("/");
298
+ const procedure = first[0];
299
+ const step = first[1] ?? pong.stepKinds[0] ?? cfg.stepKinds[0] ?? "submit-request";
300
+ const inputs = { summary: "Conformance reference case", reference: `conformance-${nonce}` };
301
+ const key = `conf-${nonce}`.slice(0, 64);
302
+ const request = (k, mode = "submit") => ({
303
+ schemaVersion: 1,
304
+ type: "run",
305
+ runId: `run-${k}-${mode}`,
306
+ procedure,
307
+ step,
308
+ inputs,
309
+ idempotencyKey: k,
310
+ mode,
311
+ approval: {
312
+ by: "conformance",
313
+ at: AT,
314
+ ref: "conformance-reference-case",
315
+ inputsSha256: inputsSha256(inputs)
316
+ }
317
+ });
318
+ const used = async (k, want, check, when) => {
319
+ try {
320
+ const a = await client.check(k);
321
+ if (!a)
322
+ res.fail(check, `Doesn't answer idempotency checks (${when}).`);
323
+ else if (a.idempotencyKey !== k)
324
+ res.fail(check, `Answered for key ${a.idempotencyKey}, not ${k}.`);
325
+ else if (a.used !== want)
326
+ res.fail(check, `Says a key ${when} is ${a.used ? "used" : "unused"}.`);
327
+ else
328
+ res.pass(check, `Says a key ${when} is ${want ? "used" : "unused"}.`);
329
+ } catch (e) {
330
+ res.fail(check, `Idempotency check failed (${when}): ${e.message}`);
331
+ }
332
+ };
333
+ await used(key, false, "executor.idempotency-fresh", "never sent");
334
+ const run = async (req) => {
335
+ const progress = [];
336
+ const result = await client.run(req, (p) => progress.push(p.message));
337
+ return { result: RunResult.parse(result), progress };
338
+ };
339
+ let done;
340
+ try {
341
+ const { result, progress } = await run(request(key));
342
+ if (result.runId !== request(key).runId)
343
+ res.fail("executor.run", `Answered for run ${result.runId}, not ${request(key).runId}.`);
344
+ else
345
+ res.pass("executor.run", `Ran the reference case: ${result.status}${result.message ? ` (${result.message})` : ""}.`);
346
+ if (progress.length > 0)
347
+ res.pass("executor.progress", `Reported progress (${progress.length} message${progress.length === 1 ? "" : "s"}).`);
348
+ else
349
+ res.warn("executor.progress", "Reported no progress before its result.");
350
+ if (result.status === "done")
351
+ done = result;
352
+ else
353
+ res.warn("executor.run", "The reference case didn't finish as done, so the idempotency checks after a run are skipped.");
354
+ } catch (e) {
355
+ res.fail("executor.run", `The reference run failed: ${e.message}`);
356
+ }
357
+ if (done) {
358
+ await used(key, true, "executor.idempotency-used", "already run");
359
+ try {
360
+ const { result } = await run({ ...request(key), runId: `run-${key}-again` });
361
+ if (result.status === "done" && JSON.stringify(result.outputs) !== JSON.stringify(done.outputs))
362
+ res.fail("executor.duplicate", "The same write sent twice gave a different result: it ran twice.");
363
+ else
364
+ res.pass("executor.duplicate", result.status === "done" ? "The same write sent twice gave the same result." : `The same write sent twice was refused (${result.status}).`);
365
+ } catch (e) {
366
+ res.pass("executor.duplicate", `The same write sent twice was refused: ${e.message}`);
367
+ }
368
+ }
369
+ if (pong.fillOnly || cfg.fillOnly) {
370
+ const k = `${key}-fill`.slice(0, 64);
371
+ try {
372
+ const { result } = await run(request(k, "fill-only"));
373
+ if (result.status !== "needs-person")
374
+ res.fail("executor.fill-only", `A fill-only run ended ${result.status}, not needs-person.`);
375
+ else
376
+ res.pass("executor.fill-only", "A fill-only run leaves the step to a person.");
377
+ await used(k, false, "executor.fill-only", "only filled in");
378
+ } catch (e) {
379
+ res.fail("executor.fill-only", `A fill-only run failed: ${e.message}`);
380
+ }
381
+ }
382
+ return res.report("executor", target);
383
+ }
384
+
385
+ // packages/conformance/dist/orgpack.js
386
+ import { stat as stat2 } from "node:fs/promises";
387
+ import { join as join3 } from "node:path";
388
+ var isDir2 = async (p) => (await stat2(p).catch(() => void 0))?.isDirectory() ?? false;
389
+ async function orgPackFolder(target) {
390
+ if (await isDir2(join3(target, "org-pack")) || await isDir2(join3(target, ".atticus", "org-pack")))
391
+ return orgPackDirOf(target);
392
+ return target;
393
+ }
394
+ async function checkOrgPack(target) {
395
+ const res = new Results();
396
+ const dir = await orgPackFolder(target);
397
+ if (!await isDir2(dir)) {
398
+ res.fail("orgpack.folder", `No org-pack folder at ${dir}.`);
399
+ return res.report("org-pack", target);
400
+ }
401
+ const pack = await loadOrgPack(dir);
402
+ for (const p of pack.problems)
403
+ res.fail(p.path ? "orgpack.schema" : "orgpack.file", `${p.path ? `${p.path}: ` : ""}${p.message}`, p.file);
404
+ res.passUnlessFailed("orgpack.file", "Every org-pack file reads as YAML or Markdown.");
405
+ res.passUnlessFailed("orgpack.schema", "Every file matches C6 and the cross-file rules hold.");
406
+ if (!pack.pack)
407
+ res.warn("orgpack.manifest", "No pack.yaml: the pack has no name or version.");
408
+ else
409
+ res.pass("orgpack.manifest", `Pack ${pack.pack.name} ${pack.pack.version}.`);
410
+ if (pack.defaulted.length > 0)
411
+ res.pass("orgpack.defaults", `Built-in defaults used for: ${pack.defaulted.join(", ")}.`);
412
+ const byName = new Map(pack.dialects.map((d) => [d.name, d]));
413
+ for (const d of pack.dialects) {
414
+ const failures = await runDialectTests(d, join3(dir, "dialects"), byName);
415
+ for (const f of failures)
416
+ res.fail("orgpack.dialect-tests", `${d.name}: ${f.test}: ${f.message}`, `dialects/${d.name}.yaml`);
417
+ }
418
+ res.passUnlessFailed("orgpack.dialect-tests", pack.dialects.length > 0 ? `Every dialect passes its tests (${pack.dialects.map((d) => d.name).join(", ")}).` : "No dialects in the pack.");
419
+ res.pass("orgpack.count", `${pack.gates.gates.length} gates, ${pack.changeTypes.types.length} change types, ${pack.patterns.length} patterns, ${pack.dialects.length} dialects, ${pack.checklists.length} checklists, ${pack.procedures.length} procedures.`);
420
+ return res.report("org-pack", target);
421
+ }
422
+
423
+ // packages/conformance/dist/plugin.js
424
+ import { readdir as readdir3, readFile as readFile4, stat as stat3 } from "node:fs/promises";
425
+ import { basename, join as join4, relative as relative2, sep as sep2 } from "node:path";
426
+ import { fileURLToPath, pathToFileURL } from "node:url";
427
+
428
+ // packages/conformance/dist/guard.js
429
+ import dgram from "node:dgram";
430
+ import dns from "node:dns";
431
+ import http from "node:http";
432
+ import https from "node:https";
433
+ import { syncBuiltinESMExports } from "node:module";
434
+ import net from "node:net";
435
+ import tls from "node:tls";
436
+ var NetworkBlocked = class extends Error {
437
+ constructor(what) {
438
+ super(`Network access is blocked in a conformance run (${what}).`);
439
+ this.name = "NetworkBlocked";
440
+ }
441
+ };
442
+ async function guarded(fn, o = {}) {
443
+ const attempts = [];
444
+ const saved = [];
445
+ const block = (target, key, what) => {
446
+ saved.push([target, key, target[key]]);
447
+ target[key] = (...args) => {
448
+ const arg = args[0];
449
+ const detail = typeof arg === "string" ? arg : arg instanceof URL ? arg.href : arg && typeof arg === "object" && "host" in arg ? String(arg.host) : "";
450
+ attempts.push(detail ? `${what} ${detail}` : what);
451
+ throw new NetworkBlocked(what);
452
+ };
453
+ };
454
+ if (typeof globalThis.fetch === "function")
455
+ block(globalThis, "fetch", "fetch");
456
+ block(http, "request", "http.request");
457
+ block(http, "get", "http.get");
458
+ block(https, "request", "https.request");
459
+ block(https, "get", "https.get");
460
+ block(net, "connect", "net.connect");
461
+ block(net, "createConnection", "net.createConnection");
462
+ block(net.Socket.prototype, "connect", "socket.connect");
463
+ block(tls, "connect", "tls.connect");
464
+ block(dgram, "createSocket", "dgram.createSocket");
465
+ for (const k of ["lookup", "resolve", "resolve4", "resolve6", "resolveAny"])
466
+ block(dns, k, `dns.${k}`);
467
+ for (const k of ["lookup", "resolve", "resolve4", "resolve6"])
468
+ block(dns.promises, k, `dns.${k}`);
469
+ const RealDate = globalThis.Date;
470
+ if (o.fixedTime) {
471
+ const fixed = RealDate.parse(o.fixedTime);
472
+ class FixedDate extends RealDate {
473
+ constructor(...args) {
474
+ if (args.length === 0)
475
+ super(fixed);
476
+ else
477
+ super(...args);
478
+ }
479
+ static now() {
480
+ return fixed;
481
+ }
482
+ }
483
+ globalThis.Date = FixedDate;
484
+ }
485
+ syncBuiltinESMExports();
486
+ try {
487
+ return { value: await fn(), attempts };
488
+ } catch (error) {
489
+ return { error, attempts };
490
+ } finally {
491
+ globalThis.Date = RealDate;
492
+ for (const [target, key, value] of saved.reverse())
493
+ target[key] = value;
494
+ syncBuiltinESMExports();
495
+ }
496
+ }
497
+
498
+ // packages/conformance/dist/plugin.js
499
+ var __atticus_import_meta_url = __atticusUrl("packages/conformance/dist/plugin.js");
500
+ var SAMPLE = fileURLToPath(new URL("../sample", __atticus_import_meta_url));
501
+ var SHA = "0".repeat(40);
502
+ var T1 = "2026-01-01T00:00:00Z";
503
+ var T2 = "2031-06-15T12:30:00Z";
504
+ var isExtractor = (v) => !!v && typeof v === "object" && typeof v.scan === "function";
505
+ var isIngestor = (v) => !!v && typeof v === "object" && typeof v.sniff === "function" && typeof v.ingest === "function";
506
+ async function files(dir) {
507
+ const out = [];
508
+ async function walk(d) {
509
+ for (const e of (await readdir3(d, { withFileTypes: true }).catch(() => [])).sort((a, b) => a.name.localeCompare(b.name))) {
510
+ const full = join4(d, e.name);
511
+ if (e.isDirectory())
512
+ await walk(full);
513
+ else
514
+ out.push(full);
515
+ }
516
+ }
517
+ await walk(dir);
518
+ return out;
519
+ }
520
+ function own(records) {
521
+ return records.map((r) => ({
522
+ ...r,
523
+ evidence: r.evidence.map((e) => {
524
+ const { scannedAt: _s, commit: _c, extractor: _x, ...rest } = e;
525
+ return rest;
526
+ })
527
+ }));
528
+ }
529
+ async function checkPlugin(module, o = {}) {
530
+ const res = new Results();
531
+ let mod;
532
+ try {
533
+ mod = await import(pathToFileURL(module).href);
534
+ } catch (e) {
535
+ res.fail("plugin.load", `Can't load this module: ${e.message}`);
536
+ return res.report("plugin", module);
537
+ }
538
+ const exported = [...new Set(Object.values(mod).flatMap((v) => Array.isArray(v) ? v : [v]))];
539
+ const extractors = exported.filter(isExtractor);
540
+ const ingestors = exported.filter(isIngestor);
541
+ if (extractors.length + ingestors.length === 0) {
542
+ res.fail("plugin.exports", "The module exports no extractor (scan) and no ingestor (sniff and ingest).");
543
+ return res.report("plugin", module);
544
+ }
545
+ res.pass("plugin.exports", `Found ${[...extractors.map((x) => `extractor ${x.id}`), ...ingestors.map((x) => `ingestor ${x.id}`)].join(", ")}.`);
546
+ for (const x of extractors)
547
+ await checkExtractor(x, o.fixture ?? join4(SAMPLE, "repo"), res);
548
+ for (const x of ingestors)
549
+ await checkIngestor(x, o.inputs ?? await files(join4(SAMPLE, "inputs")), res);
550
+ return res.report("plugin", module);
551
+ }
552
+ function shape(p, what, res) {
553
+ let ok = true;
554
+ if (typeof p.id !== "string" || !/^[a-z][a-z0-9-]*$/.test(p.id)) {
555
+ res.fail("plugin.shape", `${what}: id ${JSON.stringify(p.id)} must be a lowercase slug.`);
556
+ ok = false;
557
+ }
558
+ if (typeof p.version !== "string" || !/^\d+\.\d+\.\d+(-[0-9a-z.-]+)?$/i.test(p.version)) {
559
+ res.fail("plugin.shape", `${what}: version ${JSON.stringify(p.version)} must be semver.`);
560
+ ok = false;
561
+ }
562
+ return ok;
563
+ }
564
+ async function checkExtractor(x, fixture, res) {
565
+ const name = `extractor ${String(x.id)}`;
566
+ let ok = shape(x, name, res);
567
+ if (!Array.isArray(x.claims) || x.claims.length === 0 || !x.claims.every((c) => typeof c === "string")) {
568
+ res.fail("plugin.shape", `${name}: claims must be a non-empty list of file globs.`);
569
+ ok = false;
570
+ }
571
+ if (ok)
572
+ res.pass("plugin.shape", `${name} ${x.version} has an id, a semver version and claims.`);
573
+ if (!(await stat3(fixture).catch(() => void 0))?.isDirectory()) {
574
+ res.fail("plugin.run", `${name}: no repo folder at ${fixture}.`);
575
+ return;
576
+ }
577
+ const once = (at) => guarded(() => scanRepo({
578
+ repo: fsRepo(basename(fixture), fixture, SHA),
579
+ extractors: [x],
580
+ scannedAt: T1,
581
+ repoInfo: { component: "sample", system: "sample" }
582
+ }), { fixedTime: at });
583
+ const a = await once(T1);
584
+ const b = await once(T2);
585
+ report(name, res, a, b, (s) => {
586
+ const failed = s.runs.filter((r) => r.status === "failed");
587
+ return {
588
+ records: s.records,
589
+ rejected: s.rejected.map((r) => r.issues.map((i) => `${i.path}: ${i.message}`).join("; ")),
590
+ error: failed.map((r) => r.error).join("; ") || void 0
591
+ };
592
+ });
593
+ }
594
+ async function checkIngestor(x, inputs, res) {
595
+ const name = `ingestor ${String(x.id)}`;
596
+ if (shape(x, name, res))
597
+ res.pass("plugin.shape", `${name} ${x.version} has an id, a semver version, sniff and ingest.`);
598
+ const once = (at) => guarded(async () => {
599
+ const records = [];
600
+ const rejected = [];
601
+ for (const file of inputs) {
602
+ const content = new Uint8Array(await readFile4(file));
603
+ const score = x.sniff(basename(file), content.subarray(0, 4096));
604
+ if (typeof score !== "number" || score < 0 || score > 1) {
605
+ rejected.push(`${basename(file)}: sniff returned ${JSON.stringify(score)}, not a number from 0 to 1`);
606
+ continue;
607
+ }
608
+ if (score === 0)
609
+ continue;
610
+ const ctx = { dialects: [], scannedAt: T1, warn: () => void 0 };
611
+ for await (const r of x.ingest(basename(file), content, ctx)) {
612
+ const p = parseRecord(r);
613
+ if (p.ok)
614
+ records.push(p.record);
615
+ else
616
+ rejected.push(`${relative2(process.cwd(), file).split(sep2).join("/")}: ${p.issues.map((i) => `${i.path}: ${i.message}`).join("; ")}`);
617
+ }
618
+ }
619
+ return { records, rejected };
620
+ }, { fixedTime: at });
621
+ const a = await once(T1);
622
+ const b = await once(T2);
623
+ report(name, res, a, b, (s) => ({ records: s.records, rejected: s.rejected }));
624
+ }
625
+ function report(name, res, a, b, read) {
626
+ const attempts = [.../* @__PURE__ */ new Set([...a.attempts, ...b.attempts])];
627
+ if (attempts.length > 0)
628
+ res.fail("plugin.network", `${name} tried to reach the network: ${attempts.join(", ")}.`);
629
+ else
630
+ res.pass("plugin.network", `${name} made no network call.`);
631
+ const ra = a.value ? read(a.value) : void 0;
632
+ const rb = b.value ? read(b.value) : void 0;
633
+ const err = a.error ?? b.error;
634
+ if (err || ra?.error || !ra || !rb) {
635
+ res.fail("plugin.run", `${name} failed: ${err instanceof Error ? err.message : String(err ?? ra?.error ?? rb?.error)}`);
636
+ return;
637
+ }
638
+ res.pass("plugin.run", `${name} ran and emitted ${ra.records.length} record${ra.records.length === 1 ? "" : "s"}.`);
639
+ for (const r of ra.rejected)
640
+ res.fail("plugin.records", `${name} emitted an invalid record: ${r}`);
641
+ if (ra.rejected.length === 0)
642
+ res.pass("plugin.records", `Every record ${name} emitted is valid C1.`);
643
+ if (JSON.stringify(own(ra.records)) !== JSON.stringify(own(rb.records)))
644
+ res.fail("plugin.determinism", `${name} gave different output on two runs (at two clock times): it must read files only, with no clock or randomness.`);
645
+ else
646
+ res.pass("plugin.determinism", `${name} gave identical output on two runs at two clock times.`);
647
+ }
648
+
649
+ // packages/conformance/dist/run.js
650
+ var CONFORMANCE_KINDS = [
651
+ "catalog",
652
+ "org-pack",
653
+ "dialect",
654
+ "plugin",
655
+ "executor"
656
+ ];
657
+ async function conformanceRun(target, o) {
658
+ switch (o.kind) {
659
+ case "catalog":
660
+ return checkCatalog(target);
661
+ case "org-pack":
662
+ return checkOrgPack(target);
663
+ case "dialect":
664
+ return checkDialect(target);
665
+ case "plugin":
666
+ return checkPlugin(target, o);
667
+ case "executor":
668
+ return checkExecutor(target, o);
669
+ }
670
+ }
671
+
672
+ // packages/conformance/dist/spec.js
673
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
674
+
675
+ // packages/conformance/dist/zod-doc.js
676
+ var defOf = (s) => s._zod.def;
677
+ function unwrap(s) {
678
+ let cur = s;
679
+ let optional = false;
680
+ let dflt;
681
+ for (let i = 0; i < 20; i++) {
682
+ const d = defOf(cur);
683
+ if (d.type === "optional" || d.type === "nullable")
684
+ optional = true;
685
+ else if (d.type === "default" || d.type === "prefault") {
686
+ optional = true;
687
+ const v = d.defaultValue;
688
+ dflt = typeof v === "function" ? v() : v;
689
+ } else if (d.type === "readonly" || d.type === "catch") {
690
+ } else if (d.type === "pipe") {
691
+ cur = d.in;
692
+ continue;
693
+ } else if (d.type === "lazy") {
694
+ cur = d.getter();
695
+ continue;
696
+ } else
697
+ break;
698
+ cur = d.innerType;
699
+ }
700
+ return { inner: cur, optional, ...dflt !== void 0 ? { default: dflt } : {} };
701
+ }
702
+ var isObject = (s) => defOf(unwrap(s).inner).type === "object";
703
+ function typeName(s, ctx) {
704
+ const { inner } = unwrap(s);
705
+ const d = defOf(inner);
706
+ const name = ctx?.named.get(inner) ?? ctx?.named.get(s);
707
+ const base = () => {
708
+ switch (d.type) {
709
+ case "string":
710
+ return typeof d.format === "string" && d.format !== "regex" ? `string (${d.format})` : "string";
711
+ case "number": {
712
+ const formats = [
713
+ d.format,
714
+ ...(d.checks ?? []).map((c) => c._zod?.def?.format)
715
+ ];
716
+ return formats.some((f) => f === "safeint" || f === "int32") ? "integer" : "number";
717
+ }
718
+ case "boolean":
719
+ return "boolean";
720
+ case "literal":
721
+ return d.values.map((v) => JSON.stringify(v)).join(" or ");
722
+ case "enum":
723
+ return "enum";
724
+ case "array":
725
+ return `${typeName(d.element, ctx)}[]`;
726
+ case "object":
727
+ return "object";
728
+ case "record":
729
+ return `map of ${typeName(d.valueType, ctx)}`;
730
+ case "union": {
731
+ const opts = d.options;
732
+ if (opts.every(isObject))
733
+ return `one of ${opts.length} shapes`;
734
+ return [...new Set(opts.map((o) => typeName(o, ctx)))].join(" or ");
735
+ }
736
+ case "intersection":
737
+ return "object";
738
+ case "tuple":
739
+ return "tuple";
740
+ case "date":
741
+ return "date";
742
+ default:
743
+ return "any";
744
+ }
745
+ };
746
+ const b = base();
747
+ return name && !["object"].includes(b) && !b.startsWith(name) ? `${b} (${name})` : b;
748
+ }
749
+ function enumValues(s) {
750
+ const { inner } = unwrap(s);
751
+ const d = defOf(inner);
752
+ if (d.type === "enum")
753
+ return Object.values(d.entries).map(String);
754
+ if (d.type === "literal")
755
+ return void 0;
756
+ if (d.type === "array")
757
+ return enumValues(d.element);
758
+ if (d.type === "union") {
759
+ const opts = d.options;
760
+ const vals = opts.map((o) => {
761
+ const od = defOf(unwrap(o).inner);
762
+ return od.type === "literal" ? od.values.map(String) : enumValues(o);
763
+ });
764
+ if (vals.every((v) => v !== void 0))
765
+ return vals.flat();
766
+ }
767
+ return void 0;
768
+ }
769
+ var fmt = (v) => typeof v === "string" ? v : JSON.stringify(v);
770
+ function fieldRows(schema, ctx, docName, o = {}, depth = 0) {
771
+ const { inner } = unwrap(schema);
772
+ const d = defOf(inner);
773
+ if (depth > 5)
774
+ return [];
775
+ const shapes = d.type === "object" ? [d.shape] : d.type === "union" && d.options.every(isObject) ? d.options.map((x) => defOf(unwrap(x).inner).shape) : d.type === "intersection" ? [defOf(unwrap(d.left).inner).shape, defOf(unwrap(d.right).inner).shape].filter(Boolean) : [];
776
+ const rows = [];
777
+ const seen = /* @__PURE__ */ new Set();
778
+ for (const shape2 of shapes)
779
+ for (const [key, field] of Object.entries(shape2)) {
780
+ if (o.skip?.has(key) || seen.has(key))
781
+ continue;
782
+ seen.add(key);
783
+ const path = o.prefix ? `${o.prefix}.${key}` : key;
784
+ const docPath = o.docPrefix ? `${o.docPrefix}.${key}` : key;
785
+ const u = unwrap(field);
786
+ const fieldName = ctx.named.get(u.inner) ?? ctx.named.get(field);
787
+ const description = ctx.docs.get(docName)?.fields.get(docPath) ?? (o.fallbackDocs ?? []).map((n) => ctx.docs.get(n)?.fields.get(docPath)).find(Boolean) ?? (fieldName ? ctx.docs.get(fieldName)?.doc : void 0) ?? external_exports.globalRegistry.get(field)?.description;
788
+ const values = enumValues(field);
789
+ rows.push({
790
+ path,
791
+ type: typeName(field, ctx),
792
+ required: !u.optional,
793
+ ...values ? { values: values.map((v) => `\`${v}\``).join(", ") } : {},
794
+ ...u.default !== void 0 && !(Array.isArray(u.default) && u.default.length === 0) && !(typeof u.default === "object" && u.default !== null && Object.keys(u.default).length === 0) ? { default: fmt(u.default) } : {},
795
+ ...description ? { description } : {}
796
+ });
797
+ const id = defOf(u.inner);
798
+ const nestedDoc = fieldName && fieldName !== docName ? { name: fieldName, prefix: "" } : { name: docName, prefix: docPath };
799
+ if (id.type === "object" || id.type === "union" && id.options.every(isObject))
800
+ rows.push(...fieldRows(u.inner, ctx, nestedDoc.name, { prefix: path, docPrefix: nestedDoc.prefix || void 0 }, depth + 1));
801
+ else if (id.type === "array" && isObject(id.element)) {
802
+ const el = unwrap(id.element).inner;
803
+ const elName = ctx.named.get(el);
804
+ rows.push(...fieldRows(el, ctx, elName ?? nestedDoc.name, { prefix: `${path}[]`, docPrefix: elName ? void 0 : nestedDoc.prefix || void 0 }, depth + 1));
805
+ } else if (id.type === "record" && isObject(id.valueType)) {
806
+ const el = unwrap(id.valueType).inner;
807
+ const elName = ctx.named.get(el);
808
+ rows.push(...fieldRows(el, ctx, elName ?? nestedDoc.name, {
809
+ prefix: `${path}.<key>`,
810
+ docPrefix: elName ? void 0 : nestedDoc.prefix || void 0
811
+ }, depth + 1));
812
+ }
813
+ }
814
+ return rows;
815
+ }
816
+ var cell = (s) => s.replace(/\|/g, "\\|").replace(/\n/g, " ");
817
+ function fieldTable(rows) {
818
+ const head = "| Field | Type | Required | Values | Description |\n| --- | --- | --- | --- | --- |";
819
+ const body = rows.map((r) => {
820
+ const values = [r.values, r.default !== void 0 ? `default \`${r.default}\`` : void 0].filter(Boolean).join("; ");
821
+ return `| \`${r.path}\` | ${cell(r.type)} | ${r.required ? "yes" : "no"} | ${cell(values)} | ${cell(r.description ?? "")} |`;
822
+ });
823
+ return [head, ...body].join("\n");
824
+ }
825
+
826
+ // packages/conformance/dist/spec.js
827
+ var __atticus_import_meta_url2 = __atticusUrl("packages/conformance/dist/spec.js");
828
+ var SCHEMA_SRC = fileURLToPath2(new URL("../../core/src/schema/", __atticus_import_meta_url2));
829
+ var COMMON = ["kind", "schemaVersion", "id", "status", "confidence", "evidence", "flags"];
830
+ var CONTRACTS = [
831
+ {
832
+ id: "C1",
833
+ file: "c1-catalog-records.md",
834
+ title: "C1: Catalog records",
835
+ summary: "The catalog: one YAML record per file, thirty kinds, evidence on every fact.",
836
+ intro: [
837
+ "A catalog describes an ecosystem as records. Each record is one YAML file at `catalog/generated/<kind>/<id>.yaml` (written by scans) or `catalog/curated/curateddecision/<id>.yaml` (decisions people make over generated records). Files are written in canonical form: keys in a fixed order, list defaults written out, so the same facts always give the same bytes.",
838
+ "Every record has the common fields below, then the fields of its kind. Readers accept every supported schema version and writers always write the current one."
839
+ ],
840
+ versions: [
841
+ ["Schema version", SCHEMA_VERSION],
842
+ ["Versions readers accept", SUPPORTED_SCHEMA_VERSIONS.join(", ")]
843
+ ],
844
+ sections: [
845
+ ...RECORD_KINDS.map((name) => ({ name })),
846
+ ...[
847
+ "EntryFact",
848
+ "CallFact",
849
+ "StoreFact",
850
+ "FieldFact",
851
+ "DeployFact",
852
+ "ConfigFact",
853
+ "FlowFact"
854
+ ].map((name) => ({
855
+ name,
856
+ where: ".atticus/facts/<repo>.jsonl (one fact per line; ADR 0124)"
857
+ }))
858
+ ],
859
+ extra: (ctx) => [
860
+ "## Common fields",
861
+ "",
862
+ "Every record kind has these fields.",
863
+ "",
864
+ fieldTable(fieldRows(System, ctx, "commonFields", {
865
+ fallbackDocs: ["commonFields"],
866
+ skip: new Set(Object.keys(System.shape).filter((k) => !COMMON.includes(k)))
867
+ }).map((r) => r.path === "kind" ? { ...r, type: "string", description: "The record's kind: one of the kinds below." } : r)),
868
+ "",
869
+ "## Documented values",
870
+ "",
871
+ "`Component.type` and `DataStore.storeType` are free text, so an ecosystem can name a shape the specification doesn't list; these values are the documented ones, and tools treat them as known.",
872
+ "",
873
+ `- Component types: ${COMPONENT_TYPES.map((t) => `\`${t}\``).join(", ")}.`,
874
+ `- Data store types: ${STORE_TYPES.map((t) => `\`${t}\``).join(", ")}.`,
875
+ "- System tags: `saas` marks a SaaS product used as a system (boundary `vendor`).",
876
+ "",
877
+ "## Record kinds",
878
+ "",
879
+ RECORD_KINDS.map((k) => `- [${k}](#${k.toLowerCase()})`).join("\n"),
880
+ "",
881
+ "## The facts file (ADR 0124)",
882
+ "",
883
+ "What an assistant writes when it reads a repo: one JSON line per fact, in seven kinds plus flows, every one with a citation (`cite`: file, line, the claimed value, a short quote). The facts file is the assistant's input format, projected deterministically into the record kinds above by `projectFacts`; it is additive to C1 and changes the same way. A fact without a citation is not a fact; it is a question.",
884
+ "",
885
+ `Fact kinds: ${FACT_KINDS.map((k) => `\`${k}\``).join(", ")}.`
886
+ ]
887
+ },
888
+ {
889
+ id: "C2",
890
+ file: "c2-dialects.md",
891
+ title: "C2: Dialects",
892
+ summary: "Rule files that teach the scanner a house framework without code.",
893
+ intro: [
894
+ "A dialect is a YAML rule file, `org-pack/dialects/<name>.yaml`. Each rule matches something in source or config files (an annotation, a base class, a method call, a config key, an XPath or JSONPath, a regular expression) and emits a catalog record (C1) from templates over what matched. Every dialect ships its own tests; a dialect whose tests fail does not load."
895
+ ],
896
+ versions: [["Schema version", DIALECT_SCHEMA_VERSION]],
897
+ sections: [
898
+ { name: "Dialect", where: "org-pack/dialects/<name>.yaml" },
899
+ { name: "DialectRule" },
900
+ { name: "DialectEmit" },
901
+ { name: "DialectTest" }
902
+ ]
903
+ },
904
+ {
905
+ id: "C3",
906
+ file: "c3-rules-and-findings.md",
907
+ title: "C3: Rules and findings",
908
+ summary: "Checklist packs the critic applies, and the findings it records.",
909
+ intro: [
910
+ "A checklist pack is a set of rules a gate applies to a change: deterministic checks over the change's artifacts and the catalog, and bounded AI checks that must cite evidence. A finding is one result, stored as `openspec/changes/<change>/review/<gate>/<round>/<finding-id>.yaml`. Blocking findings stop a hand-off until fixed or waived by the stage owner; gaps need a fix or a recorded reason; risks and ideas never block."
911
+ ],
912
+ versions: [["Schema version", REVIEW_SCHEMA_VERSION]],
913
+ sections: [
914
+ { name: "ChecklistPack", where: "org-pack/checklists/<name>.yaml" },
915
+ { name: "ChecklistRule" },
916
+ { name: "Finding", where: "openspec/changes/<change>/review/<gate>/<round>/<id>.yaml" }
917
+ ]
918
+ },
919
+ {
920
+ id: "C4",
921
+ file: "c4-plugins-workspace-and-api.md",
922
+ title: "C4: Plugins, workspace files, executors and the local API",
923
+ summary: "Extractor and ingestor plugins, adapters, the workspace and change files, step executors and the local API.",
924
+ intro: [
925
+ "C4 is every interface between Atticus and code outside it: plugins that read files (extractors and ingestors), adapters to external systems, the workspace and change files, the step executor protocol, and the local API the UI uses."
926
+ ],
927
+ versions: [
928
+ ["Workspace files", WORKSPACE_SCHEMA_VERSION],
929
+ ["Change state file", CHANGE_SCHEMA_VERSION],
930
+ ["Executor protocol", EXECUTOR_SCHEMA_VERSION],
931
+ ["Local API", API_VERSION]
932
+ ],
933
+ sections: [
934
+ { name: "RepoManifest", where: "org-pack/profiles/<profile>/repos.manifest.yaml" },
935
+ { name: "ChangeRepos", where: "openspec/changes/<change>/repos.yaml" },
936
+ { name: "ChangeLifecycle", where: "openspec/changes/<change>/change.yaml" },
937
+ { name: "ManualStep" },
938
+ { name: "ExecutorsFile", where: ".atticus/executors.yaml (never committed)" },
939
+ { name: "RunRequest" },
940
+ { name: "RunProgress" },
941
+ { name: "RunResult" },
942
+ { name: "PingResponse" },
943
+ { name: "IdempotencyCheck" },
944
+ { name: "IdempotencyAnswer" }
945
+ ],
946
+ extra: () => [
947
+ "## Plugins",
948
+ "",
949
+ "Extractors read a repository and emit catalog records; ingestors read one input file (a diagram, a document, an export). Both read files only: no network, no AI model, no clock (timestamps come from the scan context), so a scan is deterministic and a plugin's output can be cached by commit. Everything a plugin emits is validated against C1; invalid records are reported and never written.",
950
+ "",
951
+ "```ts",
952
+ "interface RepoHandle {",
953
+ " readonly name: string; // repo name from the repo manifest",
954
+ " readonly commit: string; // commit being scanned",
955
+ " listFiles(globs: readonly string[]): AsyncIterable<string>;",
956
+ " readText(path: string): Promise<string>;",
957
+ "}",
958
+ "",
959
+ "interface ScanContext {",
960
+ " readonly dialects: readonly string[];",
961
+ " readonly component?: string; // the component this repo builds",
962
+ " readonly system?: string;",
963
+ " readonly repoType?: string;",
964
+ " readonly scannedAt: string; // ISO timestamp of this scan",
965
+ " warn(message: string, path?: string): void;",
966
+ "}",
967
+ "",
968
+ "interface Extractor {",
969
+ " readonly id: string; // lowercase slug",
970
+ " readonly version: string; // semver; part of the cache key and of every record's evidence",
971
+ " readonly claims: readonly string[]; // file globs it reads",
972
+ " scan(repo: RepoHandle, ctx: ScanContext): AsyncIterable<CatalogRecord>;",
973
+ "}",
974
+ "",
975
+ "interface Ingestor {",
976
+ " readonly id: string;",
977
+ " readonly version: string;",
978
+ " sniff(fileName: string, head: Uint8Array): number; // 0..1",
979
+ " ingest(fileName: string, content: Uint8Array, ctx: ScanContext): AsyncIterable<CatalogRecord>;",
980
+ "}",
981
+ "```",
982
+ "",
983
+ "## Adapters",
984
+ "",
985
+ "Adapters connect Atticus to external systems by type: work tracker, service desk, Git host, wiki, design tool, notifications, each with a manual fallback. Every write to a shared system goes through an adapter call that carries an explicit approval from a person; this is not configurable.",
986
+ "",
987
+ "## Local API",
988
+ "",
989
+ `The local API (version ${API_VERSION}) is an OpenAPI 3.1 document, generated from the same schemas and committed at [docs/api/openapi.json](../../api/openapi.json). It listens on 127.0.0.1 only and every request carries the per-session token printed at start-up.`
990
+ ]
991
+ },
992
+ {
993
+ id: "C5",
994
+ file: "c5-ai-runtime.md",
995
+ title: "C5: AI runtime",
996
+ summary: "Agent definitions, context packs, run summaries and recordings.",
997
+ intro: [
998
+ "Agents are defined as data: what they read, what they may write, the model and budget. Every run gets a context pack (the data it may see, wrapped and labelled as data, never instructions, with its classification), and leaves a run summary. Recordings let any run be replayed without a model, which is how tests run."
999
+ ],
1000
+ versions: [["Schema version", AI_SCHEMA_VERSION]],
1001
+ sections: [
1002
+ { name: "AgentDefinition", where: "org-pack/agents/<id>.yaml" },
1003
+ { name: "ContextPackManifest" },
1004
+ { name: "RunSummary" },
1005
+ { name: "Recording" }
1006
+ ]
1007
+ },
1008
+ {
1009
+ id: "C6",
1010
+ file: "c6-org-pack.md",
1011
+ title: "C6: The org pack",
1012
+ summary: "An organisation's configuration: change types, gates, patterns, sources, runtime, procedures, profiles.",
1013
+ intro: [
1014
+ "The org pack is everything an organisation configures, as files: the kinds of change and their flows, the gates and what they check, integration patterns, knowledge sources, the runtime (adapters and AI), procedures with their steps, test strategies and ecosystem profiles. A pack is validated file by file and across files; files it leaves out fall back to built-in defaults.",
1015
+ "`roles.yaml`, and the role-based approval fields in `gates.yaml`, `change-types.yaml` and the change policy, are deprecated (ADR 0073): they still load and validate, and nothing reads them. The person is the metarepo's Git user, and a gate is approved when its hand-off PR merges."
1016
+ ],
1017
+ versions: [["Schema version", ORGPACK_SCHEMA_VERSION]],
1018
+ sections: [
1019
+ { name: "PackManifest", where: "org-pack/pack.yaml" },
1020
+ { name: "Roles", where: "org-pack/roles.yaml (deprecated, ADR 0073)" },
1021
+ { name: "ChangeTypes", where: "org-pack/change-types.yaml" },
1022
+ { name: "Gates", where: "org-pack/gates.yaml" },
1023
+ { name: "IntegrationPattern", where: "org-pack/patterns/<code>.yaml" },
1024
+ { name: "FrameworkModel", where: "org-pack/frameworks/<name>.yaml (ADR 0054)" },
1025
+ { name: "Sources", where: "org-pack/sources.yaml" },
1026
+ { name: "Runtime", where: "org-pack/runtime.yaml" },
1027
+ { name: "SkillMeta", where: "org-pack/process/skills/<name>/SKILL.md (front matter)" },
1028
+ {
1029
+ name: "ServiceRequestTemplate",
1030
+ where: "org-pack/process/snow/<id>.yaml (service-desk request templates)"
1031
+ },
1032
+ { name: "Procedure", where: "org-pack/process/procedures/<id>.yaml" },
1033
+ { name: "TestStrategy", where: "org-pack/test-strategy.yaml" },
1034
+ { name: "Profile", where: "org-pack/profiles/<profile>/profile.yaml" },
1035
+ {
1036
+ name: "OpenSpecSettings",
1037
+ where: "org-pack/openspec.yaml (optional; OpenSpec's beta stores, ADR 0126)"
1038
+ }
1039
+ ]
1040
+ }
1041
+ ];
1042
+
1043
+ // packages/cli/dist/u1-commands.js
1044
+ async function conformanceCommand(target, o, io) {
1045
+ if (!o.kind || !CONFORMANCE_KINDS.includes(o.kind)) {
1046
+ io.err(`Say what to check with --kind: ${CONFORMANCE_KINDS.join(", ")}.${o.kind ? ` "${o.kind}" isn't one of them.` : ""}`);
1047
+ return 2;
1048
+ }
1049
+ const report2 = await conformanceRun(resolve(target), {
1050
+ kind: o.kind,
1051
+ ...o.executor ? { executor: o.executor } : {},
1052
+ ...o.fixture ? { fixture: resolve(o.fixture) } : {}
1053
+ });
1054
+ if (o.json)
1055
+ io.out(JSON.stringify(report2, null, 2));
1056
+ else
1057
+ for (const l of lines(report2))
1058
+ io.out(l);
1059
+ return report2.passed ? 0 : 1;
1060
+ }
1061
+ var MARK = { pass: "ok ", fail: "FAIL", warn: "warn" };
1062
+ function lines(r) {
1063
+ const out = [`Conformance of ${r.target} (${r.kind}) to specification ${r.specVersion}:`];
1064
+ for (const x of r.results)
1065
+ out.push(` ${MARK[x.status]} ${x.check} ${x.file ? `${x.file}: ` : ""}${x.message}`);
1066
+ const { pass, fail, warn } = r.summary;
1067
+ const n = (k, word) => `${k} ${word}${k === 1 ? "" : "s"}`;
1068
+ const warnings = warn ? `, ${n(warn, "warning")}` : "";
1069
+ out.push(r.passed ? `Passed: ${n(pass, "check")}${warnings}.` : `Failed: ${n(fail, "problem")}, ${n(pass, "check")} passed${warnings}.`);
1070
+ return out;
1071
+ }
1072
+
1073
+ export {
1074
+ conformanceCommand
1075
+ };