@maycombhq/atticus 0.0.0-stage → 2.0.0-beta.2
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.
- package/LICENSE +177 -0
- package/README.md +17 -2
- package/THIRD-PARTY-LICENSES.txt +2607 -0
- package/dist/bin.js +47 -0
- package/dist/chunk-23W7VWKR.js +2609 -0
- package/dist/chunk-27NKUS3X.js +4330 -0
- package/dist/chunk-2ANOROX3.js +2522 -0
- package/dist/chunk-2BF2EYJV.js +174 -0
- package/dist/chunk-2BFCZ3RK.js +315 -0
- package/dist/chunk-2DIQQJCB.js +378 -0
- package/dist/chunk-2RMYG36Q.js +1227 -0
- package/dist/chunk-2VHF7OXM.js +55 -0
- package/dist/chunk-3ALD2W2A.js +95 -0
- package/dist/chunk-3C7EYRFZ.js +41 -0
- package/dist/chunk-3G4YI4ZU.js +16 -0
- package/dist/chunk-3HI6Z55Y.js +5949 -0
- package/dist/chunk-3USYZGRF.js +324 -0
- package/dist/chunk-42EVSKME.js +37 -0
- package/dist/chunk-4AK7IBVP.js +915 -0
- package/dist/chunk-4BKGMUIK.js +53 -0
- package/dist/chunk-4BN53TG3.js +343 -0
- package/dist/chunk-4NDAAFQT.js +103 -0
- package/dist/chunk-4Q3NN7VF.js +32 -0
- package/dist/chunk-4RS5KZQD.js +25 -0
- package/dist/chunk-4SKZDI62.js +22 -0
- package/dist/chunk-4WBVUHXN.js +69 -0
- package/dist/chunk-5GDRCDQB.js +32 -0
- package/dist/chunk-5GGOLAKC.js +856 -0
- package/dist/chunk-5KLGBXG5.js +48 -0
- package/dist/chunk-5WG5YP4T.js +34 -0
- package/dist/chunk-64EQYWCA.js +180 -0
- package/dist/chunk-652QWTLZ.js +242 -0
- package/dist/chunk-65NYPGRC.js +766 -0
- package/dist/chunk-66YVAGGM.js +46 -0
- package/dist/chunk-6BNC6EQ4.js +41 -0
- package/dist/chunk-6BVONWJ7.js +50 -0
- package/dist/chunk-6D2CQ5II.js +41 -0
- package/dist/chunk-6IU67AEK.js +325 -0
- package/dist/chunk-6J5OKA4Y.js +49 -0
- package/dist/chunk-6JCPI55B.js +92 -0
- package/dist/chunk-6JUBZBMW.js +56 -0
- package/dist/chunk-6M5NK3K3.js +415 -0
- package/dist/chunk-6QSERWXH.js +53 -0
- package/dist/chunk-6TACQN3N.js +41 -0
- package/dist/chunk-76WKMA4J.js +14 -0
- package/dist/chunk-7AVHLZGD.js +45 -0
- package/dist/chunk-7EFILTCI.js +67 -0
- package/dist/chunk-7EKXJZ2Y.js +2902 -0
- package/dist/chunk-7EOBHUMC.js +133 -0
- package/dist/chunk-7FBGJFEE.js +66 -0
- package/dist/chunk-7JUKDRSZ.js +1726 -0
- package/dist/chunk-7SW2QWLU.js +212 -0
- package/dist/chunk-7WD63HU2.js +143 -0
- package/dist/chunk-7ZUIMTOU.js +108 -0
- package/dist/chunk-A3GY6SOA.js +95 -0
- package/dist/chunk-A7UPUQFY.js +2356 -0
- package/dist/chunk-AA6YULYB.js +376 -0
- package/dist/chunk-ABWHYWNI.js +101 -0
- package/dist/chunk-AIOQPLA5.js +540 -0
- package/dist/chunk-AVJDSJ2F.js +18 -0
- package/dist/chunk-B2WLAWNJ.js +374 -0
- package/dist/chunk-BKVWTZ6A.js +211 -0
- package/dist/chunk-BOHJZTEQ.js +1991 -0
- package/dist/chunk-BWZ77RQT.js +25 -0
- package/dist/chunk-C6EKFH7J.js +169 -0
- package/dist/chunk-CAQZUNOH.js +1150 -0
- package/dist/chunk-CEXSU4S6.js +1217 -0
- package/dist/chunk-CKSITVS4.js +16101 -0
- package/dist/chunk-CNUKCS2T.js +2741 -0
- package/dist/chunk-CPA6HPVR.js +3206 -0
- package/dist/chunk-CR3MTH32.js +207 -0
- package/dist/chunk-CSZ4C5N6.js +307 -0
- package/dist/chunk-D3PO4DOZ.js +261 -0
- package/dist/chunk-D46WUV3T.js +33 -0
- package/dist/chunk-DE76JROX.js +80 -0
- package/dist/chunk-DFBCSHVT.js +69 -0
- package/dist/chunk-DHPACDG7.js +104 -0
- package/dist/chunk-DKJA76CJ.js +113 -0
- package/dist/chunk-DPUYDDQG.js +164 -0
- package/dist/chunk-DPZHZQKE.js +285 -0
- package/dist/chunk-E36QOJMD.js +47 -0
- package/dist/chunk-EADP3PEN.js +450 -0
- package/dist/chunk-EBEW3XXQ.js +166 -0
- package/dist/chunk-EDS2L2LD.js +106 -0
- package/dist/chunk-EFHQ3TWP.js +637 -0
- package/dist/chunk-EPTBZ3GP.js +101 -0
- package/dist/chunk-EYWIDJFU.js +130 -0
- package/dist/chunk-F7HYOUFF.js +287 -0
- package/dist/chunk-FHH4I4ZV.js +128 -0
- package/dist/chunk-FITWGOJ2.js +131 -0
- package/dist/chunk-FQXYPF7E.js +147 -0
- package/dist/chunk-G2B4ZQGH.js +240 -0
- package/dist/chunk-GBRFVT63.js +45 -0
- package/dist/chunk-GDLULHTC.js +2919 -0
- package/dist/chunk-GLUX4EEP.js +583 -0
- package/dist/chunk-GQ4N4WKF.js +1142 -0
- package/dist/chunk-GT4I4ZWM.js +38 -0
- package/dist/chunk-HFQCFSJR.js +60 -0
- package/dist/chunk-HITVBIJS.js +1247 -0
- package/dist/chunk-HLJAXMM4.js +233 -0
- package/dist/chunk-HVUPKCGJ.js +162 -0
- package/dist/chunk-I3E7CX4H.js +155 -0
- package/dist/chunk-I4JRCD6M.js +184 -0
- package/dist/chunk-ICY36XCH.js +34 -0
- package/dist/chunk-IHMLFRVV.js +228 -0
- package/dist/chunk-IPKHE5D6.js +1963 -0
- package/dist/chunk-J4K3KVLD.js +131 -0
- package/dist/chunk-JBTK5OP2.js +55 -0
- package/dist/chunk-JCZIKA4C.js +163 -0
- package/dist/chunk-JGZCG5VM.js +189 -0
- package/dist/chunk-JIITQXFB.js +4087 -0
- package/dist/chunk-JMSCMUCA.js +271 -0
- package/dist/chunk-JZU3H6UQ.js +54 -0
- package/dist/chunk-K65BJIMT.js +49 -0
- package/dist/chunk-KEM4SDDP.js +3898 -0
- package/dist/chunk-KQDZXGNR.js +14 -0
- package/dist/chunk-L24C55VN.js +7923 -0
- package/dist/chunk-L6SGQIR3.js +471 -0
- package/dist/chunk-LR3R6Z2A.js +400 -0
- package/dist/chunk-M766ZJ6W.js +119 -0
- package/dist/chunk-MC3H7736.js +19910 -0
- package/dist/chunk-MGYZM27B.js +205 -0
- package/dist/chunk-MMOSZPWJ.js +273 -0
- package/dist/chunk-MVZVGYXH.js +1611 -0
- package/dist/chunk-N7IXEHK3.js +549 -0
- package/dist/chunk-NE2W3OO7.js +230 -0
- package/dist/chunk-NN2ZQEB4.js +38 -0
- package/dist/chunk-NXFPS2LR.js +182 -0
- package/dist/chunk-O3WI5KWW.js +31 -0
- package/dist/chunk-OLQJTJJU.js +76 -0
- package/dist/chunk-ONLS5QA5.js +102 -0
- package/dist/chunk-OT2O76OS.js +1496 -0
- package/dist/chunk-PAMPPUR6.js +4500 -0
- package/dist/chunk-PCOCACY3.js +385 -0
- package/dist/chunk-PCVDV3UZ.js +430 -0
- package/dist/chunk-PRPPGYZG.js +104 -0
- package/dist/chunk-Q4D5X7QB.js +264 -0
- package/dist/chunk-Q5AMFEWD.js +119 -0
- package/dist/chunk-QRAOANID.js +214 -0
- package/dist/chunk-QSXK2RGH.js +688 -0
- package/dist/chunk-QZSX3F7C.js +389 -0
- package/dist/chunk-R6RY4Q5T.js +51 -0
- package/dist/chunk-R6XF6UR3.js +149 -0
- package/dist/chunk-R77KLRB3.js +166 -0
- package/dist/chunk-RRTKKSLQ.js +251 -0
- package/dist/chunk-RTEYOSJY.js +29 -0
- package/dist/chunk-RUVFXE2L.js +666 -0
- package/dist/chunk-RVH5SUW5.js +69 -0
- package/dist/chunk-RZPYKDWS.js +26 -0
- package/dist/chunk-S2A7YC3Q.js +41433 -0
- package/dist/chunk-S3QNRWYR.js +25 -0
- package/dist/chunk-SJRGMG6A.js +174 -0
- package/dist/chunk-SP2I63OO.js +252 -0
- package/dist/chunk-T2UYZSCQ.js +545 -0
- package/dist/chunk-T6AIP7H5.js +3851 -0
- package/dist/chunk-T6XQL73F.js +94 -0
- package/dist/chunk-TANFV3MZ.js +531 -0
- package/dist/chunk-TDD55CJH.js +119 -0
- package/dist/chunk-TV45EUGM.js +51 -0
- package/dist/chunk-TXLH6WHQ.js +2078 -0
- package/dist/chunk-TYAID7B7.js +408 -0
- package/dist/chunk-UBBC2XSG.js +873 -0
- package/dist/chunk-UGLN7QHV.js +27 -0
- package/dist/chunk-UNM6ZOKP.js +878 -0
- package/dist/chunk-V2YTAIQO.js +1075 -0
- package/dist/chunk-VN3DP4LQ.js +43 -0
- package/dist/chunk-VOGCSYOI.js +16 -0
- package/dist/chunk-VYDBJ73M.js +32 -0
- package/dist/chunk-W3BQAZ3Q.js +34 -0
- package/dist/chunk-W5BVQF44.js +36 -0
- package/dist/chunk-WVPJSRRJ.js +52 -0
- package/dist/chunk-WY6PP6AA.js +53 -0
- package/dist/chunk-XAKWMCXI.js +285 -0
- package/dist/chunk-XPCM366L.js +70 -0
- package/dist/chunk-XPTOBS2D.js +48 -0
- package/dist/chunk-XY3P7JW7.js +3479 -0
- package/dist/chunk-XZRON6IV.js +131 -0
- package/dist/chunk-YEDDOYSC.js +27809 -0
- package/dist/chunk-YISXLPHN.js +496 -0
- package/dist/chunk-YMZ3TNYB.js +18 -0
- package/dist/chunk-YY6ZQQBP.js +203 -0
- package/dist/chunk-YYQN46FY.js +334 -0
- package/dist/chunk-Z6LF7HQN.js +22 -0
- package/dist/chunk-ZCJDOK2S.js +116 -0
- package/dist/chunk-ZDPAS56H.js +76 -0
- package/dist/chunk-ZMAINWBW.js +18 -0
- package/dist/chunk-ZMFPW66A.js +22 -0
- package/dist/chunk-ZNCEKR4J.js +296 -0
- package/dist/chunk-ZVM6AKKM.js +47 -0
- package/dist/files.json +1888 -0
- package/dist/fixtures/forge/README.md +19 -0
- package/dist/fixtures/forge/expected/discrepancies.yaml +54 -0
- package/dist/fixtures/forge/expected/inputs.yaml +38 -0
- package/dist/fixtures/forge/expected/scan.yaml +342 -0
- package/dist/fixtures/forge/inputs/diagrams/forge-context.drawio +23 -0
- package/dist/fixtures/forge/inputs/partner-specs/northwind-pay-openapi.yaml +11 -0
- package/dist/fixtures/forge/inputs/tickets/ado-stories.json +4 -0
- package/dist/fixtures/forge/inputs/tickets/closed-service-requests.json +5 -0
- package/dist/fixtures/forge/inputs/wiki/integration-patterns.md +11 -0
- package/dist/fixtures/forge/inputs/wiki/ledger-solution-spec.md +9 -0
- package/dist/fixtures/forge/inputs/wiki/snow-firewall-request.md +4 -0
- package/dist/fixtures/forge/metarepo/judgments/reaches/84af5b6af24f7ca8c23013f3.yaml +17 -0
- package/dist/fixtures/forge/metarepo/judgments/reaches/c3917555edebddce8cecb647.yaml +17 -0
- package/dist/fixtures/forge/metarepo/judgments/reaches/c5fafd6601f8ca9e34e0bbd0.yaml +17 -0
- package/dist/fixtures/forge/metarepo/org-pack/agents/architecture-critic.yaml +9 -0
- package/dist/fixtures/forge/metarepo/org-pack/agents/story-writer.yaml +10 -0
- package/dist/fixtures/forge/metarepo/org-pack/checklists/architecture.yaml +115 -0
- package/dist/fixtures/forge/metarepo/org-pack/dialects/forge.yaml +111 -0
- package/dist/fixtures/forge/metarepo/org-pack/gates.yaml +22 -0
- package/dist/fixtures/forge/metarepo/org-pack/pack.yaml +11 -0
- package/dist/fixtures/forge/metarepo/org-pack/patterns/A.EB.PUB.yaml +12 -0
- package/dist/fixtures/forge/metarepo/org-pack/patterns/D.JDBC.yaml +12 -0
- package/dist/fixtures/forge/metarepo/org-pack/patterns/S.DIR.BFF.yaml +12 -0
- package/dist/fixtures/forge/metarepo/org-pack/patterns/S.GW.SOR.yaml +13 -0
- package/dist/fixtures/forge/metarepo/org-pack/patterns/S.GW.VND.yaml +14 -0
- package/dist/fixtures/forge/metarepo/org-pack/process/change-templates/feature.md +37 -0
- package/dist/fixtures/forge/metarepo/org-pack/process/skills/add-forge-endpoint/SKILL.md +17 -0
- package/dist/fixtures/forge/metarepo/org-pack/process/snow/firewall-rule.yaml +14 -0
- package/dist/fixtures/forge/metarepo/org-pack/process/snow/gateway-route.yaml +13 -0
- package/dist/fixtures/forge/metarepo/org-pack/profiles/forge/profile.yaml +12 -0
- package/dist/fixtures/forge/metarepo/org-pack/profiles/forge/repos.manifest.yaml +44 -0
- package/dist/fixtures/forge/metarepo/org-pack/roles.yaml +14 -0
- package/dist/fixtures/forge/metarepo/org-pack/runtime.yaml +14 -0
- package/dist/fixtures/forge/metarepo/org-pack/sources.yaml +3 -0
- package/dist/fixtures/forge/repos/forge-events/topics/payments.initiated.yaml +4 -0
- package/dist/fixtures/forge/repos/forge-events/topics/transfers.completed.yaml +4 -0
- package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/ledger-v1.xml +3 -0
- package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/policies/SpikeArrest.xml +3 -0
- package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/policies/VerifyOAuth.xml +4 -0
- package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/proxies/default.xml +14 -0
- package/dist/fixtures/forge/repos/forge-gateway/proxies/ledger-v1/apiproxy/targets/ledger.xml +5 -0
- package/dist/fixtures/forge/repos/forge-infra/alerts/ledger-api.yaml +5 -0
- package/dist/fixtures/forge/repos/forge-infra/k8s/ledger-api.yaml +15 -0
- package/dist/fixtures/forge/repos/forge-infra/k8s/portal-bff.yaml +7 -0
- package/dist/fixtures/forge/repos/forge-infra/terraform/ledger-db.tf +9 -0
- package/dist/fixtures/forge/repos/forge-ledger/api/ledger-openapi.yaml +31 -0
- package/dist/fixtures/forge/repos/forge-ledger/forge.yaml +4 -0
- package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/LedgerEndpoints.java +13 -0
- package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/LedgerEvents.java +11 -0
- package/dist/fixtures/forge/repos/forge-ledger/src/main/java/forge/ledger/NorthwindClient.java +10 -0
- package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/application.yml +3 -0
- package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/db/migration/V1__create_account.sql +5 -0
- package/dist/fixtures/forge/repos/forge-ledger/src/main/resources/db/migration/V2__create_entry.sql +7 -0
- package/dist/fixtures/forge/repos/forge-portal-bff/pom.xml +1 -0
- package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/AuditPublisher.java +12 -0
- package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/BalanceController.java +16 -0
- package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/LedgerClient.java +13 -0
- package/dist/fixtures/forge/repos/forge-portal-bff/src/main/java/forge/portal/PaymentEvents.java +13 -0
- package/dist/fixtures/forge/repos/forge-portal-bff/src/main/resources/application.yml +8 -0
- package/dist/fixtures/forge/repos/forge-portal-ui/package.json +1 -0
- package/dist/fixtures/forge/repos/forge-portal-ui/src/api/balance.ts +5 -0
- package/dist/fixtures/forge/repos/forge-reports-job/src/main/java/forge/reports/DailyEntriesJob.java +19 -0
- package/dist/fixtures/forge/repos/forge-reports-job/src/main/resources/application.yml +3 -0
- package/dist/fixtures/forge-change/README.md +41 -0
- package/dist/fixtures/forge-change/expected/findings.yaml +301 -0
- package/dist/fixtures/forge-change/expected/stories.yaml +101 -0
- package/dist/fixtures/forge-change/judgments/personal-data/0b5f3dbf5257a22275d8c74b.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/2759a66770134c417440bf2d.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/31b1ea2f14d0737f1aca79fd.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/49afd70c08228e65ad6ca1ed.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/761cabcb8a39f5e5866d2dd6.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/adae902b90cc8ffa0c765145.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/ba11bb933105ec9493e065dd.yaml +18 -0
- package/dist/fixtures/forge-change/judgments/personal-data/bdbcd1cdac3021c68063c3e7.yaml +18 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/brief.md +35 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/change.yaml +120 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/data.md +18 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/design.md +29 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/interfaces.md +17 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/mappings.md +26 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/proposal.md +35 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/snow.md +12 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/specs/transfer-limits/spec.md +19 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s1-refuse-over-limit.md +17 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s2-show-remaining.md +16 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s3-audit-refusals.md +18 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories/s4-velocity-check.md +16 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/stories.md +8 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/tasks.md +12 -0
- package/dist/fixtures/forge-change/openspec/changes/add-transfer-limit/ux.md +7 -0
- package/dist/fixtures/forge-change/org-pack/agents/code-and-test-critic.yaml +13 -0
- package/dist/fixtures/forge-change/org-pack/agents/complete-critic.yaml +12 -0
- package/dist/fixtures/forge-change/org-pack/agents/safe-critic.yaml +12 -0
- package/dist/fixtures/forge-change/org-pack/agents/ship-critic.yaml +11 -0
- package/dist/fixtures/forge-change/org-pack/agents/true-critic.yaml +11 -0
- package/dist/fixtures/forge-change/org-pack/checklists/review.yaml +54 -0
- package/dist/fixtures/forge-change/org-pack/gates.yaml +25 -0
- package/dist/fixtures/forge-change/org-pack/teams/team-ledger/checklists/ledger-team.yaml +227 -0
- package/dist/fixtures/forge-change/recordings/complete-critic/2ad84f84bf39c1d5412697e69fe23034d6983ec45a00314bf0975e627589a3c5.json +12 -0
- package/dist/fixtures/forge-change/recordings/complete-critic/417c98d8e54a4387d0fd93441c49f44c2868958739070d855c1dce0c41e24db3.json +12 -0
- package/dist/fixtures/forge-change/recordings/complete-critic/50203ee22e9cb3ef047295edb6538fe7d5695e1e4b139f3c929013dc6ce47021.json +12 -0
- package/dist/fixtures/forge-change/recordings/complete-critic/89f18d67f5d9c325bf35e2a9e020f9ddb6ee13b8523315037f0905cc57c040b1.json +12 -0
- package/dist/fixtures/forge-change/recordings/complete-critic/b4097867d26ae8eadc8b9efa8cdd86897013358035f0b40086c299a59c4ba121.json +12 -0
- package/dist/fixtures/forge-change/recordings/safe-critic/302d06f49664dd67ad2e21ab9cf74c1b0f7d3f750709c6ed8eff2b70983274e2.json +12 -0
- package/dist/fixtures/forge-change/recordings/safe-critic/32f1049c9a5ab4a759543290db4644ec6e221cc45fdfdcf06193837c6a8ce0b9.json +12 -0
- package/dist/fixtures/forge-change/recordings/safe-critic/4e4a84bfc04b9f26ca4250319a879901ff7a1c081c71e46a117675fee05026b0.json +12 -0
- package/dist/fixtures/forge-change/recordings/safe-critic/604af0fcdd6df6b76208fa88305fdc15c37606c2a4d1ae816477e46ac8c2dd04.json +12 -0
- package/dist/fixtures/forge-change/recordings/safe-critic/f0bf50af11f14c50d07904f0dffe1c8c20fb0cd89770645a8824c1d30a443955.json +12 -0
- package/dist/fixtures/forge-change/recordings/ship-critic/350954b58833b2c04880c67db45a1b328b7fd541d9f0d943b63905b8875488a6.json +12 -0
- package/dist/fixtures/forge-change/recordings/ship-critic/4af95c6c96a206777cec9de1f9c2d8c55a36ddc9b8db2f81d6eb83217b835efa.json +12 -0
- package/dist/fixtures/forge-change/recordings/ship-critic/76c34522a49cf7587a4e5689a5030d384603fa780b8aba97d27815cbc829683e.json +12 -0
- package/dist/fixtures/forge-change/recordings/ship-critic/a3b2cd1ace48587e5994333db03b34c3a0f9dec4f1932f1730ddfb687f6918c8.json +12 -0
- package/dist/fixtures/forge-change/recordings/ship-critic/de288a4fa64d0fc20890f9a787080ce6eac5203b7b9b72d884df11e8cf111835.json +12 -0
- package/dist/fixtures/forge-change/recordings/story-writer/1ddb00eac2aaf91a5ec5d9dfd220116be9f75aec6546a4a3a3b050ed89af2864.json +12 -0
- package/dist/packages/assistant-kit/frameworks-kit/README.md +86 -0
- package/dist/packages/assistant-kit/frameworks-kit/checklist.md +11 -0
- package/dist/packages/assistant-kit/frameworks-kit/examples/tide-lantern.yaml +56 -0
- package/dist/packages/assistant-kit/frameworks-kit/examples/tide-platform.yaml +43 -0
- package/dist/packages/assistant-kit/frameworks-kit/prompts/write-framework-model.md +12 -0
- package/dist/packages/assistant-kit/kit/README.md +98 -0
- package/dist/packages/assistant-kit/kit/c2-reference.md +334 -0
- package/dist/packages/assistant-kit/kit/checklist.md +39 -0
- package/dist/packages/assistant-kit/kit/examples/house-http-client.yaml +102 -0
- package/dist/packages/assistant-kit/kit/examples/tide-apigee.yaml +56 -0
- package/dist/packages/assistant-kit/kit/examples/tide-apim.yaml +32 -0
- package/dist/packages/assistant-kit/kit/examples/tide-kong.yaml +44 -0
- package/dist/packages/assistant-kit/kit/prompts/write-dialect.md +34 -0
- package/dist/packages/assistant-kit/kit/worked-example.md +198 -0
- package/dist/packages/conformance/sample/README.md +4 -0
- package/dist/packages/conformance/sample/inputs/notes.md +3 -0
- package/dist/packages/conformance/sample/inputs/systems.csv +3 -0
- package/dist/packages/conformance/sample/repo/api/greeter.proto +6 -0
- package/dist/packages/conformance/sample/repo/api/openapi.yaml +10 -0
- package/dist/packages/conformance/sample/repo/api/schema.graphql +3 -0
- package/dist/packages/conformance/sample/repo/db/V1__create_greeting.sql +4 -0
- package/dist/packages/conformance/sample/repo/package.json +7 -0
- package/dist/packages/conformance/sample/repo/src/main/java/sample/HelloController.java +10 -0
- package/dist/packages/conformance/sample/repo/web/app.ts +4 -0
- package/dist/packages/evals/datasets/critic-lenses.yaml +62 -0
- package/dist/packages/evals/datasets/dialect-writer.yaml +14 -0
- package/dist/packages/evals/datasets/feature-namer.yaml +34 -0
- package/dist/packages/evals/datasets/glossary-definer.yaml +25 -0
- package/dist/packages/evals/datasets/story-writer.yaml +13 -0
- package/dist/packages/evals/datasets/template-writer.yaml +16 -0
- package/dist/packages/evals/datasets/test-writer.yaml +18 -0
- package/dist/packages/executors/reference/reference-executor.mjs +233 -0
- package/dist/packages/extractors/dialects/argocd.yaml +45 -0
- package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/AccountResource.java +47 -0
- package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/AuditClient.java +12 -0
- package/dist/packages/extractors/dialects/fixtures/jaxrs/accounts-service/src/main/java/forge/accounts/LedgerClient.java +17 -0
- package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/LedgerClient.java +14 -0
- package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/RatesClient.java +11 -0
- package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/java/forge/statements/StatementController.java +36 -0
- package/dist/packages/extractors/dialects/fixtures/micronaut/statements-service/src/main/resources/application.yml +7 -0
- package/dist/packages/extractors/dialects/fixtures/quarkus-reactive-messaging/fraud-service/src/main/java/forge/fraud/FraudScorer.java +27 -0
- package/dist/packages/extractors/dialects/fixtures/quarkus-reactive-messaging/fraud-service/src/main/resources/application.properties +4 -0
- package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/api.tf +38 -0
- package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/main.tf +95 -0
- package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/terraform.tfvars +1 -0
- package/dist/packages/extractors/dialects/fixtures/terraform-aws/forge-aws-infra/envs/prod/variables.tf +4 -0
- package/dist/packages/extractors/dialects/fixtures/terraform-azure/forge-azure-infra/main.tf +102 -0
- package/dist/packages/extractors/dialects/fixtures/terraform-gcp/forge-gcp-infra/main.tf +51 -0
- package/dist/packages/extractors/dialects/harness.yaml +101 -0
- package/dist/packages/extractors/dialects/jaxrs.yaml +155 -0
- package/dist/packages/extractors/dialects/micronaut.yaml +207 -0
- package/dist/packages/extractors/dialects/quarkus-reactive-messaging.yaml +158 -0
- package/dist/packages/extractors/dialects/tekton.yaml +71 -0
- package/dist/packages/extractors/dialects/terraform-aws.yaml +267 -0
- package/dist/packages/extractors/dialects/terraform-azure.yaml +212 -0
- package/dist/packages/extractors/dialects/terraform-gcp.yaml +109 -0
- package/dist/packages/extractors/grammars/README.md +11 -0
- package/dist/packages/extractors/grammars/tree-sitter-groovy.LICENSE +21 -0
- package/dist/packages/extractors/grammars/tree-sitter-groovy.wasm +0 -0
- package/dist/packages/extractors/grammars/vendored.json +11 -0
- package/dist/packages/learn/lessons/architect-diagrams-and-code.yaml +69 -0
- package/dist/packages/learn/lessons/business-analyst-story-bar.yaml +94 -0
- package/dist/packages/learn/lessons/delivery-lead-release-readiness.yaml +44 -0
- package/dist/packages/learn/lessons/designer-features-in-user-words.yaml +57 -0
- package/dist/packages/learn/lessons/developer-find-your-way.yaml +60 -0
- package/dist/packages/learn/lessons/everyone-first-hour.yaml +74 -0
- package/dist/packages/learn/lessons/platform-lead-coverage-and-defences.yaml +58 -0
- package/dist/packages/learn/lessons/product-owner-first-change.yaml +167 -0
- package/dist/packages/learn/lessons/qa-tests-and-trace.yaml +53 -0
- package/dist/packages/learn/lessons/team-lead-initiative.yaml +146 -0
- package/dist/packages/naysayer/constitution/constitution.yaml +286 -0
- package/dist/packages/naysayer/starter/review.yaml +256 -0
- package/dist/packages/sdk/npm/index.js +8892 -0
- package/dist/packages/speckit/rules/drift.yaml +78 -0
- package/dist/packages/taskrun/rules/conform.yaml +38 -0
- package/dist/packages/testgen/rules/trace.yaml +49 -0
- package/dist/packages/ui/dist/assets/elk-api-tma0MCuh.js +2 -0
- package/dist/packages/ui/dist/assets/elk-worker.min--dAJroGl.js +6401 -0
- package/dist/packages/ui/dist/assets/elk-worker.min-DdYmS5kP.js +2 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- package/dist/packages/ui/dist/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +29 -0
- package/dist/packages/ui/dist/assets/index-DD_hufQz.css +1 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- package/dist/packages/ui/dist/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-devanagari-600-normal-BtY48IV_.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-devanagari-600-normal-DhS7ScYx.woff2 +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-devanagari-700-normal-BQQOj9BB.woff2 +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-devanagari-700-normal-DBRwWuxA.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-600-normal-CXCVEoA9.woff2 +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-600-normal-Dx02qI2_.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-700-normal-BPDUZo87.woff2 +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-700-normal-e0Uj8ZlN.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-ext-600-normal-BleIgkPp.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-ext-600-normal-C9ZjJQAt.woff2 +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-ext-700-normal-BPaQ7tlD.woff +0 -0
- package/dist/packages/ui/dist/assets/rajdhani-latin-ext-700-normal-S6aYESQK.woff2 +0 -0
- package/dist/packages/ui/dist/favicon.svg +1 -0
- package/dist/packages/ui/dist/index.html +15 -0
- package/dist/third-party.json +575 -0
- package/dist/vendor/@fission-ai/openspec/bin/openspec.js +85986 -0
- package/dist/vendor/@fission-ai/openspec/package.json +82 -0
- package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/schema.yaml +248 -0
- package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/design.md +21 -0
- package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/proposal.md +34 -0
- package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/spec.md +13 -0
- package/dist/vendor/@fission-ai/openspec/schemas/spec-driven/templates/tasks.md +11 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-c_sharp.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-go.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-java.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-javascript.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-kotlin.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-php.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-python.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-ruby.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-rust.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-scala.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-tsx.wasm +0 -0
- package/dist/vendor/tree-sitter-wasms/out/tree-sitter-typescript.wasm +0 -0
- package/dist/vendor/web-tree-sitter/tree-sitter.wasm +0 -0
- package/package.json +36 -3
|
@@ -0,0 +1,131 @@
|
|
|
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 "./chunk-GLUX4EEP.js";
|
|
7
|
+
import "./chunk-FITWGOJ2.js";
|
|
8
|
+
import {
|
|
9
|
+
repoFor
|
|
10
|
+
} from "./chunk-O3WI5KWW.js";
|
|
11
|
+
import "./chunk-KEM4SDDP.js";
|
|
12
|
+
import "./chunk-ZVM6AKKM.js";
|
|
13
|
+
import {
|
|
14
|
+
draftRepoType,
|
|
15
|
+
matchRepoType
|
|
16
|
+
} from "./chunk-27NKUS3X.js";
|
|
17
|
+
import "./chunk-L24C55VN.js";
|
|
18
|
+
import "./chunk-PAMPPUR6.js";
|
|
19
|
+
import "./chunk-23W7VWKR.js";
|
|
20
|
+
import "./chunk-7EKXJZ2Y.js";
|
|
21
|
+
import "./chunk-MC3H7736.js";
|
|
22
|
+
import "./chunk-T6AIP7H5.js";
|
|
23
|
+
import "./chunk-EFHQ3TWP.js";
|
|
24
|
+
import {
|
|
25
|
+
fsRepo
|
|
26
|
+
} from "./chunk-GQ4N4WKF.js";
|
|
27
|
+
import "./chunk-CNUKCS2T.js";
|
|
28
|
+
import {
|
|
29
|
+
RecordId,
|
|
30
|
+
loadOrgPack,
|
|
31
|
+
orgPackDirOf,
|
|
32
|
+
require_dist
|
|
33
|
+
} from "./chunk-S2A7YC3Q.js";
|
|
34
|
+
import "./chunk-D3PO4DOZ.js";
|
|
35
|
+
import {
|
|
36
|
+
__toESM
|
|
37
|
+
} from "./chunk-TV45EUGM.js";
|
|
38
|
+
|
|
39
|
+
// packages/cli/dist/repo-type-commands.js
|
|
40
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
41
|
+
import { mkdir, stat, writeFile } from "node:fs/promises";
|
|
42
|
+
import { join } from "node:path";
|
|
43
|
+
var pct = (n) => `${Math.round(n * 100)}%`;
|
|
44
|
+
var notFound = (target) => `${target} isn't a cloned repo of the manifest or a folder; clone it with atticus workspace sync, or give its folder.`;
|
|
45
|
+
function verdictLine(id, r) {
|
|
46
|
+
const best = r.matches.find((m) => m.type === r.best);
|
|
47
|
+
switch (r.verdict) {
|
|
48
|
+
case "clear":
|
|
49
|
+
return `${id} is a clear match for ${best.name} (${best.type}), ${pct(best.score)}. Reuse it: atticus scan survey ${id} hands its settings and skills to your assistant.`;
|
|
50
|
+
case "partial":
|
|
51
|
+
return `${id} is a partial match for ${best.name} (${best.type}), ${pct(best.score)}. Reuse it, and extend the type with what this repo does differently.`;
|
|
52
|
+
case "tie":
|
|
53
|
+
return `${id} matches ${r.tied.join(" and ")} about as well.${r.fromDescription ? ` Its description says "${r.fromDescription.words}", so ${r.fromDescription.type} is the likelier of them; a person still decides.` : ""} A person decides which it is; then change the types so their fingerprints tell them apart.`;
|
|
54
|
+
case "none":
|
|
55
|
+
return `${id} matches no known repo type.${r.fromDescription ? ` Its description says "${r.fromDescription.words}", so ${r.fromDescription.type} may be it, though nothing in its files says so.` : ""} Draft one: atticus repo-type new <id> --from ${id}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function typeYaml(t) {
|
|
59
|
+
const doc = new import_yaml.Document(t);
|
|
60
|
+
(0, import_yaml.visit)(doc, {
|
|
61
|
+
Seq(_, node) {
|
|
62
|
+
if (node.items.every((i) => (0, import_yaml.isScalar)(i)))
|
|
63
|
+
node.flow = true;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return doc.toString({ lineWidth: 0, flowCollectionPadding: false });
|
|
67
|
+
}
|
|
68
|
+
async function repoTypeDetect(root, target, o, io) {
|
|
69
|
+
const repo = await repoFor(root, target);
|
|
70
|
+
if (!repo) {
|
|
71
|
+
io.err(notFound(target));
|
|
72
|
+
return 2;
|
|
73
|
+
}
|
|
74
|
+
const op = await loadOrgPack(orgPackDirOf(root));
|
|
75
|
+
const said = op.profiles.flatMap((p) => p.repos?.repos ?? []).find((x) => x.id === repo.id)?.description?.text;
|
|
76
|
+
const r = await matchRepoType(fsRepo(repo.id, repo.dir, "0".repeat(40)), op.repoTypes, {
|
|
77
|
+
...said ? { description: said } : {}
|
|
78
|
+
});
|
|
79
|
+
if (o.json) {
|
|
80
|
+
io.out(JSON.stringify({ repo: repo.id, ...r }, null, 2));
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
if (op.repoTypes.length === 0) {
|
|
84
|
+
io.out(`The org pack has no repo types yet (org-pack/repo-types/<id>/type.yaml). Draft one: atticus repo-type new <id> --from ${repo.id}`);
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
io.out(verdictLine(repo.id, r));
|
|
88
|
+
for (const m of r.matches) {
|
|
89
|
+
io.out(` ${m.type} ${pct(m.score)} (${m.got} of ${m.total})${m.ruledOut ? ", ruled out: a required signal is missing" : ""}`);
|
|
90
|
+
for (const s of m.signals)
|
|
91
|
+
io.out(` ${s.found ? "found " : "missing"} ${s.label} (${s.weight}${s.required ? ", required" : ""})${s.found ? `: ${s.evidence.join(", ")}` : ""}`);
|
|
92
|
+
}
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
async function repoTypeNew(root, id, o, io) {
|
|
96
|
+
if (!RecordId.safeParse(id).success || !o.from) {
|
|
97
|
+
io.err("Usage: atticus repo-type new <id> --from <repo> [--force]. The id is a lowercase slug, like forge-spring-service.");
|
|
98
|
+
return 2;
|
|
99
|
+
}
|
|
100
|
+
const repo = await repoFor(root, o.from);
|
|
101
|
+
if (!repo) {
|
|
102
|
+
io.err(notFound(o.from));
|
|
103
|
+
return 2;
|
|
104
|
+
}
|
|
105
|
+
const dir = join(orgPackDirOf(root), "repo-types", id);
|
|
106
|
+
const file = join(dir, "type.yaml");
|
|
107
|
+
if (!o.force && await stat(file).catch(() => void 0)) {
|
|
108
|
+
io.err(`The repo type ${id} already exists (org-pack/repo-types/${id}/type.yaml). Re-run with --force to draft it again.`);
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
const t = await draftRepoType(fsRepo(repo.id, repo.dir, "0".repeat(40)), id);
|
|
112
|
+
if (!t) {
|
|
113
|
+
io.out(`${repo.id} has no build file, dependency, framework marker or known folder to fingerprint; nothing was written. Write the type by hand.`);
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
await mkdir(dir, { recursive: true });
|
|
117
|
+
const date = (o.now ?? /* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
118
|
+
await writeFile(file, `# Drafted from ${repo.id} by atticus repo-type new on ${date} (ADR 0077). Edit it: name what kind
|
|
119
|
+
# of repo this is, keep the signals every repo of the kind has, set the weights, add skills.
|
|
120
|
+
${typeYaml(t)}`, "utf8");
|
|
121
|
+
const kinds = /* @__PURE__ */ new Map();
|
|
122
|
+
for (const s of t.fingerprint)
|
|
123
|
+
kinds.set(s.kind, (kinds.get(s.kind) ?? 0) + 1);
|
|
124
|
+
io.out(`Wrote org-pack/repo-types/${id}/type.yaml from ${repo.id}: ${[...kinds].map(([k, n]) => `${n} ${k}`).join(", ")} ${t.fingerprint.length === 1 ? "signal" : "signals"}, ${t.settings.prefixes.length} prefix ${t.settings.prefixes.length === 1 ? "rule" : "rules"}.`);
|
|
125
|
+
io.out(`Next: edit it, check it with atticus repo-type detect ${repo.id} and atticus orgpack validate, then review it in a pull request.`);
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
export {
|
|
129
|
+
repoTypeDetect,
|
|
130
|
+
repoTypeNew
|
|
131
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
external_exports,
|
|
8
|
+
require_dist
|
|
9
|
+
} from "./chunk-S2A7YC3Q.js";
|
|
10
|
+
import {
|
|
11
|
+
ensureLocalIgnore
|
|
12
|
+
} from "./chunk-D3PO4DOZ.js";
|
|
13
|
+
import {
|
|
14
|
+
__toESM
|
|
15
|
+
} from "./chunk-TV45EUGM.js";
|
|
16
|
+
|
|
17
|
+
// packages/cli/dist/me-file.js
|
|
18
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
19
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
20
|
+
import { dirname, join } from "node:path";
|
|
21
|
+
var ME_FILE = ".atticus/me.yaml";
|
|
22
|
+
var MeNotify = external_exports.object({
|
|
23
|
+
/** Where the digest goes; default a direct message to the person. */
|
|
24
|
+
channel: external_exports.string().min(1).optional(),
|
|
25
|
+
/** How often the person wants the digest; Atticus sends it only when they (or their own scheduled job) ask. */
|
|
26
|
+
digest: external_exports.enum(["off", "daily", "weekly"]).default("off")
|
|
27
|
+
});
|
|
28
|
+
var MeFile = external_exports.object({
|
|
29
|
+
notify: MeNotify.optional(),
|
|
30
|
+
/** Changes the person follows: the digest and the editors say how each is doing. */
|
|
31
|
+
watch: external_exports.array(external_exports.string().min(1)).default([])
|
|
32
|
+
});
|
|
33
|
+
async function readMe(root) {
|
|
34
|
+
try {
|
|
35
|
+
const r = MeFile.safeParse((0, import_yaml.parse)(await readFile(join(root, ME_FILE), "utf8")) ?? {});
|
|
36
|
+
return r.success ? r.data : { watch: [] };
|
|
37
|
+
} catch {
|
|
38
|
+
return { watch: [] };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function writeMe(root, me) {
|
|
42
|
+
await ensureLocalIgnore(root);
|
|
43
|
+
const file = join(root, ME_FILE);
|
|
44
|
+
await mkdir(dirname(file), { recursive: true });
|
|
45
|
+
await writeFile(file, (0, import_yaml.stringify)({
|
|
46
|
+
...me.notify ? { notify: me.notify } : {},
|
|
47
|
+
...me.watch.length ? { watch: [...new Set(me.watch)].sort() } : {}
|
|
48
|
+
}), "utf8");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export {
|
|
52
|
+
ME_FILE,
|
|
53
|
+
readMe,
|
|
54
|
+
writeMe
|
|
55
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
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
|
+
ASSISTANT_FORMATS,
|
|
8
|
+
assistantTier,
|
|
9
|
+
probeFileOf,
|
|
10
|
+
probeTier,
|
|
11
|
+
writeProbe
|
|
12
|
+
} from "./chunk-IPKHE5D6.js";
|
|
13
|
+
import "./chunk-EFHQ3TWP.js";
|
|
14
|
+
import {
|
|
15
|
+
AssistantId,
|
|
16
|
+
external_exports,
|
|
17
|
+
loadOrgPack,
|
|
18
|
+
orgPackDirOf,
|
|
19
|
+
runsDirOf,
|
|
20
|
+
runsRelOf
|
|
21
|
+
} from "./chunk-S2A7YC3Q.js";
|
|
22
|
+
import "./chunk-D3PO4DOZ.js";
|
|
23
|
+
import "./chunk-TV45EUGM.js";
|
|
24
|
+
|
|
25
|
+
// packages/cli/dist/probe-commands.js
|
|
26
|
+
import { randomBytes } from "node:crypto";
|
|
27
|
+
import { existsSync } from "node:fs";
|
|
28
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
29
|
+
import { join } from "node:path";
|
|
30
|
+
var OPEN_HOURS = 24;
|
|
31
|
+
var Challenge = external_exports.strictObject({
|
|
32
|
+
schemaVersion: external_exports.literal(1),
|
|
33
|
+
assistant: AssistantId,
|
|
34
|
+
code: external_exports.string().regex(/^[0-9a-f]{8}$/),
|
|
35
|
+
started: external_exports.iso.datetime(),
|
|
36
|
+
maxTokens: external_exports.number().int().min(1e3).optional()
|
|
37
|
+
});
|
|
38
|
+
var probeDir = (root) => join(runsDirOf(root), "probe");
|
|
39
|
+
var probeRel = (root) => `${runsRelOf(root)}/probe`;
|
|
40
|
+
function startIn(id) {
|
|
41
|
+
const f = ASSISTANT_FORMATS[id];
|
|
42
|
+
return id === "agents-md" ? `In ${f.typeIn}, ask it to follow ${f.commandPath("atticus-probe")}.` : `In ${f.typeIn}, run /atticus-probe.`;
|
|
43
|
+
}
|
|
44
|
+
async function probeCommand(root, o, io, deps = {}) {
|
|
45
|
+
const rt = (await loadOrgPack(orgPackDirOf(root))).runtime;
|
|
46
|
+
if (rt.ai === "off") {
|
|
47
|
+
io.err("AI is off here (runtime.yaml): there is no assistant to probe.");
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
const want = o.assistant ?? rt.assistants.default;
|
|
51
|
+
const id = AssistantId.safeParse(want);
|
|
52
|
+
if (!id.success || !rt.assistants.allowed.includes(id.data)) {
|
|
53
|
+
io.err(`runtime.yaml doesn't allow ${want} here: it allows ${rt.assistants.allowed.join(", ")}.`);
|
|
54
|
+
return 2;
|
|
55
|
+
}
|
|
56
|
+
const assistant = id.data;
|
|
57
|
+
const now = (deps.now ?? (() => /* @__PURE__ */ new Date()))();
|
|
58
|
+
const challenge = {
|
|
59
|
+
schemaVersion: 1,
|
|
60
|
+
assistant,
|
|
61
|
+
code: deps.code?.() ?? randomBytes(4).toString("hex"),
|
|
62
|
+
started: now.toISOString(),
|
|
63
|
+
...o.maxTokens !== void 0 ? { maxTokens: o.maxTokens } : {}
|
|
64
|
+
};
|
|
65
|
+
const dir = probeDir(root);
|
|
66
|
+
await rm(dir, { recursive: true, force: true });
|
|
67
|
+
await mkdir(dir, { recursive: true });
|
|
68
|
+
await writeFile(join(dir, "probe.json"), `${JSON.stringify(challenge, null, 2)}
|
|
69
|
+
`, "utf8");
|
|
70
|
+
await writeFile(join(dir, "challenge.md"), [
|
|
71
|
+
"# Atticus capability probe",
|
|
72
|
+
"",
|
|
73
|
+
`Code: ${challenge.code}`,
|
|
74
|
+
"",
|
|
75
|
+
`Atticus wrote this file at ${challenge.started} for /atticus-probe. The steps of /atticus-probe say what to do with the code.`,
|
|
76
|
+
""
|
|
77
|
+
].join("\n"), "utf8");
|
|
78
|
+
const rel = probeRel(root);
|
|
79
|
+
const name = ASSISTANT_FORMATS[assistant].name;
|
|
80
|
+
const result = probeFileOf(assistant);
|
|
81
|
+
if (o.json) {
|
|
82
|
+
io.out(JSON.stringify({
|
|
83
|
+
assistant,
|
|
84
|
+
challenge: `${rel}/challenge.md`,
|
|
85
|
+
answerFile: `${rel}/answer.txt`,
|
|
86
|
+
result,
|
|
87
|
+
started: challenge.started,
|
|
88
|
+
expires: new Date(now.getTime() + OPEN_HOURS * 36e5).toISOString(),
|
|
89
|
+
...o.maxTokens !== void 0 ? { maxTokens: o.maxTokens } : {}
|
|
90
|
+
}, null, 2));
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
io.out(`Probing ${name} (another assistant runtime.yaml allows: --assistant <id>).`);
|
|
94
|
+
io.out(`${startIn(assistant)} It asks the assistant to open ${rel}/challenge.md, write the code it holds to ${rel}/answer.txt, and run atticus probe answer <code> itself.`);
|
|
95
|
+
io.out("An assistant that can't run commands gives you a line to paste in this terminal instead: atticus probe answer <code> --pasted.");
|
|
96
|
+
io.out("A chat with no /atticus-probe (a web chat) can't open files here: run atticus probe answer none --pasted.");
|
|
97
|
+
if (o.maxTokens === void 0)
|
|
98
|
+
io.out("Give your model's limit, the most tokens it takes in one prompt, with --max-tokens <n> on the answer if you know it: Atticus never guesses it.");
|
|
99
|
+
else
|
|
100
|
+
io.out(`Model limit: ${o.maxTokens} tokens, as you stated it.`);
|
|
101
|
+
io.out(`The probe is open for ${OPEN_HOURS} hours. Nothing leaves this machine: the answer is checked here and kept in ${result}.`);
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
var yesNo = (b) => b ? "yes" : "no";
|
|
105
|
+
async function probeAnswerCommand(root, given, o, io, deps = {}) {
|
|
106
|
+
if (!given) {
|
|
107
|
+
io.err("Usage: atticus probe answer <code|none> [--pasted] [--max-tokens n] [--json]");
|
|
108
|
+
return 2;
|
|
109
|
+
}
|
|
110
|
+
const dir = probeDir(root);
|
|
111
|
+
const rel = probeRel(root);
|
|
112
|
+
const parsed = Challenge.safeParse(await readFile(join(dir, "probe.json"), "utf8").then((t2) => JSON.parse(t2)).catch(() => void 0));
|
|
113
|
+
if (!parsed.success) {
|
|
114
|
+
io.err("No probe is under way here: start one with atticus probe.");
|
|
115
|
+
return 1;
|
|
116
|
+
}
|
|
117
|
+
const c = parsed.data;
|
|
118
|
+
const now = (deps.now ?? (() => /* @__PURE__ */ new Date()))();
|
|
119
|
+
if (now.getTime() - Date.parse(c.started) > OPEN_HOURS * 36e5) {
|
|
120
|
+
io.err(`The probe started at ${c.started} is more than ${OPEN_HOURS} hours old: start a new one with atticus probe.`);
|
|
121
|
+
return 1;
|
|
122
|
+
}
|
|
123
|
+
const code = given.trim().toLowerCase();
|
|
124
|
+
if (code !== "none" && code !== c.code) {
|
|
125
|
+
io.err(`${given.trim()} isn't the code in ${rel}/challenge.md: the assistant didn't read that file. Nothing was recorded. Run /atticus-probe again, or answer none if the assistant can't open files.`);
|
|
126
|
+
return 1;
|
|
127
|
+
}
|
|
128
|
+
const answerFile = join(dir, "answer.txt");
|
|
129
|
+
const written = existsSync(answerFile) ? (await readFile(answerFile, "utf8").catch(() => "")).trim().toLowerCase() : void 0;
|
|
130
|
+
const read = code === c.code;
|
|
131
|
+
const write = written === c.code;
|
|
132
|
+
const run = o.pasted !== true;
|
|
133
|
+
const maxTokens = o.maxTokens ?? c.maxTokens;
|
|
134
|
+
const result = {
|
|
135
|
+
schemaVersion: 1,
|
|
136
|
+
assistant: c.assistant,
|
|
137
|
+
measured: now.toISOString(),
|
|
138
|
+
tier: probeTier({ read, write, run }),
|
|
139
|
+
read,
|
|
140
|
+
write,
|
|
141
|
+
run,
|
|
142
|
+
answered: run ? "command" : "pasted",
|
|
143
|
+
...maxTokens !== void 0 ? { maxTokens } : {}
|
|
144
|
+
};
|
|
145
|
+
const file = await writeProbe(root, result);
|
|
146
|
+
await rm(dir, { recursive: true, force: true });
|
|
147
|
+
const rt = (await loadOrgPack(orgPackDirOf(root))).runtime;
|
|
148
|
+
const t = assistantTier({ ...rt, assistants: { allowed: [c.assistant], default: c.assistant } }, { probes: [result], now });
|
|
149
|
+
if (o.json) {
|
|
150
|
+
io.out(JSON.stringify({ ...result, file, how: t.how }, null, 2));
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
const name = ASSISTANT_FORMATS[c.assistant].name;
|
|
154
|
+
io.out(`Measured ${name}: opened the file Atticus wrote: ${yesNo(read)}; wrote a file: ${write ? "yes" : written === void 0 ? "no" : `no (${rel}/answer.txt doesn't hold the code)`}; ran a command itself: ${run ? "yes" : "no (the line was pasted)"}. That is ${result.tier === 1 ? "agentic (tier 1)" : result.tier === 2 ? "batched hand-off (tier 2)" : "copy-paste (tier 3)"}.`);
|
|
155
|
+
io.out(`The first read of a repo: ${t.how}`);
|
|
156
|
+
io.out(maxTokens !== void 0 ? `Model limit: ${maxTokens} tokens, as stated.` : "No model limit was stated: atticus probe --max-tokens <n> measures again with it, or give --max-tokens <n> on each atticus map.");
|
|
157
|
+
io.out(`Kept in ${file}, on this machine only (never committed). atticus doctor, init, adopt and map --estimate say this tier from now on.`);
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
export {
|
|
161
|
+
probeAnswerCommand,
|
|
162
|
+
probeCommand
|
|
163
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
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
|
+
askHosts
|
|
8
|
+
} from "./chunk-RVH5SUW5.js";
|
|
9
|
+
import {
|
|
10
|
+
driftAfterScan
|
|
11
|
+
} from "./chunk-OT2O76OS.js";
|
|
12
|
+
import {
|
|
13
|
+
diffCatalogs,
|
|
14
|
+
diffIsEmpty,
|
|
15
|
+
readCatalog,
|
|
16
|
+
scanEstate,
|
|
17
|
+
writeCatalog
|
|
18
|
+
} from "./chunk-27NKUS3X.js";
|
|
19
|
+
import {
|
|
20
|
+
loadRepos
|
|
21
|
+
} from "./chunk-EFHQ3TWP.js";
|
|
22
|
+
import {
|
|
23
|
+
catalogDirOf
|
|
24
|
+
} from "./chunk-S2A7YC3Q.js";
|
|
25
|
+
import {
|
|
26
|
+
LockHeldError,
|
|
27
|
+
acquireLock
|
|
28
|
+
} from "./chunk-D3PO4DOZ.js";
|
|
29
|
+
|
|
30
|
+
// packages/cli/dist/scan-commands.js
|
|
31
|
+
import { join } from "node:path";
|
|
32
|
+
function diffLines(d) {
|
|
33
|
+
if (diffIsEmpty(d))
|
|
34
|
+
return ["No catalog changes."];
|
|
35
|
+
const lines = [
|
|
36
|
+
`${d.added.length} added, ${d.removed.length} removed, ${d.changed.length} changed, ${d.evidenceOnly.length} with new evidence only`,
|
|
37
|
+
...d.added.map((r) => `+ ${r.kind}/${r.id}`),
|
|
38
|
+
...d.removed.map((r) => `- ${r.kind}/${r.id}`),
|
|
39
|
+
...d.changed.map((r) => `~ ${r.kind}/${r.id} (${r.fields.join(", ")})`)
|
|
40
|
+
];
|
|
41
|
+
return lines;
|
|
42
|
+
}
|
|
43
|
+
function driftLine(d) {
|
|
44
|
+
const head = `Drift check for ${d.change} (${d.state})`;
|
|
45
|
+
if (d.error)
|
|
46
|
+
return `${head} couldn't run: ${d.error}`;
|
|
47
|
+
if (d.round === void 0)
|
|
48
|
+
return `${head}: no drift.`;
|
|
49
|
+
const what = `${d.open} open finding${d.open === 1 ? "" : "s"}${d.blocking ? ` (${d.blocking} blocking)` : ""}`;
|
|
50
|
+
return `${head}: ${what} in review/drift/${d.round}${d.unchanged ? ", nothing new" : ""}.`;
|
|
51
|
+
}
|
|
52
|
+
async function scanCommand(root, o, io) {
|
|
53
|
+
if (o.repos && o.repos.length > 0) {
|
|
54
|
+
const known = new Set((await loadRepos(root)).map((r) => r.id));
|
|
55
|
+
const unknown = o.repos.filter((r) => !known.has(r));
|
|
56
|
+
if (unknown.length > 0) {
|
|
57
|
+
io.err(`Not in any repos.manifest.yaml: ${unknown.join(", ")}`);
|
|
58
|
+
return 2;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
let lock;
|
|
62
|
+
if (!o.dryRun) {
|
|
63
|
+
try {
|
|
64
|
+
lock = await acquireLock(root, "scan", "scan");
|
|
65
|
+
} catch (e) {
|
|
66
|
+
if (e instanceof LockHeldError) {
|
|
67
|
+
io.err(e.message);
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
throw e;
|
|
71
|
+
}
|
|
72
|
+
if (lock.interrupted)
|
|
73
|
+
io.err(`The last scan (started ${lock.interrupted.startedAt}) stopped before it finished; this one brings the catalog up to date.`);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
if (o.ref) {
|
|
77
|
+
const { scanBranch } = await import("./chunk-ZCJDOK2S.js");
|
|
78
|
+
return await scanBranch(root, o.ref, {
|
|
79
|
+
...o.repos ? { repos: o.repos } : {},
|
|
80
|
+
...o.full ? { full: true } : {},
|
|
81
|
+
...o.json ? { json: true } : {}
|
|
82
|
+
}, io);
|
|
83
|
+
}
|
|
84
|
+
return await scanLocked(root, o, io);
|
|
85
|
+
} finally {
|
|
86
|
+
await lock?.release();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function scanLocked(root, o, io) {
|
|
90
|
+
const out = join(catalogDirOf(root), "generated");
|
|
91
|
+
const before = await readCatalog(out, { cacheRoot: root });
|
|
92
|
+
const started = Date.now();
|
|
93
|
+
const scan = await scanEstate({
|
|
94
|
+
root,
|
|
95
|
+
...o.repos ? { repos: o.repos } : {},
|
|
96
|
+
...o.full ? { cache: null } : {}
|
|
97
|
+
});
|
|
98
|
+
const diff = diffCatalogs(before.records, scan.records);
|
|
99
|
+
const write = o.dryRun ? void 0 : await writeCatalog(out, scan.records);
|
|
100
|
+
const drift = write && !o.noDrift ? await driftAfterScan(root) : [];
|
|
101
|
+
const hosts = write ? await askHosts(root, scan.records, { command: "atticus scan" }) : { raised: [], open: [], lines: [] };
|
|
102
|
+
const problems = [
|
|
103
|
+
...before.problems.map((p) => ({ source: `catalog/generated/${p.file}`, message: p.message })),
|
|
104
|
+
...scan.problems
|
|
105
|
+
];
|
|
106
|
+
const seen = /* @__PURE__ */ new Set();
|
|
107
|
+
const warnings = scan.repos.flatMap((r) => r.warnings.map((w) => ({ repo: r.repo, ...w })).filter((w) => {
|
|
108
|
+
const k = `${w.repo}\0${w.path ?? ""}\0${w.message}`;
|
|
109
|
+
if (seen.has(k))
|
|
110
|
+
return false;
|
|
111
|
+
seen.add(k);
|
|
112
|
+
return true;
|
|
113
|
+
}));
|
|
114
|
+
if (o.json) {
|
|
115
|
+
io.out(JSON.stringify({
|
|
116
|
+
stats: scan.stats,
|
|
117
|
+
diff,
|
|
118
|
+
problems,
|
|
119
|
+
warnings,
|
|
120
|
+
coverage: scan.coverage,
|
|
121
|
+
unmodelled: scan.unmodelled,
|
|
122
|
+
notes: scan.notes,
|
|
123
|
+
written: write !== void 0,
|
|
124
|
+
files: write ?? null,
|
|
125
|
+
drift,
|
|
126
|
+
questions: [...hosts.raised, ...hosts.open].map((q) => q.id)
|
|
127
|
+
}, null, 2));
|
|
128
|
+
} else {
|
|
129
|
+
const s = scan.stats;
|
|
130
|
+
io.out(`Scanned ${s.repos} repos in ${((Date.now() - started) / 1e3).toFixed(1)}s (${s.ranRuns} extractor runs, ${s.cachedRuns} from cache)`);
|
|
131
|
+
io.out(`${s.records} records: ${s.interfaces} interfaces (${s.verified} verified), ${s.unresolved} loose ends`);
|
|
132
|
+
const joined = scan.coverage.reduce((n, c) => n + c.joined, 0);
|
|
133
|
+
const found = joined + scan.coverage.reduce((n, c) => n + c.open, 0);
|
|
134
|
+
const unread = scan.coverage.reduce((n, c) => n + c.unreadFiles, 0);
|
|
135
|
+
io.out(`Joined ${joined} of ${found} calls, listeners and endpoints found (${found ? Math.round(joined / found * 100) : 100}%)` + (unread ? `; ${unread} file${unread === 1 ? " uses" : "s use"} a client library with nothing read (atticus scan --warnings)` : ""));
|
|
136
|
+
for (const c of scan.coverage)
|
|
137
|
+
for (const r of c.redraft)
|
|
138
|
+
io.out(`Rule ${r.dialect} on ${c.repo} ${r.why === "tests-fail" ? "fails its own tests, so this scan didn't use it" : "read nothing there"}; have your assistant re-draft it: atticus onboard ${c.repo} --name ${r.dialect} (then onboard accept ${r.dialect} --replace)`);
|
|
139
|
+
const toOnboard = scan.coverage.filter((c) => c.needsOnboarding);
|
|
140
|
+
if (toOnboard.length)
|
|
141
|
+
io.out(`Read nothing from ${toOnboard.length === 1 ? "1 repo" : `${toOnboard.length} repos`} whose files no reader knows: ${toOnboard.map((c) => `${c.repo} (${c.unreadConfig.length} file${c.unreadConfig.length === 1 ? "" : "s"})`).join(", ")}. Have your assistant draft a dialect: atticus onboard ${toOnboard[0].repo}`);
|
|
142
|
+
for (const f of scan.unmodelled)
|
|
143
|
+
io.out(`House framework ${f.framework} is imported by ${f.repos.length} repos and no framework model covers it: ${f.repos.join(", ")}. Onboard it: atticus onboard framework ${f.name} --from <its source, JAR or package> --users ${f.repos.join(",")}`);
|
|
144
|
+
const idle = /* @__PURE__ */ new Map();
|
|
145
|
+
for (const c of scan.coverage)
|
|
146
|
+
for (const r of c.redraftFrameworks)
|
|
147
|
+
idle.set(r.framework, [...idle.get(r.framework) ?? [], c.repo]);
|
|
148
|
+
for (const [framework, repos] of idle)
|
|
149
|
+
io.out(`Framework model ${framework} read nothing in ${repos.join(", ")}, which import${repos.length === 1 ? "s" : ""} it; the framework may have changed. Have your assistant re-draft it: atticus onboard framework ${framework} --from <its source, JAR or package> --users ${repos.join(",")} (then onboard accept framework ${framework} --replace)`);
|
|
150
|
+
for (const l of diffLines(diff))
|
|
151
|
+
io.out(l);
|
|
152
|
+
if (write)
|
|
153
|
+
io.out(`catalog/generated: ${write.written} written, ${write.unchanged} unchanged, ${write.removed} removed`);
|
|
154
|
+
else
|
|
155
|
+
io.out("Dry run: nothing written.");
|
|
156
|
+
for (const d of drift)
|
|
157
|
+
io.out(driftLine(d));
|
|
158
|
+
for (const l of hosts.lines)
|
|
159
|
+
io.out(l);
|
|
160
|
+
for (const n of scan.notes)
|
|
161
|
+
io.out(`note: ${n}`);
|
|
162
|
+
if (o.warnings)
|
|
163
|
+
for (const w of warnings)
|
|
164
|
+
io.out(`warning: ${w.repo}: ${w.path ? `${w.path}: ` : ""}${w.message}`);
|
|
165
|
+
else if (warnings.length)
|
|
166
|
+
io.out(`${warnings.length} warning${warnings.length === 1 ? "" : "s"}: atticus scan --warnings lists ${warnings.length === 1 ? "it" : "them"}`);
|
|
167
|
+
for (const p of problems)
|
|
168
|
+
io.err(`${"repo" in p && p.repo ? `${p.repo}: ` : ""}${p.source}: ${p.message}`);
|
|
169
|
+
}
|
|
170
|
+
return problems.length > 0 ? 1 : 0;
|
|
171
|
+
}
|
|
172
|
+
async function catalogDiff(a, b, json, io) {
|
|
173
|
+
const [x, y] = await Promise.all([readCatalog(a), readCatalog(b)]);
|
|
174
|
+
for (const p of [...x.problems, ...y.problems])
|
|
175
|
+
io.err(`${p.file}: ${p.message}`);
|
|
176
|
+
const d = diffCatalogs(x.records, y.records);
|
|
177
|
+
if (json)
|
|
178
|
+
io.out(JSON.stringify(d, null, 2));
|
|
179
|
+
else
|
|
180
|
+
for (const l of diffLines(d))
|
|
181
|
+
io.out(l);
|
|
182
|
+
return diffIsEmpty(d) && x.problems.length + y.problems.length === 0 ? 0 : 1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export {
|
|
186
|
+
diffLines,
|
|
187
|
+
scanCommand,
|
|
188
|
+
catalogDiff
|
|
189
|
+
};
|