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

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 (497) 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-23M2LUYM.js +55 -0
  6. package/dist/chunk-26PLPSQW.js +48 -0
  7. package/dist/chunk-2G4DFUWJ.js +43 -0
  8. package/dist/chunk-2HMWX4T6.js +226 -0
  9. package/dist/chunk-2KDSXJFJ.js +294 -0
  10. package/dist/chunk-2M6WXO73.js +38 -0
  11. package/dist/chunk-2RX7PI2Y.js +166 -0
  12. package/dist/chunk-2XM6PYQQ.js +199 -0
  13. package/dist/chunk-3G4YI4ZU.js +16 -0
  14. package/dist/chunk-3GTZ2OON.js +362 -0
  15. package/dist/chunk-3QAKDIEU.js +108 -0
  16. package/dist/chunk-47QE246J.js +6115 -0
  17. package/dist/chunk-4GZXS6S2.js +5401 -0
  18. package/dist/chunk-4PJADZRR.js +545 -0
  19. package/dist/chunk-4Q3NN7VF.js +32 -0
  20. package/dist/chunk-4QUQEBFT.js +143 -0
  21. package/dist/chunk-4SKZDI62.js +22 -0
  22. package/dist/chunk-4SVJNVEE.js +80 -0
  23. package/dist/chunk-52R2YXP5.js +80 -0
  24. package/dist/chunk-577AJVRS.js +44694 -0
  25. package/dist/chunk-5F3RJCHB.js +45 -0
  26. package/dist/chunk-5IALSMZ2.js +34 -0
  27. package/dist/chunk-5KTOPOEP.js +174 -0
  28. package/dist/chunk-5MI2SEV5.js +242 -0
  29. package/dist/chunk-5XDNUJ4P.js +2743 -0
  30. package/dist/chunk-5XN76FTF.js +22 -0
  31. package/dist/chunk-5YIBJXGB.js +2007 -0
  32. package/dist/chunk-62YMDXY6.js +38 -0
  33. package/dist/chunk-65C57N7P.js +116 -0
  34. package/dist/chunk-67J3VZBA.js +120 -0
  35. package/dist/chunk-6EDQE7GO.js +27809 -0
  36. package/dist/chunk-6GNS32SI.js +285 -0
  37. package/dist/chunk-6GWHKMQR.js +405 -0
  38. package/dist/chunk-6JLPXDWN.js +7923 -0
  39. package/dist/chunk-6TJCUYC5.js +22 -0
  40. package/dist/chunk-6VBXAGJX.js +234 -0
  41. package/dist/chunk-73VPWF5R.js +415 -0
  42. package/dist/chunk-76WKMA4J.js +14 -0
  43. package/dist/chunk-7DUDLVFJ.js +52 -0
  44. package/dist/chunk-7EFILTCI.js +67 -0
  45. package/dist/chunk-7EKESFWV.js +130 -0
  46. package/dist/chunk-7F2RUWPU.js +101 -0
  47. package/dist/chunk-7GB4ZRE2.js +378 -0
  48. package/dist/chunk-7TGYNOXD.js +189 -0
  49. package/dist/chunk-7UKVYFQ2.js +2078 -0
  50. package/dist/chunk-7URGP4DD.js +102 -0
  51. package/dist/chunk-7YYEKTYF.js +2522 -0
  52. package/dist/chunk-AJJK7GLO.js +252 -0
  53. package/dist/chunk-AKJTKMXU.js +25 -0
  54. package/dist/chunk-APSVL2AI.js +344 -0
  55. package/dist/chunk-AWECWW5Y.js +3206 -0
  56. package/dist/chunk-AY2IUF4K.js +5071 -0
  57. package/dist/chunk-B2VSVN4P.js +34 -0
  58. package/dist/chunk-B3O52AUQ.js +275 -0
  59. package/dist/chunk-B7434AE2.js +104 -0
  60. package/dist/chunk-BDEKREZH.js +155 -0
  61. package/dist/chunk-BJPMKJTL.js +1428 -0
  62. package/dist/chunk-BMCKL3VQ.js +324 -0
  63. package/dist/chunk-BMHGA7WD.js +25 -0
  64. package/dist/chunk-BUYJL3GJ.js +287 -0
  65. package/dist/chunk-BXIX7S7O.js +32 -0
  66. package/dist/chunk-CHC5FKTU.js +26 -0
  67. package/dist/chunk-CITDNDIZ.js +53 -0
  68. package/dist/chunk-CIUHAHM6.js +70 -0
  69. package/dist/chunk-CNKGYDMG.js +334 -0
  70. package/dist/chunk-CRE4BJHM.js +408 -0
  71. package/dist/chunk-D3PO4DOZ.js +261 -0
  72. package/dist/chunk-DAQBIK5G.js +47 -0
  73. package/dist/chunk-DDAHCPGA.js +212 -0
  74. package/dist/chunk-DPHCFZ7W.js +374 -0
  75. package/dist/chunk-DZRQDNPT.js +34 -0
  76. package/dist/chunk-E3JYO547.js +46 -0
  77. package/dist/chunk-E3Z67HRK.js +104 -0
  78. package/dist/chunk-EADP3PEN.js +450 -0
  79. package/dist/chunk-EX6ZXS5K.js +169 -0
  80. package/dist/chunk-EZIUFEN6.js +27 -0
  81. package/dist/chunk-F2FOQLJ7.js +430 -0
  82. package/dist/chunk-F7UQR4ZX.js +149 -0
  83. package/dist/chunk-F7YL2RZ4.js +94 -0
  84. package/dist/chunk-FEZE6NIA.js +69 -0
  85. package/dist/chunk-FJCFYKVO.js +1014 -0
  86. package/dist/chunk-FLOEZA6K.js +29 -0
  87. package/dist/chunk-FMKKVWZD.js +133 -0
  88. package/dist/chunk-FNHSVBRA.js +48 -0
  89. package/dist/chunk-FOGG4AUR.js +114 -0
  90. package/dist/chunk-FPGVOSOG.js +41 -0
  91. package/dist/chunk-FQSRHTTC.js +49 -0
  92. package/dist/chunk-FR7JPYBD.js +182 -0
  93. package/dist/chunk-FTV6I76U.js +211 -0
  94. package/dist/chunk-FV5YFR6I.js +540 -0
  95. package/dist/chunk-FZ2E5LGK.js +54 -0
  96. package/dist/chunk-FZL2HNWP.js +531 -0
  97. package/dist/chunk-G2E5MNYP.js +549 -0
  98. package/dist/chunk-G5SFOH7P.js +256 -0
  99. package/dist/chunk-GFXLPJWY.js +53 -0
  100. package/dist/chunk-GR6YKM55.js +480 -0
  101. package/dist/chunk-GXJVY6WT.js +250 -0
  102. package/dist/chunk-GZ4TKR3Q.js +928 -0
  103. package/dist/chunk-HB6XSGI6.js +131 -0
  104. package/dist/chunk-HE4ZQXZM.js +396 -0
  105. package/dist/chunk-HHUFVJF7.js +1019 -0
  106. package/dist/chunk-HKTUIMH4.js +76 -0
  107. package/dist/chunk-HUZQDKQK.js +48 -0
  108. package/dist/chunk-I7IWQIEB.js +58 -0
  109. package/dist/chunk-IDGSU7JF.js +1496 -0
  110. package/dist/chunk-ILFKECGI.js +69 -0
  111. package/dist/chunk-ISNZYKAS.js +53 -0
  112. package/dist/chunk-IUD3ME4E.js +251 -0
  113. package/dist/chunk-IV7BCWWN.js +101 -0
  114. package/dist/chunk-IZNSAEBX.js +164 -0
  115. package/dist/chunk-J5LHDJU4.js +400 -0
  116. package/dist/chunk-JAA53T23.js +172 -0
  117. package/dist/chunk-JF2NSTFO.js +47 -0
  118. package/dist/chunk-JMSEEBN4.js +41 -0
  119. package/dist/chunk-JQ7XQPQS.js +273 -0
  120. package/dist/chunk-KC5DROFC.js +16667 -0
  121. package/dist/chunk-KIAI6PWL.js +36 -0
  122. package/dist/chunk-KIHOIVST.js +18 -0
  123. package/dist/chunk-KM2FBM3T.js +659 -0
  124. package/dist/chunk-KQDZXGNR.js +14 -0
  125. package/dist/chunk-L4VJ4ETL.js +41 -0
  126. package/dist/chunk-LDKUC2QJ.js +49 -0
  127. package/dist/chunk-LK44ULGI.js +2043 -0
  128. package/dist/chunk-LRS573EX.js +104 -0
  129. package/dist/chunk-LTQANUDH.js +119 -0
  130. package/dist/chunk-LVGBKKSM.js +282 -0
  131. package/dist/chunk-MF7QH4AX.js +162 -0
  132. package/dist/chunk-MGVYVW7Q.js +915 -0
  133. package/dist/chunk-MH5OCRUM.js +240 -0
  134. package/dist/chunk-MKFYQQ5Q.js +36 -0
  135. package/dist/chunk-MKRBG5EF.js +1142 -0
  136. package/dist/chunk-MTAUZW2Z.js +2504 -0
  137. package/dist/chunk-MTEBM4Y4.js +39 -0
  138. package/dist/chunk-N3NBWIYQ.js +48 -0
  139. package/dist/chunk-N4QZJJVB.js +3851 -0
  140. package/dist/chunk-NGPU2ARF.js +1726 -0
  141. package/dist/chunk-NIXVDQVO.js +2929 -0
  142. package/dist/chunk-NNUASOAA.js +34 -0
  143. package/dist/chunk-NPCD54I7.js +226 -0
  144. package/dist/chunk-OEI7LVRP.js +856 -0
  145. package/dist/chunk-OGRWQ562.js +18 -0
  146. package/dist/chunk-OIU657QQ.js +95 -0
  147. package/dist/chunk-OJLRFGBP.js +128 -0
  148. package/dist/chunk-OS7PQ35Z.js +391 -0
  149. package/dist/chunk-OSGQW2Z6.js +104 -0
  150. package/dist/chunk-P3TKKBAH.js +131 -0
  151. package/dist/chunk-PEF5OEMB.js +163 -0
  152. package/dist/chunk-PGKHJYOB.js +706 -0
  153. package/dist/chunk-PIVKU64W.js +688 -0
  154. package/dist/chunk-PKCMRPPB.js +109 -0
  155. package/dist/chunk-QICFHVRW.js +15 -0
  156. package/dist/chunk-QKEFZRHS.js +166 -0
  157. package/dist/chunk-QWVBEK4P.js +113 -0
  158. package/dist/chunk-R4TBNKKC.js +3217 -0
  159. package/dist/chunk-R64GLVBO.js +2919 -0
  160. package/dist/chunk-R6B6XAKK.js +56 -0
  161. package/dist/chunk-R6RY4Q5T.js +51 -0
  162. package/dist/chunk-RK6MKKKP.js +471 -0
  163. package/dist/chunk-ROTY5J2L.js +25 -0
  164. package/dist/chunk-RRVT4MPS.js +150 -0
  165. package/dist/chunk-SS66Q4VE.js +231 -0
  166. package/dist/chunk-T4RTWMJD.js +310 -0
  167. package/dist/chunk-T6USVBEJ.js +105 -0
  168. package/dist/chunk-TM7LC37P.js +4044 -0
  169. package/dist/chunk-TV45EUGM.js +51 -0
  170. package/dist/chunk-TZDSDDSV.js +233 -0
  171. package/dist/chunk-UBWCUP3G.js +55 -0
  172. package/dist/chunk-UF7TAFJM.js +906 -0
  173. package/dist/chunk-UR7RMZ3R.js +19943 -0
  174. package/dist/chunk-UYYN2IUZ.js +1611 -0
  175. package/dist/chunk-V2TH46ZY.js +66 -0
  176. package/dist/chunk-VKMTFIWS.js +315 -0
  177. package/dist/chunk-VOGCSYOI.js +16 -0
  178. package/dist/chunk-W5OYJMBT.js +41 -0
  179. package/dist/chunk-WARBF2KY.js +296 -0
  180. package/dist/chunk-WGZWR4RF.js +130 -0
  181. package/dist/chunk-WLIIQ2A4.js +18 -0
  182. package/dist/chunk-X4W4XXWP.js +134 -0
  183. package/dist/chunk-XB5RFZHH.js +1217 -0
  184. package/dist/chunk-XEG3FE2R.js +766 -0
  185. package/dist/chunk-XIWYUQZQ.js +583 -0
  186. package/dist/chunk-XKS6THI5.js +31 -0
  187. package/dist/chunk-XKZHAD6Y.js +184 -0
  188. package/dist/chunk-XNYNEEBR.js +214 -0
  189. package/dist/chunk-XPCWQXTY.js +37 -0
  190. package/dist/chunk-XPEEICAO.js +325 -0
  191. package/dist/chunk-XQ3YIV5R.js +3507 -0
  192. package/dist/chunk-XRO65C7V.js +1079 -0
  193. package/dist/chunk-XTVDAHH2.js +203 -0
  194. package/dist/chunk-XZRON6IV.js +131 -0
  195. package/dist/chunk-Y4BRGOJR.js +523 -0
  196. package/dist/chunk-Y5PZHS4K.js +3898 -0
  197. package/dist/chunk-Y7KBQ4BD.js +230 -0
  198. package/dist/chunk-YFSSNGLR.js +277 -0
  199. package/dist/chunk-YGKYFMSL.js +60 -0
  200. package/dist/chunk-YGR6OCHQ.js +345 -0
  201. package/dist/chunk-YIEOFHOL.js +30 -0
  202. package/dist/chunk-YLAJAI2W.js +180 -0
  203. package/dist/chunk-YMOJD5BO.js +50 -0
  204. package/dist/chunk-YPBQNJHA.js +33 -0
  205. package/dist/chunk-YPIEYQF4.js +307 -0
  206. package/dist/chunk-YVLMBAYE.js +221 -0
  207. package/dist/chunk-YXJ4XOHF.js +376 -0
  208. package/dist/chunk-ZE3P35DA.js +1247 -0
  209. package/dist/chunk-ZONE6E3Z.js +32 -0
  210. package/dist/chunk-ZP4FJHR4.js +95 -0
  211. package/dist/chunk-ZZXF6OOJ.js +119 -0
  212. package/dist/files.json +1976 -0
  213. package/dist/fixtures/forge/README.md +19 -0
  214. package/dist/fixtures/forge/expected/discrepancies.yaml +54 -0
  215. package/dist/fixtures/forge/expected/inputs.yaml +38 -0
  216. package/dist/fixtures/forge/expected/scan.yaml +342 -0
  217. package/dist/fixtures/forge/inputs/diagrams/forge-context.drawio +23 -0
  218. package/dist/fixtures/forge/inputs/partner-specs/northwind-pay-openapi.yaml +11 -0
  219. package/dist/fixtures/forge/inputs/tickets/ado-stories.json +4 -0
  220. package/dist/fixtures/forge/inputs/tickets/closed-service-requests.json +5 -0
  221. package/dist/fixtures/forge/inputs/wiki/integration-patterns.md +11 -0
  222. package/dist/fixtures/forge/inputs/wiki/ledger-solution-spec.md +9 -0
  223. package/dist/fixtures/forge/inputs/wiki/snow-firewall-request.md +4 -0
  224. package/dist/fixtures/forge/metarepo/judgments/reaches/84af5b6af24f7ca8c23013f3.yaml +17 -0
  225. package/dist/fixtures/forge/metarepo/judgments/reaches/c3917555edebddce8cecb647.yaml +17 -0
  226. package/dist/fixtures/forge/metarepo/judgments/reaches/c5fafd6601f8ca9e34e0bbd0.yaml +17 -0
  227. package/dist/fixtures/forge/metarepo/org-pack/agents/architecture-critic.yaml +9 -0
  228. package/dist/fixtures/forge/metarepo/org-pack/agents/story-writer.yaml +10 -0
  229. package/dist/fixtures/forge/metarepo/org-pack/checklists/architecture.yaml +115 -0
  230. package/dist/fixtures/forge/metarepo/org-pack/dialects/forge.yaml +111 -0
  231. package/dist/fixtures/forge/metarepo/org-pack/gates.yaml +22 -0
  232. package/dist/fixtures/forge/metarepo/org-pack/pack.yaml +11 -0
  233. package/dist/fixtures/forge/metarepo/org-pack/patterns/A.EB.PUB.yaml +12 -0
  234. package/dist/fixtures/forge/metarepo/org-pack/patterns/D.JDBC.yaml +12 -0
  235. package/dist/fixtures/forge/metarepo/org-pack/patterns/S.DIR.BFF.yaml +12 -0
  236. package/dist/fixtures/forge/metarepo/org-pack/patterns/S.GW.SOR.yaml +13 -0
  237. package/dist/fixtures/forge/metarepo/org-pack/patterns/S.GW.VND.yaml +14 -0
  238. package/dist/fixtures/forge/metarepo/org-pack/process/change-templates/feature.md +37 -0
  239. package/dist/fixtures/forge/metarepo/org-pack/process/skills/add-forge-endpoint/SKILL.md +17 -0
  240. package/dist/fixtures/forge/metarepo/org-pack/process/snow/firewall-rule.yaml +14 -0
  241. package/dist/fixtures/forge/metarepo/org-pack/process/snow/gateway-route.yaml +13 -0
  242. package/dist/fixtures/forge/metarepo/org-pack/profiles/forge/profile.yaml +12 -0
  243. package/dist/fixtures/forge/metarepo/org-pack/profiles/forge/repos.manifest.yaml +44 -0
  244. package/dist/fixtures/forge/metarepo/org-pack/roles.yaml +14 -0
  245. package/dist/fixtures/forge/metarepo/org-pack/runtime.yaml +14 -0
  246. package/dist/fixtures/forge/metarepo/org-pack/sources.yaml +3 -0
  247. package/dist/fixtures/forge/repos/forge-events/topics/payments.initiated.yaml +4 -0
  248. package/dist/fixtures/forge/repos/forge-events/topics/transfers.completed.yaml +4 -0
  249. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/ledger-v1.xml +3 -0
  250. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/policies/SpikeArrest.xml +3 -0
  251. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/policies/VerifyOAuth.xml +4 -0
  252. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/proxies/default.xml +14 -0
  253. package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/targets/ledger.xml +5 -0
  254. package/dist/fixtures/forge/repos/forge-infra/alerts/ledger-api.yaml +5 -0
  255. package/dist/fixtures/forge/repos/forge-infra/k8s/ledger-api.yaml +15 -0
  256. package/dist/fixtures/forge/repos/forge-infra/k8s/portal-bff.yaml +7 -0
  257. package/dist/fixtures/forge/repos/forge-infra/terraform/ledger-db.tf +9 -0
  258. package/dist/fixtures/forge/repos/forge-ledger/api/ledger-openapi.yaml +31 -0
  259. package/dist/fixtures/forge/repos/forge-ledger/forge.yaml +4 -0
  260. package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/LedgerEndpoints.java +13 -0
  261. package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/LedgerEvents.java +11 -0
  262. package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/NorthwindClient.java +10 -0
  263. package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/application.yml +3 -0
  264. package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/db/migration/V1__create_account.sql +5 -0
  265. package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/db/migration/V2__create_entry.sql +7 -0
  266. package/dist/fixtures/forge/repos/forge-portal-bff/pom.xml +1 -0
  267. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/AuditPublisher.java +12 -0
  268. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/BalanceController.java +16 -0
  269. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/LedgerClient.java +13 -0
  270. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/PaymentEvents.java +13 -0
  271. package/dist/fixtures/forge/repos/forge-portal-bff/src/main/resources/application.yml +8 -0
  272. package/dist/fixtures/forge/repos/forge-portal-ui/package.json +1 -0
  273. package/dist/fixtures/forge/repos/forge-portal-ui/src/api/balance.ts +5 -0
  274. package/dist/fixtures/forge/repos/forge-reports-job/src/main/java/forge/reports/DailyEntriesJob.java +19 -0
  275. package/dist/fixtures/forge/repos/forge-reports-job/src/main/resources/application.yml +3 -0
  276. package/dist/fixtures/forge-change/README.md +41 -0
  277. package/dist/fixtures/forge-change/expected/findings.yaml +301 -0
  278. package/dist/fixtures/forge-change/expected/stories.yaml +101 -0
  279. package/dist/fixtures/forge-change/judgments/personal-data/0b5f3dbf5257a22275d8c74b.yaml +18 -0
  280. package/dist/fixtures/forge-change/judgments/personal-data/2759a66770134c417440bf2d.yaml +18 -0
  281. package/dist/fixtures/forge-change/judgments/personal-data/31b1ea2f14d0737f1aca79fd.yaml +18 -0
  282. package/dist/fixtures/forge-change/judgments/personal-data/49afd70c08228e65ad6ca1ed.yaml +18 -0
  283. package/dist/fixtures/forge-change/judgments/personal-data/761cabcb8a39f5e5866d2dd6.yaml +18 -0
  284. package/dist/fixtures/forge-change/judgments/personal-data/adae902b90cc8ffa0c765145.yaml +18 -0
  285. package/dist/fixtures/forge-change/judgments/personal-data/ba11bb933105ec9493e065dd.yaml +18 -0
  286. package/dist/fixtures/forge-change/judgments/personal-data/bdbcd1cdac3021c68063c3e7.yaml +18 -0
  287. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/brief.md +35 -0
  288. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/change.yaml +120 -0
  289. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/data.md +18 -0
  290. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/design.md +29 -0
  291. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/interfaces.md +17 -0
  292. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/mappings.md +26 -0
  293. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/proposal.md +35 -0
  294. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/snow.md +12 -0
  295. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/specs/transfer-limits/spec.md +19 -0
  296. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s1-refuse-over-limit.md +17 -0
  297. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s2-show-remaining.md +16 -0
  298. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s3-audit-refusals.md +18 -0
  299. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s4-velocity-check.md +16 -0
  300. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories.md +8 -0
  301. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/tasks.md +12 -0
  302. package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/ux.md +7 -0
  303. package/dist/fixtures/forge-change/org-pack/agents/code-and-test-critic.yaml +13 -0
  304. package/dist/fixtures/forge-change/org-pack/agents/complete-critic.yaml +12 -0
  305. package/dist/fixtures/forge-change/org-pack/agents/safe-critic.yaml +12 -0
  306. package/dist/fixtures/forge-change/org-pack/agents/ship-critic.yaml +11 -0
  307. package/dist/fixtures/forge-change/org-pack/agents/true-critic.yaml +11 -0
  308. package/dist/fixtures/forge-change/org-pack/checklists/review.yaml +54 -0
  309. package/dist/fixtures/forge-change/org-pack/gates.yaml +25 -0
  310. package/dist/fixtures/forge-change/org-pack/teams/team-ledger/checklists/ledger-team.yaml +227 -0
  311. package/dist/fixtures/forge-change/recordings/complete-critic/2ad84f84bf39c1d5412697e69fe23034d6983ec45a00314bf0975e627589a3c5.json +12 -0
  312. package/dist/fixtures/forge-change/recordings/complete-critic/417c98d8e54a4387d0fd93441c49f44c2868958739070d855c1dce0c41e24db3.json +12 -0
  313. package/dist/fixtures/forge-change/recordings/complete-critic/50203ee22e9cb3ef047295edb6538fe7d5695e1e4b139f3c929013dc6ce47021.json +12 -0
  314. package/dist/fixtures/forge-change/recordings/complete-critic/89f18d67f5d9c325bf35e2a9e020f9ddb6ee13b8523315037f0905cc57c040b1.json +12 -0
  315. package/dist/fixtures/forge-change/recordings/complete-critic/b4097867d26ae8eadc8b9efa8cdd86897013358035f0b40086c299a59c4ba121.json +12 -0
  316. package/dist/fixtures/forge-change/recordings/safe-critic/302d06f49664dd67ad2e21ab9cf74c1b0f7d3f750709c6ed8eff2b70983274e2.json +12 -0
  317. package/dist/fixtures/forge-change/recordings/safe-critic/32f1049c9a5ab4a759543290db4644ec6e221cc45fdfdcf06193837c6a8ce0b9.json +12 -0
  318. package/dist/fixtures/forge-change/recordings/safe-critic/4e4a84bfc04b9f26ca4250319a879901ff7a1c081c71e46a117675fee05026b0.json +12 -0
  319. package/dist/fixtures/forge-change/recordings/safe-critic/604af0fcdd6df6b76208fa88305fdc15c37606c2a4d1ae816477e46ac8c2dd04.json +12 -0
  320. package/dist/fixtures/forge-change/recordings/safe-critic/f0bf50af11f14c50d07904f0dffe1c8c20fb0cd89770645a8824c1d30a443955.json +12 -0
  321. package/dist/fixtures/forge-change/recordings/ship-critic/350954b58833b2c04880c67db45a1b328b7fd541d9f0d943b63905b8875488a6.json +12 -0
  322. package/dist/fixtures/forge-change/recordings/ship-critic/4af95c6c96a206777cec9de1f9c2d8c55a36ddc9b8db2f81d6eb83217b835efa.json +12 -0
  323. package/dist/fixtures/forge-change/recordings/ship-critic/76c34522a49cf7587a4e5689a5030d384603fa780b8aba97d27815cbc829683e.json +12 -0
  324. package/dist/fixtures/forge-change/recordings/ship-critic/a3b2cd1ace48587e5994333db03b34c3a0f9dec4f1932f1730ddfb687f6918c8.json +12 -0
  325. package/dist/fixtures/forge-change/recordings/ship-critic/de288a4fa64d0fc20890f9a787080ce6eac5203b7b9b72d884df11e8cf111835.json +12 -0
  326. package/dist/fixtures/forge-change/recordings/story-writer/1ddb00eac2aaf91a5ec5d9dfd220116be9f75aec6546a4a3a3b050ed89af2864.json +12 -0
  327. package/dist/packages/assistant-kit/frameworks-kit/README.md +86 -0
  328. package/dist/packages/assistant-kit/frameworks-kit/checklist.md +11 -0
  329. package/dist/packages/assistant-kit/frameworks-kit/examples/tide-lantern.yaml +56 -0
  330. package/dist/packages/assistant-kit/frameworks-kit/examples/tide-platform.yaml +43 -0
  331. package/dist/packages/assistant-kit/frameworks-kit/prompts/write-framework-model.md +12 -0
  332. package/dist/packages/assistant-kit/kit/README.md +98 -0
  333. package/dist/packages/assistant-kit/kit/c2-reference.md +334 -0
  334. package/dist/packages/assistant-kit/kit/checklist.md +39 -0
  335. package/dist/packages/assistant-kit/kit/examples/house-http-client.yaml +102 -0
  336. package/dist/packages/assistant-kit/kit/examples/tide-apigee.yaml +56 -0
  337. package/dist/packages/assistant-kit/kit/examples/tide-apim.yaml +32 -0
  338. package/dist/packages/assistant-kit/kit/examples/tide-kong.yaml +44 -0
  339. package/dist/packages/assistant-kit/kit/prompts/write-dialect.md +34 -0
  340. package/dist/packages/assistant-kit/kit/worked-example.md +198 -0
  341. package/dist/packages/conformance/sample/README.md +4 -0
  342. package/dist/packages/conformance/sample/inputs/notes.md +3 -0
  343. package/dist/packages/conformance/sample/inputs/systems.csv +3 -0
  344. package/dist/packages/conformance/sample/repo/api/greeter.proto +6 -0
  345. package/dist/packages/conformance/sample/repo/api/openapi.yaml +10 -0
  346. package/dist/packages/conformance/sample/repo/api/schema.graphql +3 -0
  347. package/dist/packages/conformance/sample/repo/db/V1__create_greeting.sql +4 -0
  348. package/dist/packages/conformance/sample/repo/package.json +7 -0
  349. package/dist/packages/conformance/sample/repo/src/main/java/sample/HelloController.java +10 -0
  350. package/dist/packages/conformance/sample/repo/web/app.ts +4 -0
  351. package/dist/packages/evals/datasets/critic-lenses.yaml +62 -0
  352. package/dist/packages/evals/datasets/dialect-writer.yaml +14 -0
  353. package/dist/packages/evals/datasets/feature-namer.yaml +34 -0
  354. package/dist/packages/evals/datasets/glossary-definer.yaml +25 -0
  355. package/dist/packages/evals/datasets/story-writer.yaml +13 -0
  356. package/dist/packages/evals/datasets/template-writer.yaml +16 -0
  357. package/dist/packages/evals/datasets/test-writer.yaml +18 -0
  358. package/dist/packages/executors/reference/reference-executor.mjs +233 -0
  359. package/dist/packages/extractors/dialects/argocd.yaml +45 -0
  360. package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/AccountResource.java +47 -0
  361. package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/AuditClient.java +12 -0
  362. package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/LedgerClient.java +17 -0
  363. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/LedgerClient.java +14 -0
  364. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/RatesClient.java +11 -0
  365. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/StatementController.java +36 -0
  366. package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/resources/application.yml +7 -0
  367. package/dist/packages/extractors/dialects/fixtures/quarkus-reactive-messaging/fraud-service/src/main/java/forge/fraud/FraudScorer.java +27 -0
  368. package/dist/packages/extractors/dialects/fixtures/quarkus-reactive-messaging/fraud-service/src/main/resources/application.properties +4 -0
  369. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/api.tf +38 -0
  370. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/main.tf +95 -0
  371. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/terraform.tfvars +1 -0
  372. package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/variables.tf +4 -0
  373. package/dist/packages/extractors/dialects/fixtures/terraform-azure/forge-azure-infra/main.tf +102 -0
  374. package/dist/packages/extractors/dialects/fixtures/terraform-gcp/forge-gcp-infra/main.tf +51 -0
  375. package/dist/packages/extractors/dialects/harness.yaml +101 -0
  376. package/dist/packages/extractors/dialects/jaxrs.yaml +155 -0
  377. package/dist/packages/extractors/dialects/micronaut.yaml +207 -0
  378. package/dist/packages/extractors/dialects/quarkus-reactive-messaging.yaml +158 -0
  379. package/dist/packages/extractors/dialects/tekton.yaml +71 -0
  380. package/dist/packages/extractors/dialects/terraform-aws.yaml +267 -0
  381. package/dist/packages/extractors/dialects/terraform-azure.yaml +212 -0
  382. package/dist/packages/extractors/dialects/terraform-gcp.yaml +109 -0
  383. package/dist/packages/extractors/grammars/README.md +11 -0
  384. package/dist/packages/extractors/grammars/tree-sitter-groovy.LICENSE +21 -0
  385. package/dist/packages/extractors/grammars/tree-sitter-groovy.wasm +0 -0
  386. package/dist/packages/extractors/grammars/vendored.json +11 -0
  387. package/dist/packages/learn/lessons/architect-diagrams-and-code.yaml +69 -0
  388. package/dist/packages/learn/lessons/business-analyst-story-bar.yaml +94 -0
  389. package/dist/packages/learn/lessons/delivery-lead-release-readiness.yaml +44 -0
  390. package/dist/packages/learn/lessons/designer-features-in-user-words.yaml +57 -0
  391. package/dist/packages/learn/lessons/developer-find-your-way.yaml +60 -0
  392. package/dist/packages/learn/lessons/everyone-first-hour.yaml +74 -0
  393. package/dist/packages/learn/lessons/platform-lead-coverage-and-defences.yaml +58 -0
  394. package/dist/packages/learn/lessons/product-owner-first-change.yaml +167 -0
  395. package/dist/packages/learn/lessons/qa-tests-and-trace.yaml +53 -0
  396. package/dist/packages/learn/lessons/team-lead-initiative.yaml +146 -0
  397. package/dist/packages/naysayer/constitution/constitution.yaml +305 -0
  398. package/dist/packages/naysayer/starter/review.yaml +256 -0
  399. package/dist/packages/sdk/npm/index.js +9780 -0
  400. package/dist/packages/speckit/rules/drift.yaml +78 -0
  401. package/dist/packages/taskrun/rules/conform.yaml +38 -0
  402. package/dist/packages/testgen/rules/trace.yaml +49 -0
  403. package/dist/packages/ui/dist/assets/elk-api-Mo5w5xCa.js +2 -0
  404. package/dist/packages/ui/dist/assets/elk-worker.min--dAJroGl.js +6401 -0
  405. package/dist/packages/ui/dist/assets/elk-worker.min-DdYmS5kP.js +2 -0
  406. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
  407. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
  408. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
  409. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
  410. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
  411. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
  412. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
  413. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
  414. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
  415. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
  416. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
  417. package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
  418. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
  419. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
  420. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
  421. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
  422. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
  423. package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
  424. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  425. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  426. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  427. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  428. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  429. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  430. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
  431. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
  432. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
  433. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
  434. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
  435. package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
  436. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
  437. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
  438. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
  439. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
  440. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
  441. package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
  442. package/dist/packages/ui/dist/assets/index-Bp3XhPHX.css +1 -0
  443. package/dist/packages/ui/dist/assets/index-DM212ZbV.js +29 -0
  444. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  445. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  446. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
  447. package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  448. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  449. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  450. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
  451. package/dist/packages/ui/dist/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  452. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  453. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  454. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  455. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  456. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  457. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  458. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  459. package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
  460. package/dist/packages/ui/dist/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  461. package/dist/packages/ui/dist/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
  462. package/dist/packages/ui/dist/assets/rajdhani-devanagari-600-normal-BtY48IV_.woff +0 -0
  463. package/dist/packages/ui/dist/assets/rajdhani-devanagari-600-normal-DhS7ScYx.woff2 +0 -0
  464. package/dist/packages/ui/dist/assets/rajdhani-devanagari-700-normal-BQQOj9BB.woff2 +0 -0
  465. package/dist/packages/ui/dist/assets/rajdhani-devanagari-700-normal-DBRwWuxA.woff +0 -0
  466. package/dist/packages/ui/dist/assets/rajdhani-latin-600-normal-CXCVEoA9.woff2 +0 -0
  467. package/dist/packages/ui/dist/assets/rajdhani-latin-600-normal-Dx02qI2_.woff +0 -0
  468. package/dist/packages/ui/dist/assets/rajdhani-latin-700-normal-BPDUZo87.woff2 +0 -0
  469. package/dist/packages/ui/dist/assets/rajdhani-latin-700-normal-e0Uj8ZlN.woff +0 -0
  470. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-600-normal-BleIgkPp.woff +0 -0
  471. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-600-normal-C9ZjJQAt.woff2 +0 -0
  472. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-700-normal-BPaQ7tlD.woff +0 -0
  473. package/dist/packages/ui/dist/assets/rajdhani-latin-ext-700-normal-S6aYESQK.woff2 +0 -0
  474. package/dist/packages/ui/dist/favicon.svg +1 -0
  475. package/dist/packages/ui/dist/index.html +15 -0
  476. package/dist/third-party.json +575 -0
  477. package/dist/vendor/@fission-ai/openspec/bin/openspec.js +85986 -0
  478. package/dist/vendor/@fission-ai/openspec/package.json +82 -0
  479. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/schema.yaml +248 -0
  480. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/design.md +21 -0
  481. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/proposal.md +34 -0
  482. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/spec.md +13 -0
  483. package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/tasks.md +11 -0
  484. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-c_sharp.wasm +0 -0
  485. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-go.wasm +0 -0
  486. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-java.wasm +0 -0
  487. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-javascript.wasm +0 -0
  488. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-kotlin.wasm +0 -0
  489. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-php.wasm +0 -0
  490. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-python.wasm +0 -0
  491. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-ruby.wasm +0 -0
  492. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-rust.wasm +0 -0
  493. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-scala.wasm +0 -0
  494. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-tsx.wasm +0 -0
  495. package/dist/vendor/tree-sitter-wasms/out/tree-sitter-typescript.wasm +0 -0
  496. package/dist/vendor/web-tree-sitter/tree-sitter.wasm +0 -0
  497. package/package.json +36 -3
@@ -0,0 +1,150 @@
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
+ SEED_MARK,
8
+ loadEstate,
9
+ openspecRootOf,
10
+ readExistingSpecs,
11
+ seedChangeId,
12
+ seedCollisionWords,
13
+ seedCollisions,
14
+ seedSpec,
15
+ writeSpecFiles
16
+ } from "./chunk-KC5DROFC.js";
17
+ import "./chunk-RK6MKKKP.js";
18
+ import "./chunk-47QE246J.js";
19
+ import {
20
+ changeFolder
21
+ } from "./chunk-XQ3YIV5R.js";
22
+ import {
23
+ createOpenSpec
24
+ } from "./chunk-MGVYVW7Q.js";
25
+ import "./chunk-NGPU2ARF.js";
26
+ import "./chunk-AY2IUF4K.js";
27
+ import "./chunk-6JLPXDWN.js";
28
+ import "./chunk-4GZXS6S2.js";
29
+ import "./chunk-R4TBNKKC.js";
30
+ import "./chunk-NIXVDQVO.js";
31
+ import "./chunk-UR7RMZ3R.js";
32
+ import "./chunk-N4QZJJVB.js";
33
+ import "./chunk-PGKHJYOB.js";
34
+ import "./chunk-MKRBG5EF.js";
35
+ import "./chunk-5XDNUJ4P.js";
36
+ import "./chunk-577AJVRS.js";
37
+ import {
38
+ writeFileAtomic
39
+ } from "./chunk-D3PO4DOZ.js";
40
+ import "./chunk-TV45EUGM.js";
41
+
42
+ // packages/cli/dist/spec-seed-commands.js
43
+ import { existsSync } from "node:fs";
44
+ import { readFile } from "node:fs/promises";
45
+ import { join } from "node:path";
46
+ var NO_OPENSPEC = "This metarepo isn't set up with OpenSpec (no openspec/config.yaml). Set it up first: atticus openspec setup";
47
+ async function specSeed(root, repo, o, io) {
48
+ const osRoot = openspecRootOf(root);
49
+ if (!osRoot) {
50
+ io.err(NO_OPENSPEC);
51
+ return 2;
52
+ }
53
+ const estate = await loadEstate(root, []);
54
+ const flows = estate.flows.filter((f) => f.repo === repo).map((f) => f.flow);
55
+ if (!flows.length) {
56
+ io.err(`${repo} has no verified flows in specs/${repo}/. Read it first: atticus map ${repo}, then atticus verify ${repo} --write`);
57
+ return 2;
58
+ }
59
+ const os = createOpenSpec({ root: osRoot });
60
+ const existing = await readExistingSpecs(os);
61
+ const multiRepo = new Set(estate.flows.map((f) => f.repo)).size > 1;
62
+ const seed = seedSpec(repo, flows, { existing, multiRepo });
63
+ if (!seed.deltas.length) {
64
+ if (o.json)
65
+ io.out(JSON.stringify({ change: null, repo, skipped: seed.skipped }, null, 2));
66
+ else
67
+ io.out(`Nothing to seed: openspec/specs already has every flow of ${repo} that the code runs today. Each change keeps it current when it is archived.`);
68
+ return 0;
69
+ }
70
+ const dir = changeFolder(root, seed.change);
71
+ if (!existsSync(join(dir, ".openspec.yaml")))
72
+ await os.newChange(seed.change, { description: `Starting spec for ${repo}` });
73
+ const written = await writeSpecFiles(dir, seed.files, SEED_MARK);
74
+ const had = await readFile(join(dir, "proposal.md"), "utf8").catch(() => void 0);
75
+ const proposal = had === void 0 || had.startsWith(SEED_MARK);
76
+ if (proposal)
77
+ await writeFileAtomic(join(dir, "proposal.md"), seed.proposal);
78
+ const kept = Object.keys(seed.files).filter((f) => !written.includes(f));
79
+ const collisions = (await seedCollisions(root)).filter((c) => c.seed === seed.change);
80
+ if (o.json) {
81
+ io.out(JSON.stringify({
82
+ change: seed.change,
83
+ repo,
84
+ capabilities: seed.deltas.map((d) => ({ capability: d.capability, flow: d.flow })),
85
+ written,
86
+ kept,
87
+ skipped: seed.skipped,
88
+ collisions
89
+ }, null, 2));
90
+ return 0;
91
+ }
92
+ for (const c of collisions)
93
+ io.err(`Warning: ${seedCollisionWords(c)}`);
94
+ const rel = `openspec/changes/${seed.change}`;
95
+ io.out(`Wrote ${rel}/: a starting spec for ${repo}, ${seed.deltas.length} ${seed.deltas.length === 1 ? "capability" : "capabilities"}, one per verified flow, each scenario citing its lines.`);
96
+ for (const f of kept)
97
+ io.out(`Kept ${rel}/${f} as a person left it (no mark on its first line).`);
98
+ if (!proposal)
99
+ io.out(`Kept ${rel}/proposal.md as a person left it.`);
100
+ for (const s of seed.skipped)
101
+ io.out(`Not seeded: ${s.flow} (${s.why}).`);
102
+ io.out(`Read each spec under ${rel}/specs/ against the code it cites, then accept it: atticus spec accept ${repo}`);
103
+ return 0;
104
+ }
105
+ async function specAccept(root, repo, o, io) {
106
+ if (!o.by) {
107
+ io.err("Say who is accepting: set your Git user (git config user.name), or pass --by <you>.");
108
+ return 2;
109
+ }
110
+ const osRoot = openspecRootOf(root);
111
+ if (!osRoot) {
112
+ io.err(NO_OPENSPEC);
113
+ return 2;
114
+ }
115
+ const change = seedChangeId(repo);
116
+ const dir = changeFolder(root, change);
117
+ if (!existsSync(join(dir, ".openspec.yaml"))) {
118
+ io.err(`${repo} has no starting spec waiting. Write one first: atticus spec seed ${repo}`);
119
+ return 2;
120
+ }
121
+ const os = createOpenSpec({ root: osRoot });
122
+ const v = await os.validate({ item: change, type: "change", strict: true });
123
+ const issues = (v.items[0]?.issues ?? []).filter((i) => i.level !== "INFO");
124
+ if (issues.length || v.items[0]?.valid === false) {
125
+ io.err(`${change} doesn't pass openspec validate --strict; fix its specs and accept again:`);
126
+ for (const i of issues)
127
+ io.err(` ${i.path}: ${i.message}`);
128
+ return 1;
129
+ }
130
+ const date = (o.now ?? /* @__PURE__ */ new Date()).toISOString().slice(0, 10);
131
+ const p = join(dir, "proposal.md");
132
+ const text = await readFile(p, "utf8").catch(() => void 0);
133
+ if (text !== void 0 && !/\nAccepted by .+ on \d{4}-\d{2}-\d{2}\.\n?$/.test(text))
134
+ await writeFileAtomic(p, `${text.trimEnd()}
135
+
136
+ Accepted by ${o.by} on ${date}.
137
+ `);
138
+ try {
139
+ await os.archive(change);
140
+ } catch (e) {
141
+ io.err(`openspec archive ${change} failed: ${e.message}`);
142
+ return 1;
143
+ }
144
+ io.out(`Accepted ${repo}'s starting spec: openspec/specs/ has its capabilities, and ${change} is archived. Commit the metarepo and open its pull request; the next change to ${repo} modifies these requirements.`);
145
+ return 0;
146
+ }
147
+ export {
148
+ specAccept,
149
+ specSeed
150
+ };
@@ -0,0 +1,231 @@
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
+ intakeContext
8
+ } from "./chunk-WARBF2KY.js";
9
+ import "./chunk-VOGCSYOI.js";
10
+ import {
11
+ estateFacts,
12
+ estateRepos,
13
+ hostAliases,
14
+ joinReposOf,
15
+ outsideProfileSystems
16
+ } from "./chunk-AY2IUF4K.js";
17
+ import "./chunk-6JLPXDWN.js";
18
+ import "./chunk-4GZXS6S2.js";
19
+ import {
20
+ readVendorSpec,
21
+ slug,
22
+ vendorImpact
23
+ } from "./chunk-R4TBNKKC.js";
24
+ import "./chunk-NIXVDQVO.js";
25
+ import "./chunk-UR7RMZ3R.js";
26
+ import "./chunk-PGKHJYOB.js";
27
+ import "./chunk-MKRBG5EF.js";
28
+ import "./chunk-5XDNUJ4P.js";
29
+ import {
30
+ inputsDirOf,
31
+ joinConventions,
32
+ readFlow,
33
+ specFlowFiles
34
+ } from "./chunk-577AJVRS.js";
35
+ import "./chunk-D3PO4DOZ.js";
36
+ import "./chunk-TV45EUGM.js";
37
+
38
+ // packages/cli/dist/vendor-impact-commands.js
39
+ import { existsSync } from "node:fs";
40
+ import { readFile } from "node:fs/promises";
41
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
42
+ var IMPACT_WORDS = {
43
+ usage: "Name the vendor spec: atticus intake impact <spec> [--json]",
44
+ noSuchSpec: (spec) => `There is no ${spec} in inputs/. atticus intake list shows what is there.`,
45
+ notASpec: (path) => `${path} isn't an OpenAPI 3 or Swagger 2 spec, so it has no operations to compare.`,
46
+ noOtherVersion: (path) => `${path} has no other version beside it in inputs/, so there is nothing to compare. Add each version of a vendor's spec beside the last (atticus intake add), never over it.`,
47
+ noSystem: (path) => `${path} isn't linked to a system yet, so its operations belong to nobody. atticus triage asks which system it is.`,
48
+ header: (name, older, newer) => `${name}: ${older.path}${older.version ? ` (${older.version})` : ""} \u2192 ${newer.path}${newer.version ? ` (${newer.version})` : ""}`,
49
+ counts: (all, breaking) => all === 0 ? "The two versions publish the same operations, fields and auth." : `${all} change${all === 1 ? "" : "s"}: ${breaking} breaking, ${all - breaking} additive.`,
50
+ severity: { breaking: "Breaking", additive: "Additive" },
51
+ reachesNothing: "Nothing in the estate reaches it.",
52
+ direct: (component, what, where2, name) => `called directly by ${component}: ${what}, ${where2} (on ${name})`,
53
+ gap: (message, where2) => `Forwarded, but not in the older version either: ${message} (${where2}).`,
54
+ ask: (question) => `Asked: ${question}`,
55
+ affected: (repos, flows) => `Affected: ${repos.join(", ")}${flows.length ? `; flows ${flows.join(", ")}` : ""}.`,
56
+ nothingAffected: "Nothing in the estate reaches these changes.",
57
+ start: (spec) => `Start a change with this as its footprint: atticus change new "<title>" --type <type> --impact ${spec}`,
58
+ docTitle: (name, version) => `# What ${name} ${version} changes, and what in the estate it reaches`,
59
+ started: (name, version, i, attached) => `Its footprint is what ${name} ${version} reaches: ${i.repos.length} repo${i.repos.length === 1 ? "" : "s"}, ${i.flows.length} flow${i.flows.length === 1 ? "" : "s"}, ${i.interfaces.length} Interface${i.interfaces.length === 1 ? "" : "s"}. The impact is attached as ${attached}.`
60
+ };
61
+ var posix = (p) => p.split(sep).join("/");
62
+ var SPECS = /* @__PURE__ */ new Set(["openapi", "swagger"]);
63
+ function findDocument(root, docs, spec) {
64
+ const kept = docs.filter((d) => d.id);
65
+ if (!isAbsolute(spec) && spec.includes("/") && existsSync(resolve(spec)))
66
+ spec = resolve(spec);
67
+ const rel = isAbsolute(spec) ? `inputs/${posix(relative(inputsDirOf(root), spec))}` : posix(spec);
68
+ return kept.find((d) => d.path === rel) ?? kept.find((d) => d.path === `inputs/${rel}`) ?? kept.find((d) => d.id === spec) ?? (() => {
69
+ const named = kept.filter((d) => d.path.split("/").pop() === rel);
70
+ return named.length === 1 ? named[0] : void 0;
71
+ })();
72
+ }
73
+ async function loadVendorImpact(root, spec, io) {
74
+ const { op, inputs } = await intakeContext(root, io);
75
+ const doc = findDocument(root, inputs.documents, spec);
76
+ if (!doc)
77
+ return { error: IMPACT_WORDS.noSuchSpec(spec) };
78
+ if (!SPECS.has(doc.classification))
79
+ return { error: IMPACT_WORDS.notASpec(doc.path) };
80
+ const byId = new Map(inputs.documents.filter((d) => d.id).map((d) => [d.id, d]));
81
+ const older = doc.supersededBy ? doc : inputs.documents.find((d) => d.supersededBy === doc.id && SPECS.has(d.classification));
82
+ const newer = doc.supersededBy ? byId.get(doc.supersededBy) : doc;
83
+ if (!older || !newer || !SPECS.has(newer.classification))
84
+ return { error: IMPACT_WORDS.noOtherVersion(doc.path) };
85
+ const systemId = newer.systems[0] ?? older.systems[0];
86
+ const system = op.profiles.flatMap((p) => p.profile?.systems ?? []).find((s) => s.id === systemId);
87
+ if (!systemId || !system)
88
+ return { error: IMPACT_WORDS.noSystem(newer.path) };
89
+ const inputsDir = inputsDirOf(root);
90
+ const read = async (d) => readVendorSpec(d.path, await readFile(join(inputsDir, ...d.path.split("/").slice(1)), "utf8"), systemId);
91
+ const [olderSpec, newerSpec] = [await read(older), await read(newer)];
92
+ if (!olderSpec)
93
+ return { error: IMPACT_WORDS.notASpec(older.path) };
94
+ if (!newerSpec)
95
+ return { error: IMPACT_WORDS.notASpec(newer.path) };
96
+ const estate = await estateFacts(root, op, "");
97
+ const repos = joinReposOf(op, estate.repos);
98
+ const flows = [];
99
+ for (const [id, f] of await specFlowFiles(root).catch(() => /* @__PURE__ */ new Map())) {
100
+ const flow = await readFlow(root, f.repo, id).catch(() => void 0);
101
+ if (!flow)
102
+ continue;
103
+ flows.push({
104
+ id,
105
+ repo: f.repo,
106
+ ...flow.trigger.ref ? { trigger: flow.trigger.ref } : {},
107
+ refs: flow.steps.flatMap((s) => s.refs ?? [])
108
+ });
109
+ }
110
+ const systemOfRepo = Object.fromEntries(estateRepos(op).flatMap((r) => r.system ? [[r.id, r.system]] : []));
111
+ const team = system.boundary !== "vendor" && outsideProfileSystems(op).some((s) => s.id === system.id);
112
+ const hosts = hostAliases(system.aliases);
113
+ const { diff, impact } = vendorImpact({
114
+ vendor: {
115
+ system: systemId,
116
+ names: [system.name, ...system.aliases],
117
+ ...hosts.length ? { hosts } : {},
118
+ ...team ? { boundary: "internal" } : {}
119
+ },
120
+ older: { id: older.id, spec: olderSpec },
121
+ newer: { id: newer.id, spec: newerSpec },
122
+ repos,
123
+ targets: estate.targets,
124
+ // The org pack's facing words and gateway bundle folders (ADR 0147), as the catalog joins.
125
+ ...joinConventions(op),
126
+ flows,
127
+ systemOfRepo
128
+ });
129
+ const facts = /* @__PURE__ */ new Map();
130
+ for (const r of estate.repos)
131
+ for (const f of r.facts)
132
+ facts.set(`${r.repo}\0${f.id}`, f);
133
+ return { name: system.name, diff, impact, notes: estate.notes, facts };
134
+ }
135
+ var where = (e) => `${e.repo} ${e.at}`;
136
+ var callWhat = (l, e) => {
137
+ const call = l.facts.get(`${e.repo}\0${e.fact}`);
138
+ return call?.kind === "call" ? [call.method?.toUpperCase(), call.path].filter(Boolean).join(" ") : e.fact;
139
+ };
140
+ var fieldWords = (s, field) => s.field ? s.field.uses === "sends" || s.field.uses === "reads" ? `, ${s.field.uses} ${field}${s.field.at ? ` (${s.field.at})` : ""}` : `, ${s.field.uses === "does-not-send" ? "doesn't send" : "doesn't read"} ${field}` : "";
141
+ var upstreamLine = (u, indent) => {
142
+ const uvia = u.via?.length ? `, through ${u.via.join(" \u2192 ")}` : "";
143
+ return `${indent}\u2190 ${u.call.component}: ${where(u.call)}${uvia}${u.under ? `, under ${where(u.under)}` : ""}`;
144
+ };
145
+ function impactLines(l) {
146
+ const { impact, diff } = l;
147
+ const out = [];
148
+ out.push(IMPACT_WORDS.header(l.name, impact.older, impact.newer));
149
+ out.push(IMPACT_WORDS.counts(diff.length, diff.filter((c) => c.severity === "breaking").length));
150
+ const byId = new Map(diff.map((c) => [c.id, c]));
151
+ for (const c of impact.changes) {
152
+ const d = byId.get(c.id);
153
+ out.push("");
154
+ out.push(`${IMPACT_WORDS.severity[c.severity]}: ${c.says}`);
155
+ const cites = [
156
+ ...d.before ? [`was ${d.before.cite}`] : [],
157
+ ...d.after ? [`now ${d.after.cite}`] : []
158
+ ];
159
+ if (cites.length)
160
+ out.push(` ${cites.join(", ")}`);
161
+ if (!c.forwards.length)
162
+ out.push(` ${IMPACT_WORDS.reachesNothing}`);
163
+ for (const f of c.forwards) {
164
+ if (f.direct) {
165
+ const s = f.callers[0];
166
+ out.push(` ${IMPACT_WORDS.direct(f.call.component, callWhat(l, f.call), where(f.call), l.name)}${fieldWords(s, d.field)}`);
167
+ if (s.under)
168
+ out.push(` under ${where(s.under)}`);
169
+ for (const u of s.upstream)
170
+ out.push(upstreamLine(u, " "));
171
+ continue;
172
+ }
173
+ const to = f.tie ? `to ${l.name} through ${f.tie.at}` : `to ${l.name}`;
174
+ out.push(` forwarded by ${f.call.component}: ${callWhat(l, f.call)}, ${where(f.call)} (${to})`);
175
+ for (const s of f.callers) {
176
+ const via = s.via?.length ? `, through ${s.via.join(" \u2192 ")}` : "";
177
+ out.push(` called by ${s.call.component}: ${where(s.call)}${fieldWords(s, d.field)}${via}`);
178
+ if (s.under)
179
+ out.push(` under ${where(s.under)}`);
180
+ for (const u of s.upstream)
181
+ out.push(upstreamLine(u, " "));
182
+ }
183
+ }
184
+ }
185
+ if (impact.gaps.length || impact.asks.length)
186
+ out.push("");
187
+ for (const g of impact.gaps)
188
+ out.push(IMPACT_WORDS.gap(g.message, where(g.call)));
189
+ for (const a of impact.asks)
190
+ out.push(IMPACT_WORDS.ask(a.question));
191
+ out.push("");
192
+ out.push(impact.repos.length ? IMPACT_WORDS.affected(impact.repos, impact.flows.map((f) => f.id)) : IMPACT_WORDS.nothingAffected);
193
+ return out;
194
+ }
195
+ async function intakeImpact(root, spec, o, io) {
196
+ if (!spec) {
197
+ io.err(IMPACT_WORDS.usage);
198
+ return 2;
199
+ }
200
+ const l = await loadVendorImpact(root, spec, io);
201
+ if ("error" in l) {
202
+ io.err(l.error);
203
+ return 1;
204
+ }
205
+ for (const n of l.notes)
206
+ io.err(n);
207
+ const reaches = l.impact.changes.some((c) => c.severity === "breaking" && c.forwards.length > 0);
208
+ if (o.json) {
209
+ io.out(JSON.stringify({ diff: l.diff, impact: l.impact }, null, 2));
210
+ return reaches ? 1 : 0;
211
+ }
212
+ for (const line of impactLines(l))
213
+ io.out(line);
214
+ if (l.impact.repos.length)
215
+ io.out(IMPACT_WORDS.start(l.impact.newer.path));
216
+ return reaches ? 1 : 0;
217
+ }
218
+ function impactDocument(l) {
219
+ const version = l.impact.newer.version ?? l.impact.newer.id;
220
+ return {
221
+ name: `${slug(`${l.name} ${version}`)}-impact.md`,
222
+ text: [IMPACT_WORDS.docTitle(l.name, version), "", ...impactLines(l), ""].join("\n")
223
+ };
224
+ }
225
+ export {
226
+ IMPACT_WORDS,
227
+ impactDocument,
228
+ impactLines,
229
+ intakeImpact,
230
+ loadVendorImpact
231
+ };
@@ -0,0 +1,310 @@
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
+ nearRepos
8
+ } from "./chunk-MKFYQQ5Q.js";
9
+ import {
10
+ gitUser,
11
+ loadRepos
12
+ } from "./chunk-PGKHJYOB.js";
13
+ import {
14
+ ManifestEditError,
15
+ REPO_DESCRIPTION_MAX,
16
+ RecordId,
17
+ RepoDescription,
18
+ addManifestRepo,
19
+ descriptionLine,
20
+ factsDirOf,
21
+ manifestFiles,
22
+ parseFacts,
23
+ setManifestDescription
24
+ } from "./chunk-577AJVRS.js";
25
+ import "./chunk-D3PO4DOZ.js";
26
+ import "./chunk-TV45EUGM.js";
27
+
28
+ // packages/cli/dist/repo-commands.js
29
+ import { readFile, stat } from "node:fs/promises";
30
+ import { basename, dirname, join, resolve } from "node:path";
31
+ import { createInterface } from "node:readline/promises";
32
+ import { stdin, stdout } from "node:process";
33
+ var askOnTerminal = async (prompt) => {
34
+ if (!stdin.isTTY)
35
+ return void 0;
36
+ const rl = createInterface({ input: stdin, output: stdout });
37
+ try {
38
+ return (await rl.question(`${prompt} `)).trim() || void 0;
39
+ } finally {
40
+ rl.close();
41
+ }
42
+ };
43
+ var ASK = "What is this repo, in one line? (what it is for, who uses it; Enter to skip and write it later)";
44
+ function idFromUrl(url) {
45
+ const last = url.replace(/[/\\]+$/, "").split(/[/\\:]/).pop() ?? "";
46
+ return last.replace(/\.git$/i, "").toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "repo";
47
+ }
48
+ var trimmed = (t) => {
49
+ const s = t?.trim();
50
+ return s ? s.slice(0, REPO_DESCRIPTION_MAX) : void 0;
51
+ };
52
+ function written(text, by, now) {
53
+ return RepoDescription.parse({
54
+ text,
55
+ trust: "verified",
56
+ by,
57
+ at: now.toISOString().replace(/\.\d{3}Z$/, "Z")
58
+ });
59
+ }
60
+ async function declaredFrameworks(root, repo) {
61
+ const text = await readFile(join(factsDirOf(root), `${repo}.jsonl`), "utf8").catch(() => void 0);
62
+ if (text === void 0)
63
+ return [];
64
+ const p = parseFacts(text);
65
+ if (!p.ok)
66
+ return [];
67
+ return p.facts.flatMap((f) => f.kind === "framework" ? [{ name: f.name, cite: `${f.cite.file}:${f.cite.line}` }] : []);
68
+ }
69
+ async function typeOf(url, description, frameworks = []) {
70
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(url) || /^[^/\\]+@/.test(url))
71
+ return void 0;
72
+ const dir = resolve(url);
73
+ if (!await stat(dir).then((s) => s.isDirectory(), () => false))
74
+ return void 0;
75
+ const [{ detectRepoType }, { fsRepo }] = await Promise.all([
76
+ import("./chunk-QKEFZRHS.js"),
77
+ import("./chunk-YGKYFMSL.js")
78
+ ]);
79
+ const d = await detectRepoType(fsRepo(basename(dir), dir, "0".repeat(40)), {
80
+ ...description ? { description } : {},
81
+ ...frameworks.length ? { frameworks } : {}
82
+ });
83
+ return d.type === "unknown" ? void 0 : { type: d.type, signals: d.signals, confidence: d.confidence };
84
+ }
85
+ async function cloneAt(url) {
86
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(url) || /^[^/\\]+@/.test(url))
87
+ return void 0;
88
+ const dir = resolve(url);
89
+ if (!await stat(join(dir, ".git")).catch(() => void 0))
90
+ return void 0;
91
+ const { execFile } = await import("node:child_process");
92
+ const git = (...args) => new Promise((done) => execFile("git", args, { cwd: dir }, (e, out) => done(e ? "" : String(out).trim())));
93
+ const origin = await git("config", "--get", "remote.origin.url");
94
+ const branch = await git("rev-parse", "--abbrev-ref", "HEAD");
95
+ return {
96
+ dir,
97
+ ...origin ? { origin } : {},
98
+ ...branch && branch !== "HEAD" ? { branch } : {}
99
+ };
100
+ }
101
+ async function whoFor(root, d) {
102
+ if (d.by)
103
+ return d.by;
104
+ try {
105
+ return (await gitUser(root)).handle;
106
+ } catch {
107
+ return "someone";
108
+ }
109
+ }
110
+ async function repoAdd(root, url, o, io, deps = {}) {
111
+ if (!url?.trim()) {
112
+ io.err('Usage: atticus repo add <clone URL or path> [--id id] [--type repo type] [--owner team] [--description "what it is"].');
113
+ return 2;
114
+ }
115
+ const clone = await cloneAt(url.trim());
116
+ const id = o.id?.trim() || idFromUrl(url.trim());
117
+ if (!RecordId.safeParse(id).success) {
118
+ io.err(`${id} isn't a repo id: ids are lowercase slugs (a-z, 0-9, '.', '_' and '-'). Give one with --id.`);
119
+ return 2;
120
+ }
121
+ const files = await manifestFiles(root);
122
+ const platform = o.platform?.trim() || (files.length === 1 ? files[0].platform : void 0);
123
+ if (!platform) {
124
+ io.err(files.length ? `There are ${files.length} platform profiles (${files.map((f) => f.platform).join(", ")}): say which with --platform.` : "The org pack has no platform profile yet (org-pack/profiles/<platform>/repos.manifest.yaml). Run atticus repos discover <folder of clones>, or atticus init first.");
125
+ return 2;
126
+ }
127
+ let text = trimmed(o.description);
128
+ let asked = false;
129
+ if (!text && !o.noDescription && !o.json) {
130
+ text = trimmed(await (deps.ask ?? askOnTerminal)(`${id}: ${ASK}`));
131
+ asked = true;
132
+ }
133
+ const by = await whoFor(root, deps);
134
+ const description = text ? written(text, by, deps.now ?? /* @__PURE__ */ new Date()) : void 0;
135
+ const detected = o.type?.trim() ? void 0 : await typeOf(url.trim(), text, await declaredFrameworks(root, id));
136
+ const listed = await loadRepos(root).catch(() => []);
137
+ const near = nearRepos({ id, url: clone?.origin ?? url.trim() }, listed);
138
+ try {
139
+ const file = await addManifestRepo(root, platform, {
140
+ id,
141
+ url: clone?.origin ?? url.trim(),
142
+ ...clone?.branch ? { defaultBranch: clone.branch } : {},
143
+ type: o.type?.trim() || detected?.type || "unknown",
144
+ owner: o.owner?.trim() || "unassigned",
145
+ ...o.system?.trim() ? { system: o.system.trim() } : {},
146
+ ...o.component?.trim() ? { component: o.component.trim() } : {},
147
+ ...description ? { description } : {}
148
+ });
149
+ for (const n of near)
150
+ io.err(`Warning: ${id} looks like ${n.id}, already listed (${n.why}). If they are one repo, remove this entry from ${file.rel}, or keep one id: atticus repo rename <old> <new>.`);
151
+ if (o.json) {
152
+ io.out(JSON.stringify({ repo: id, platform, file: file.rel, description, ...near.length ? { near } : {} }, null, 2));
153
+ return 0;
154
+ }
155
+ io.out(`Added ${id} to ${file.rel}: commit it in a pull request.`);
156
+ if (detected)
157
+ io.out(`Type: ${detected.type}, from ${detected.signals.join(", ")} (${detected.confidence} confidence). Change it in the manifest if it is wrong.`);
158
+ if (description)
159
+ io.out(`What it is: ${description.text}`);
160
+ else
161
+ io.out(`${id} has no description yet${asked ? "" : " (--description, or atticus repo describe)"}: atticus repo describe ${id} --description "what it is". Until then its reading prompts, the join's questions and the views have only its id to go on.`);
162
+ io.out(clone?.origin ? `From your clone: ${clone.origin}, branch ${clone.branch ?? "main"}. Next: atticus workspace sync --from "${dirname(clone.dir)}" --repos ${id} (copied from it, no network), then read it: /atticus-map ${id}.` : `Next: atticus workspace sync, then read it: /atticus-map ${id}.`);
163
+ return 0;
164
+ } catch (e) {
165
+ if (e instanceof ManifestEditError) {
166
+ io.err(e.message);
167
+ return e.code === "not-found" ? 2 : 1;
168
+ }
169
+ throw e;
170
+ }
171
+ }
172
+ async function undescribedRepos(root) {
173
+ const repos = await loadRepos(root).catch(() => []);
174
+ const missing = [];
175
+ const unconfirmed = [];
176
+ for (const r of repos) {
177
+ if (r.archived)
178
+ continue;
179
+ if (!r.description)
180
+ missing.push(r.id);
181
+ else if (r.description.trust === "suggested")
182
+ unconfirmed.push({ id: r.id, text: r.description.text });
183
+ }
184
+ return { missing, unconfirmed };
185
+ }
186
+ async function repoDescribe(root, repo, o, io, deps = {}) {
187
+ if (!repo?.trim()) {
188
+ const { missing, unconfirmed } = await undescribedRepos(root);
189
+ if (o.json) {
190
+ io.out(JSON.stringify({ missing, unconfirmed }, null, 2));
191
+ return 0;
192
+ }
193
+ if (!missing.length && !unconfirmed.length) {
194
+ io.out("Every repo of the manifests says what it is.");
195
+ return 0;
196
+ }
197
+ if (missing.length) {
198
+ io.out(`${missing.length} repo${missing.length === 1 ? " has" : "s have"} no description:`);
199
+ for (const id2 of missing)
200
+ io.out(` ${id2}: atticus repo describe ${id2} --description "..."`);
201
+ }
202
+ if (unconfirmed.length) {
203
+ io.out(`${unconfirmed.length} description${unconfirmed.length === 1 ? " was" : "s were"} drafted by your assistant and nobody has confirmed ${unconfirmed.length === 1 ? "it" : "them"} yet:`);
204
+ for (const u of unconfirmed)
205
+ io.out(` ${u.id}: "${u.text}" \u2014 atticus repo describe ${u.id} --accept`);
206
+ }
207
+ return 0;
208
+ }
209
+ const id = repo.trim();
210
+ const found = (await loadRepos(root).catch(() => [])).find((r) => r.id === id);
211
+ if (!found) {
212
+ io.err(`There is no repo ${id} in any repos.manifest.yaml.`);
213
+ return 2;
214
+ }
215
+ const now = deps.now ?? /* @__PURE__ */ new Date();
216
+ const at = now.toISOString().replace(/\.\d{3}Z$/, "Z");
217
+ if (o.drafted !== void 0) {
218
+ const cites = (o.cites ?? "").split(",").map((c) => c.trim()).filter(Boolean).flatMap((c) => {
219
+ const m = /^(.*):(\d+)$/.exec(c);
220
+ return m && Number(m[2]) > 0 ? [{ file: m[1], line: Number(m[2]) }] : [];
221
+ });
222
+ if (!cites.length) {
223
+ io.err(`Say where you read it: atticus repo describe ${id} --drafted "..." --cites <file>:<line> (several separated by commas), as a fact cites its line.`);
224
+ return 2;
225
+ }
226
+ const r = await keepDraftedDescription(root, id, { text: o.drafted, cites }, now);
227
+ if (o.json) {
228
+ io.out(JSON.stringify({ repo: id, ...r }, null, 2));
229
+ return r.kept ? 0 : 1;
230
+ }
231
+ if (!r.kept) {
232
+ io.err(`The draft wasn't kept: ${r.why ?? "it wasn't one line"}.`);
233
+ return 1;
234
+ }
235
+ io.out(`${id}: "${o.drafted.trim()}" \u2014 kept as a draft, unconfirmed, with the lines you read it from. A person confirms it (atticus repo describe ${id} --accept), changes it or drops it.`);
236
+ return 0;
237
+ }
238
+ let next;
239
+ if (o.reject) {
240
+ if (!found.description) {
241
+ io.err(`${id} has no description to reject.`);
242
+ return 2;
243
+ }
244
+ next = void 0;
245
+ } else {
246
+ let text = trimmed(o.description);
247
+ if (!text && o.accept) {
248
+ if (!found.description) {
249
+ io.err(`${id} has no description to confirm. Write one: atticus repo describe ${id} --description "what it is".`);
250
+ return 2;
251
+ }
252
+ text = found.description.text;
253
+ }
254
+ if (!text && !o.json)
255
+ text = trimmed(await (deps.ask ?? askOnTerminal)(`${id}: ${ASK}`));
256
+ if (!text) {
257
+ io.err(`Say what ${id} is: atticus repo describe ${id} --description "what it is" (or --accept to keep the draft, --reject to drop it).`);
258
+ return 2;
259
+ }
260
+ next = written(text, await whoFor(root, deps), now);
261
+ }
262
+ try {
263
+ const file = await setManifestDescription(root, id, next);
264
+ if (o.json) {
265
+ io.out(JSON.stringify({ repo: id, file: file.rel, description: next ?? null }, null, 2));
266
+ return 0;
267
+ }
268
+ io.out(next ? `${id}: ${descriptionLine(next)}` : `${id}: the description was dropped; nothing says what it is now.`);
269
+ io.out(`Written to ${file.rel} at ${at}: commit it in a pull request.`);
270
+ return 0;
271
+ } catch (e) {
272
+ if (e instanceof ManifestEditError) {
273
+ io.err(e.message);
274
+ return e.code === "not-found" ? 2 : 1;
275
+ }
276
+ throw e;
277
+ }
278
+ }
279
+ async function keepDraftedDescription(root, repo, draft, now) {
280
+ const found = (await loadRepos(root).catch(() => [])).find((r) => r.id === repo);
281
+ if (!found)
282
+ return { kept: false, why: `${repo} isn't in any repos.manifest.yaml` };
283
+ if (found.description)
284
+ return {
285
+ kept: false,
286
+ why: found.description.trust === "verified" ? `${repo} already says what it is, in a person's words` : `${repo} already has a drafted description waiting for a person`
287
+ };
288
+ const text = trimmed(draft.text);
289
+ if (!text)
290
+ return { kept: false, why: "the draft was empty" };
291
+ const d = RepoDescription.safeParse({
292
+ text,
293
+ trust: "suggested",
294
+ by: draft.by ?? "assistant",
295
+ at: now.toISOString().replace(/\.\d{3}Z$/, "Z"),
296
+ cites: (draft.cites ?? []).slice(0, 6)
297
+ });
298
+ if (!d.success)
299
+ return { kept: false, why: d.error.issues[0]?.message ?? "the draft wasn't one line" };
300
+ await setManifestDescription(root, repo, d.data);
301
+ return { kept: true };
302
+ }
303
+ export {
304
+ askOnTerminal,
305
+ idFromUrl,
306
+ keepDraftedDescription,
307
+ repoAdd,
308
+ repoDescribe,
309
+ undescribedRepos
310
+ };