@maycombhq/atticus 0.0.0-stage → 2.0.0-beta.11
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-23VFQHFQ.js +827 -0
- package/dist/chunk-26DBAGOP.js +315 -0
- package/dist/chunk-27EDZN52.js +115 -0
- package/dist/chunk-2K2ZEJVR.js +252 -0
- package/dist/chunk-3DDJLI7N.js +1081 -0
- package/dist/chunk-3G4YI4ZU.js +16 -0
- package/dist/chunk-3LU6YCSQ.js +3507 -0
- package/dist/chunk-3WU7LVTL.js +203 -0
- package/dist/chunk-4AYZQ3SY.js +285 -0
- package/dist/chunk-4ONORLK5.js +234 -0
- package/dist/chunk-4Q3NN7VF.js +32 -0
- package/dist/chunk-4SKZDI62.js +22 -0
- package/dist/chunk-4URR24DD.js +189 -0
- package/dist/chunk-4UZJOQYK.js +70 -0
- package/dist/chunk-4Y4FY34K.js +34 -0
- package/dist/chunk-4YWRU7JK.js +80 -0
- package/dist/chunk-52WCHTVZ.js +41 -0
- package/dist/chunk-55TBYJF2.js +36 -0
- package/dist/chunk-5ACUW753.js +240 -0
- package/dist/chunk-5BJFMAQU.js +32 -0
- package/dist/chunk-5ICB2BXH.js +33 -0
- package/dist/chunk-5NZSJ5ZG.js +60 -0
- package/dist/chunk-5P5BGG5L.js +307 -0
- package/dist/chunk-5RUMHLIS.js +104 -0
- package/dist/chunk-5TY4DTHQ.js +242 -0
- package/dist/chunk-5V5BJACL.js +2929 -0
- package/dist/chunk-6E2GJANQ.js +52 -0
- package/dist/chunk-6N2GUZMZ.js +471 -0
- package/dist/chunk-6RGIM2ZH.js +2069 -0
- package/dist/chunk-6V3DTQWK.js +391 -0
- package/dist/chunk-76WKMA4J.js +14 -0
- package/dist/chunk-77RSRG3A.js +104 -0
- package/dist/chunk-7A7IG7OA.js +2007 -0
- package/dist/chunk-7EFILTCI.js +67 -0
- package/dist/chunk-7HQOZALR.js +180 -0
- package/dist/chunk-7HWXYP4H.js +1217 -0
- package/dist/chunk-7J7UY46S.js +688 -0
- package/dist/chunk-7KXYMC2P.js +38 -0
- package/dist/chunk-7LCQ7JAM.js +55 -0
- package/dist/chunk-7RGCQ4VZ.js +22 -0
- package/dist/chunk-7RUMD56V.js +26 -0
- package/dist/chunk-7S3XFWOU.js +251 -0
- package/dist/chunk-7SZPENUP.js +32 -0
- package/dist/chunk-7VFVQX5K.js +105 -0
- package/dist/chunk-ACWQDL6T.js +37 -0
- package/dist/chunk-ANCI3LFS.js +25 -0
- package/dist/chunk-ASKDCMW5.js +275 -0
- package/dist/chunk-ATNG5VOZ.js +122 -0
- package/dist/chunk-B3QOYE74.js +58 -0
- package/dist/chunk-B3UHYXHU.js +41 -0
- package/dist/chunk-BA5DTXHQ.js +250 -0
- package/dist/chunk-BKFGGJKA.js +2743 -0
- package/dist/chunk-BQNEHB5U.js +212 -0
- package/dist/chunk-BUWSOQLU.js +131 -0
- package/dist/chunk-BX52REMA.js +134 -0
- package/dist/chunk-BXBCMGIQ.js +82 -0
- package/dist/chunk-C2YGYTU6.js +408 -0
- package/dist/chunk-C5JFMAXX.js +102 -0
- package/dist/chunk-C75W7VXX.js +42 -0
- package/dist/chunk-CAN3EBE5.js +1726 -0
- package/dist/chunk-CE4S5ZY3.js +182 -0
- package/dist/chunk-CRQ73DIF.js +25 -0
- package/dist/chunk-CZI2ACNT.js +36 -0
- package/dist/chunk-D7MWYJZF.js +43 -0
- package/dist/chunk-DDAEAZEV.js +54 -0
- package/dist/chunk-DGKNOPSE.js +549 -0
- package/dist/chunk-DQNKG4HY.js +906 -0
- package/dist/chunk-DS3ZEJVN.js +22 -0
- package/dist/chunk-DYWTQXP4.js +108 -0
- package/dist/chunk-E25G46RW.js +54 -0
- package/dist/chunk-EADP3PEN.js +450 -0
- package/dist/chunk-EAQFRD2B.js +430 -0
- package/dist/chunk-EATSD7YD.js +41 -0
- package/dist/chunk-EBWIOODZ.js +339 -0
- package/dist/chunk-EHUYLNLC.js +282 -0
- package/dist/chunk-EI4KQYJ3.js +1496 -0
- package/dist/chunk-EQOSXLK3.js +49 -0
- package/dist/chunk-EV4TEFOD.js +16667 -0
- package/dist/chunk-EW7MRMD5.js +312 -0
- package/dist/chunk-EZSZFI54.js +531 -0
- package/dist/chunk-FMRMTI7W.js +1142 -0
- package/dist/chunk-FOQXYMOR.js +46 -0
- package/dist/chunk-G3PBLW4K.js +246 -0
- package/dist/chunk-G7WZH54P.js +221 -0
- package/dist/chunk-GG6HIU74.js +211 -0
- package/dist/chunk-GMJXC5AL.js +27809 -0
- package/dist/chunk-GPLFYLGH.js +130 -0
- package/dist/chunk-GVFUEGGM.js +19943 -0
- package/dist/chunk-GWSWS264.js +130 -0
- package/dist/chunk-H4VJO3M2.js +229 -0
- package/dist/chunk-HGQZTUAC.js +415 -0
- package/dist/chunk-HOUUBE74.js +166 -0
- package/dist/chunk-HQMCHHY5.js +155 -0
- package/dist/chunk-HR4DVO6X.js +374 -0
- package/dist/chunk-HZYFLEWO.js +39 -0
- package/dist/chunk-IA2RKC6I.js +279 -0
- package/dist/chunk-IILZ7J3L.js +5548 -0
- package/dist/chunk-IRW64JFF.js +247 -0
- package/dist/chunk-IVHN2VYG.js +1526 -0
- package/dist/chunk-IWZPGIGT.js +856 -0
- package/dist/chunk-IY4PHPHT.js +15 -0
- package/dist/chunk-J27QGXO4.js +1247 -0
- package/dist/chunk-JBSD57N7.js +324 -0
- package/dist/chunk-JEUXCIRD.js +120 -0
- package/dist/chunk-JMOLB347.js +46388 -0
- package/dist/chunk-JQX6BSE4.js +130 -0
- package/dist/chunk-JRPQX2EK.js +376 -0
- package/dist/chunk-JUQHYTXN.js +45 -0
- package/dist/chunk-JUZ75OG4.js +344 -0
- package/dist/chunk-KIWEBM6G.js +378 -0
- package/dist/chunk-KLKENMWQ.js +891 -0
- package/dist/chunk-KQDZXGNR.js +14 -0
- package/dist/chunk-KQK6SQPE.js +48 -0
- package/dist/chunk-KQRYW7OS.js +4108 -0
- package/dist/chunk-KU4T2CXJ.js +116 -0
- package/dist/chunk-KXZR2BLL.js +53 -0
- package/dist/chunk-L7I5PKGD.js +915 -0
- package/dist/chunk-LDIARP6F.js +31 -0
- package/dist/chunk-LEHZTKB3.js +34 -0
- package/dist/chunk-LS3WR2RF.js +1071 -0
- package/dist/chunk-LUPW4WLK.js +526 -0
- package/dist/chunk-LVBPY2M6.js +406 -0
- package/dist/chunk-LZWVK4YY.js +169 -0
- package/dist/chunk-MCWWMMLN.js +48 -0
- package/dist/chunk-MKC7P5LD.js +32 -0
- package/dist/chunk-MKFYQQ5Q.js +36 -0
- package/dist/chunk-MKIULIUQ.js +273 -0
- package/dist/chunk-MMB2OHUY.js +263 -0
- package/dist/chunk-MQNBEO3N.js +2610 -0
- package/dist/chunk-MSL3CLHX.js +545 -0
- package/dist/chunk-MV4637YA.js +174 -0
- package/dist/chunk-MYKQVS5W.js +296 -0
- package/dist/chunk-MYOW3RPC.js +143 -0
- package/dist/chunk-NBGBMRIS.js +25 -0
- package/dist/chunk-NBQO75XT.js +287 -0
- package/dist/chunk-NCR24CPV.js +41 -0
- package/dist/chunk-NDW4ROST.js +38 -0
- package/dist/chunk-NELU7LSL.js +3208 -0
- package/dist/chunk-NG5R2WIY.js +2919 -0
- package/dist/chunk-NH5QH3WS.js +119 -0
- package/dist/chunk-NIYB5K5B.js +583 -0
- package/dist/chunk-NR5T46ZY.js +49 -0
- package/dist/chunk-NX6QEEOA.js +163 -0
- package/dist/chunk-O6ILVBYB.js +18 -0
- package/dist/chunk-OFWYZH6B.js +230 -0
- package/dist/chunk-OHXTB6CO.js +50 -0
- package/dist/chunk-OJN7WME4.js +34 -0
- package/dist/chunk-OR5VRULZ.js +226 -0
- package/dist/chunk-ORZSD2KD.js +55 -0
- package/dist/chunk-OXVVRJDQ.js +66 -0
- package/dist/chunk-PQW7PYUR.js +2522 -0
- package/dist/chunk-Q32Y5T2U.js +27 -0
- package/dist/chunk-QWHTTA2X.js +130 -0
- package/dist/chunk-R3RVFCJ2.js +76 -0
- package/dist/chunk-R3VFLYZZ.js +400 -0
- package/dist/chunk-R6RY4Q5T.js +51 -0
- package/dist/chunk-R6UTCLH5.js +166 -0
- package/dist/chunk-RB2VSED2.js +231 -0
- package/dist/chunk-REWZE2XI.js +53 -0
- package/dist/chunk-RIEFYHXI.js +162 -0
- package/dist/chunk-RJDP642F.js +101 -0
- package/dist/chunk-RWMSJP7H.js +279 -0
- package/dist/chunk-S2FDPN32.js +41 -0
- package/dist/chunk-S5LSDXV4.js +40 -0
- package/dist/chunk-S7ZWCMDO.js +192 -0
- package/dist/chunk-SG5KY4VB.js +69 -0
- package/dist/chunk-SH7AZZDA.js +69 -0
- package/dist/chunk-SILY6ZEZ.js +104 -0
- package/dist/chunk-SINJKQSI.js +34 -0
- package/dist/chunk-SIUDWWKS.js +47 -0
- package/dist/chunk-SKMHS4CL.js +766 -0
- package/dist/chunk-SNHOLLGN.js +280 -0
- package/dist/chunk-SUQZGPVG.js +119 -0
- package/dist/chunk-T6ESD5KM.js +6115 -0
- package/dist/chunk-TC3KTG33.js +221 -0
- package/dist/chunk-TCADP67G.js +101 -0
- package/dist/chunk-TEBBD4XH.js +7923 -0
- package/dist/chunk-TGEOLIAK.js +149 -0
- package/dist/chunk-TQYBXDVH.js +133 -0
- package/dist/chunk-TV45EUGM.js +51 -0
- package/dist/chunk-TZXHUDI6.js +233 -0
- package/dist/chunk-U5PDQTLA.js +50 -0
- package/dist/chunk-U6YKL7SI.js +334 -0
- package/dist/chunk-UABFFMWH.js +2078 -0
- package/dist/chunk-UFBKJOWB.js +325 -0
- package/dist/chunk-UFTQIK2J.js +43 -0
- package/dist/chunk-UNFCFJMF.js +95 -0
- package/dist/chunk-UTR67XU2.js +164 -0
- package/dist/chunk-V4XKYGLK.js +405 -0
- package/dist/chunk-VOGCSYOI.js +16 -0
- package/dist/chunk-VYNZED7B.js +53 -0
- package/dist/chunk-WCLAOKCH.js +540 -0
- package/dist/chunk-WFYHOXTB.js +29 -0
- package/dist/chunk-WGU6NIUV.js +113 -0
- package/dist/chunk-WIMOJMAK.js +3702 -0
- package/dist/chunk-WKXOEIOY.js +184 -0
- package/dist/chunk-WUE6HKIU.js +790 -0
- package/dist/chunk-WUP77GG2.js +56 -0
- package/dist/chunk-XF3DATVU.js +150 -0
- package/dist/chunk-XJAJQGXJ.js +18 -0
- package/dist/chunk-XKJRPVJO.js +3898 -0
- package/dist/chunk-XNRPCI23.js +3851 -0
- package/dist/chunk-XOVLGBKI.js +214 -0
- package/dist/chunk-XPJR74MA.js +562 -0
- package/dist/chunk-XPWSNKF3.js +5619 -0
- package/dist/chunk-XR5DD5DQ.js +104 -0
- package/dist/chunk-XZJE6WIT.js +706 -0
- package/dist/chunk-XZRON6IV.js +131 -0
- package/dist/chunk-Y5AYBGLB.js +368 -0
- package/dist/chunk-YLAM4HZH.js +95 -0
- package/dist/chunk-YVCOQ5TZ.js +47 -0
- package/dist/chunk-YWOMGMZB.js +94 -0
- package/dist/chunk-YWZDAZMA.js +18 -0
- package/dist/chunk-Z2EYRUOH.js +172 -0
- package/dist/chunk-Z46OXTBE.js +1611 -0
- package/dist/chunk-ZHWSL6SR.js +45 -0
- package/dist/chunk-ZJQUIG3A.js +87 -0
- package/dist/chunk-ZKUDS7JG.js +310 -0
- package/dist/chunk-ZTNS3L5Z.js +1019 -0
- package/dist/files.json +2024 -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 +305 -0
- package/dist/packages/naysayer/starter/review.yaml +256 -0
- package/dist/packages/sdk/npm/index.js +10097 -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-DDup23Us.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-C0JEkXyN.css +1 -0
- package/dist/packages/ui/dist/assets/index-mTOWhQZm.js +29 -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,2610 @@
|
|
|
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
|
+
aliasArgv
|
|
8
|
+
} from "./chunk-BXBCMGIQ.js";
|
|
9
|
+
import {
|
|
10
|
+
VERSION
|
|
11
|
+
} from "./chunk-7RUMD56V.js";
|
|
12
|
+
import {
|
|
13
|
+
SCHEMA_VERSION,
|
|
14
|
+
createLog
|
|
15
|
+
} from "./chunk-MMB2OHUY.js";
|
|
16
|
+
import "./chunk-TV45EUGM.js";
|
|
17
|
+
|
|
18
|
+
// packages/cli/dist/main.js
|
|
19
|
+
import { parseArgs } from "node:util";
|
|
20
|
+
import { basename, join, resolve } from "node:path";
|
|
21
|
+
import { existsSync } from "node:fs";
|
|
22
|
+
var loadAi = () => import("./chunk-2K2ZEJVR.js");
|
|
23
|
+
var runtimeForCli = async (...a) => {
|
|
24
|
+
await setUpAi();
|
|
25
|
+
return (await loadAi()).runtimeForCli(...a);
|
|
26
|
+
};
|
|
27
|
+
var gitUser = (...a) => import("./chunk-R3RVFCJ2.js").then((m) => m.gitUser(...a));
|
|
28
|
+
var loadAiSetUp = () => Promise.all([
|
|
29
|
+
loadAi(),
|
|
30
|
+
import("./chunk-YLAM4HZH.js"),
|
|
31
|
+
import("./chunk-EATSD7YD.js"),
|
|
32
|
+
import("./chunk-UFBKJOWB.js"),
|
|
33
|
+
import("./chunk-7RGCQ4VZ.js"),
|
|
34
|
+
import("./chunk-S2FDPN32.js")
|
|
35
|
+
]);
|
|
36
|
+
async function setUpAi() {
|
|
37
|
+
const [ai, providers, plugins, naysayer, codeTools, draftCheck] = await loadAiSetUp();
|
|
38
|
+
providers.registerBuiltInModelProviders();
|
|
39
|
+
plugins.registerModelProviderPlugins();
|
|
40
|
+
ai.registerToolSource((at) => (req) => draftCheck.bothTools(codeTools.metarepoToolBox(at), draftCheck.draftCheckTool(at, req)));
|
|
41
|
+
naysayer.registerCodeSearch(codeTools.criticCodeSearch);
|
|
42
|
+
}
|
|
43
|
+
var NO_AI = /* @__PURE__ */ new Set([
|
|
44
|
+
"next",
|
|
45
|
+
"runs",
|
|
46
|
+
"history",
|
|
47
|
+
"waiting",
|
|
48
|
+
"mcp",
|
|
49
|
+
"doctor",
|
|
50
|
+
"setup",
|
|
51
|
+
"verify",
|
|
52
|
+
"baseline",
|
|
53
|
+
"upgrade",
|
|
54
|
+
"support",
|
|
55
|
+
"change list",
|
|
56
|
+
"estate measure",
|
|
57
|
+
"estate fresh",
|
|
58
|
+
"estate shared",
|
|
59
|
+
"change status",
|
|
60
|
+
// Reading the questions on file and printing one: files only, no model (question-commands.ts).
|
|
61
|
+
"questions list",
|
|
62
|
+
"questions show"
|
|
63
|
+
]);
|
|
64
|
+
var runsNoAi = (group, command) => NO_AI.has(group) || NO_AI.has(`${group} ${command ?? ""}`);
|
|
65
|
+
var loadCommands = () => import("./chunk-NH5QH3WS.js");
|
|
66
|
+
var catalogValidate = (...a) => loadCommands().then((m) => m.catalogValidate(...a));
|
|
67
|
+
var orgPackValidate = (...a) => loadCommands().then((m) => m.orgPackValidate(...a));
|
|
68
|
+
var schemaExport = (...a) => loadCommands().then((m) => m.schemaExport(...a));
|
|
69
|
+
var loadWorkspaceCommands = () => import("./chunk-E25G46RW.js");
|
|
70
|
+
var handoffDone = (...a) => loadWorkspaceCommands().then((m) => m.handoffDone(...a));
|
|
71
|
+
var openspecCheck = (...a) => loadWorkspaceCommands().then((m) => m.openspecCheck(...a));
|
|
72
|
+
var openspecSetup = (...a) => loadWorkspaceCommands().then((m) => m.openspecSetup(...a));
|
|
73
|
+
var workspaceOpen = (...a) => loadWorkspaceCommands().then((m) => m.workspaceOpen(...a));
|
|
74
|
+
var workspacePrune = (...a) => loadWorkspaceCommands().then((m) => m.workspacePrune(...a));
|
|
75
|
+
var workspaceSync = (...a) => loadWorkspaceCommands().then((m) => m.workspaceSync(...a));
|
|
76
|
+
var loadScanCommands = () => import("./chunk-4Y4FY34K.js");
|
|
77
|
+
var catalogDiff = (...a) => loadScanCommands().then((m) => m.catalogDiff(...a));
|
|
78
|
+
var scanCommand = (...a) => loadScanCommands().then((m) => m.scanCommand(...a));
|
|
79
|
+
var loadIndexCommands = () => import("./chunk-LZWVK4YY.js");
|
|
80
|
+
var askCommand = (...a) => loadIndexCommands().then((m) => m.askCommand(...a));
|
|
81
|
+
var impactCommand = (...a) => loadIndexCommands().then((m) => m.impactCommand(...a));
|
|
82
|
+
var indexRebuild = (...a) => loadIndexCommands().then((m) => m.indexRebuild(...a));
|
|
83
|
+
var queryCommand = (...a) => loadIndexCommands().then((m) => m.queryCommand(...a));
|
|
84
|
+
var searchCommand = (...a) => loadIndexCommands().then((m) => m.searchCommand(...a));
|
|
85
|
+
var loadSiteCommands = () => import("./chunk-MKC7P5LD.js");
|
|
86
|
+
var guideCommand = (...a) => loadSiteCommands().then((m) => m.guideCommand(...a));
|
|
87
|
+
var siteBuildCommand = (...a) => loadSiteCommands().then((m) => m.siteBuildCommand(...a));
|
|
88
|
+
var loadBaselineCommands = () => import("./chunk-ZHWSL6SR.js");
|
|
89
|
+
var baselineCommand = (...a) => loadBaselineCommands().then((m) => m.baselineCommand(...a));
|
|
90
|
+
var setupCommand = (...a) => loadBaselineCommands().then((m) => m.setupCommand(...a));
|
|
91
|
+
var loadDigestCommands = () => import("./chunk-WFYHOXTB.js");
|
|
92
|
+
var digestCommand = (...a) => loadDigestCommands().then((m) => m.digestCommand(...a));
|
|
93
|
+
var loadDoctor = () => import("./chunk-MCWWMMLN.js");
|
|
94
|
+
var doctorCommand = (...a) => loadDoctor().then((m) => m.doctorCommand(...a));
|
|
95
|
+
var loadSupport = () => import("./chunk-MV4637YA.js");
|
|
96
|
+
var supportBundleCommand = (...a) => loadSupport().then((m) => m.supportBundleCommand(...a));
|
|
97
|
+
var loadUpgrade = () => import("./chunk-B3UHYXHU.js");
|
|
98
|
+
var upgradeCommand = (...a) => loadUpgrade().then((m) => m.upgradeCommand(...a));
|
|
99
|
+
var loadReconcileCommands = () => import("./chunk-CRQ73DIF.js");
|
|
100
|
+
var aliasCommand = (...a) => loadReconcileCommands().then((m) => m.aliasCommand(...a));
|
|
101
|
+
var reconcileCommand = (...a) => loadReconcileCommands().then((m) => m.reconcileCommand(...a));
|
|
102
|
+
var loadKnowledgeCommands = () => import("./chunk-SINJKQSI.js");
|
|
103
|
+
var coverageCommand = (...a) => loadKnowledgeCommands().then((m) => m.coverageCommand(...a));
|
|
104
|
+
var patternsScan = (...a) => loadKnowledgeCommands().then((m) => m.patternsScan(...a));
|
|
105
|
+
var questionsCommand = (...a) => loadKnowledgeCommands().then((m) => m.questionsCommand(...a));
|
|
106
|
+
var questionsFiles = (...a) => import("./chunk-XPJR74MA.js").then((m) => m.questionsFiles(...a));
|
|
107
|
+
var sourcesAdd = (...a) => loadKnowledgeCommands().then((m) => m.sourcesAdd(...a));
|
|
108
|
+
var sourcesSync = (...a) => loadKnowledgeCommands().then((m) => m.sourcesSync(...a));
|
|
109
|
+
var loadDiagramCommands = () => import("./chunk-Q32Y5T2U.js");
|
|
110
|
+
var diagramLibrary = (...a) => loadDiagramCommands().then((m) => m.diagramLibrary(...a));
|
|
111
|
+
var diagramRender = (...a) => loadDiagramCommands().then((m) => m.diagramRender(...a));
|
|
112
|
+
var loadStubCommands = () => import("./chunk-WGU6NIUV.js");
|
|
113
|
+
var stubCheck = (...a) => loadStubCommands().then((m) => m.stubCheck(...a));
|
|
114
|
+
var stubServe = (...a) => loadStubCommands().then((m) => m.stubServe(...a));
|
|
115
|
+
var loadIntakeCommands = () => import("./chunk-LEHZTKB3.js");
|
|
116
|
+
var intakeAdd = (...a) => loadIntakeCommands().then((m) => m.intakeAdd(...a));
|
|
117
|
+
var intakeList = (...a) => loadIntakeCommands().then((m) => m.intakeList(...a));
|
|
118
|
+
var triageDecide = (...a) => loadIntakeCommands().then((m) => m.triageDecide(...a));
|
|
119
|
+
var triageList = (...a) => loadIntakeCommands().then((m) => m.triageList(...a));
|
|
120
|
+
var loadRunCommands = () => import("./chunk-REWZE2XI.js");
|
|
121
|
+
var assistantFiles = (...a) => loadRunCommands().then((m) => m.assistantFiles(...a));
|
|
122
|
+
var driftCommand = (...a) => loadRunCommands().then((m) => m.driftCommand(...a));
|
|
123
|
+
var specHandDown = (...a) => loadRunCommands().then((m) => m.specHandDown(...a));
|
|
124
|
+
var specHandUp = (...a) => loadRunCommands().then((m) => m.specHandUp(...a));
|
|
125
|
+
var taskHandoff = (...a) => loadRunCommands().then((m) => m.taskHandoff(...a));
|
|
126
|
+
var taskRun = (...a) => loadRunCommands().then((m) => m.taskRun(...a));
|
|
127
|
+
var loadFeatureCommands = () => import("./chunk-EQOSXLK3.js");
|
|
128
|
+
var featureSuggestNames = (...a) => loadFeatureCommands().then((m) => m.featureSuggestNames(...a));
|
|
129
|
+
var loadDomainCommands = () => import("./chunk-OXVVRJDQ.js");
|
|
130
|
+
var domainProfileCommand = (...a) => loadDomainCommands().then((m) => m.domainProfileCommand(...a));
|
|
131
|
+
var loadPlanCommands = () => import("./chunk-FOQXYMOR.js");
|
|
132
|
+
var adoSync = (...a) => loadPlanCommands().then((m) => m.adoSync(...a));
|
|
133
|
+
var changeDraft = (...a) => loadPlanCommands().then((m) => m.changeDraft(...a));
|
|
134
|
+
var planStories = (...a) => loadPlanCommands().then((m) => m.planStories(...a));
|
|
135
|
+
var snowDraft = (...a) => loadPlanCommands().then((m) => m.snowDraft(...a));
|
|
136
|
+
var snowSubmit = (...a) => loadPlanCommands().then((m) => m.snowSubmit(...a));
|
|
137
|
+
var storyBarCommand = (...a) => loadPlanCommands().then((m) => m.storyBarCommand(...a));
|
|
138
|
+
var templatesDraft = (...a) => loadPlanCommands().then((m) => m.templatesDraft(...a));
|
|
139
|
+
var loadTodoCommands = () => import("./chunk-ANCI3LFS.js");
|
|
140
|
+
var executorsCheck = (...a) => loadTodoCommands().then((m) => m.executorsCheck(...a));
|
|
141
|
+
var todoDone = (...a) => loadTodoCommands().then((m) => m.todoDone(...a));
|
|
142
|
+
var todoList = (...a) => loadTodoCommands().then((m) => m.todoList(...a));
|
|
143
|
+
var todoRun = (...a) => loadTodoCommands().then((m) => m.todoRun(...a));
|
|
144
|
+
var todoShow = (...a) => loadTodoCommands().then((m) => m.todoShow(...a));
|
|
145
|
+
var loadSetupCommands = () => import("./chunk-6V3DTQWK.js");
|
|
146
|
+
var absorbCommand = (...a) => loadSetupCommands().then((m) => m.absorbCommand(...a));
|
|
147
|
+
var absorbAcceptCommand = (...a) => loadSetupCommands().then((m) => m.absorbAcceptCommand(...a));
|
|
148
|
+
var absorbRefreshCommand = (...a) => loadSetupCommands().then((m) => m.absorbRefreshCommand(...a));
|
|
149
|
+
var sourcesRefreshCommand = (...a) => loadSetupCommands().then((m) => m.sourcesRefreshCommand(...a));
|
|
150
|
+
var adoptCommand = (...a) => loadSetupCommands().then((m) => m.adoptCommand(...a));
|
|
151
|
+
var initCommand = (...a) => loadSetupCommands().then((m) => m.initCommand(...a));
|
|
152
|
+
var reposDiscoverCommand = (...a) => loadSetupCommands().then((m) => m.reposDiscoverCommand(...a));
|
|
153
|
+
var unadoptCommand = (...a) => loadSetupCommands().then((m) => m.unadoptCommand(...a));
|
|
154
|
+
var zeroInstallCommand = (...a) => loadSetupCommands().then((m) => m.zeroInstallCommand(...a));
|
|
155
|
+
var loadQualityCommands = () => import("./chunk-VYNZED7B.js");
|
|
156
|
+
var ciArchiveGate = (...a) => loadQualityCommands().then((m) => m.ciArchiveGate(...a));
|
|
157
|
+
var ciDrift = (...a) => loadQualityCommands().then((m) => m.ciDrift(...a));
|
|
158
|
+
var ciSnippet = (...a) => loadQualityCommands().then((m) => m.ciSnippet(...a));
|
|
159
|
+
var glossaryAlias = (...a) => loadQualityCommands().then((m) => m.glossaryAlias(...a));
|
|
160
|
+
var glossaryDefine = (...a) => loadQualityCommands().then((m) => m.glossaryDefine(...a));
|
|
161
|
+
var glossaryLink = (...a) => loadQualityCommands().then((m) => m.glossaryLink(...a));
|
|
162
|
+
var glossaryList = (...a) => loadQualityCommands().then((m) => m.glossaryList(...a));
|
|
163
|
+
var glossaryScan = (...a) => loadQualityCommands().then((m) => m.glossaryScan(...a));
|
|
164
|
+
var testsGenerate = (...a) => loadQualityCommands().then((m) => m.testsGenerate(...a));
|
|
165
|
+
var traceCommand = (...a) => loadQualityCommands().then((m) => m.traceCommand(...a));
|
|
166
|
+
var loadInitiativeCommands = () => import("./chunk-WKXOEIOY.js");
|
|
167
|
+
var initiativeCommitment = (...a) => loadInitiativeCommands().then((m) => m.initiativeCommitment(...a));
|
|
168
|
+
var initiativeNew = (...a) => loadInitiativeCommands().then((m) => m.initiativeNew(...a));
|
|
169
|
+
var initiativePlan = (...a) => loadInitiativeCommands().then((m) => m.initiativePlan(...a));
|
|
170
|
+
var initiativeStatus = (...a) => loadInitiativeCommands().then((m) => m.initiativeStatus(...a));
|
|
171
|
+
var requestFromTeam = (...a) => loadInitiativeCommands().then((m) => m.requestFromTeam(...a));
|
|
172
|
+
var loadLearnCommands = () => import("./chunk-UFTQIK2J.js");
|
|
173
|
+
var explainCommand = (...a) => loadLearnCommands().then((m) => m.explainCommand(...a));
|
|
174
|
+
var learnCheck = (...a) => loadLearnCommands().then((m) => m.learnCheck(...a));
|
|
175
|
+
var learnList = (...a) => loadLearnCommands().then((m) => m.learnList(...a));
|
|
176
|
+
var learnStart = (...a) => loadLearnCommands().then((m) => m.learnStart(...a));
|
|
177
|
+
var sandboxCreate = (...a) => loadLearnCommands().then((m) => m.sandboxCreate(...a));
|
|
178
|
+
var loadEvalCommands = () => import("./chunk-NCR24CPV.js");
|
|
179
|
+
var loadBenchCommands = () => import("./chunk-KQK6SQPE.js");
|
|
180
|
+
var benchFetch = (...a) => loadBenchCommands().then((m) => m.benchFetch(...a));
|
|
181
|
+
var benchRun = (...a) => loadBenchCommands().then((m) => m.benchRun(...a));
|
|
182
|
+
var benchSurvey = (...a) => loadBenchCommands().then((m) => m.benchSurvey(...a));
|
|
183
|
+
var benchVerify = (...a) => loadBenchCommands().then((m) => m.benchVerify(...a));
|
|
184
|
+
var loadScanVerifyCommands = () => import("./chunk-U6YKL7SI.js");
|
|
185
|
+
var stageCli = (...a) => import("./chunk-JBSD57N7.js").then((m) => m.stageCli(...a));
|
|
186
|
+
var knowledgeCli = (...a) => import("./chunk-IWZPGIGT.js").then((m) => m.knowledgeCli(...a));
|
|
187
|
+
var defencesScan = (...a) => loadEvalCommands().then((m) => m.defencesScan(...a));
|
|
188
|
+
var evalReport = (...a) => loadEvalCommands().then((m) => m.evalReport(...a));
|
|
189
|
+
var evalRun = (...a) => loadEvalCommands().then((m) => m.evalRun(...a));
|
|
190
|
+
var loadU1Commands = () => import("./chunk-YWZDAZMA.js");
|
|
191
|
+
var conformanceCommand = (...a) => loadU1Commands().then((m) => m.conformanceCommand(...a));
|
|
192
|
+
var loadReleaseCommands = () => import("./chunk-SIUDWWKS.js");
|
|
193
|
+
var outcomeList = (...a) => loadReleaseCommands().then((m) => m.outcomeList(...a));
|
|
194
|
+
var outcomeRecord = (...a) => loadReleaseCommands().then((m) => m.outcomeRecord(...a));
|
|
195
|
+
var releaseEvidenceCommand = (...a) => loadReleaseCommands().then((m) => m.releaseEvidenceCommand(...a));
|
|
196
|
+
var releaseForecastCommand = (...a) => loadReleaseCommands().then((m) => m.releaseForecastCommand(...a));
|
|
197
|
+
var releaseNotesCommand = (...a) => loadReleaseCommands().then((m) => m.releaseNotesCommand(...a));
|
|
198
|
+
var releasePlanCommand = (...a) => loadReleaseCommands().then((m) => m.releasePlanCommand(...a));
|
|
199
|
+
var releaseSecurityCommand = (...a) => loadReleaseCommands().then((m) => m.releaseSecurityCommand(...a));
|
|
200
|
+
var loadUiCommands = () => import("./chunk-KQRYW7OS.js");
|
|
201
|
+
var uiCommand = (...a) => loadUiCommands().then((m) => m.uiCommand(...a));
|
|
202
|
+
var loadCriticCommands = () => import("./chunk-7KXYMC2P.js");
|
|
203
|
+
var critic = (...a) => loadCriticCommands().then((m) => m.critic(...a));
|
|
204
|
+
var criticStats = (...a) => loadCriticCommands().then((m) => m.criticStats(...a));
|
|
205
|
+
var findingAction = (...a) => loadCriticCommands().then((m) => m.findingAction(...a));
|
|
206
|
+
var findings = (...a) => loadCriticCommands().then((m) => m.findings(...a));
|
|
207
|
+
var catalogMigrate = (...a) => loadFeatureCommands().then((m) => m.catalogMigrate(...a));
|
|
208
|
+
var featureLink = (...a) => loadFeatureCommands().then((m) => m.featureLink(...a));
|
|
209
|
+
var featureList = (...a) => loadFeatureCommands().then((m) => m.featureList(...a));
|
|
210
|
+
var featureMerge = (...a) => loadFeatureCommands().then((m) => m.featureMerge(...a));
|
|
211
|
+
var featureName = (...a) => loadFeatureCommands().then((m) => m.featureName(...a));
|
|
212
|
+
var featureShow = (...a) => loadFeatureCommands().then((m) => m.featureShow(...a));
|
|
213
|
+
var featureSpec = (...a) => loadFeatureCommands().then((m) => m.featureSpec(...a));
|
|
214
|
+
var featureSplit = (...a) => loadFeatureCommands().then((m) => m.featureSplit(...a));
|
|
215
|
+
var featureSuggestLinks = (...a) => loadFeatureCommands().then((m) => m.featureSuggestLinks(...a));
|
|
216
|
+
var featureTag = (...a) => loadFeatureCommands().then((m) => m.featureTag(...a));
|
|
217
|
+
var loadChangeCommands = () => import("./chunk-6E2GJANQ.js");
|
|
218
|
+
var changeArchive = (...a) => loadChangeCommands().then((m) => m.changeArchive(...a));
|
|
219
|
+
var changeConflicts = (...a) => loadChangeCommands().then((m) => m.changeConflicts(...a));
|
|
220
|
+
var changeHandoff = (...a) => loadChangeCommands().then((m) => m.changeHandoff(...a));
|
|
221
|
+
var changeList = (...a) => loadChangeCommands().then((m) => m.changeList(...a));
|
|
222
|
+
var changeNew = (...a) => loadChangeCommands().then((m) => m.changeNew(...a));
|
|
223
|
+
var changeReturn = (...a) => loadChangeCommands().then((m) => m.changeReturn(...a));
|
|
224
|
+
var changeStatus = (...a) => loadChangeCommands().then((m) => m.changeStatus(...a));
|
|
225
|
+
var changeSync = (...a) => loadChangeCommands().then((m) => m.changeSync(...a));
|
|
226
|
+
var changeLearn = (...a) => loadChangeCommands().then((m) => m.changeLearn(...a));
|
|
227
|
+
var loadDialectCommands = () => import("./chunk-BQNEHB5U.js");
|
|
228
|
+
var dialectGrade = (...a) => loadDialectCommands().then((m) => m.dialectGrade(...a));
|
|
229
|
+
var dialectKit = (...a) => loadDialectCommands().then((m) => m.dialectKit(...a));
|
|
230
|
+
var dialectTree = (...a) => loadDialectCommands().then((m) => m.dialectTree(...a));
|
|
231
|
+
var dialectNew = (...a) => loadDialectCommands().then((m) => m.dialectNew(...a));
|
|
232
|
+
var dialectRun = (...a) => loadDialectCommands().then((m) => m.dialectRun(...a));
|
|
233
|
+
var dialectTest = (...a) => loadDialectCommands().then((m) => m.dialectTest(...a));
|
|
234
|
+
var loadPluginCommands = () => import("./chunk-CE4S5ZY3.js");
|
|
235
|
+
var pluginTest = (...a) => loadPluginCommands().then((m) => m.pluginTest(...a));
|
|
236
|
+
var pluginPin = (...a) => loadPluginCommands().then((m) => m.pluginPin(...a));
|
|
237
|
+
var pluginAdd = (...a) => loadPluginCommands().then((m) => m.pluginAdd(...a));
|
|
238
|
+
var loadFrameworkCommands = () => import("./chunk-KIWEBM6G.js");
|
|
239
|
+
var frameworksCheck = (...a) => loadFrameworkCommands().then((m) => m.frameworksCheck(...a));
|
|
240
|
+
var frameworksDiscover = (...a) => loadFrameworkCommands().then((m) => m.frameworksDiscover(...a));
|
|
241
|
+
var frameworksKit = (...a) => loadFrameworkCommands().then((m) => m.frameworksKit(...a));
|
|
242
|
+
var frameworksLearn = (...a) => loadFrameworkCommands().then((m) => m.frameworksLearn(...a));
|
|
243
|
+
var frameworksSurvey = (...a) => loadFrameworkCommands().then((m) => m.frameworksSurvey(...a));
|
|
244
|
+
var loadOnboardCommands = () => import("./chunk-NR5T46ZY.js");
|
|
245
|
+
var onboardAccept = (...a) => loadOnboardCommands().then((m) => m.onboardAccept(...a));
|
|
246
|
+
var onboardCheck = (...a) => loadOnboardCommands().then((m) => m.onboardCheck(...a));
|
|
247
|
+
var onboardDraft = (...a) => loadOnboardCommands().then((m) => m.onboardDraft(...a));
|
|
248
|
+
var scanReview = (...a) => loadOnboardCommands().then((m) => m.scanReview(...a));
|
|
249
|
+
var scanSurvey = (...a) => loadOnboardCommands().then((m) => m.scanSurvey(...a));
|
|
250
|
+
var loadRepoTypeCommands = () => import("./chunk-HZYFLEWO.js");
|
|
251
|
+
var loadRepoCommands = () => import("./chunk-ZKUDS7JG.js");
|
|
252
|
+
var loadSpecCommands = () => import("./chunk-C2YGYTU6.js");
|
|
253
|
+
var loadEstateCommands = () => import("./chunk-26DBAGOP.js");
|
|
254
|
+
var onboardEval = (...a) => loadOnboardCommands().then((m) => m.onboardEval(...a));
|
|
255
|
+
var onboardFramework = (...a) => loadOnboardCommands().then((m) => m.onboardFramework(...a));
|
|
256
|
+
var onboardFrameworkAccept = (...a) => loadOnboardCommands().then((m) => m.onboardFrameworkAccept(...a));
|
|
257
|
+
var onboardFrameworkCheck = (...a) => loadOnboardCommands().then((m) => m.onboardFrameworkCheck(...a));
|
|
258
|
+
var HELP = `atticus ${VERSION} (catalog schema v${SCHEMA_VERSION})
|
|
259
|
+
|
|
260
|
+
Usage:
|
|
261
|
+
atticus schema export [dir] Write JSON Schema for every contract and the API's OpenAPI document (default: ./schema)
|
|
262
|
+
atticus catalog validate <dir> Check record files: schema, location and canonical form
|
|
263
|
+
[--fix] Rewrite files that aren't in canonical form
|
|
264
|
+
atticus catalog diff <a> <b> Compare two catalog folders (exit 1 when they differ)
|
|
265
|
+
atticus scan [--no-drift] Scan every repo's base clone and write catalog/generated
|
|
266
|
+
[--repos a,b] Only these repos
|
|
267
|
+
[--full] Ignore the scan cache
|
|
268
|
+
[--dry-run] Show what would change; write nothing
|
|
269
|
+
[--warnings] List what the scan left out or couldn't read, not just how many
|
|
270
|
+
[--ref <branch>] Scan another branch beside the baseline, into catalog/branches/<branch>/, and say what it changes
|
|
271
|
+
[--json] Print the result as JSON
|
|
272
|
+
atticus scan survey <repo> Your assistant reads the repo and drafts its scan settings (folders to leave out, path prefixes, client base URLs); checked against the code [--attempts 3] [--force] [--max-tokens n]
|
|
273
|
+
atticus scan verify <repo> Your assistant compares the code with the last scan: what it missed, what it has wrong, a fix for each; checked, kept in proposals/scan/ [--attempts 3] [--json] [--accept] [--max-tokens n]
|
|
274
|
+
atticus map <repo> Read a repo into facts in batches that fit your model, one hand-off at a time, each answer verified at once; for an assistant without file tools (ADR 0124; /atticus-map reads it in one session) [--mode m] [--max-tokens n] [--next] [--resume run] [--force] [--dir path] [--commit sha] [--json]
|
|
275
|
+
[--estimate] Say what the first read costs: the checkout, commit, facts file, source files, tokens, your assistant's tier and the batches at the limit; with housePrefixes in conventions.yaml, it warns of house packages the repo imports that no taught framework covers, with the frameworks learn command for each (ADR 0147)
|
|
276
|
+
[--gaps] Plan a second pass on what the last verify left (files no fact cites, skipped lines, spec operations, entries no flow follows) for a new chat, sized to the session: writes facts/<repo>.gaps.md (ADR 0157)
|
|
277
|
+
[--copy] Print the next batch's prompt to paste into a chat
|
|
278
|
+
[--answer <file>] With --copy: read the pasted answer back from a file (- for stdin)
|
|
279
|
+
[--gaps --part n] With --gaps: only what is left of part n of the read plan, for a read that stopped in it (ADR 0161); /atticus-map <repo> --part n --gaps in a new chat reads it
|
|
280
|
+
[--spent <tokens>] [--sessions n] [--part n] Record what the read took as your assistant reports it, in facts/<repo>.read-plan.yaml beside --estimate's estimate (Atticus can't meter an assistant's tokens; ADR 0141)
|
|
281
|
+
atticus map --all Map or re-map the whole estate in one command (ADR 0161): every repo's read planned at the model's limit, in the onboarding queue's order, fresh repos skipped. Under Copilot you paste one line per part into a new chat and Atticus waits for the facts, verifies them and moves on (s skip, r retry what's left, q stop; it resumes); where runtime.yaml allows model mode it runs unattended. Then the estate is joined once [--max-tokens n] [--stale | --gaps] [--repos a,b] [--dry-run] [--mode model|hand-off] [--max-parts n] [--budget-tokens n] [--idle minutes]
|
|
282
|
+
atticus verify <repo> Check the facts your assistant wrote for a repo (/atticus-map) against its code: the claim on each cited line, the quote, references, secrets, coverage; raises the questions it wrote for a person; rejected facts go back to the assistant (ADR 0124) [--dir path] [--commit sha] [--routed a,b] [--skipped] [--json]
|
|
283
|
+
[--write] When nothing is rejected: put the facts in the catalog, the flows in specs/<repo>/, ask about calls nothing joins, and render the map
|
|
284
|
+
[--verbose] With --write: list every record changed and flow written, not only the counts
|
|
285
|
+
atticus verify --all [--write] Every repo read so far (each with a facts file), one after another; no model is called
|
|
286
|
+
atticus verify audit <repo> Confirm a reproducible random sample of the repo's kept facts and its links, each with its cited lines (right, wrong or unsure); the answers go to facts/<repo>.audit.yaml, a person's record for a pull request (ADR 0148) [--size n] [--seed s] [--answers file] [--right ids] [--wrong ids] [--unsure ids] [--dir path] [--json]
|
|
287
|
+
atticus verify audit <repo> --report Precision from the answers, per kind of fact and for links (by how each was joined), with the sample size and a 95% interval; without a repo, every repo audited and the estate [--json]
|
|
288
|
+
atticus map render <repo> [--json] Render the repo's map from the catalog: map.md, a page per flow with its sequence diagram, an OpenAPI file per component, under map/<repo>/
|
|
289
|
+
atticus spec draft <repo> Your assistant writes the repo's flows, one per trigger, each step cited and checked [--attempts 3] [--resume run] [--force] [--mode m] [--max-tokens n]
|
|
290
|
+
atticus spec check <repo> [--json] Check the repo's flows against the catalog, the template and the code; confirms steps on their cited lines
|
|
291
|
+
atticus estate join [--json] Join each repo's call-outs to the flows their targets start; writes specs/estate.yaml
|
|
292
|
+
atticus estate flow <flow> [--depth 5] [--json] A flow followed across repos, with the data at each crossing
|
|
293
|
+
atticus estate lineage <flow> <field> [--depth 5] [--json] Follow a field along a flow to the column it is stored in, or where it breaks
|
|
294
|
+
atticus join [--json] Follow each repo's flows into the flows their calls reach, through the calls the repos' verified facts join (verify --write); the same as estate join
|
|
295
|
+
atticus join measure <reference> [--json] Measure your map against a reference you write by hand for two or three repos you know (their entries and calls, each call with the repo it should reach): reading recall, and join precision and recall; reads files only (docs/guide/measure.md)
|
|
296
|
+
atticus estate measure <reference> [--json] The same as join measure
|
|
297
|
+
atticus join shared import <their metarepo> --team <id> --system <id> Bring in another team's Atticus map, read-only: their verified entries (quotes redacted, the deny-list applied) go to shared/<team>/ at their commit, and verify --write joins your calls to that system to them, cited on their lines; files only (docs/guide/shared-maps.md) [--name <team name>] [--commit <sha>] [--json]
|
|
298
|
+
atticus join shared refresh [<team>] [<folder>] Import a team's map again from where it came from (a folder inside the metarepo), or the folder given (needed when it was outside); a newer commit replaces the old [--commit <sha>]
|
|
299
|
+
atticus join shared list [--json] The shared maps on file: whose, for which system, their commit and entries
|
|
300
|
+
atticus estate shared import|refresh|list The same as join shared
|
|
301
|
+
atticus join contracts [--json] Compare the payload on both sides of every link (REST calls, gateway hops, topics, calls to outside systems) from the field facts and the specs on file (a repo's own, a consumer's copy, a topic's .proto, Avro, JSON Schema or AsyncAPI, a vendor's or team's taken in through intake): missing and extra fields, required but not sent, types, error statuses, protobuf field numbers; a mapping nobody traced is unconfirmed, never a mismatch; reads files only (ADR 0164)
|
|
302
|
+
atticus estate contracts [--json] The same as join contracts
|
|
303
|
+
atticus estate fresh [--all] [--json] Which repos' clones have moved past their facts' commit, most stale first: per repo the facts' commit, the clone's, the files changed that the facts cite, the facts to read again and the command to run; local git only, nothing fetched or written (--all lists the fresh ones too)
|
|
304
|
+
atticus repo-type detect <repo> [--json] Match a repo against the org pack's repo types by fingerprint, with the evidence for each signal
|
|
305
|
+
atticus repo-type new <id> --from <repo> [--force] Draft a repo type from a repo (its build files, dependencies, markers, folders) for you to edit
|
|
306
|
+
atticus repo-type note <type> | --org-wide [--add "..."] List a repo type's notes (or the org-wide ones), or add one: what the organisation's terms mean and what must hold, in its own words; each read of a repo is handed them
|
|
307
|
+
atticus repo-type rules [--save] [--json] Draft a checklist rule (status draft) from each note that reads as a rule (all, every, must); --save adds the new drafts to org-pack/checklists/org-notes.yaml for review
|
|
308
|
+
atticus scan review <repo> What the last scan couldn't read: your assistant gives a verdict on each gap and a rule for code it can read; checked [--gaps] [--attempts 3]
|
|
309
|
+
atticus query "<query>" Find records, e.g. "kind:interface via:gateway -has:pattern"
|
|
310
|
+
atticus query "<words>" --search Search everything the index holds (records, knowledge items, flows, changes, answered questions, wiki sections, documents), names and ids first [--by words|meaning|both] [--kind k,k] [--limit n] [--json]
|
|
311
|
+
[--limit n] [--json] (see docs/query-language.md)
|
|
312
|
+
atticus context show <id> One record, flow, step, knowledge item, change, answered question or wiki section in full, with its file
|
|
313
|
+
atticus context walk <id> [--hops 1] [--kind k,k] [--limit n] The links from one id, how each was made, at most two hops
|
|
314
|
+
atticus cites --repo <repo> --path <path> What cites each line of one file: the flow steps, with the changes in flight on them, and the records (or --file <path on disk>) [--json]
|
|
315
|
+
atticus context code <id> [--around 6] The code a fact cites, a few lines around each cited line, from the workspace checkout
|
|
316
|
+
[--repo r --path p --line n] (or one line a fact cites)
|
|
317
|
+
atticus context similar <id> [--kind k,k] [--limit n] What reads like one id, by the local embedding model: a hint where to look, never a link
|
|
318
|
+
atticus context grep "<pattern>" [--regex] [--ignore-case] [--repo r] [--paths glob] [--limit n] The lines of the workspace clones that match, each repo:path:line; .gitignore'd files skipped
|
|
319
|
+
atticus context files "<glob>" [--repo r] [--limit n] The clones' files whose paths match a glob
|
|
320
|
+
atticus context outline <repo> <path> A file's declarations with their annotations, from its syntax tree; a document's headings
|
|
321
|
+
atticus context tools [--json] The read-only tools a step's model may call beside its pack, and their caps
|
|
322
|
+
atticus context call <tool> --input <json> [--run <run>] [--round n] [--json] Run one tool call a model made; with --run it is kept in the run's record
|
|
323
|
+
atticus impact <id> What a change to a record reaches, with owners and open questions
|
|
324
|
+
atticus ask "<question>" Answer a plain question from the catalog, showing the query it ran
|
|
325
|
+
atticus setup [--json] The setup checklist until the catalog is accepted, with a fix for each step
|
|
326
|
+
atticus baseline Accept the as-is catalog as the baseline [--note text] [--site dir]
|
|
327
|
+
atticus doctor [--json] Check this machine: Node, Git, OpenSpec, proxy, TLS, disk, port, assistant, and the tier your assistant reads a repo at
|
|
328
|
+
atticus doctor --counts [--json] How far the map has got, in counts and flags only (questions, links by how joined, repos read and stale, facts, tokens reported): nothing named, safe to paste
|
|
329
|
+
atticus probe Measure what your assistant can do here (open a file, write one, run a command), so the tier it reads a repo at is measured, not read off runtime.yaml; then /atticus-probe in the assistant (ADR 0124) [--assistant id] [--max-tokens n] [--json]
|
|
330
|
+
atticus probe answer <code> Check the assistant's answer (none when it couldn't open the file) and keep what it measured in .atticus/probe/<assistant>.yaml, on this machine only [--pasted] [--max-tokens n] [--json]
|
|
331
|
+
atticus secret set|check|forget <name> Keep a model provider's key in this machine's credential store under the name runtime.yaml gives as keyEnv; read from stdin, never printed
|
|
332
|
+
atticus upgrade [--check|--dry-run] Bring the metarepo's files up to this version (backs them up first) [--openspec-store: also make it an OpenSpec store, beta]
|
|
333
|
+
atticus support bundle Collect versions, checks, counts and the redacted log in a zip [--out f]
|
|
334
|
+
atticus digest What waits on you: hand-offs to revise, blocking findings [--channel c] [--send] [--json]
|
|
335
|
+
atticus watch [<change>] [--off] Follow a change without being on it (or stop); with no change, how each one you watch is doing [--json]
|
|
336
|
+
atticus guide <system> [--json] A system's guide, generated from the catalog: parts, calls, data, runtime, decisions
|
|
337
|
+
atticus site build <dir> [--title t] The read-only catalog site as static files (only systems open to everyone)
|
|
338
|
+
[--depth n] [--json]
|
|
339
|
+
atticus index rebuild Rebuild the local index from the catalog files
|
|
340
|
+
atticus index embed Give every node of the index its vector from the local embedding model (similar in meaning stays off until then)
|
|
341
|
+
atticus reconcile [diagram...] Compare draw.io diagrams with the catalog (default: inputs/diagrams)
|
|
342
|
+
[--json]
|
|
343
|
+
atticus sources add <type> <location> Print the sources.yaml entry for a wiki (git, markdown-folder, ado-wiki, ...), or write it [--save]
|
|
344
|
+
[--id <id>] [--path <folder>] [--ref <branch>] [--submodule] [--kind <k,k>] [--framework <f,f>] [--owner <who>] [--save]
|
|
345
|
+
atticus sources sync [--source s] [--json] Read the wikis and copy each to a dated snapshot: pages, stale pages, conflicts with code, document-only facts
|
|
346
|
+
atticus sources tag <source> [--kind k,k] [--framework f,f] [--owner o] Tag a knowledge source in sources.yaml (kinds, frameworks, owner)
|
|
347
|
+
atticus sources estimate [--source s] [--batch-tokens n] [--full] [--json] What a knowledge scan would cost before it runs: pages, tokens and model calls per source, within each source's maxPages
|
|
348
|
+
atticus knowledge scan [--source s] [--mode m] [--resume run] [--full] [--batch-tokens n] [--max-tokens n] Your assistant reads the snapshots into patterns, standards, processes, requests, decisions and constraints; every quote checked. A rescan reads only the pages that changed and says what changed
|
|
349
|
+
atticus knowledge list [--tag t] [--kind k] [--unverified] [--json] The knowledge items, by tag and kind
|
|
350
|
+
atticus knowledge ask "<question>" [--mode m] [--resume run] [--max-tokens n] An answer from the knowledge items only, citing them
|
|
351
|
+
atticus knowledge find "<phrase>" Search every wiki for a term or phrase; your assistant reads the pages that mention it and proposes what isn't a knowledge item yet, each quote checked [--source s] [--mode m] [--resume run] [--json] [--max-tokens n]
|
|
352
|
+
atticus knowledge keep <item> Keep a found item as a knowledge item you verified [--find <search>] [--as <kind>] [--set <field=value>] [--note <text>]
|
|
353
|
+
atticus knowledge finds [--json] The searches saved, and how many of each were kept
|
|
354
|
+
atticus knowledge conflicts [--json] Pages that disagree: what each says, which page applies and who decided (a person's answer, or the code: a fact verified from code that holds one page's value), the page a signal suggests, and the questions still open
|
|
355
|
+
atticus knowledge verify <item> Mark a knowledge item right as read: a green tick wherever it shows [--note <text>]
|
|
356
|
+
atticus knowledge correct <item> --set field=value Correct an item's details (a list takes a|b|c); the corrected item is what plans read [--note <text>]
|
|
357
|
+
atticus knowledge reject <item> --note <why> Mark an item wrong: plans and answers leave it out
|
|
358
|
+
atticus bench knowledge [--mode m] [--resume run] Scan the bench's invented wiki, ask its questions, and score both
|
|
359
|
+
atticus bench design [--mode m] [--resume run] Read the bench's Figma export, map it against the petclinic estate, and score it
|
|
360
|
+
atticus sources refresh [--json] Fetch every absorbed source again and show what changed
|
|
361
|
+
atticus patterns scan [--json] Find integration patterns in the wikis and compare them with the org pack
|
|
362
|
+
atticus coverage [--json] What the catalog knows per system and area: verified, document-only, unknown
|
|
363
|
+
atticus questions [--json] Knowledge gaps and the owner questions that close them
|
|
364
|
+
atticus questions list [--state open] [--mine] [--json] The questions in questions/ a step raised for a person,
|
|
365
|
+
in the order to ask them, each with its owner team; --mine, your teams' only
|
|
366
|
+
atticus questions show <id> [--json] One question on file, with its options, evidence and answer
|
|
367
|
+
(--json on an open target or topics question adds its picks: every repo, system and team --target takes, for the editors' pickers; ADR 0166)
|
|
368
|
+
atticus questions answer <id> --option <n> | --text "..." | --accept-proposal Write the answer to the file; prints the rerun
|
|
369
|
+
[--scope repo|repo-type] [--type <repo type>] [--by who] (--accept-proposal: the assistant's proposed answer, checked again, as yours)
|
|
370
|
+
[--match <host pattern or /path/**>] (a target or hosts answer by rule: it covers every call that matches, the calls found later too)
|
|
371
|
+
[--target <id> [--add-system vendor|internal] [--name "..."]] (where a call goes: any repo of the manifest, read or not, any system of the profile or a team in roles.yaml; a vendor or a team with no system yet is added to the profile with --add-system, a file change for review; ADR 0162)
|
|
372
|
+
atticus questions proposed [--json] The answers /atticus-propose proposed for open questions, each citation checked (the file, the line, the quote on it); exits 1 while one doesn't check
|
|
373
|
+
atticus questions sheet [--out <file>] Every open question in one YAML answer sheet, each with an empty answer:, to answer in one sitting
|
|
374
|
+
atticus questions sheet --apply <file> [--by who] [--json] Answer each filled entry as you; skips blanks, refuses one whose question changed since
|
|
375
|
+
atticus intake add <files...> Drop documents, specs and diagrams into inputs/inbox for intake
|
|
376
|
+
atticus intake list [--json] What intake read from inputs/: kinds, systems, duplicates, versions
|
|
377
|
+
atticus intake impact <spec> [--json] A vendor spec against its other version: each change, breaking or not, and the gateway routes, service calls and callers it reaches
|
|
378
|
+
atticus intake traffic <file> --source apigee|catalog [--from YYYY-MM-DD --to YYYY-MM-DD] [--json] A traffic export (a file) kept as aggregate counts in evidence/traffic/, client ids, IPs and tokens dropped; the next verify write marks the links it shows used
|
|
379
|
+
atticus triage [--json] What needs a person: unknown names, conflicts with code, image edges
|
|
380
|
+
atticus triage decide <item> <n> Choose option n for a triage item; writes a curated decision
|
|
381
|
+
[--reason text]
|
|
382
|
+
atticus diagram render <view|file> Draw a view (context, container, data, event, sequence) or a .drawio file
|
|
383
|
+
[--focus id] [--format mermaid|drawio] [--out file]
|
|
384
|
+
atticus diagram library <file> Write the draw.io shape library
|
|
385
|
+
atticus stub serve <spec|id> Serve a stub of an API from its spec, or from the catalog (--from-catalog)
|
|
386
|
+
[--port 4010] [--host 127.0.0.1]
|
|
387
|
+
atticus stub check <spec> Which operations have examples to answer with
|
|
388
|
+
atticus dialect new <name> --from <repo>[,<repo>...] Scaffold a dialect from sample repos
|
|
389
|
+
atticus dialect test <name> Run a dialect's own tests
|
|
390
|
+
atticus dialect run <name> <repo> Show the records a dialect produces from one repo [--json]
|
|
391
|
+
atticus dialect kit [dir] Export the dialect build kit for an assistant
|
|
392
|
+
atticus dialect tree <file> [--language l] Print a file's syntax tree, for syntax matches
|
|
393
|
+
atticus plugin test|pin <id> Run a scanner or model-provider plugin against its golden files, sandboxed; or pin its entry file's sha256
|
|
394
|
+
atticus plugin add <id> Copy a model-provider plugin Atticus ships (vertex) into the org pack, to review and pin
|
|
395
|
+
atticus onboard <repo> [--name n] [--attempts 3] [--mode m] Your assistant drafts a dialect for a repo Atticus can't read; checked, kept as a proposal
|
|
396
|
+
atticus onboard check <name> --repo <repo> Check a proposal (drafted, handed off or hand-written)
|
|
397
|
+
atticus onboard eval <dir> [--mode m] [--json] Score the assistant's drafts against reference dialects
|
|
398
|
+
atticus onboard accept <name> [--replace] Accept a proposal into org-pack/dialects/ (or frameworks/)
|
|
399
|
+
atticus onboard framework <name> --from <source|jar|tgz> [--users <repo>,...] Learn a house framework, your assistant drafts what the learner couldn't; checked, kept as a proposal
|
|
400
|
+
[--attempts 3] [--package a.b] [--mode m] [--no-ai]
|
|
401
|
+
atticus onboard check framework <name> [--from <source>] [--users <repo>,...] Check a framework proposal (drafted, handed off or hand-written)
|
|
402
|
+
atticus onboard accept framework <name> [--replace] Accept a framework proposal into org-pack/frameworks/
|
|
403
|
+
atticus frameworks learn <name> --from <repo|jar|tgz> Learn what a house framework means from its source, JAR or npm package
|
|
404
|
+
[--package a.b] [--dry-run] (writes org-pack/frameworks/<name>.yaml)
|
|
405
|
+
atticus frameworks discover --group <a.b|@scope>[,...] The house artifacts and npm packages the repos build on, found here
|
|
406
|
+
[--jars <dir>]... [--learn] [--json] (.jar and .tgz folders, Maven and Gradle caches, node_modules; never downloads)
|
|
407
|
+
atticus frameworks check [name] Run each framework model's own tests; a failing model isn't used
|
|
408
|
+
atticus frameworks survey [--package <prefix>[,...]] How the repos use house frameworks, any language [--json]
|
|
409
|
+
atticus frameworks kit [dir] Export the framework-model kit for an assistant
|
|
410
|
+
atticus change new "<title>" Start a change from a template: --type <type>
|
|
411
|
+
[--template id] [--id id] [--owner role=a,b]... [--system id]... [--like <archived change>]
|
|
412
|
+
[--impact <vendor spec>] (its footprint: what the spec's newer version reaches, see intake impact)
|
|
413
|
+
atticus change impact <change> [--json] What the change's target flows break across the estate: each entry or table, who calls or uses it (a link the map guessed: may break, not counted), the fields that stop crossing and the gateway routes to update, each with its owner team; then who calls the callers, up to five hops up
|
|
414
|
+
atticus change similar "<brief>" The archived changes nearest a new brief (or --change <id>: a change's own), to start from one with change new --like or change attach --like [--limit n] [--json]
|
|
415
|
+
atticus domain profile <system> A system as a domain profile, filled from the catalog [--out file]
|
|
416
|
+
atticus change feature <change> The feature stage: your assistant places the change on the estate's flows and features from the brief, stories or a design; checked and criticised every draft until done [--from-figma f.json] [--mode m] [--resume run] [--force] [--context-tokens n] [--whole-context] [--max-tokens n]
|
|
417
|
+
atticus change architecture <change> The architecture stage: the target flows (steps added, changed or removed, with fields) as flow deltas; looped the same way [--mode m] [--resume run] [--context-tokens n] [--whole-context] [--max-tokens n]
|
|
418
|
+
atticus change small <change> The fast path for a small change (ADR 0113): your assistant places it on the flows, writes its target flows and words its stories in one step; every stage's checks, and the critic at the change type's gate [--mode m] [--resume run] [--force] [--context-tokens n] [--whole-context]
|
|
419
|
+
atticus change attach <change> <files...> Attach a spec, screenshot, PDF, email export or document to a change: copied into its inputs/, read and cited by line or page, read by its steps [--replaces inputs/<file>] [--promote inputs/<file>: copy one into general knowledge] [--like <archived change>: attach an earlier change as an example] [--prototype <repo>: compare a prototype with the estate and attach what exists, changes, is new or only a vendor provides] [--json]
|
|
420
|
+
atticus change draft <change> Your assistant drafts the proposal, spec and interfaces from the brief and the catalog; checked [--attempts 3] [--force] [--mode m] [--max-tokens n]
|
|
421
|
+
atticus change status <id> [--json] State, next step, what blocks it, risk, the PR to merge and test kinds
|
|
422
|
+
atticus change knowledge <id> The patterns, standards, decisions, processes, requests and wiki and document sections that apply to the change, picked by each of its stages from the feature stage on and by each task, with near-misses and the pages that disagree (each undecided one asked of a person once); confirm one (later stages that take its kind pick it) or exclude it (they leave it out) [--confirm id] [--exclude id] [--json]
|
|
423
|
+
atticus change handoff <id> --approve Open the phase's hand-off PR; merging it approves the gate [--repo]
|
|
424
|
+
(without --approve: say what it would open, send nothing)
|
|
425
|
+
atticus change sync <id> [--approve] Read the hand-off PR; a merged PR moves the change on (--approve merges a ready one) and keeps what Atticus drafted beside what merged (stage/<stage>.drafted/, .merged/)
|
|
426
|
+
atticus change learn [--json] How much people changed Atticus's drafts: per merged change and stage, lines per file and each story's criteria and fields, and whether it falls over time (from the kept drafts; completes any whose merge you have since pulled)
|
|
427
|
+
atticus change return <id> --reason "<why>" --approve Close the hand-off PR and return the change to the product owner
|
|
428
|
+
atticus change archive <id> [--no-rescan] Archive a released change and rescan its repos
|
|
429
|
+
atticus change list [--json] Every change and its state
|
|
430
|
+
atticus change export <change> [ado|jira] [--format ado|jira] [--out file.csv] [--area path] [--iteration path] The change's stories and tasks as a work-item import file: Azure DevOps' CSV (a User Story per story, its Tasks under it, criteria in Acceptance Criteria) or Jira's; a person imports it
|
|
431
|
+
atticus change conflicts [--json] Open changes that touch the same systems, records or repos
|
|
432
|
+
atticus change conform <change> [--repo r] [--ref branch] [--task t] [--latest] [--json] Does the code do what the design says: scan the branch's commit and check it against the target flows; what is missing, still there or not in the design becomes findings on the conform gate (--latest shows the newest check, scanning nothing)
|
|
433
|
+
atticus change estimate <change> [--json] The change's estimate: its size from the target flows, the org pack's ranges summed, and what drives it, each with its source; never a number nobody stands behind
|
|
434
|
+
atticus change map <change> [--format mermaid|drawio] [--json] The change's picture: the components, entries and tables its target flows touch, marked + new, \u25C7 modify or \u2715 retire
|
|
435
|
+
atticus critic <change> [--gate g] [--lens l] [--mode m] [--json] [--max-tokens n] Review a change at a gate: rule checks, then AI lenses (--mode runs them)
|
|
436
|
+
atticus critic <change> [--gate g] --resume Read in the AI lens answers your assistant wrote (hand-off); handoff done does it per lens
|
|
437
|
+
atticus critic stats [--json] How often each rule's findings are dismissed or waived
|
|
438
|
+
atticus findings <change> [--json] The change's findings by gate and round
|
|
439
|
+
atticus finding <change> <id> <action> apply | edit-and-apply | not-relevant | waive | ask (recorded with you; reaches main with the hand-off PR)
|
|
440
|
+
[--gate g] [--reason text] [--asked-of who] [--edit patch-file]
|
|
441
|
+
atticus feature list [--json] Features found in code, named by people or proposed by AI
|
|
442
|
+
atticus feature show <id> [--json] A feature's entry points, flow, owner, links and gaps
|
|
443
|
+
atticus feature name <id> "<name>" Confirm or correct a feature's name [--description] [--owner]
|
|
444
|
+
atticus feature tag <id> <tags...> Tag a feature
|
|
445
|
+
atticus feature merge <into> <from...> Merge features
|
|
446
|
+
atticus feature split <id> <entry-points...> Split entry points into another feature [--name] [--into]
|
|
447
|
+
atticus feature link <id> <ref> Link a work item or page, e.g. ado:1234 [--title]
|
|
448
|
+
atticus feature suggest-links [--json] Suggest links between features and work items
|
|
449
|
+
atticus feature spec <id> Draft an OpenSpec capability spec from a confirmed feature
|
|
450
|
+
atticus catalog migrate [--dry-run] Rewrite catalog files to the current schema version
|
|
451
|
+
atticus task context <change> <task> [--json|--markdown] The task's context for an assistant: its story and criteria, the step it implements with today's code, what applies, the knowledge that applies to it (how-tos with their steps, standards, processes, decisions, each with its page, the pages that say the same and those that disagree), the files attached and the files likely to change
|
|
452
|
+
atticus task run <change> <task> Run a task with AI [--level plan|draft|pr] [--mode m] [--approve]
|
|
453
|
+
atticus task <change> <task> Run one task with your assistant, the same as task run [--level plan|draft|pr] [--mode m] [--approve]
|
|
454
|
+
atticus spec hand-down <change> <task> Create the task's Spec Kit feature in its repo [--force]
|
|
455
|
+
atticus spec hand-up <change> <task> Read the Spec Kit feature back at the PR [--pr n --pr-url url]
|
|
456
|
+
atticus drift <change> [--json] Compare design, repo plans and code
|
|
457
|
+
atticus assistant-files [--repo id [--change id]] [--force] [--check] Generate the slash commands, instructions and skills for each assistant runtime.yaml allows (Copilot, Claude Code, Cursor, Gemini CLI, Windsurf, AGENTS.md)
|
|
458
|
+
atticus feature suggest-names [--mode m] Ask AI to propose names for detected features
|
|
459
|
+
atticus plan stories <change> Write stories, stories.md and tasks.md from the approved design [--force] [--mode m] [--draft: before approval] [--context-tokens n] [--whole-context] [--max-tokens n]
|
|
460
|
+
atticus stories <change> The stories stage, the same as plan stories [--force] [--mode m] [--draft] [--context-tokens n] [--whole-context] [--max-tokens n]
|
|
461
|
+
atticus change needs <change> Your assistant says what the change needs from the organisation (requests and processes to raise, standards to follow, teams and vendors to involve), for the change, a feature, flow, story or task; each checked against the change's own words [--mode m] [--resume run] [--context-tokens n] [--whole-context] [--max-tokens n]
|
|
462
|
+
atticus needs [--change id] [--all] [--json] What changes need from the organisation, open ones first, with lead times and who handles each
|
|
463
|
+
atticus waiting [--group change|kind] [--filter words] [--json] What waits on you across every change: questions, open needs, manual steps, findings, knowledge to verify
|
|
464
|
+
atticus runs [--change id] [--limit n] [--json] The model runs: what Atticus asked a model, each round, and whether it was answered
|
|
465
|
+
atticus runs show <run> [--json] One run: its prompt, its answer and the problems handed back to it
|
|
466
|
+
atticus history [--change id] [--session id] [--filter words] [--limit n] [--json] The prompts people sent their assistant here and the responses they got, by session, kept on this machine
|
|
467
|
+
atticus history show <id> [--json] One prompt or response, and its pair
|
|
468
|
+
atticus history add --surface <claude-code|vscode|cli> --kind <prompt|response> [--session id] [--command c] [--change id] Record one prompt or response, its text read from stdin (the plugin's hooks and VS Code call it)
|
|
469
|
+
atticus history off Stop recording prompts and responses on this machine (kept in .atticus/me.yaml)
|
|
470
|
+
atticus history on Record them again on this machine (runtime.yaml can still turn it off for everyone)
|
|
471
|
+
atticus needs done <change> <item> Record a need as done, e.g. with the CTASK number as its note [--for <target>] [--note <text>]
|
|
472
|
+
atticus needs skip <change> <item> --note <why> Record a need as not needed, and why [--for <target>]
|
|
473
|
+
atticus needs reopen <change> <item> Open a need again [--for <target>]
|
|
474
|
+
(with target flows: the stories stage, a task per changed step with its prompt, requests from knowledge)
|
|
475
|
+
atticus plan snow <change> Draft service-desk requests the change needs [--force]
|
|
476
|
+
atticus plan bar <change> Measure the story bar [--eval file]
|
|
477
|
+
atticus plan submit <change> File the drafted requests (a dry run until you add --approve)
|
|
478
|
+
atticus ado sync <change> Create or update work items (a dry run until you add --approve) [--epic id]
|
|
479
|
+
atticus templates draft Draft request and work-item templates from wikis, uploads and past tickets [--no-ai]
|
|
480
|
+
atticus todo [--change id] [--all] Manual steps waiting for a person
|
|
481
|
+
atticus todo show <step> [--export text|csv|import] A manual step: what to do, where, and what it needs
|
|
482
|
+
atticus todo done <step> Record a manual step's result [--result k=v]... [--skip --note why]
|
|
483
|
+
atticus todo run <step> --with <executor> Run a step with a team's own tool [--approve --inputs sha] [--fill-only]
|
|
484
|
+
atticus executors check Ping configured executors and show what each covers
|
|
485
|
+
atticus init <folder> --platform <p> Create a new metarepo named after the folder [--from pack] [--owner who] [--openspec-store: also an OpenSpec store, beta]
|
|
486
|
+
atticus adopt <path> Use Atticus in an existing repo; writes only .atticus/ [--platform p] [--name n]
|
|
487
|
+
atticus unadopt <path> Remove Atticus from an adopted repo, leaving it as it was
|
|
488
|
+
atticus repos discover <folder> | --org <org> Propose repos.manifest.yaml entries [--platform p] [--dry-run]
|
|
489
|
+
atticus repo add <url|path> Add one repo to the manifest, with what it is in your own words; with a folder and no --type, its type is read from its files (or, where they say nothing, from what you wrote) [--id x] [--type t] [--owner team] [--system s] [--component c] [--platform p] [--description "what it is"] [--no-description] [--json]
|
|
490
|
+
atticus repo rename <old> <new> Move a repo's id with its facts, read plan, reviewed file, questions and catalog records, in one change you review (files moved and rewritten; nothing committed or pushed)
|
|
491
|
+
atticus repo describe [<repo>] Say what a repo is, in one line, for a repo that has none (or edit what it says); with no repo, the repos with no description and the drafts waiting for a person [--description "..."] [--accept] [--reject] [--json]
|
|
492
|
+
[--drafted "..." --cites f:n] Your assistant hands over the line it drafted, with the lines it read it from; kept unconfirmed until a person confirms it
|
|
493
|
+
atticus absorb <git-url|path> --id <id> Translate another team's prompts, agents, checklists, OpenSpec, Spec Kit, TypeSpec or Atticus repo
|
|
494
|
+
[--mode adopt|link|ignore] [--ref r] [--dry-run]
|
|
495
|
+
atticus absorb --refresh <id> Fetch an absorbed source again and update its proposal
|
|
496
|
+
atticus absorb accept <id> Copy what the reviewed proposal adopts into the org pack and add its sources.yaml entry [--replace] [--dry-run] [--json]
|
|
497
|
+
atticus tests generate <change> <story> Generate tests from a story [--framework id] [--force] [--check] [--mode m]
|
|
498
|
+
atticus trace <change> [--json] [--csv] [--no-write] Requirement \u2192 story \u2192 test \u2192 code \u2192 records \u2192 feature
|
|
499
|
+
atticus release plan <change> [--json] Deploy order across the repos, why, rollback per step, waits and release sections
|
|
500
|
+
atticus release forecast <change> [--json] Forecast ready-to-release day from lead times and the initiative's plan
|
|
501
|
+
atticus release evidence <change> [--out dir] [--json] The evidence pack for an approval board or an audit
|
|
502
|
+
atticus release notes <change> [--audience business|technical] [--json] Release notes from the brief, interfaces and data
|
|
503
|
+
atticus release security <change> [--json] Security review draft: auth, classifications, boundaries, vendors, secrets
|
|
504
|
+
atticus outcome list [--change id] [--json] The brief's success measures and the values recorded after release
|
|
505
|
+
atticus outcome record <change> <measure> --value <v> Record a measured outcome [--note text]
|
|
506
|
+
atticus ci drift [repo] --catalog <path> In a repo's pipeline: compare the repo with the committed catalog
|
|
507
|
+
[--repo id] [--json [file]] [--junit file] [--summary file] [--warn-only]
|
|
508
|
+
atticus ci snippet <github|azure|gitlab|jenkins> [--write dir] Pipeline template for the drift check
|
|
509
|
+
atticus ci archive-gate <change> [--drift file]... Whether a change may be archived
|
|
510
|
+
atticus glossary list|scan [--json] Business terms from wikis, code and people
|
|
511
|
+
atticus glossary define <term> "<definition>" [--owner team] Define a business term, as you
|
|
512
|
+
atticus glossary link <term> <record-id|schema#field> Link a term to a catalog record or field
|
|
513
|
+
atticus glossary alias <term> <name>... Another name people use for a term
|
|
514
|
+
atticus initiative new "<title>" --journey <j> Start an initiative [--id] [--release YYYY-MM-DD] [--epic]
|
|
515
|
+
atticus initiative plan <id> --target <system> Plan its changes and commitments [--release d] [--system s]... [--dry-run]
|
|
516
|
+
atticus initiative status <id> Critical path, at-risk and slipped commitments
|
|
517
|
+
atticus initiative request <id> <party> Send a team a system card and track the reply [--system s]...
|
|
518
|
+
atticus initiative commit <commitment> <open|at-risk|done|slipped> Record a commitment's status
|
|
519
|
+
atticus learn [list] | learn start <role|lesson> | learn check [--answer a] [--lesson l] [--step s]
|
|
520
|
+
Lessons by role in a practice sandbox: list them, start one, check a step
|
|
521
|
+
atticus sandbox create <dir> A throwaway practice metarepo
|
|
522
|
+
atticus commands [--json] Every command as data: its arguments, options, area and how it runs (for an editor)
|
|
523
|
+
atticus legacy [--all] Every command outside the twelve atticus help shows, grouped; atticus legacy <command> runs one exactly as atticus <command> does
|
|
524
|
+
atticus explain <id|command> Explain a record, finding, change or command in plain words
|
|
525
|
+
atticus eval run [--agent a]... [--mode mock|replay|live] [--runs n] Evaluate AI agents
|
|
526
|
+
atticus eval report The latest eval results and AI quality
|
|
527
|
+
atticus bench fetch [--repo id] [--batch n] [--cache dir] Clone the bench's public repos at their pinned commits
|
|
528
|
+
atticus bench survey [--repo id] [--batch n] [--mode m] Your assistant drafts each bench repo's scan settings; kept for later runs
|
|
529
|
+
atticus bench verify [--repo id] [--batch n] [--mode m] Your assistant verifies each bench repo's scan; kept for bench run to score
|
|
530
|
+
atticus bench run [--repo id] [--batch n] [--estate e] [--json] [--specs] Scan each bench repo and score it against its reference; --specs also scores drafted specs against bench/flows and scans each estate's repos together
|
|
531
|
+
atticus bench facts [<repo>] [--facts file] [--batch n] [--json] Score the facts your assistant wrote for each bench repo against its reference, per kind, with bench run's matcher
|
|
532
|
+
atticus bench stories --draft <file> [--facts file] [--json] Score a drafted user story against its reference story in bench/stories: steps, fields, error cases, invented fields, rubric sections
|
|
533
|
+
atticus bench stories --change <change> --story <id> [--out file] [--facts file] [--json] Score the stories the stories stage drafted for a change (its id or folder), converted to one bench story, against bench/stories/<id>.yaml; --out keeps the converted draft
|
|
534
|
+
atticus defences scan [path] [--all] Look for instructions hidden in documents and prompts
|
|
535
|
+
atticus conformance <path> --kind <catalog|org-pack|dialect|plugin|executor>
|
|
536
|
+
Check a catalog, org pack, dialect, plugin or executor against the spec
|
|
537
|
+
atticus alias "<name>" <id> Record that a name used in diagrams or documents means a catalog id
|
|
538
|
+
[--reason text]
|
|
539
|
+
atticus orgpack owner [<handle>] Who looks after the org pack: shown, or set in pack.yaml (the rest of the file stays)
|
|
540
|
+
atticus orgpack validate [dir] Check an org pack against its schemas (default: <root>/org-pack)
|
|
541
|
+
atticus orgpack draft Draft the profile's systems from the knowledge items: the products and vendors the wikis name, with their aliases and owners, each citing its item [--platform <p>] [--json]
|
|
542
|
+
atticus orgpack accept <platform> Put the drafted systems into profile.yaml [--only <id,id>] [--verified-only] [--dry-run] [--json]
|
|
543
|
+
atticus standards propose Propose each rule of a confirmed standard as a critic check (proposals/checklists/standards.yaml); nothing is enforced [--json]
|
|
544
|
+
atticus standards accept Put the proposed checks a person picks into org-pack/checklists/standards.yaml [--only <id,id>] [--dry-run] [--json]
|
|
545
|
+
atticus openspec setup Set up OpenSpec with the org-flow schema in the metarepo
|
|
546
|
+
atticus openspec check Check the OpenSpec version and validate every change and spec
|
|
547
|
+
atticus spec seed <repo> [--json] Propose a repo's starting openspec/specs from its verified flows, as the change openspec/changes/seed-<repo>/: a requirement per flow, a scenario per path and error case, each citing its lines (ADR 0146)
|
|
548
|
+
atticus spec accept <repo> Accept the repo's seeded spec: OpenSpec validates it strictly, then archives it into openspec/specs/; the next change modifies it
|
|
549
|
+
atticus openspec <args...> Run the bundled OpenSpec CLI in the metarepo with these arguments (openspec isn't on PATH; it ships inside Atticus). status, instructions and show take --change from the only change open when you don't name one
|
|
550
|
+
atticus handoff done <run-id> Tell Atticus a hand-off artifact is written; it validates it (a stage's draft: with the stage's checks, its problems listed with their lines until it is clean) [--model m: the model that wrote it, kept in the run record]
|
|
551
|
+
atticus stage check <change> <stage> <file> Run a stage's checks on a draft's file and list its problems with their lines; writes nothing (a drafter checks its draft before it hands it in)
|
|
552
|
+
atticus next [--all] [--json] The next step to take, its command and slash command, and why; from the files only
|
|
553
|
+
[--queue] The repos to read next, gateways and the repos others call first so links land early, each with its estimated cost, and what each read so far took (ADR 0141)
|
|
554
|
+
atticus <step> --handoff [--json] On map, scan survey, scan verify, spec draft, knowledge scan, change feature, change architecture, change small, change draft, stories, change needs, knowledge find, knowledge ask and critic (its lenses one at a time, as a stage offers its critic lenses after each draft): print only the prompt, the result file and the commands that finish it
|
|
555
|
+
atticus <step> --max-tokens n On the same steps: the model's limit. The whole prompt fits n tokens (counted as characters / 4, a quarter kept back for the count's error), or the step says before handing off that it can't, with the numbers. The VS Code extension passes its model's limit to every step
|
|
556
|
+
atticus workspace sync Clone or update the base clone of every repo in the manifests
|
|
557
|
+
[--repos a,b] Only these repos
|
|
558
|
+
[--from <folder>] Copy a missing base clone from your own clone of it in that folder: no network, your clone only read
|
|
559
|
+
atticus workspace open <change> Create the change's worktrees, repos.yaml and editor workspaces
|
|
560
|
+
--repos a,b The repos the change touches
|
|
561
|
+
atticus workspace prune <change> Remove worktrees whose PRs merged or closed
|
|
562
|
+
[--all] [--force] All worktrees; also those with uncommitted work
|
|
563
|
+
|
|
564
|
+
--root <dir> The metarepo (default: the current folder)
|
|
565
|
+
--by <handle> Who is acting (default: the metarepo's Git user, git config user.email)
|
|
566
|
+
atticus mcp Serve read-only tools to an assistant over MCP (stdio): next step, catalog, knowledge, changes, needs (the Claude Code plugin starts it)
|
|
567
|
+
atticus ui [--port n] [--open] Start the app on this machine (127.0.0.1); Ctrl+C stops it
|
|
568
|
+
[--embed vscode] Let a VS Code panel show the app (the Atticus extension starts it so)
|
|
569
|
+
[--parent pid] Stop when that process ends (an editor that started it)
|
|
570
|
+
[--show-token] Print the session token, for an assistant or a script (an editor that starts it gets it)
|
|
571
|
+
[--full] Every page a tab of its section, and the menu's More pages open
|
|
572
|
+
atticus --version Print the version
|
|
573
|
+
atticus --help Show this help
|
|
574
|
+
|
|
575
|
+
Every command is described in docs/guide/commands.md; atticus explain <command> says more.`;
|
|
576
|
+
var HELP_TEXT = HELP;
|
|
577
|
+
var RECORDS_A_PERSON = /* @__PURE__ */ new Set([
|
|
578
|
+
"knowledge",
|
|
579
|
+
"needs",
|
|
580
|
+
"upgrade",
|
|
581
|
+
"baseline",
|
|
582
|
+
"digest",
|
|
583
|
+
"alias",
|
|
584
|
+
"initiative",
|
|
585
|
+
"outcome",
|
|
586
|
+
"glossary",
|
|
587
|
+
"plan",
|
|
588
|
+
"ado",
|
|
589
|
+
"todo",
|
|
590
|
+
"task",
|
|
591
|
+
"spec",
|
|
592
|
+
"feature",
|
|
593
|
+
"finding",
|
|
594
|
+
"change",
|
|
595
|
+
"triage",
|
|
596
|
+
"handoff"
|
|
597
|
+
]);
|
|
598
|
+
async function readAll(stream) {
|
|
599
|
+
const chunks = [];
|
|
600
|
+
for await (const c of stream)
|
|
601
|
+
chunks.push(typeof c === "string" ? Buffer.from(c) : c);
|
|
602
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
603
|
+
}
|
|
604
|
+
function num(v) {
|
|
605
|
+
const n = typeof v === "string" ? Number(v) : NaN;
|
|
606
|
+
return Number.isInteger(n) && n > 0 ? n : void 0;
|
|
607
|
+
}
|
|
608
|
+
async function main(given, io, o = {}) {
|
|
609
|
+
const started = Date.now();
|
|
610
|
+
const argv = aliasArgv(given, positionalsAt(given));
|
|
611
|
+
const words = argv.filter((a) => !a.startsWith("-")).slice(0, 2);
|
|
612
|
+
const flags = [
|
|
613
|
+
...new Set(argv.filter((a) => a.startsWith("--")).map((a) => a.slice(2).split("=")[0]))
|
|
614
|
+
];
|
|
615
|
+
const rootAt = argv.indexOf("--root");
|
|
616
|
+
const root = resolve(rootAt >= 0 && argv[rootAt + 1] ? argv[rootAt + 1] : process.cwd());
|
|
617
|
+
const log = () => isMetarepoRoot(root) ? createLog(root, o.quiet ? { level: "warn" } : {}) : void 0;
|
|
618
|
+
try {
|
|
619
|
+
const code = await dispatch(argv, io);
|
|
620
|
+
log()?.info("command", { command: words.join(" "), flags, code, ms: Date.now() - started });
|
|
621
|
+
return code;
|
|
622
|
+
} catch (e) {
|
|
623
|
+
const l = log();
|
|
624
|
+
l?.error("crash", e, { command: words.join(" "), flags, ms: Date.now() - started });
|
|
625
|
+
if (l && e instanceof Error)
|
|
626
|
+
e.logFile = l.file;
|
|
627
|
+
throw e;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
function openspecArgsOf(argv) {
|
|
631
|
+
const at = argv.indexOf("openspec");
|
|
632
|
+
const out = [];
|
|
633
|
+
for (let i = at + 1; i < argv.length; i++) {
|
|
634
|
+
const a = argv[i];
|
|
635
|
+
if (a === "--root") {
|
|
636
|
+
i++;
|
|
637
|
+
continue;
|
|
638
|
+
}
|
|
639
|
+
if (a.startsWith("--root="))
|
|
640
|
+
continue;
|
|
641
|
+
out.push(a);
|
|
642
|
+
}
|
|
643
|
+
return out;
|
|
644
|
+
}
|
|
645
|
+
function positionalsAt(argv) {
|
|
646
|
+
const { tokens } = parseArgs({
|
|
647
|
+
args: argv,
|
|
648
|
+
allowPositionals: true,
|
|
649
|
+
options: OPTIONS,
|
|
650
|
+
strict: false,
|
|
651
|
+
tokens: true
|
|
652
|
+
});
|
|
653
|
+
return tokens.filter((t) => t.kind === "positional").map((t) => t.index);
|
|
654
|
+
}
|
|
655
|
+
function isMetarepoRoot(root) {
|
|
656
|
+
return existsSync(join(root, "org-pack")) || existsSync(join(root, ".atticus", "org-pack"));
|
|
657
|
+
}
|
|
658
|
+
async function dispatch(argv, io) {
|
|
659
|
+
const at = argv.findIndex((a) => a === "--max-tokens" || a.startsWith("--max-tokens="));
|
|
660
|
+
if (at < 0)
|
|
661
|
+
return dispatchCommand(argv, io);
|
|
662
|
+
const raw = argv[at].includes("=") ? argv[at].slice("--max-tokens=".length) : argv[at + 1];
|
|
663
|
+
const n = Number(raw);
|
|
664
|
+
if (!Number.isInteger(n) || n < 1e3) {
|
|
665
|
+
io.err("--max-tokens is a whole number of 1000 or more: the model's limit, which the whole prompt must fit.");
|
|
666
|
+
return 2;
|
|
667
|
+
}
|
|
668
|
+
const { withPromptLimit, PromptTooLong } = await loadAi();
|
|
669
|
+
try {
|
|
670
|
+
return await withPromptLimit(n, () => dispatchCommand(argv, io));
|
|
671
|
+
} catch (e) {
|
|
672
|
+
if (!(e instanceof PromptTooLong))
|
|
673
|
+
throw e;
|
|
674
|
+
io.err(e.message);
|
|
675
|
+
return 2;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
var OPTIONS = {
|
|
679
|
+
help: { type: "boolean", short: "h" },
|
|
680
|
+
// ADR 0141: what a read took, as the reader reports it (atticus map <repo> --spent).
|
|
681
|
+
spent: { type: "string" },
|
|
682
|
+
sessions: { type: "string" },
|
|
683
|
+
part: { type: "string" },
|
|
684
|
+
queue: { type: "boolean" },
|
|
685
|
+
// F10: atticus doctor --counts.
|
|
686
|
+
counts: { type: "boolean" },
|
|
687
|
+
version: { type: "boolean", short: "v" },
|
|
688
|
+
fix: { type: "boolean" },
|
|
689
|
+
root: { type: "string" },
|
|
690
|
+
repos: { type: "string" },
|
|
691
|
+
all: { type: "boolean" },
|
|
692
|
+
kind: { type: "string" },
|
|
693
|
+
executor: { type: "string" },
|
|
694
|
+
fixture: { type: "string" },
|
|
695
|
+
force: { type: "boolean" },
|
|
696
|
+
draft: { type: "boolean" },
|
|
697
|
+
story: { type: "string" },
|
|
698
|
+
gaps: { type: "boolean" },
|
|
699
|
+
// ADR 0161: atticus map --all.
|
|
700
|
+
stale: { type: "boolean" },
|
|
701
|
+
"max-parts": { type: "string" },
|
|
702
|
+
"budget-tokens": { type: "string" },
|
|
703
|
+
idle: { type: "string" },
|
|
704
|
+
full: { type: "boolean" },
|
|
705
|
+
"dry-run": { type: "boolean" },
|
|
706
|
+
json: { type: "boolean" },
|
|
707
|
+
limit: { type: "string" },
|
|
708
|
+
filter: { type: "string" },
|
|
709
|
+
"batch-tokens": { type: "string" },
|
|
710
|
+
"max-tokens": { type: "string" },
|
|
711
|
+
// atticus probe (ADR 0124 addendum A-probe).
|
|
712
|
+
assistant: { type: "string" },
|
|
713
|
+
pasted: { type: "boolean" },
|
|
714
|
+
"context-tokens": { type: "string" },
|
|
715
|
+
"whole-context": { type: "boolean" },
|
|
716
|
+
search: { type: "boolean" },
|
|
717
|
+
regex: { type: "boolean" },
|
|
718
|
+
"ignore-case": { type: "boolean" },
|
|
719
|
+
paths: { type: "string" },
|
|
720
|
+
// atticus context (ADR 0107 addendum): the context tools.
|
|
721
|
+
input: { type: "string" },
|
|
722
|
+
run: { type: "string" },
|
|
723
|
+
round: { type: "string" },
|
|
724
|
+
hops: { type: "string" },
|
|
725
|
+
line: { type: "string" },
|
|
726
|
+
around: { type: "string" },
|
|
727
|
+
depth: { type: "string" },
|
|
728
|
+
by: { type: "string" },
|
|
729
|
+
as: { type: "string" },
|
|
730
|
+
group: { type: "string", multiple: true },
|
|
731
|
+
channel: { type: "string" },
|
|
732
|
+
send: { type: "boolean" },
|
|
733
|
+
site: { type: "string" },
|
|
734
|
+
reason: { type: "string" },
|
|
735
|
+
focus: { type: "string" },
|
|
736
|
+
format: { type: "string" },
|
|
737
|
+
out: { type: "string" },
|
|
738
|
+
area: { type: "string" },
|
|
739
|
+
iteration: { type: "string" },
|
|
740
|
+
port: { type: "string" },
|
|
741
|
+
open: { type: "boolean" },
|
|
742
|
+
"show-token": { type: "boolean" },
|
|
743
|
+
embed: { type: "string" },
|
|
744
|
+
parent: { type: "string" },
|
|
745
|
+
host: { type: "string" },
|
|
746
|
+
catalog: { type: "string" },
|
|
747
|
+
"from-catalog": { type: "boolean" },
|
|
748
|
+
from: { type: "string" },
|
|
749
|
+
to: { type: "string" },
|
|
750
|
+
package: { type: "string" },
|
|
751
|
+
jars: { type: "string", multiple: true },
|
|
752
|
+
learn: { type: "boolean" },
|
|
753
|
+
type: { type: "string" },
|
|
754
|
+
template: { type: "string" },
|
|
755
|
+
like: { type: "string" },
|
|
756
|
+
impact: { type: "string" },
|
|
757
|
+
id: { type: "string" },
|
|
758
|
+
owner: { type: "string", multiple: true },
|
|
759
|
+
system: { type: "string", multiple: true },
|
|
760
|
+
base: { type: "string" },
|
|
761
|
+
repo: { type: "string" },
|
|
762
|
+
gate: { type: "string" },
|
|
763
|
+
lens: { type: "string" },
|
|
764
|
+
model: { type: "string" },
|
|
765
|
+
"asked-of": { type: "string" },
|
|
766
|
+
edit: { type: "string" },
|
|
767
|
+
description: { type: "string" },
|
|
768
|
+
title: { type: "string" },
|
|
769
|
+
name: { type: "string" },
|
|
770
|
+
attempts: { type: "string" },
|
|
771
|
+
users: { type: "string" },
|
|
772
|
+
language: { type: "string" },
|
|
773
|
+
replace: { type: "boolean" },
|
|
774
|
+
into: { type: "string" },
|
|
775
|
+
level: { type: "string" },
|
|
776
|
+
mode: { type: "string" },
|
|
777
|
+
approve: { type: "boolean" },
|
|
778
|
+
pr: { type: "string" },
|
|
779
|
+
"pr-url": { type: "string" },
|
|
780
|
+
change: { type: "string" },
|
|
781
|
+
check: { type: "boolean" },
|
|
782
|
+
resume: { type: "string" },
|
|
783
|
+
eval: { type: "string" },
|
|
784
|
+
epic: { type: "string" },
|
|
785
|
+
"no-ai": { type: "boolean" },
|
|
786
|
+
"openspec-store": { type: "boolean" },
|
|
787
|
+
"no-drift": { type: "boolean" },
|
|
788
|
+
warnings: { type: "boolean" },
|
|
789
|
+
"no-rescan": { type: "boolean" },
|
|
790
|
+
refresh: { type: "string" },
|
|
791
|
+
export: { type: "string" },
|
|
792
|
+
result: { type: "string", multiple: true },
|
|
793
|
+
skip: { type: "boolean" },
|
|
794
|
+
note: { type: "string" },
|
|
795
|
+
for: { type: "string" },
|
|
796
|
+
with: { type: "string" },
|
|
797
|
+
inputs: { type: "string" },
|
|
798
|
+
"fill-only": { type: "boolean" },
|
|
799
|
+
platform: { type: "string" },
|
|
800
|
+
ref: { type: "string" },
|
|
801
|
+
task: { type: "string" },
|
|
802
|
+
latest: { type: "boolean" },
|
|
803
|
+
org: { type: "string" },
|
|
804
|
+
framework: { type: "string" },
|
|
805
|
+
csv: { type: "boolean" },
|
|
806
|
+
"no-write": { type: "boolean" },
|
|
807
|
+
junit: { type: "string" },
|
|
808
|
+
summary: { type: "string" },
|
|
809
|
+
"json-out": { type: "string" },
|
|
810
|
+
"warn-only": { type: "boolean" },
|
|
811
|
+
write: { type: "string" },
|
|
812
|
+
path: { type: "string" },
|
|
813
|
+
file: { type: "string" },
|
|
814
|
+
submodule: { type: "boolean" },
|
|
815
|
+
save: { type: "boolean" },
|
|
816
|
+
only: { type: "string" },
|
|
817
|
+
"verified-only": { type: "boolean" },
|
|
818
|
+
unverified: { type: "boolean" },
|
|
819
|
+
set: { type: "string", multiple: true },
|
|
820
|
+
find: { type: "string" },
|
|
821
|
+
drift: { type: "string", multiple: true },
|
|
822
|
+
journey: { type: "string" },
|
|
823
|
+
release: { type: "string" },
|
|
824
|
+
target: { type: "string" },
|
|
825
|
+
answer: { type: "string" },
|
|
826
|
+
lesson: { type: "string" },
|
|
827
|
+
step: { type: "string" },
|
|
828
|
+
agent: { type: "string", multiple: true },
|
|
829
|
+
runs: { type: "string" },
|
|
830
|
+
audience: { type: "string" },
|
|
831
|
+
value: { type: "string" },
|
|
832
|
+
bench: { type: "string" },
|
|
833
|
+
cache: { type: "string" },
|
|
834
|
+
batch: { type: "string" },
|
|
835
|
+
specs: { type: "boolean" },
|
|
836
|
+
estate: { type: "string" },
|
|
837
|
+
accept: { type: "boolean" },
|
|
838
|
+
// atticus repo add / repo describe (ADR 0128)
|
|
839
|
+
reject: { type: "boolean" },
|
|
840
|
+
cites: { type: "string" },
|
|
841
|
+
drafted: { type: "string" },
|
|
842
|
+
"no-description": { type: "boolean" },
|
|
843
|
+
component: { type: "string" },
|
|
844
|
+
tag: { type: "string" },
|
|
845
|
+
source: { type: "string" },
|
|
846
|
+
"from-figma": { type: "string" },
|
|
847
|
+
replaces: { type: "string" },
|
|
848
|
+
promote: { type: "string" },
|
|
849
|
+
prototype: { type: "string" },
|
|
850
|
+
off: { type: "boolean" },
|
|
851
|
+
surface: { type: "string" },
|
|
852
|
+
session: { type: "string" },
|
|
853
|
+
command: { type: "string" },
|
|
854
|
+
markdown: { type: "boolean" },
|
|
855
|
+
dir: { type: "string" },
|
|
856
|
+
commit: { type: "string" },
|
|
857
|
+
confirm: { type: "string" },
|
|
858
|
+
exclude: { type: "string" },
|
|
859
|
+
routed: { type: "string" },
|
|
860
|
+
// atticus map (ADR 0124 §4)
|
|
861
|
+
estimate: { type: "boolean" },
|
|
862
|
+
next: { type: "boolean" },
|
|
863
|
+
copy: { type: "boolean" },
|
|
864
|
+
facts: { type: "string" },
|
|
865
|
+
// ADR 0163: atticus repo-type note.
|
|
866
|
+
add: { type: "string" },
|
|
867
|
+
"org-wide": { type: "boolean" }
|
|
868
|
+
};
|
|
869
|
+
async function dispatchCommand(argv, io) {
|
|
870
|
+
const { values, positionals } = parseArgs({
|
|
871
|
+
args: argv,
|
|
872
|
+
allowPositionals: true,
|
|
873
|
+
options: OPTIONS,
|
|
874
|
+
strict: false
|
|
875
|
+
});
|
|
876
|
+
if (values.version) {
|
|
877
|
+
io.out(VERSION);
|
|
878
|
+
return 0;
|
|
879
|
+
}
|
|
880
|
+
const [group, command, arg] = positionals;
|
|
881
|
+
const refused = await checkFlags(argv, positionals, io);
|
|
882
|
+
if (refused !== void 0)
|
|
883
|
+
return refused;
|
|
884
|
+
if (group === "help" || values.help || !group) {
|
|
885
|
+
const { helpCommand } = await import("./chunk-TQYBXDVH.js");
|
|
886
|
+
return helpCommand(group === "help" ? positionals.slice(1) : positionals, HELP, io, {
|
|
887
|
+
all: values.all === true
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
if (group === "legacy") {
|
|
891
|
+
const { legacyHelp } = await import("./chunk-TQYBXDVH.js");
|
|
892
|
+
io.out(legacyHelp(HELP, { all: values.all === true }));
|
|
893
|
+
return 0;
|
|
894
|
+
}
|
|
895
|
+
if (group === "commands") {
|
|
896
|
+
const { AREAS, commandCatalog: commandCatalog2 } = await import("./chunk-O6ILVBYB.js");
|
|
897
|
+
const commands = commandCatalog2(HELP);
|
|
898
|
+
if (values.json === true)
|
|
899
|
+
io.out(JSON.stringify({ areas: AREAS, commands }, null, 2));
|
|
900
|
+
else
|
|
901
|
+
for (const a of AREAS) {
|
|
902
|
+
io.out(`${a.title}:`);
|
|
903
|
+
for (const c of commands.filter((x) => x.area === a.id))
|
|
904
|
+
io.out(` atticus ${c.id}${c.runs === "local" ? "" : ` (${c.runs})`}`);
|
|
905
|
+
}
|
|
906
|
+
return 0;
|
|
907
|
+
}
|
|
908
|
+
if (group === "schema" && command === "export") {
|
|
909
|
+
await schemaExport(arg ?? "schema", io);
|
|
910
|
+
return 0;
|
|
911
|
+
}
|
|
912
|
+
if (group === "catalog" && command === "validate") {
|
|
913
|
+
if (!arg) {
|
|
914
|
+
io.err("catalog validate needs a folder, for example: atticus catalog validate catalog/generated");
|
|
915
|
+
return 2;
|
|
916
|
+
}
|
|
917
|
+
const s = await catalogValidate(arg, { fix: values.fix === true }, io);
|
|
918
|
+
return s.invalid + s.misplaced + s.notCanonical > 0 ? 1 : 0;
|
|
919
|
+
}
|
|
920
|
+
if (group === "catalog" && command === "diff") {
|
|
921
|
+
const b = positionals[3];
|
|
922
|
+
if (!arg || !b) {
|
|
923
|
+
io.err("catalog diff needs two folders, for example: atticus catalog diff catalog/generated /tmp/other");
|
|
924
|
+
return 2;
|
|
925
|
+
}
|
|
926
|
+
return catalogDiff(resolve(arg), resolve(b), values.json === true, io);
|
|
927
|
+
}
|
|
928
|
+
const root = resolve(typeof values.root === "string" ? values.root : process.cwd());
|
|
929
|
+
if (!runsNoAi(group, command))
|
|
930
|
+
await setUpAi();
|
|
931
|
+
if (group === "next")
|
|
932
|
+
return (await import("./chunk-DDAEAZEV.js")).nextCommand(root, { json: values.json === true, all: values.all === true, queue: values.queue === true }, io);
|
|
933
|
+
if (values.handoff === true && (await import("./chunk-KQDZXGNR.js")).isHandoffStep(group, command))
|
|
934
|
+
return (await import("./chunk-CZI2ACNT.js")).handoffStep(root, argv, io, dispatch);
|
|
935
|
+
const given = typeof values.by === "string" && values.by.trim() ? values.by : void 0;
|
|
936
|
+
const person = !given && RECORDS_A_PERSON.has(group) ? await gitUser(root) : void 0;
|
|
937
|
+
let warned = false;
|
|
938
|
+
const who = () => {
|
|
939
|
+
if (given)
|
|
940
|
+
return given;
|
|
941
|
+
if (person?.warning && !warned) {
|
|
942
|
+
io.err(person.warning);
|
|
943
|
+
warned = true;
|
|
944
|
+
}
|
|
945
|
+
return person?.handle ?? "someone";
|
|
946
|
+
};
|
|
947
|
+
const repoIds = typeof values.repos === "string" ? values.repos.split(",").map((s) => s.trim()).filter(Boolean) : void 0;
|
|
948
|
+
if (group === "change" && command === "needs" || group === "needs") {
|
|
949
|
+
const handled = await (await import("./chunk-XOVLGBKI.js")).needsCli(root, positionals, values, io, who);
|
|
950
|
+
if (handled !== void 0)
|
|
951
|
+
return handled;
|
|
952
|
+
}
|
|
953
|
+
if (group === "waiting") {
|
|
954
|
+
const given2 = Array.isArray(values.group) ? values.group[0] : values.group;
|
|
955
|
+
const g = given2 === void 0 ? "change" : String(given2);
|
|
956
|
+
if (g !== "change" && g !== "kind") {
|
|
957
|
+
io.err(`--group takes change or kind, not ${g}.`);
|
|
958
|
+
return 2;
|
|
959
|
+
}
|
|
960
|
+
const run = async (argv2) => {
|
|
961
|
+
const out = [];
|
|
962
|
+
const err = [];
|
|
963
|
+
const code = await main([...argv2, "--root", root], { out: (l) => out.push(l), err: (l) => err.push(l) }, { quiet: true });
|
|
964
|
+
return { code, out: out.join("\n"), err: err.join("\n") };
|
|
965
|
+
};
|
|
966
|
+
return (await import("./chunk-XZRON6IV.js")).waitingCli({
|
|
967
|
+
by: g,
|
|
968
|
+
...typeof values.filter === "string" ? { filter: values.filter } : {},
|
|
969
|
+
json: values.json === true
|
|
970
|
+
}, io, run);
|
|
971
|
+
}
|
|
972
|
+
if (group === "runs") {
|
|
973
|
+
const m = await import("./chunk-SILY6ZEZ.js");
|
|
974
|
+
if (command === "show") {
|
|
975
|
+
const id = positionals[2];
|
|
976
|
+
if (!id) {
|
|
977
|
+
io.err("Usage: atticus runs show <run> [--json] (atticus runs lists them)");
|
|
978
|
+
return 2;
|
|
979
|
+
}
|
|
980
|
+
return m.runShowCli(root, id, { json: values.json === true }, io);
|
|
981
|
+
}
|
|
982
|
+
if (command !== void 0) {
|
|
983
|
+
io.err(`runs takes show <run>, or nothing to list them; not ${command}.`);
|
|
984
|
+
return 2;
|
|
985
|
+
}
|
|
986
|
+
const limit = num(values.limit);
|
|
987
|
+
return m.runsCli(root, {
|
|
988
|
+
...typeof values.change === "string" ? { change: values.change } : {},
|
|
989
|
+
...limit ? { limit } : {},
|
|
990
|
+
json: values.json === true
|
|
991
|
+
}, io);
|
|
992
|
+
}
|
|
993
|
+
if (group === "history") {
|
|
994
|
+
const m = await import("./chunk-HQMCHHY5.js");
|
|
995
|
+
const text = (v) => typeof v === "string" && v.trim() ? v : void 0;
|
|
996
|
+
if (command === "add") {
|
|
997
|
+
if (process.stdin.isTTY) {
|
|
998
|
+
io.err("history add reads the text from stdin; pipe the prompt or response into it (the plugin's hooks and VS Code do).");
|
|
999
|
+
return 2;
|
|
1000
|
+
}
|
|
1001
|
+
return m.historyAddCli(root, {
|
|
1002
|
+
...text(values.surface) ? { surface: text(values.surface) } : {},
|
|
1003
|
+
...text(values.kind) ? { kind: text(values.kind) } : {},
|
|
1004
|
+
...text(values.session) ? { session: text(values.session) } : {},
|
|
1005
|
+
...text(values.command) ? { command: text(values.command) } : {},
|
|
1006
|
+
...text(values.change) ? { change: text(values.change) } : {}
|
|
1007
|
+
}, () => readAll(process.stdin), io);
|
|
1008
|
+
}
|
|
1009
|
+
if (command === "show") {
|
|
1010
|
+
const id = positionals[2];
|
|
1011
|
+
if (!id) {
|
|
1012
|
+
io.err("Usage: atticus history show <id> [--json] (atticus history lists them)");
|
|
1013
|
+
return 2;
|
|
1014
|
+
}
|
|
1015
|
+
return m.historyShowCli(root, id, { json: values.json === true }, io);
|
|
1016
|
+
}
|
|
1017
|
+
if (command === "on" || command === "off")
|
|
1018
|
+
return m.historyOnOffCli(root, command === "on", io);
|
|
1019
|
+
if (command !== void 0) {
|
|
1020
|
+
io.err(`history takes show <id>, add, on or off, or nothing to list them; not ${command}.`);
|
|
1021
|
+
return 2;
|
|
1022
|
+
}
|
|
1023
|
+
const limit = num(values.limit);
|
|
1024
|
+
return m.historyCli(root, {
|
|
1025
|
+
...text(values.change) ? { change: text(values.change) } : {},
|
|
1026
|
+
...text(values.session) ? { session: text(values.session) } : {},
|
|
1027
|
+
...text(values.filter) ? { filter: text(values.filter) } : {},
|
|
1028
|
+
...limit ? { limit } : {},
|
|
1029
|
+
json: values.json === true
|
|
1030
|
+
}, io);
|
|
1031
|
+
}
|
|
1032
|
+
if (group === "change" && (command === "feature" || command === "architecture" || command === "small") || group === "plan" && command === "stories" || group === "bench" && command === "design") {
|
|
1033
|
+
const handled = await stageCli(root, positionals, values, io);
|
|
1034
|
+
if (handled !== void 0)
|
|
1035
|
+
return handled;
|
|
1036
|
+
}
|
|
1037
|
+
if (group === "repo" && command === "rename") {
|
|
1038
|
+
const { repoRename } = await import("./chunk-OR5VRULZ.js");
|
|
1039
|
+
return repoRename(root, positionals[2], positionals[3], io);
|
|
1040
|
+
}
|
|
1041
|
+
if (group === "repo" && (command === "add" || command === "describe")) {
|
|
1042
|
+
const m = await loadRepoCommands();
|
|
1043
|
+
const str2 = (v) => typeof v === "string" ? v : void 0;
|
|
1044
|
+
const pick = (...names) => Object.fromEntries(names.flatMap((n) => {
|
|
1045
|
+
const v = str2(values[n]);
|
|
1046
|
+
return v ? [[n, v]] : [];
|
|
1047
|
+
}));
|
|
1048
|
+
const first = (v) => Array.isArray(v) ? v[0] : str2(v);
|
|
1049
|
+
if (command === "add")
|
|
1050
|
+
return m.repoAdd(root, arg, {
|
|
1051
|
+
...pick("id", "type", "platform", "component", "description"),
|
|
1052
|
+
...first(values.owner) ? { owner: first(values.owner) } : {},
|
|
1053
|
+
...first(values.system) ? { system: first(values.system) } : {},
|
|
1054
|
+
noDescription: values["no-description"] === true,
|
|
1055
|
+
json: values.json === true
|
|
1056
|
+
}, io);
|
|
1057
|
+
return m.repoDescribe(root, arg, {
|
|
1058
|
+
...pick("description", "drafted", "cites"),
|
|
1059
|
+
accept: values.accept === true,
|
|
1060
|
+
reject: values.reject === true,
|
|
1061
|
+
json: values.json === true
|
|
1062
|
+
}, io);
|
|
1063
|
+
}
|
|
1064
|
+
if (group === "repo-type" && command === "note") {
|
|
1065
|
+
const m = await loadRepoTypeCommands();
|
|
1066
|
+
return m.repoTypeNote(root, arg, {
|
|
1067
|
+
...typeof values.add === "string" ? { add: values.add } : {},
|
|
1068
|
+
org: values["org-wide"] === true
|
|
1069
|
+
}, io);
|
|
1070
|
+
}
|
|
1071
|
+
if (group === "repo-type" && command === "rules") {
|
|
1072
|
+
const m = await loadRepoTypeCommands();
|
|
1073
|
+
return m.repoTypeRules(root, { write: values.save === true, json: values.json === true }, io);
|
|
1074
|
+
}
|
|
1075
|
+
if (group === "repo-type" && (command === "detect" || command === "new")) {
|
|
1076
|
+
const m = await loadRepoTypeCommands();
|
|
1077
|
+
const from = typeof values.from === "string" ? values.from : void 0;
|
|
1078
|
+
if (command === "new")
|
|
1079
|
+
return m.repoTypeNew(root, arg ?? "", { ...from ? { from } : {}, force: values.force === true }, io);
|
|
1080
|
+
if (!arg) {
|
|
1081
|
+
io.err("Usage: atticus repo-type detect <repo> [--json]");
|
|
1082
|
+
return 2;
|
|
1083
|
+
}
|
|
1084
|
+
return m.repoTypeDetect(root, arg, { json: values.json === true }, io);
|
|
1085
|
+
}
|
|
1086
|
+
if (group === "scan" && command === "survey") {
|
|
1087
|
+
const text = (v) => typeof v === "string" ? v : void 0;
|
|
1088
|
+
if (!arg) {
|
|
1089
|
+
io.err("Usage: atticus scan survey <repo> [--attempts 3] [--resume run] [--force] [--mode m]");
|
|
1090
|
+
return 2;
|
|
1091
|
+
}
|
|
1092
|
+
const attempts = Number(text(values.attempts) ?? "3");
|
|
1093
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 10) {
|
|
1094
|
+
io.err("--attempts is a whole number from 1 to 10.");
|
|
1095
|
+
return 2;
|
|
1096
|
+
}
|
|
1097
|
+
try {
|
|
1098
|
+
const { runtime } = await runtimeForCli(root, {
|
|
1099
|
+
...text(values.mode) ? { mode: text(values.mode) } : {}
|
|
1100
|
+
});
|
|
1101
|
+
return await scanSurvey(root, arg, {
|
|
1102
|
+
attempts,
|
|
1103
|
+
force: values.force === true,
|
|
1104
|
+
...text(values.resume) ? { resume: text(values.resume) } : {}
|
|
1105
|
+
}, { runtime }, io);
|
|
1106
|
+
} catch (e) {
|
|
1107
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
1108
|
+
io.err(e.message);
|
|
1109
|
+
return 2;
|
|
1110
|
+
}
|
|
1111
|
+
throw e;
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
if (group === "estate" && command === "fresh") {
|
|
1115
|
+
const m = await import("./chunk-C75W7VXX.js");
|
|
1116
|
+
return m.estateFresh(root, { json: values.json === true, all: values.all === true }, io);
|
|
1117
|
+
}
|
|
1118
|
+
if (group === "estate" && command === "shared") {
|
|
1119
|
+
const m = await import("./chunk-5BJFMAQU.js");
|
|
1120
|
+
const json2 = values.json === true;
|
|
1121
|
+
const text = (v) => typeof v === "string" && v.trim() ? v : void 0;
|
|
1122
|
+
if (arg === "import")
|
|
1123
|
+
return m.sharedImport(root, positionals[3], {
|
|
1124
|
+
...text(values.team) ? { team: text(values.team) } : {},
|
|
1125
|
+
...text(values.system) ? { system: text(values.system) } : {},
|
|
1126
|
+
...text(values.name) ? { name: text(values.name) } : {},
|
|
1127
|
+
...text(values.commit) ? { commit: text(values.commit) } : {},
|
|
1128
|
+
json: json2
|
|
1129
|
+
}, io);
|
|
1130
|
+
if (arg === "refresh")
|
|
1131
|
+
return m.sharedRefresh(root, positionals[3], {
|
|
1132
|
+
...positionals[4] ? { dir: positionals[4] } : {},
|
|
1133
|
+
...text(values.commit) ? { commit: text(values.commit) } : {},
|
|
1134
|
+
json: json2
|
|
1135
|
+
}, io);
|
|
1136
|
+
if (arg === "list" || arg === void 0)
|
|
1137
|
+
return m.sharedList(root, { json: json2 }, io);
|
|
1138
|
+
io.err("Usage: atticus join shared import|refresh|list (atticus help join)");
|
|
1139
|
+
return 2;
|
|
1140
|
+
}
|
|
1141
|
+
if (group === "estate" && command === "contracts") {
|
|
1142
|
+
const m = await import("./chunk-ZJQUIG3A.js");
|
|
1143
|
+
return m.joinContracts(root, { json: values.json === true }, io);
|
|
1144
|
+
}
|
|
1145
|
+
if (group === "estate" && command === "measure") {
|
|
1146
|
+
const m = await import("./chunk-JQX6BSE4.js");
|
|
1147
|
+
return m.joinMeasure(root, arg, { json: values.json === true }, io);
|
|
1148
|
+
}
|
|
1149
|
+
if (group === "estate" && (command === "join" || command === "flow" || command === "lineage")) {
|
|
1150
|
+
const m = await loadEstateCommands();
|
|
1151
|
+
const field = positionals[3];
|
|
1152
|
+
const depth = num(values.depth);
|
|
1153
|
+
const o = { json: values.json === true, ...depth ? { depth } : {} };
|
|
1154
|
+
if (command === "join")
|
|
1155
|
+
return m.estateJoin(root, o, io);
|
|
1156
|
+
if (!arg || command === "lineage" && !field) {
|
|
1157
|
+
io.err(command === "flow" ? "Usage: atticus estate flow <flow-id> [--depth 5] [--json]" : "Usage: atticus estate lineage <flow-id> <field> [--depth 5] [--json]");
|
|
1158
|
+
return 2;
|
|
1159
|
+
}
|
|
1160
|
+
return command === "flow" ? m.estateFlowCommand(root, arg, o, io) : m.estateLineage(root, arg, field, o, io);
|
|
1161
|
+
}
|
|
1162
|
+
if (group === "spec" && (command === "seed" || command === "accept")) {
|
|
1163
|
+
const m = await import("./chunk-XF3DATVU.js");
|
|
1164
|
+
if (!arg) {
|
|
1165
|
+
io.err(command === "seed" ? "Usage: atticus spec seed <repo> [--json]" : "Usage: atticus spec accept <repo> [--by you]");
|
|
1166
|
+
return 2;
|
|
1167
|
+
}
|
|
1168
|
+
return command === "seed" ? m.specSeed(root, arg, { json: values.json === true }, io) : m.specAccept(root, arg, { by: who() }, io);
|
|
1169
|
+
}
|
|
1170
|
+
if (group === "spec" && (command === "draft" || command === "check")) {
|
|
1171
|
+
const text = (v) => typeof v === "string" ? v : void 0;
|
|
1172
|
+
const m = await loadSpecCommands();
|
|
1173
|
+
if (!arg) {
|
|
1174
|
+
io.err(command === "draft" ? "Usage: atticus spec draft <repo> [--attempts 3] [--resume run] [--force] [--mode m]" : "Usage: atticus spec check <repo> [--json]");
|
|
1175
|
+
return 2;
|
|
1176
|
+
}
|
|
1177
|
+
if (command === "check")
|
|
1178
|
+
return m.specCheck(root, arg, { json: values.json === true }, io);
|
|
1179
|
+
const attempts = Number(text(values.attempts) ?? "3");
|
|
1180
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 10) {
|
|
1181
|
+
io.err("--attempts is a whole number from 1 to 10.");
|
|
1182
|
+
return 2;
|
|
1183
|
+
}
|
|
1184
|
+
try {
|
|
1185
|
+
const { runtime } = await runtimeForCli(root, {
|
|
1186
|
+
...text(values.mode) ? { mode: text(values.mode) } : {}
|
|
1187
|
+
});
|
|
1188
|
+
return await m.specDraft(root, arg, {
|
|
1189
|
+
attempts,
|
|
1190
|
+
force: values.force === true,
|
|
1191
|
+
...text(values.resume) ? { resume: text(values.resume) } : {}
|
|
1192
|
+
}, { runtime }, io);
|
|
1193
|
+
} catch (e) {
|
|
1194
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
1195
|
+
io.err(e.message);
|
|
1196
|
+
return 2;
|
|
1197
|
+
}
|
|
1198
|
+
throw e;
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
if (group === "map" && command === "render") {
|
|
1202
|
+
const repo = positionals[2];
|
|
1203
|
+
if (!repo) {
|
|
1204
|
+
io.err("Usage: atticus map render <repo> [--json]");
|
|
1205
|
+
return 2;
|
|
1206
|
+
}
|
|
1207
|
+
const { mapRenderCommand } = await import("./chunk-KLKENMWQ.js");
|
|
1208
|
+
return mapRenderCommand(root, repo, { json: values.json === true }, io);
|
|
1209
|
+
}
|
|
1210
|
+
if (group === "map" && !command && values.all === true) {
|
|
1211
|
+
const text = (v) => typeof v === "string" ? v : void 0;
|
|
1212
|
+
const count = (flag) => {
|
|
1213
|
+
const raw = text(values[flag]);
|
|
1214
|
+
if (raw === void 0)
|
|
1215
|
+
return void 0;
|
|
1216
|
+
const n = Number(raw);
|
|
1217
|
+
return Number.isInteger(n) && n > 0 ? n : NaN;
|
|
1218
|
+
};
|
|
1219
|
+
const numbers = {
|
|
1220
|
+
maxParts: count("max-parts"),
|
|
1221
|
+
budgetTokens: count("budget-tokens"),
|
|
1222
|
+
idle: count("idle")
|
|
1223
|
+
};
|
|
1224
|
+
for (const [k, v] of Object.entries(numbers))
|
|
1225
|
+
if (Number.isNaN(v)) {
|
|
1226
|
+
io.err(`--${k === "maxParts" ? "max-parts" : k === "budgetTokens" ? "budget-tokens" : "idle"} is a whole number above 0.`);
|
|
1227
|
+
return 2;
|
|
1228
|
+
}
|
|
1229
|
+
const asked = text(values.mode);
|
|
1230
|
+
if (asked && !["model", "hand-off", "copilot"].includes(asked)) {
|
|
1231
|
+
io.err("atticus map --all takes --mode model or --mode hand-off (Copilot Chat, a line pasted per part).");
|
|
1232
|
+
return 2;
|
|
1233
|
+
}
|
|
1234
|
+
const { mapAllCommand } = await import("./chunk-WUE6HKIU.js");
|
|
1235
|
+
const { copyToClipboard } = await import("./chunk-S5LSDXV4.js");
|
|
1236
|
+
const typed = [];
|
|
1237
|
+
const { createInterface } = await import("node:readline");
|
|
1238
|
+
const rl = process.stdin.readable ? createInterface({ input: process.stdin, terminal: false }) : void 0;
|
|
1239
|
+
rl?.on("line", (l) => typed.push(l));
|
|
1240
|
+
const ac = new AbortController();
|
|
1241
|
+
const onInt = () => {
|
|
1242
|
+
if (ac.signal.aborted)
|
|
1243
|
+
process.exit(130);
|
|
1244
|
+
ac.abort();
|
|
1245
|
+
io.err("Stopping after this step (Ctrl+C again stops at once)...");
|
|
1246
|
+
};
|
|
1247
|
+
process.on("SIGINT", onInt);
|
|
1248
|
+
try {
|
|
1249
|
+
return await mapAllCommand(root, {
|
|
1250
|
+
...text(values.repos) ? {
|
|
1251
|
+
repos: text(values.repos).split(",").map((x) => x.trim()).filter(Boolean)
|
|
1252
|
+
} : {},
|
|
1253
|
+
stale: values.stale === true,
|
|
1254
|
+
gaps: values.gaps === true,
|
|
1255
|
+
dryRun: values["dry-run"] === true,
|
|
1256
|
+
json: values.json === true,
|
|
1257
|
+
...asked ? { mode: asked === "model" ? "model" : "copilot" } : {},
|
|
1258
|
+
...numbers.maxParts ? { maxParts: numbers.maxParts } : {},
|
|
1259
|
+
...numbers.budgetTokens ? { budgetTokens: numbers.budgetTokens } : {},
|
|
1260
|
+
...numbers.idle ? { idleMinutes: numbers.idle } : {}
|
|
1261
|
+
}, io, {
|
|
1262
|
+
clipboard: copyToClipboard,
|
|
1263
|
+
input: { take: () => typed.shift() },
|
|
1264
|
+
signal: ac.signal,
|
|
1265
|
+
makeRuntime: async () => (await runtimeForCli(root, { mode: "model", handoffValidate: async () => [] })).runtime
|
|
1266
|
+
});
|
|
1267
|
+
} catch (e) {
|
|
1268
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
1269
|
+
io.err(e.message);
|
|
1270
|
+
return 2;
|
|
1271
|
+
}
|
|
1272
|
+
throw e;
|
|
1273
|
+
} finally {
|
|
1274
|
+
process.off("SIGINT", onInt);
|
|
1275
|
+
rl?.close();
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
if (group === "map") {
|
|
1279
|
+
const repo = command;
|
|
1280
|
+
if (!repo) {
|
|
1281
|
+
io.err("Usage: atticus map <repo> [--estimate | --gaps [--part n]] [--handoff | --copy [--answer <file>] | --mode m] [--next] [--max-tokens n] [--force], or atticus map --all [--stale | --gaps] [--repos a,b] [--dry-run] [--max-tokens n]");
|
|
1282
|
+
return 2;
|
|
1283
|
+
}
|
|
1284
|
+
const text = (v) => typeof v === "string" ? v : void 0;
|
|
1285
|
+
if (values.spent !== void 0 || values.sessions !== void 0) {
|
|
1286
|
+
const { mapSpent } = await import("./chunk-OHXTB6CO.js");
|
|
1287
|
+
return mapSpent(root, repo, {
|
|
1288
|
+
...text(values.spent) !== void 0 ? { spent: text(values.spent) } : {},
|
|
1289
|
+
...text(values.sessions) !== void 0 ? { sessions: text(values.sessions) } : {},
|
|
1290
|
+
...text(values.part) !== void 0 ? { part: text(values.part) } : {},
|
|
1291
|
+
...text(values.by) ? { by: text(values.by) } : {}
|
|
1292
|
+
}, io);
|
|
1293
|
+
}
|
|
1294
|
+
const { mapCommand } = await import("./chunk-D7MWYJZF.js");
|
|
1295
|
+
const o = {
|
|
1296
|
+
...text(values.dir) ? { dir: resolve(text(values.dir)) } : {},
|
|
1297
|
+
...text(values.commit) ? { commit: text(values.commit) } : {},
|
|
1298
|
+
...text(values.resume) ? { resume: text(values.resume) } : {},
|
|
1299
|
+
...text(values.answer) !== void 0 ? { answer: text(values.answer) } : {},
|
|
1300
|
+
estimate: values.estimate === true,
|
|
1301
|
+
gaps: values.gaps === true,
|
|
1302
|
+
// ADR 0161: with --gaps, the rest of one part of the read plan.
|
|
1303
|
+
...values.gaps === true && Number.isInteger(Number(text(values.part))) && Number(text(values.part)) > 0 ? { part: Number(text(values.part)) } : {},
|
|
1304
|
+
next: values.next === true,
|
|
1305
|
+
force: values.force === true,
|
|
1306
|
+
copy: values.copy === true,
|
|
1307
|
+
json: values.json === true
|
|
1308
|
+
};
|
|
1309
|
+
if (o.estimate || o.gaps)
|
|
1310
|
+
return mapCommand(root, repo, o, io);
|
|
1311
|
+
try {
|
|
1312
|
+
const { runtime } = await runtimeForCli(root, {
|
|
1313
|
+
...o.copy ? { mode: "hand-off" } : text(values.mode) ? { mode: text(values.mode) } : {},
|
|
1314
|
+
handoffValidate: async () => []
|
|
1315
|
+
});
|
|
1316
|
+
return await mapCommand(root, repo, o, io, { runtime });
|
|
1317
|
+
} catch (e) {
|
|
1318
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
1319
|
+
io.err(e.message);
|
|
1320
|
+
return 2;
|
|
1321
|
+
}
|
|
1322
|
+
throw e;
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
if (group === "verify") {
|
|
1326
|
+
const v = parseArgs({
|
|
1327
|
+
args: argv,
|
|
1328
|
+
allowPositionals: true,
|
|
1329
|
+
options: {
|
|
1330
|
+
...OPTIONS,
|
|
1331
|
+
write: { type: "boolean" },
|
|
1332
|
+
verbose: { type: "boolean" },
|
|
1333
|
+
skipped: { type: "boolean" },
|
|
1334
|
+
size: { type: "string" },
|
|
1335
|
+
seed: { type: "string" },
|
|
1336
|
+
answers: { type: "string" },
|
|
1337
|
+
right: { type: "string" },
|
|
1338
|
+
wrong: { type: "string" },
|
|
1339
|
+
unsure: { type: "string" },
|
|
1340
|
+
report: { type: "boolean" }
|
|
1341
|
+
},
|
|
1342
|
+
strict: false
|
|
1343
|
+
});
|
|
1344
|
+
const repo = v.positionals[1];
|
|
1345
|
+
const text = (x) => typeof x === "string" ? x : void 0;
|
|
1346
|
+
if (repo === "audit" && (v.positionals[2] || v.values.report === true)) {
|
|
1347
|
+
const { auditCommand } = await import("./chunk-JUQHYTXN.js");
|
|
1348
|
+
const ids = (x) => text(x)?.split(",").map((y) => y.trim()).filter(Boolean);
|
|
1349
|
+
const size = Number(text(v.values.size));
|
|
1350
|
+
const interactive = process.stdin.isTTY && v.values.json !== true;
|
|
1351
|
+
let rl;
|
|
1352
|
+
const ask = interactive ? async (q) => {
|
|
1353
|
+
const { createInterface } = await import("node:readline/promises");
|
|
1354
|
+
rl ??= createInterface({ input: process.stdin, output: process.stdout });
|
|
1355
|
+
return rl.question(`${q} `);
|
|
1356
|
+
} : void 0;
|
|
1357
|
+
try {
|
|
1358
|
+
return await auditCommand(text(v.values.root) ? resolve(text(v.values.root)) : root, v.positionals[2], {
|
|
1359
|
+
by: who(),
|
|
1360
|
+
...Number.isFinite(size) && size > 0 ? { size } : {},
|
|
1361
|
+
...text(v.values.seed) ? { seed: text(v.values.seed) } : {},
|
|
1362
|
+
...text(v.values.dir) ? { dir: resolve(text(v.values.dir)) } : {},
|
|
1363
|
+
...text(v.values.answers) ? { answers: text(v.values.answers) } : {},
|
|
1364
|
+
...ids(v.values.right) ? { right: ids(v.values.right) } : {},
|
|
1365
|
+
...ids(v.values.wrong) ? { wrong: ids(v.values.wrong) } : {},
|
|
1366
|
+
...ids(v.values.unsure) ? { unsure: ids(v.values.unsure) } : {},
|
|
1367
|
+
report: v.values.report === true,
|
|
1368
|
+
json: v.values.json === true,
|
|
1369
|
+
...ask ? { ask } : {}
|
|
1370
|
+
}, io);
|
|
1371
|
+
} finally {
|
|
1372
|
+
rl?.close();
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
if (!repo && v.values.all === true) {
|
|
1376
|
+
const { verifyAllCommand } = await import("./chunk-55TBYJF2.js");
|
|
1377
|
+
return verifyAllCommand(text(v.values.root) ? resolve(text(v.values.root)) : root, {
|
|
1378
|
+
...v.values.write === true ? { write: true } : {},
|
|
1379
|
+
...v.values.verbose === true ? { verbose: true } : {}
|
|
1380
|
+
}, io);
|
|
1381
|
+
}
|
|
1382
|
+
if (!repo) {
|
|
1383
|
+
io.err("Usage: atticus verify <repo> [--write [--verbose]] [--dir path] [--commit sha] [--routed a,b] [--skipped] [--json], or atticus verify --all [--write]");
|
|
1384
|
+
return 2;
|
|
1385
|
+
}
|
|
1386
|
+
const { verifyCommand } = await import("./chunk-55TBYJF2.js");
|
|
1387
|
+
return verifyCommand(
|
|
1388
|
+
// The first reading took --write's next word as its value, so a --root right after it
|
|
1389
|
+
// was lost; this reading has --write as a switch.
|
|
1390
|
+
text(v.values.root) ? resolve(text(v.values.root)) : root,
|
|
1391
|
+
repo,
|
|
1392
|
+
{
|
|
1393
|
+
...text(v.values.dir) ? { dir: resolve(text(v.values.dir)) } : {},
|
|
1394
|
+
...text(v.values.commit) ? { commit: text(v.values.commit) } : {},
|
|
1395
|
+
...text(v.values.routed) ? {
|
|
1396
|
+
routed: text(v.values.routed).split(",").map((x) => x.trim()).filter(Boolean)
|
|
1397
|
+
} : {},
|
|
1398
|
+
write: v.values.write === true,
|
|
1399
|
+
verbose: v.values.verbose === true,
|
|
1400
|
+
json: v.values.json === true,
|
|
1401
|
+
...v.values.skipped === true ? { skipped: true } : {}
|
|
1402
|
+
},
|
|
1403
|
+
io
|
|
1404
|
+
);
|
|
1405
|
+
}
|
|
1406
|
+
if (group === "scan" && command === "verify") {
|
|
1407
|
+
const text = (v) => typeof v === "string" ? v : void 0;
|
|
1408
|
+
if (!arg) {
|
|
1409
|
+
io.err("Usage: atticus scan verify <repo> [--attempts 3] [--resume run] [--mode m] [--json] | --accept");
|
|
1410
|
+
return 2;
|
|
1411
|
+
}
|
|
1412
|
+
const m = await loadScanVerifyCommands();
|
|
1413
|
+
if (values.accept === true) {
|
|
1414
|
+
const by = given ?? (await gitUser(root)).handle ?? "someone";
|
|
1415
|
+
return m.scanVerifyAccept(root, arg, { by }, io);
|
|
1416
|
+
}
|
|
1417
|
+
const attempts = Number(text(values.attempts) ?? "3");
|
|
1418
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 10) {
|
|
1419
|
+
io.err("--attempts is a whole number from 1 to 10.");
|
|
1420
|
+
return 2;
|
|
1421
|
+
}
|
|
1422
|
+
try {
|
|
1423
|
+
const { runtime } = await runtimeForCli(root, {
|
|
1424
|
+
...text(values.mode) ? { mode: text(values.mode) } : {}
|
|
1425
|
+
});
|
|
1426
|
+
return await m.scanVerify(root, arg, {
|
|
1427
|
+
attempts,
|
|
1428
|
+
json: values.json === true,
|
|
1429
|
+
...text(values.resume) ? { resume: text(values.resume) } : {}
|
|
1430
|
+
}, { runtime }, io);
|
|
1431
|
+
} catch (e) {
|
|
1432
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
1433
|
+
io.err(e.message);
|
|
1434
|
+
return 2;
|
|
1435
|
+
}
|
|
1436
|
+
throw e;
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
if (group === "scan" && command === "review") {
|
|
1440
|
+
const text = (v) => typeof v === "string" ? v : void 0;
|
|
1441
|
+
if (!arg) {
|
|
1442
|
+
io.err("Usage: atticus scan review <repo> [--gaps] [--name n] [--attempts 3] [--resume run] [--mode m]");
|
|
1443
|
+
return 2;
|
|
1444
|
+
}
|
|
1445
|
+
const attempts = Number(text(values.attempts) ?? "3");
|
|
1446
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 10) {
|
|
1447
|
+
io.err("--attempts is a whole number from 1 to 10.");
|
|
1448
|
+
return 2;
|
|
1449
|
+
}
|
|
1450
|
+
try {
|
|
1451
|
+
const { runtime } = await runtimeForCli(root, {
|
|
1452
|
+
...text(values.mode) ? { mode: text(values.mode) } : {}
|
|
1453
|
+
});
|
|
1454
|
+
return await scanReview(root, arg, {
|
|
1455
|
+
gapsOnly: values.gaps === true,
|
|
1456
|
+
attempts,
|
|
1457
|
+
...text(values.name) ? { name: text(values.name) } : {},
|
|
1458
|
+
...text(values.resume) ? { resume: text(values.resume) } : {}
|
|
1459
|
+
}, { runtime }, io);
|
|
1460
|
+
} catch (e) {
|
|
1461
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
1462
|
+
io.err(e.message);
|
|
1463
|
+
return 2;
|
|
1464
|
+
}
|
|
1465
|
+
throw e;
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
if (group === "scan")
|
|
1469
|
+
return scanCommand(root, {
|
|
1470
|
+
...repoIds ? { repos: repoIds } : {},
|
|
1471
|
+
full: values.full === true,
|
|
1472
|
+
dryRun: values["dry-run"] === true,
|
|
1473
|
+
json: values.json === true,
|
|
1474
|
+
noDrift: values["no-drift"] === true,
|
|
1475
|
+
warnings: values.warnings === true,
|
|
1476
|
+
...typeof values.ref === "string" && values.ref.trim() ? { ref: values.ref.trim() } : {}
|
|
1477
|
+
}, io);
|
|
1478
|
+
if (group === "cites") {
|
|
1479
|
+
const given2 = (v) => typeof v === "string" && v.trim() ? v.trim() : void 0;
|
|
1480
|
+
const [repo, path, file] = [given2(values.repo), given2(values.path), given2(values.file)];
|
|
1481
|
+
return (await import("./chunk-OJN7WME4.js")).citesCli(root, {
|
|
1482
|
+
...repo ? { repo } : {},
|
|
1483
|
+
...path ? { path } : {},
|
|
1484
|
+
...file ? { file: resolve(file) } : {},
|
|
1485
|
+
json: values.json === true
|
|
1486
|
+
}, io);
|
|
1487
|
+
}
|
|
1488
|
+
if (group === "watch")
|
|
1489
|
+
return (await import("./chunk-4YWRU7JK.js")).watchCommand(root, command, { off: values.off === true, json: values.json === true }, io);
|
|
1490
|
+
if (group === "setup" && !command)
|
|
1491
|
+
return setupCommand(root, { json: values.json === true }, io);
|
|
1492
|
+
if (group === "doctor" && values.counts === true)
|
|
1493
|
+
return (await import("./chunk-SNHOLLGN.js")).doctorCountsCommand(root, { json: values.json === true }, io);
|
|
1494
|
+
if (group === "doctor")
|
|
1495
|
+
return doctorCommand(root, { json: values.json === true }, io);
|
|
1496
|
+
if (group === "probe") {
|
|
1497
|
+
const { probeCommand, probeAnswerCommand } = await import("./chunk-NX6QEEOA.js");
|
|
1498
|
+
const max = typeof values["max-tokens"] === "string" ? Number(values["max-tokens"]) : void 0;
|
|
1499
|
+
const json2 = values.json === true;
|
|
1500
|
+
if (command === "answer")
|
|
1501
|
+
return probeAnswerCommand(root, positionals[2], { pasted: values.pasted === true, ...max !== void 0 ? { maxTokens: max } : {}, json: json2 }, io);
|
|
1502
|
+
if (command) {
|
|
1503
|
+
io.err("Usage: atticus probe [--assistant id] [--max-tokens n] [--json] | atticus probe answer <code|none> [--pasted] [--max-tokens n] [--json]");
|
|
1504
|
+
return 2;
|
|
1505
|
+
}
|
|
1506
|
+
return probeCommand(root, {
|
|
1507
|
+
...typeof values.assistant === "string" ? { assistant: values.assistant } : {},
|
|
1508
|
+
...max !== void 0 ? { maxTokens: max } : {},
|
|
1509
|
+
json: json2
|
|
1510
|
+
}, io);
|
|
1511
|
+
}
|
|
1512
|
+
if (group === "upgrade")
|
|
1513
|
+
return upgradeCommand(root, {
|
|
1514
|
+
check: values.check === true,
|
|
1515
|
+
dryRun: values["dry-run"] === true,
|
|
1516
|
+
...values.check === true || values["dry-run"] === true ? {} : { by: who() },
|
|
1517
|
+
json: values.json === true,
|
|
1518
|
+
...values["openspec-store"] === true ? { openspecStore: true } : {}
|
|
1519
|
+
}, io);
|
|
1520
|
+
if (group === "support" && command === "bundle")
|
|
1521
|
+
return supportBundleCommand(root, {
|
|
1522
|
+
...typeof values.out === "string" && values.out ? { out: values.out } : {},
|
|
1523
|
+
json: values.json === true
|
|
1524
|
+
}, io);
|
|
1525
|
+
if (group === "baseline")
|
|
1526
|
+
return baselineCommand(root, {
|
|
1527
|
+
by: who(),
|
|
1528
|
+
...typeof values.note === "string" && values.note ? { note: values.note } : {},
|
|
1529
|
+
...typeof values.site === "string" && values.site ? { site: values.site } : {}
|
|
1530
|
+
}, io);
|
|
1531
|
+
if (group === "digest")
|
|
1532
|
+
return digestCommand(root, {
|
|
1533
|
+
as: typeof values.as === "string" && values.as ? values.as : who(),
|
|
1534
|
+
...typeof values.channel === "string" && values.channel ? { channel: values.channel } : {},
|
|
1535
|
+
send: values.send === true,
|
|
1536
|
+
json: values.json === true
|
|
1537
|
+
}, io);
|
|
1538
|
+
if (group === "guide")
|
|
1539
|
+
return guideCommand(root, command, { json: values.json === true }, io);
|
|
1540
|
+
if (group === "site" && command === "build")
|
|
1541
|
+
return siteBuildCommand(root, positionals[2], { ...typeof values.title === "string" && values.title ? { title: values.title } : {} }, io);
|
|
1542
|
+
if (group === "ask") {
|
|
1543
|
+
if (!command) {
|
|
1544
|
+
io.err('ask needs a question, for example: atticus ask "who calls ledger-api?"');
|
|
1545
|
+
return 2;
|
|
1546
|
+
}
|
|
1547
|
+
return askCommand(root, command, { json: values.json === true }, io);
|
|
1548
|
+
}
|
|
1549
|
+
if (group === "context") {
|
|
1550
|
+
const m = await import("./chunk-GWSWS264.js");
|
|
1551
|
+
const target = positionals[2];
|
|
1552
|
+
const csv = (v) => typeof v === "string" ? v.split(",").map((k) => k.trim()).filter(Boolean) : void 0;
|
|
1553
|
+
if (command === "tools")
|
|
1554
|
+
return m.contextTools({ json: values.json === true }, io);
|
|
1555
|
+
if (command === "show" || command === "walk") {
|
|
1556
|
+
if (!target) {
|
|
1557
|
+
io.err(`Usage: atticus context ${command} <id> (an id the index has; atticus query "<words>" --search finds one)`);
|
|
1558
|
+
return 2;
|
|
1559
|
+
}
|
|
1560
|
+
if (command === "show")
|
|
1561
|
+
return m.contextShow(root, target, io);
|
|
1562
|
+
return m.contextWalk(root, target, {
|
|
1563
|
+
...num(values.hops) ? { hops: num(values.hops) } : {},
|
|
1564
|
+
...csv(values.kind) ? { kinds: csv(values.kind) } : {},
|
|
1565
|
+
...num(values.limit) ? { limit: num(values.limit) } : {}
|
|
1566
|
+
}, io);
|
|
1567
|
+
}
|
|
1568
|
+
if (command === "code") {
|
|
1569
|
+
const repo = typeof values.repo === "string" ? values.repo : void 0;
|
|
1570
|
+
const path = typeof values.path === "string" ? values.path : void 0;
|
|
1571
|
+
if (!target && !(repo && path && num(values.line))) {
|
|
1572
|
+
io.err("Usage: atticus context code <id>, or --repo <repo> --path <path> --line <n> (a line a fact cites)");
|
|
1573
|
+
return 2;
|
|
1574
|
+
}
|
|
1575
|
+
const around = typeof values.around === "string" ? Number(values.around) : void 0;
|
|
1576
|
+
return m.contextCode(root, {
|
|
1577
|
+
...target ? { id: target } : {},
|
|
1578
|
+
...repo ? { repo } : {},
|
|
1579
|
+
...path ? { path } : {},
|
|
1580
|
+
...num(values.line) ? { line: num(values.line) } : {},
|
|
1581
|
+
...around !== void 0 && Number.isInteger(around) ? { around } : {}
|
|
1582
|
+
}, io);
|
|
1583
|
+
}
|
|
1584
|
+
const repoOpt = typeof values.repo === "string" && values.repo ? values.repo : void 0;
|
|
1585
|
+
if (command === "grep") {
|
|
1586
|
+
if (!target) {
|
|
1587
|
+
io.err('Usage: atticus context grep "<pattern>" [--regex] [--ignore-case] [--repo r] [--paths glob] [--limit n]');
|
|
1588
|
+
return 2;
|
|
1589
|
+
}
|
|
1590
|
+
return m.contextGrep(root, target, {
|
|
1591
|
+
...values.regex === true ? { regex: true } : {},
|
|
1592
|
+
...values["ignore-case"] === true ? { ignoreCase: true } : {},
|
|
1593
|
+
...repoOpt ? { repo: repoOpt } : {},
|
|
1594
|
+
...typeof values.paths === "string" && values.paths ? { paths: values.paths } : {},
|
|
1595
|
+
...num(values.limit) ? { limit: num(values.limit) } : {}
|
|
1596
|
+
}, io);
|
|
1597
|
+
}
|
|
1598
|
+
if (command === "files") {
|
|
1599
|
+
if (!target) {
|
|
1600
|
+
io.err('Usage: atticus context files "<glob>" [--repo r] [--limit n], e.g. "src/**/*.java"');
|
|
1601
|
+
return 2;
|
|
1602
|
+
}
|
|
1603
|
+
return m.contextFiles(root, target, {
|
|
1604
|
+
...repoOpt ? { repo: repoOpt } : {},
|
|
1605
|
+
...num(values.limit) ? { limit: num(values.limit) } : {}
|
|
1606
|
+
}, io);
|
|
1607
|
+
}
|
|
1608
|
+
if (command === "outline") {
|
|
1609
|
+
const file = positionals[3];
|
|
1610
|
+
if (!target || !file) {
|
|
1611
|
+
io.err("Usage: atticus context outline <repo> <path> (the file's path in the repo)");
|
|
1612
|
+
return 2;
|
|
1613
|
+
}
|
|
1614
|
+
return m.contextOutline(root, target, file, io);
|
|
1615
|
+
}
|
|
1616
|
+
if (command === "call") {
|
|
1617
|
+
if (!target) {
|
|
1618
|
+
io.err("Usage: atticus context call <tool> --input <json> [--run <run>] (atticus context tools lists the tools)");
|
|
1619
|
+
return 2;
|
|
1620
|
+
}
|
|
1621
|
+
return m.contextCall(root, target, {
|
|
1622
|
+
...typeof values.input === "string" ? { input: values.input } : {},
|
|
1623
|
+
...typeof values.run === "string" ? { run: values.run } : {},
|
|
1624
|
+
...num(values.round) ? { round: num(values.round) } : {},
|
|
1625
|
+
json: values.json === true
|
|
1626
|
+
}, io);
|
|
1627
|
+
}
|
|
1628
|
+
if (command === "similar") {
|
|
1629
|
+
if (!target) {
|
|
1630
|
+
io.err("Usage: atticus context similar <id> [--kind k,k] [--limit n]");
|
|
1631
|
+
return 2;
|
|
1632
|
+
}
|
|
1633
|
+
return m.contextSimilar(root, target, {
|
|
1634
|
+
...csv(values.kind) ? { kinds: csv(values.kind) } : {},
|
|
1635
|
+
...num(values.limit) ? { limit: num(values.limit) } : {}
|
|
1636
|
+
}, io);
|
|
1637
|
+
}
|
|
1638
|
+
io.err(`context takes show, walk, code, grep, files, outline, similar, tools or call; not ${command ?? "nothing"}.`);
|
|
1639
|
+
return 2;
|
|
1640
|
+
}
|
|
1641
|
+
if (group === "query") {
|
|
1642
|
+
if (!command) {
|
|
1643
|
+
io.err('query needs a query, for example: atticus query "kind:interface via:gateway"');
|
|
1644
|
+
return 2;
|
|
1645
|
+
}
|
|
1646
|
+
if (values.search === true)
|
|
1647
|
+
return searchCommand(root, command, {
|
|
1648
|
+
json: values.json === true,
|
|
1649
|
+
...num(values.limit) ? { limit: num(values.limit) } : {},
|
|
1650
|
+
...typeof values.kind === "string" ? { kind: values.kind } : {},
|
|
1651
|
+
...typeof values.by === "string" ? { by: values.by } : {}
|
|
1652
|
+
}, io);
|
|
1653
|
+
return queryCommand(root, command, { json: values.json === true, ...num(values.limit) ? { limit: num(values.limit) } : {} }, io);
|
|
1654
|
+
}
|
|
1655
|
+
if (group === "impact") {
|
|
1656
|
+
if (!command) {
|
|
1657
|
+
io.err("impact needs a record id, for example: atticus impact ledger-db.entry");
|
|
1658
|
+
return 2;
|
|
1659
|
+
}
|
|
1660
|
+
return impactCommand(root, command, { json: values.json === true, ...num(values.depth) ? { depth: num(values.depth) } : {} }, io);
|
|
1661
|
+
}
|
|
1662
|
+
if (group === "index" && command === "rebuild")
|
|
1663
|
+
return indexRebuild(root, io);
|
|
1664
|
+
if (group === "index" && command === "embed")
|
|
1665
|
+
return (await import("./chunk-LZWVK4YY.js")).indexEmbed(root, io);
|
|
1666
|
+
if (group === "alias") {
|
|
1667
|
+
const target = positionals[2];
|
|
1668
|
+
if (!command || !target) {
|
|
1669
|
+
io.err('alias needs a name and an id, for example: atticus alias "Ledger Platform" ledger-api');
|
|
1670
|
+
return 2;
|
|
1671
|
+
}
|
|
1672
|
+
return aliasCommand(root, command, target, {
|
|
1673
|
+
by: who(),
|
|
1674
|
+
...typeof values.reason === "string" ? { reason: values.reason } : {}
|
|
1675
|
+
}, io);
|
|
1676
|
+
}
|
|
1677
|
+
const str = (v) => typeof v === "string" ? v : void 0;
|
|
1678
|
+
const json = values.json === true;
|
|
1679
|
+
if (group === "initiative") {
|
|
1680
|
+
const by = command === "status" ? void 0 : who();
|
|
1681
|
+
const systems = Array.isArray(values.system) ? values.system : [];
|
|
1682
|
+
if (command === "new")
|
|
1683
|
+
return initiativeNew(root, {
|
|
1684
|
+
...arg ? { title: positionals.slice(2).join(" ") } : {},
|
|
1685
|
+
...str(values.journey) ? { journey: str(values.journey) } : {},
|
|
1686
|
+
...by ? { by } : {},
|
|
1687
|
+
...str(values.id) ? { id: str(values.id) } : {},
|
|
1688
|
+
...str(values.release) ? { release: str(values.release) } : {},
|
|
1689
|
+
...str(values.epic) ? { epic: str(values.epic) } : {},
|
|
1690
|
+
json
|
|
1691
|
+
}, io);
|
|
1692
|
+
if (command === "plan")
|
|
1693
|
+
return initiativePlan(root, arg, {
|
|
1694
|
+
...str(values.target) ? { target: str(values.target) } : {},
|
|
1695
|
+
...str(values.release) ? { release: str(values.release) } : {},
|
|
1696
|
+
...systems.length ? { systems } : {},
|
|
1697
|
+
...by ? { by } : {},
|
|
1698
|
+
dryRun: values["dry-run"] === true,
|
|
1699
|
+
json
|
|
1700
|
+
}, io);
|
|
1701
|
+
if (command === "status")
|
|
1702
|
+
return initiativeStatus(root, arg, { json }, io);
|
|
1703
|
+
if (command === "request")
|
|
1704
|
+
return requestFromTeam(root, arg, positionals[3], { ...by ? { by } : {}, ...systems.length ? { systems } : {}, json }, io);
|
|
1705
|
+
if (command === "commit")
|
|
1706
|
+
return initiativeCommitment(root, arg, positionals[3], { ...by ? { by } : {} }, io);
|
|
1707
|
+
}
|
|
1708
|
+
if (group === "learn") {
|
|
1709
|
+
if (!command || command === "list")
|
|
1710
|
+
return learnList(root, { json }, io);
|
|
1711
|
+
if (command === "start")
|
|
1712
|
+
return learnStart(root, arg, { json }, io);
|
|
1713
|
+
if (command === "check")
|
|
1714
|
+
return learnCheck(root, {
|
|
1715
|
+
...str(values.answer) ? { answer: str(values.answer) } : {},
|
|
1716
|
+
...str(values.lesson) ? { lesson: str(values.lesson) } : {},
|
|
1717
|
+
...str(values.step) ? { step: str(values.step) } : {},
|
|
1718
|
+
json
|
|
1719
|
+
}, io);
|
|
1720
|
+
}
|
|
1721
|
+
if (group === "sandbox" && command === "create")
|
|
1722
|
+
return sandboxCreate(arg ? resolve(arg) : void 0, { json }, io);
|
|
1723
|
+
if (group === "explain")
|
|
1724
|
+
return explainCommand(root, positionals.slice(1).join(" ") || void 0, { json }, io);
|
|
1725
|
+
if (group === "eval" && command === "run")
|
|
1726
|
+
return evalRun(root, {
|
|
1727
|
+
...Array.isArray(values.agent) ? { agent: values.agent } : {},
|
|
1728
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
1729
|
+
...num(values.runs) ? { runs: num(values.runs) } : {},
|
|
1730
|
+
json
|
|
1731
|
+
}, io);
|
|
1732
|
+
if (group === "eval" && command === "report")
|
|
1733
|
+
return evalReport(root, { json }, io);
|
|
1734
|
+
if (group === "bench" && (command === "facts" || command === "stories")) {
|
|
1735
|
+
const m = await import("./chunk-GG6HIU74.js");
|
|
1736
|
+
return m.benchScoreCli(command, arg, values, io, root);
|
|
1737
|
+
}
|
|
1738
|
+
if (group === "bench" && (command === "fetch" || command === "run" || command === "survey" || command === "verify")) {
|
|
1739
|
+
const b = {
|
|
1740
|
+
...str(values.bench) ? { bench: str(values.bench) } : {},
|
|
1741
|
+
...str(values.cache) ? { cache: str(values.cache) } : {},
|
|
1742
|
+
...str(values.repo) ? { repo: str(values.repo) } : {},
|
|
1743
|
+
...num(values.batch) ? { batch: num(values.batch) } : {},
|
|
1744
|
+
...str(values.estate) ? { estate: str(values.estate) } : {},
|
|
1745
|
+
json
|
|
1746
|
+
};
|
|
1747
|
+
if (command === "survey")
|
|
1748
|
+
return benchSurvey({ ...b, ...str(values.mode) ? { mode: str(values.mode) } : {} }, io);
|
|
1749
|
+
if (command === "verify")
|
|
1750
|
+
return benchVerify({ ...b, ...str(values.mode) ? { mode: str(values.mode) } : {} }, io);
|
|
1751
|
+
return command === "fetch" ? benchFetch(b, io) : benchRun({ ...b, ...values.specs === true ? { specs: true } : {} }, io);
|
|
1752
|
+
}
|
|
1753
|
+
if (group === "mcp") {
|
|
1754
|
+
const run = async (argv2) => {
|
|
1755
|
+
const out = [];
|
|
1756
|
+
const err = [];
|
|
1757
|
+
const code = await main([...argv2, "--root", root], { out: (l) => out.push(l), err: (l) => err.push(l) }, { quiet: true });
|
|
1758
|
+
return { code, out: out.join("\n"), err: err.join("\n") };
|
|
1759
|
+
};
|
|
1760
|
+
const { serveMcp } = await import("./chunk-EADP3PEN.js");
|
|
1761
|
+
await serveMcp(process.stdin, process.stdout, run, VERSION);
|
|
1762
|
+
return 0;
|
|
1763
|
+
}
|
|
1764
|
+
if (group === "ui") {
|
|
1765
|
+
if (values.embed !== void 0 && values.embed !== "vscode") {
|
|
1766
|
+
io.err(`--embed takes vscode (the app in a VS Code panel), not ${values.embed}.`);
|
|
1767
|
+
return 2;
|
|
1768
|
+
}
|
|
1769
|
+
const parent = values.parent === void 0 ? void 0 : Number(values.parent);
|
|
1770
|
+
if (parent !== void 0 && !(Number.isInteger(parent) && parent > 0)) {
|
|
1771
|
+
io.err(`--parent takes a process id, not ${String(values.parent)}.`);
|
|
1772
|
+
return 2;
|
|
1773
|
+
}
|
|
1774
|
+
return uiCommand(root, {
|
|
1775
|
+
// --port 0 asks for any free port.
|
|
1776
|
+
...values.port === "0" ? { port: 0 } : num(values.port) ? { port: num(values.port) } : {},
|
|
1777
|
+
open: values.open === true,
|
|
1778
|
+
showToken: values["show-token"] === true,
|
|
1779
|
+
...values.full === true ? { full: true } : {},
|
|
1780
|
+
...values.embed === "vscode" ? { embed: "vscode" } : {},
|
|
1781
|
+
...parent !== void 0 ? { parent } : {},
|
|
1782
|
+
version: VERSION,
|
|
1783
|
+
...given ? { user: given } : {}
|
|
1784
|
+
}, io);
|
|
1785
|
+
}
|
|
1786
|
+
if (group === "secret") {
|
|
1787
|
+
const { secretCommand } = await import("./chunk-SG5KY4VB.js");
|
|
1788
|
+
return secretCommand(positionals.slice(1), io);
|
|
1789
|
+
}
|
|
1790
|
+
if (group === "conformance") {
|
|
1791
|
+
if (!command) {
|
|
1792
|
+
io.err("conformance needs a folder or file to check, for example: atticus conformance catalog --kind catalog");
|
|
1793
|
+
return 2;
|
|
1794
|
+
}
|
|
1795
|
+
return conformanceCommand(command, {
|
|
1796
|
+
...str(values.kind) ? { kind: str(values.kind) } : {},
|
|
1797
|
+
...str(values.executor) ? { executor: str(values.executor) } : {},
|
|
1798
|
+
...str(values.fixture) ? { fixture: str(values.fixture) } : {},
|
|
1799
|
+
json
|
|
1800
|
+
}, io);
|
|
1801
|
+
}
|
|
1802
|
+
if (group === "defences" && command === "scan")
|
|
1803
|
+
return defencesScan(root, arg ? resolve(arg) : void 0, { json, all: values.all === true }, io);
|
|
1804
|
+
if (group === "tests" && command === "generate")
|
|
1805
|
+
return testsGenerate(root, arg, positionals[3], {
|
|
1806
|
+
...str(values.framework) ? { framework: str(values.framework) } : {},
|
|
1807
|
+
force: values.force === true,
|
|
1808
|
+
check: values.check === true,
|
|
1809
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
1810
|
+
...str(values.resume) ? { resume: str(values.resume) } : {},
|
|
1811
|
+
json
|
|
1812
|
+
}, io);
|
|
1813
|
+
if (group === "trace")
|
|
1814
|
+
return traceCommand(root, command, { json, csv: values.csv === true, write: values["no-write"] !== true }, io);
|
|
1815
|
+
if (group === "release") {
|
|
1816
|
+
if (command === "plan")
|
|
1817
|
+
return releasePlanCommand(root, arg, { json }, io);
|
|
1818
|
+
if (command === "forecast")
|
|
1819
|
+
return releaseForecastCommand(root, arg, { json }, io);
|
|
1820
|
+
if (command === "evidence")
|
|
1821
|
+
return releaseEvidenceCommand(root, arg, { ...str(values.out) ? { out: str(values.out) } : {}, json }, io);
|
|
1822
|
+
if (command === "notes")
|
|
1823
|
+
return releaseNotesCommand(root, arg, { ...str(values.audience) ? { audience: str(values.audience) } : {}, json }, io);
|
|
1824
|
+
if (command === "security")
|
|
1825
|
+
return releaseSecurityCommand(root, arg, { json }, io);
|
|
1826
|
+
}
|
|
1827
|
+
if (group === "outcome" && (!command || command === "list"))
|
|
1828
|
+
return outcomeList(root, { ...str(values.change) ? { change: str(values.change) } : {}, json }, io);
|
|
1829
|
+
if (group === "outcome" && command === "record")
|
|
1830
|
+
return outcomeRecord(root, arg, positionals[3], {
|
|
1831
|
+
...str(values.value) ? { value: str(values.value) } : {},
|
|
1832
|
+
by: who(),
|
|
1833
|
+
...str(values.note) ? { note: str(values.note) } : {},
|
|
1834
|
+
json
|
|
1835
|
+
}, io);
|
|
1836
|
+
if (group === "ci" && command === "drift")
|
|
1837
|
+
return ciDrift(resolve(arg ?? "."), {
|
|
1838
|
+
...str(values.catalog) ? { catalog: resolve(str(values.catalog)) } : {},
|
|
1839
|
+
json: str(values["json-out"]) ?? json,
|
|
1840
|
+
...str(values.junit) ? { junit: str(values.junit) } : {},
|
|
1841
|
+
...str(values.summary) ? { summary: str(values.summary) } : {},
|
|
1842
|
+
warnOnly: values["warn-only"] === true,
|
|
1843
|
+
...str(values.repo) ? { repo: str(values.repo) } : {}
|
|
1844
|
+
}, io);
|
|
1845
|
+
if (group === "ci" && command === "snippet")
|
|
1846
|
+
return ciSnippet(arg, io, { ...str(values.write) ? { write: str(values.write) } : {} });
|
|
1847
|
+
if (group === "ci" && command === "archive-gate")
|
|
1848
|
+
return ciArchiveGate(root, arg, { ...Array.isArray(values.drift) ? { drift: values.drift } : {}, json }, io);
|
|
1849
|
+
if (group === "glossary") {
|
|
1850
|
+
const by = ["define", "link", "alias"].includes(command ?? "") ? who() : void 0;
|
|
1851
|
+
if (command === "list")
|
|
1852
|
+
return glossaryList(root, { json }, io);
|
|
1853
|
+
if (command === "scan")
|
|
1854
|
+
return glossaryScan(root, { ...str(values.mode) ? { mode: str(values.mode) } : {}, json }, io);
|
|
1855
|
+
const ownerOne = Array.isArray(values.owner) ? values.owner[0] : str(values.owner);
|
|
1856
|
+
if (command === "define")
|
|
1857
|
+
return glossaryDefine(root, arg, positionals.slice(3).join(" ") || void 0, { ...by ? { by } : {}, ...ownerOne ? { owner: ownerOne } : {} }, io);
|
|
1858
|
+
if (command === "link")
|
|
1859
|
+
return glossaryLink(root, arg, positionals[3], { ...by ? { by } : {} }, io);
|
|
1860
|
+
if (command === "alias")
|
|
1861
|
+
return glossaryAlias(root, arg, positionals.slice(3), { ...by ? { by } : {} }, io);
|
|
1862
|
+
}
|
|
1863
|
+
if (group === "init") {
|
|
1864
|
+
const owner = Array.isArray(values.owner) ? values.owner[0] : str(values.owner);
|
|
1865
|
+
const dir = resolve(command ?? ".");
|
|
1866
|
+
const code = await initCommand(dir, {
|
|
1867
|
+
...command ? { name: basename(dir) } : {},
|
|
1868
|
+
...str(values.platform) ? { platform: str(values.platform) } : {},
|
|
1869
|
+
...str(values.from) ? { packFrom: resolve(str(values.from)) } : {},
|
|
1870
|
+
...owner ? { owner } : {},
|
|
1871
|
+
...values["openspec-store"] === true ? { openspecStore: true } : {},
|
|
1872
|
+
json
|
|
1873
|
+
}, io);
|
|
1874
|
+
return code;
|
|
1875
|
+
}
|
|
1876
|
+
if (group === "adopt")
|
|
1877
|
+
return adoptCommand(resolve(command ?? "."), {
|
|
1878
|
+
json,
|
|
1879
|
+
...str(values.platform) ? { platform: str(values.platform) } : {},
|
|
1880
|
+
...str(values.name) ? { name: str(values.name) } : {}
|
|
1881
|
+
}, io);
|
|
1882
|
+
if (group === "unadopt")
|
|
1883
|
+
return unadoptCommand(resolve(command ?? "."), io);
|
|
1884
|
+
if (group === "repos" && command === "discover")
|
|
1885
|
+
return reposDiscoverCommand(root, {
|
|
1886
|
+
...arg ? { from: resolve(arg) } : {},
|
|
1887
|
+
...str(values.org) ? { org: str(values.org) } : {},
|
|
1888
|
+
...str(values.platform) ? { platform: str(values.platform) } : {},
|
|
1889
|
+
dryRun: values["dry-run"] === true,
|
|
1890
|
+
json
|
|
1891
|
+
}, io);
|
|
1892
|
+
if (group === "absorb") {
|
|
1893
|
+
if (str(values.refresh))
|
|
1894
|
+
return absorbRefreshCommand(root, str(values.refresh), { json }, io);
|
|
1895
|
+
if (command === "accept")
|
|
1896
|
+
return absorbAcceptCommand(root, arg ?? "", { replace: values.replace === true, dryRun: values["dry-run"] === true, json }, io);
|
|
1897
|
+
if (!command) {
|
|
1898
|
+
io.err("absorb needs a git URL or a folder, for example: atticus absorb ../payments-metarepo --id payments");
|
|
1899
|
+
return 2;
|
|
1900
|
+
}
|
|
1901
|
+
return absorbCommand(root, command, {
|
|
1902
|
+
...str(values.id) ? { id: str(values.id) } : {},
|
|
1903
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
1904
|
+
...str(values.ref) ? { ref: str(values.ref) } : {},
|
|
1905
|
+
json,
|
|
1906
|
+
dryRun: values["dry-run"] === true
|
|
1907
|
+
}, io);
|
|
1908
|
+
}
|
|
1909
|
+
const approver = values.approve === true ? who() : void 0;
|
|
1910
|
+
const dryRun = values["dry-run"] === true;
|
|
1911
|
+
if (group === "plan") {
|
|
1912
|
+
if (!arg) {
|
|
1913
|
+
io.err(`plan ${command ?? ""} needs a change id, for example: atticus plan stories add-transfer-limit`.replace(" ", " "));
|
|
1914
|
+
return 2;
|
|
1915
|
+
}
|
|
1916
|
+
if (command === "stories")
|
|
1917
|
+
return planStories(root, arg, {
|
|
1918
|
+
force: values.force === true,
|
|
1919
|
+
draft: values.draft === true,
|
|
1920
|
+
...str(values.resume) ? { resume: str(values.resume) } : {},
|
|
1921
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
1922
|
+
json
|
|
1923
|
+
}, io);
|
|
1924
|
+
if (command === "snow")
|
|
1925
|
+
return snowDraft(root, arg, { force: values.force === true, json }, io);
|
|
1926
|
+
if (command === "bar")
|
|
1927
|
+
return storyBarCommand(root, arg, { ...str(values.eval) ? { eval: str(values.eval) } : {}, json }, io);
|
|
1928
|
+
if (command === "submit")
|
|
1929
|
+
return snowSubmit(root, arg, { ...approver ? { approve: approver } : {}, dryRun, json }, io);
|
|
1930
|
+
}
|
|
1931
|
+
if (group === "ado" && command === "sync") {
|
|
1932
|
+
if (!arg) {
|
|
1933
|
+
io.err("ado sync needs a change id");
|
|
1934
|
+
return 2;
|
|
1935
|
+
}
|
|
1936
|
+
return adoSync(root, arg, {
|
|
1937
|
+
...approver ? { approve: approver } : {},
|
|
1938
|
+
dryRun,
|
|
1939
|
+
...str(values.epic) ? { epic: str(values.epic) } : {},
|
|
1940
|
+
json
|
|
1941
|
+
}, io);
|
|
1942
|
+
}
|
|
1943
|
+
if (group === "templates" && command === "draft")
|
|
1944
|
+
return templatesDraft(root, {
|
|
1945
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
1946
|
+
json,
|
|
1947
|
+
noAi: values["no-ai"] === true
|
|
1948
|
+
}, io);
|
|
1949
|
+
if (group === "executors" && command === "check")
|
|
1950
|
+
return executorsCheck(root, { json }, io);
|
|
1951
|
+
if (group === "todo") {
|
|
1952
|
+
if (!command || command === "list")
|
|
1953
|
+
return todoList(root, {
|
|
1954
|
+
json,
|
|
1955
|
+
...str(values.change) ? { change: str(values.change) } : {},
|
|
1956
|
+
all: values.all === true
|
|
1957
|
+
}, io);
|
|
1958
|
+
if (!arg) {
|
|
1959
|
+
io.err(`todo ${command} needs a step id; see atticus todo`);
|
|
1960
|
+
return 2;
|
|
1961
|
+
}
|
|
1962
|
+
if (command === "show")
|
|
1963
|
+
return todoShow(root, arg, { ...str(values.export) ? { export: str(values.export) } : {} }, io);
|
|
1964
|
+
if (command === "done") {
|
|
1965
|
+
const results = Array.isArray(values.result) ? values.result : [];
|
|
1966
|
+
return todoDone(root, arg, {
|
|
1967
|
+
result: results,
|
|
1968
|
+
by: who(),
|
|
1969
|
+
skip: values.skip === true,
|
|
1970
|
+
...str(values.note) ? { note: str(values.note) } : {}
|
|
1971
|
+
}, io);
|
|
1972
|
+
}
|
|
1973
|
+
if (command === "run")
|
|
1974
|
+
return todoRun(root, arg, {
|
|
1975
|
+
...str(values.with) ? { with: str(values.with) } : {},
|
|
1976
|
+
...approver ? { approve: approver } : {},
|
|
1977
|
+
...str(values.inputs) ? { inputs: str(values.inputs) } : {},
|
|
1978
|
+
fillOnly: values["fill-only"] === true
|
|
1979
|
+
}, io);
|
|
1980
|
+
}
|
|
1981
|
+
if (group === "task" && command === "context")
|
|
1982
|
+
return (await import("./chunk-OFWYZH6B.js")).taskContextCli(root, arg, positionals[3], { json, markdown: values.markdown === true }, io);
|
|
1983
|
+
if (group === "change" && command === "attach")
|
|
1984
|
+
return (await import("./chunk-OFWYZH6B.js")).changeAttachCli(root, arg, positionals.slice(3), {
|
|
1985
|
+
by: who(),
|
|
1986
|
+
json,
|
|
1987
|
+
...typeof values.replaces === "string" && values.replaces.trim() ? { replaces: values.replaces.trim() } : {},
|
|
1988
|
+
...typeof values.promote === "string" && values.promote.trim() ? { promote: values.promote.trim() } : {},
|
|
1989
|
+
...typeof values.like === "string" && values.like.trim() ? { like: values.like.trim() } : {},
|
|
1990
|
+
...typeof values.prototype === "string" && values.prototype.trim() ? { prototype: values.prototype.trim() } : {}
|
|
1991
|
+
}, io);
|
|
1992
|
+
if (group === "task" && command === "run")
|
|
1993
|
+
return taskRun(root, arg, positionals[3], {
|
|
1994
|
+
...str(values.level) ? { level: str(values.level) } : {},
|
|
1995
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
1996
|
+
by: who(),
|
|
1997
|
+
approve: values.approve === true,
|
|
1998
|
+
json
|
|
1999
|
+
}, io);
|
|
2000
|
+
if (group === "spec" && command === "hand-down")
|
|
2001
|
+
return specHandDown(root, arg, positionals[3], { force: values.force === true, json }, io);
|
|
2002
|
+
if (group === "spec" && command === "hand-up")
|
|
2003
|
+
return specHandUp(root, arg, positionals[3], {
|
|
2004
|
+
by: who(),
|
|
2005
|
+
...num(values.pr) ? { pr: num(values.pr) } : {},
|
|
2006
|
+
...str(values["pr-url"]) ? { prUrl: str(values["pr-url"]) } : {},
|
|
2007
|
+
json
|
|
2008
|
+
}, io);
|
|
2009
|
+
if (group === "drift")
|
|
2010
|
+
return driftCommand(root, command, { json }, io);
|
|
2011
|
+
if (group === "assistant-files" && existsSync(join(root, ".atticus", "adopted.yaml")))
|
|
2012
|
+
return zeroInstallCommand(root, { check: values.check === true, force: values.force === true }, io);
|
|
2013
|
+
if (group === "assistant-files")
|
|
2014
|
+
return assistantFiles(root, {
|
|
2015
|
+
...str(values.repo) ? { repo: str(values.repo) } : {},
|
|
2016
|
+
...str(values.change) ? { change: str(values.change) } : {},
|
|
2017
|
+
force: values.force === true,
|
|
2018
|
+
check: values.check === true,
|
|
2019
|
+
json
|
|
2020
|
+
}, io);
|
|
2021
|
+
if (group === "catalog" && command === "migrate")
|
|
2022
|
+
return catalogMigrate(root, io, { dryRun: values["dry-run"] === true });
|
|
2023
|
+
if (group === "feature") {
|
|
2024
|
+
const rest = positionals.slice(3);
|
|
2025
|
+
const writes = ["name", "tag", "merge", "split", "link"].includes(command ?? "");
|
|
2026
|
+
const by = writes ? who() : void 0;
|
|
2027
|
+
const firstOwner = Array.isArray(values.owner) ? values.owner[0] : str(values.owner);
|
|
2028
|
+
if (command === "list")
|
|
2029
|
+
return featureList(root, { json }, io);
|
|
2030
|
+
if (command === "suggest-links")
|
|
2031
|
+
return featureSuggestLinks(root, { json }, io);
|
|
2032
|
+
if (command === "suggest-names") {
|
|
2033
|
+
try {
|
|
2034
|
+
const { runtime } = await runtimeForCli(root, {
|
|
2035
|
+
...str(values.mode) ? { mode: str(values.mode) } : {}
|
|
2036
|
+
});
|
|
2037
|
+
return await featureSuggestNames(root, { runtime, json }, io);
|
|
2038
|
+
} catch (e) {
|
|
2039
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
2040
|
+
io.err(e.message);
|
|
2041
|
+
return 2;
|
|
2042
|
+
}
|
|
2043
|
+
throw e;
|
|
2044
|
+
}
|
|
2045
|
+
}
|
|
2046
|
+
if (!arg) {
|
|
2047
|
+
io.err(`feature ${command ?? ""} needs a feature id, for example: atticus feature show feature.transfers`);
|
|
2048
|
+
return 2;
|
|
2049
|
+
}
|
|
2050
|
+
if (command === "show")
|
|
2051
|
+
return featureShow(root, arg, { json }, io);
|
|
2052
|
+
if (command === "spec")
|
|
2053
|
+
return featureSpec(root, arg, io);
|
|
2054
|
+
if (command === "name") {
|
|
2055
|
+
if (!rest[0]) {
|
|
2056
|
+
io.err('feature name needs a name, for example: atticus feature name feature.transfers "Transfer money"');
|
|
2057
|
+
return 2;
|
|
2058
|
+
}
|
|
2059
|
+
return featureName(root, arg, rest.join(" "), {
|
|
2060
|
+
...by ? { by } : {},
|
|
2061
|
+
...str(values.description) ? { description: str(values.description) } : {},
|
|
2062
|
+
...firstOwner ? { owner: firstOwner } : {}
|
|
2063
|
+
}, io);
|
|
2064
|
+
}
|
|
2065
|
+
if (command === "tag")
|
|
2066
|
+
return featureTag(root, arg, rest, { ...by ? { by } : {} }, io);
|
|
2067
|
+
if (command === "merge")
|
|
2068
|
+
return featureMerge(root, arg, rest, { ...by ? { by } : {} }, io);
|
|
2069
|
+
if (command === "split")
|
|
2070
|
+
return featureSplit(root, arg, rest, {
|
|
2071
|
+
...by ? { by } : {},
|
|
2072
|
+
...str(values.name) ? { name: str(values.name) } : {},
|
|
2073
|
+
...str(values.into) ? { into: str(values.into) } : {}
|
|
2074
|
+
}, io);
|
|
2075
|
+
if (command === "link") {
|
|
2076
|
+
if (!rest[0]) {
|
|
2077
|
+
io.err("feature link needs a reference, for example: atticus feature link feature.transfers ado:1234");
|
|
2078
|
+
return 2;
|
|
2079
|
+
}
|
|
2080
|
+
return featureLink(root, arg, rest[0], { ...by ? { by } : {}, ...str(values.title) ? { title: str(values.title) } : {} }, io);
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
if (group === "critic" && command === "stats")
|
|
2084
|
+
return criticStats(root, { json }, io);
|
|
2085
|
+
if (group === "critic") {
|
|
2086
|
+
if (!command) {
|
|
2087
|
+
io.err("critic needs a change id, for example: atticus critic add-transfer-limit --gate design");
|
|
2088
|
+
return 2;
|
|
2089
|
+
}
|
|
2090
|
+
return critic(root, command, {
|
|
2091
|
+
...str(values.gate) ? { gate: str(values.gate) } : {},
|
|
2092
|
+
...str(values.lens) ? { lens: str(values.lens) } : {},
|
|
2093
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
2094
|
+
...values.resume ? { resume: true } : {},
|
|
2095
|
+
json
|
|
2096
|
+
}, io);
|
|
2097
|
+
}
|
|
2098
|
+
if (group === "findings") {
|
|
2099
|
+
if (!command) {
|
|
2100
|
+
io.err("findings needs a change id");
|
|
2101
|
+
return 2;
|
|
2102
|
+
}
|
|
2103
|
+
return findings(root, command, { json }, io);
|
|
2104
|
+
}
|
|
2105
|
+
if (group === "finding") {
|
|
2106
|
+
const [findingId, action] = positionals.slice(2);
|
|
2107
|
+
if (!command || !findingId || !action) {
|
|
2108
|
+
io.err('finding needs a change, a finding id and an action, for example: atticus finding add-transfer-limit f-1 not-relevant --reason "..."');
|
|
2109
|
+
return 2;
|
|
2110
|
+
}
|
|
2111
|
+
const session = given ? void 0 : (await import("./chunk-7SZPENUP.js")).assistantSession(process.env);
|
|
2112
|
+
if (session)
|
|
2113
|
+
io.err(`Recorded as ${session.by}: ${session.because}.`);
|
|
2114
|
+
return findingAction(root, command, findingId, action, {
|
|
2115
|
+
by: session?.by ?? who(),
|
|
2116
|
+
...str(values.reason) ? { reason: str(values.reason) } : {},
|
|
2117
|
+
...str(values["asked-of"]) ? { askedOf: str(values["asked-of"]) } : {},
|
|
2118
|
+
...str(values.edit) ? { edit: str(values.edit) } : {},
|
|
2119
|
+
...str(values.gate) ? { gate: str(values.gate) } : {}
|
|
2120
|
+
}, io);
|
|
2121
|
+
}
|
|
2122
|
+
if (group === "change") {
|
|
2123
|
+
const list = (v) => Array.isArray(v) ? v : typeof v === "string" ? [v] : void 0;
|
|
2124
|
+
const repo = str(values.repo);
|
|
2125
|
+
if (command === "new")
|
|
2126
|
+
return changeNew(root, {
|
|
2127
|
+
...arg ? { title: arg } : {},
|
|
2128
|
+
...str(values.type) ? { type: str(values.type) } : {},
|
|
2129
|
+
...str(values.template) ? { template: str(values.template) } : {},
|
|
2130
|
+
...str(values.id) ? { id: str(values.id) } : {},
|
|
2131
|
+
by: who(),
|
|
2132
|
+
...list(values.owner) ? { owners: list(values.owner) } : {},
|
|
2133
|
+
...list(values.system) ? { systems: list(values.system) } : {},
|
|
2134
|
+
...str(values.like) ? { like: str(values.like) } : {},
|
|
2135
|
+
...str(values.impact) ? { impact: str(values.impact) } : {}
|
|
2136
|
+
}, io);
|
|
2137
|
+
if (command === "impact") {
|
|
2138
|
+
const { changeImpactCli } = await import("./chunk-Z2EYRUOH.js");
|
|
2139
|
+
return changeImpactCli(root, arg, { json }, io);
|
|
2140
|
+
}
|
|
2141
|
+
if (command === "similar") {
|
|
2142
|
+
const { changeSimilarCli } = await import("./chunk-RIEFYHXI.js");
|
|
2143
|
+
const limit = Number(str(values.limit) ?? 5);
|
|
2144
|
+
return changeSimilarCli(root, arg, {
|
|
2145
|
+
json,
|
|
2146
|
+
...Number.isFinite(limit) && limit > 0 ? { limit } : {},
|
|
2147
|
+
...str(values.change) ? { change: str(values.change) } : {}
|
|
2148
|
+
}, io);
|
|
2149
|
+
}
|
|
2150
|
+
if (command === "list")
|
|
2151
|
+
return changeList(root, { json }, io);
|
|
2152
|
+
if (command === "export") {
|
|
2153
|
+
const { changeExportCommand } = await import("./chunk-SH7AZZDA.js");
|
|
2154
|
+
const named = positionals[3];
|
|
2155
|
+
const fmt = str(values.format) ?? (named === "ado" || named === "jira" ? named : void 0);
|
|
2156
|
+
return changeExportCommand(root, arg, {
|
|
2157
|
+
...fmt ? { format: fmt } : {},
|
|
2158
|
+
...str(values.out) ? { out: str(values.out) } : {},
|
|
2159
|
+
...str(values.area) ? { areaPath: str(values.area) } : {},
|
|
2160
|
+
...str(values.iteration) ? { iterationPath: str(values.iteration) } : {}
|
|
2161
|
+
}, io);
|
|
2162
|
+
}
|
|
2163
|
+
if (command === "conflicts")
|
|
2164
|
+
return changeConflicts(root, { json }, io);
|
|
2165
|
+
if (command === "conform") {
|
|
2166
|
+
if (!arg) {
|
|
2167
|
+
io.err("change conform needs a change id, for example: atticus change conform add-transfer-limit");
|
|
2168
|
+
return 2;
|
|
2169
|
+
}
|
|
2170
|
+
const { changeConformCommand } = await import("./chunk-DYWTQXP4.js");
|
|
2171
|
+
return changeConformCommand(root, arg, {
|
|
2172
|
+
...str(values.repo) ? { repo: str(values.repo) } : {},
|
|
2173
|
+
...str(values.ref) ? { ref: str(values.ref) } : {},
|
|
2174
|
+
...str(values.task) ? { task: str(values.task) } : {},
|
|
2175
|
+
latest: values.latest === true,
|
|
2176
|
+
json
|
|
2177
|
+
}, io);
|
|
2178
|
+
}
|
|
2179
|
+
if (command === "estimate") {
|
|
2180
|
+
if (!arg) {
|
|
2181
|
+
io.err("change estimate needs a change id, for example: atticus change estimate add-transfer-limit");
|
|
2182
|
+
return 2;
|
|
2183
|
+
}
|
|
2184
|
+
const { changeEstimateCommand } = await import("./chunk-NDW4ROST.js");
|
|
2185
|
+
return changeEstimateCommand(root, arg, { json }, io);
|
|
2186
|
+
}
|
|
2187
|
+
if (command === "map") {
|
|
2188
|
+
if (!arg) {
|
|
2189
|
+
io.err("change map needs a change id, for example: atticus change map add-transfer-limit");
|
|
2190
|
+
return 2;
|
|
2191
|
+
}
|
|
2192
|
+
const { changeMapCommand } = await import("./chunk-ACWQDL6T.js");
|
|
2193
|
+
return changeMapCommand(root, arg, { ...str(values.format) ? { format: str(values.format) } : {}, json }, io);
|
|
2194
|
+
}
|
|
2195
|
+
if (command === "learn")
|
|
2196
|
+
return changeLearn(root, { json }, io);
|
|
2197
|
+
if (command === "draft")
|
|
2198
|
+
return changeDraft(root, arg, {
|
|
2199
|
+
...str(values.attempts) ? { attempts: Number(str(values.attempts)) } : {},
|
|
2200
|
+
force: values.force === true,
|
|
2201
|
+
...str(values.resume) ? { resume: str(values.resume) } : {},
|
|
2202
|
+
...str(values.mode) ? { mode: str(values.mode) } : {},
|
|
2203
|
+
json
|
|
2204
|
+
}, io);
|
|
2205
|
+
if (!arg) {
|
|
2206
|
+
io.err(`change ${command ?? ""} needs a change id, for example: atticus change status add-transfer-limit`);
|
|
2207
|
+
return 2;
|
|
2208
|
+
}
|
|
2209
|
+
if (command === "status")
|
|
2210
|
+
return changeStatus(root, arg, { json }, io);
|
|
2211
|
+
if (command === "knowledge") {
|
|
2212
|
+
const { changeKnowledge } = await import("./chunk-UNFCFJMF.js");
|
|
2213
|
+
return changeKnowledge(root, arg, {
|
|
2214
|
+
...str(values.confirm) ? { confirm: str(values.confirm) } : {},
|
|
2215
|
+
...str(values.exclude) ? { exclude: str(values.exclude) } : {},
|
|
2216
|
+
json
|
|
2217
|
+
}, io);
|
|
2218
|
+
}
|
|
2219
|
+
const approve = values.approve === true;
|
|
2220
|
+
if (command === "handoff")
|
|
2221
|
+
return changeHandoff(root, arg, {
|
|
2222
|
+
by: who(),
|
|
2223
|
+
approve,
|
|
2224
|
+
...repo ? { repo } : {},
|
|
2225
|
+
...str(values.base) ? { base: str(values.base) } : {}
|
|
2226
|
+
}, io);
|
|
2227
|
+
if (command === "sync")
|
|
2228
|
+
return changeSync(root, arg, { ...approve ? { by: who() } : {}, approve, ...repo ? { repo } : {} }, io);
|
|
2229
|
+
if (command === "return")
|
|
2230
|
+
return changeReturn(root, arg, {
|
|
2231
|
+
by: who(),
|
|
2232
|
+
approve,
|
|
2233
|
+
...str(values.reason) ? { reason: str(values.reason) } : {},
|
|
2234
|
+
...repo ? { repo } : {}
|
|
2235
|
+
}, io);
|
|
2236
|
+
if (command === "archive" && await ciArchiveGate(root, arg, { json: false }, io) !== 0)
|
|
2237
|
+
return 1;
|
|
2238
|
+
if (command === "archive")
|
|
2239
|
+
return changeArchive(root, arg, { by: who(), ...values["no-rescan"] === true ? { rescan: false } : {} }, io);
|
|
2240
|
+
}
|
|
2241
|
+
if (group === "intake" && command === "add")
|
|
2242
|
+
return intakeAdd(root, positionals.slice(2).map((f) => resolve(f)), io);
|
|
2243
|
+
if (group === "intake" && command === "list")
|
|
2244
|
+
return intakeList(root, io, { json });
|
|
2245
|
+
if (group === "intake" && command === "traffic") {
|
|
2246
|
+
const { intakeTraffic } = await import("./chunk-5ICB2BXH.js");
|
|
2247
|
+
return intakeTraffic(root, positionals[2] ?? "", {
|
|
2248
|
+
...str(values.source) ? { source: str(values.source) } : {},
|
|
2249
|
+
...str(values.from) ? { from: str(values.from) } : {},
|
|
2250
|
+
...str(values.to) ? { to: str(values.to) } : {},
|
|
2251
|
+
json
|
|
2252
|
+
}, io);
|
|
2253
|
+
}
|
|
2254
|
+
if (group === "intake" && command === "impact") {
|
|
2255
|
+
const { intakeImpact } = await import("./chunk-RB2VSED2.js");
|
|
2256
|
+
return intakeImpact(root, positionals[2] ?? "", { json }, io);
|
|
2257
|
+
}
|
|
2258
|
+
if (group === "triage" && !command)
|
|
2259
|
+
return triageList(root, io, { json });
|
|
2260
|
+
if (group === "triage" && command === "decide") {
|
|
2261
|
+
const [item, option] = positionals.slice(2);
|
|
2262
|
+
if (!item || !option || !num(option)) {
|
|
2263
|
+
io.err("triage decide needs an item id and an option number, for example: atticus triage decide alias-needed.ledger-platform 1");
|
|
2264
|
+
return 2;
|
|
2265
|
+
}
|
|
2266
|
+
return triageDecide(root, item, num(option), {
|
|
2267
|
+
by: who(),
|
|
2268
|
+
...str(values.reason) ? { reason: str(values.reason) } : {}
|
|
2269
|
+
}, io);
|
|
2270
|
+
}
|
|
2271
|
+
if (group === "diagram" && command === "render") {
|
|
2272
|
+
if (!arg) {
|
|
2273
|
+
io.err("diagram render needs a view or a file, for example: atticus diagram render context");
|
|
2274
|
+
return 2;
|
|
2275
|
+
}
|
|
2276
|
+
return diagramRender(root, {
|
|
2277
|
+
view: arg,
|
|
2278
|
+
...str(values.focus) ? { focus: str(values.focus) } : {},
|
|
2279
|
+
...str(values.format) ? { format: str(values.format) } : {},
|
|
2280
|
+
...str(values.out) ? { out: str(values.out) } : {}
|
|
2281
|
+
}, io);
|
|
2282
|
+
}
|
|
2283
|
+
if (group === "diagram" && command === "library") {
|
|
2284
|
+
if (!arg) {
|
|
2285
|
+
io.err("diagram library needs a file to write, for example: atticus diagram library atticus.xml");
|
|
2286
|
+
return 2;
|
|
2287
|
+
}
|
|
2288
|
+
return diagramLibrary(arg, io);
|
|
2289
|
+
}
|
|
2290
|
+
if (group === "stub" && command === "serve") {
|
|
2291
|
+
if (!arg) {
|
|
2292
|
+
io.err("stub serve needs a spec file or a catalog id, for example: atticus stub serve api/openapi.yaml");
|
|
2293
|
+
return 2;
|
|
2294
|
+
}
|
|
2295
|
+
return stubServe(root, arg, {
|
|
2296
|
+
...num(values.port) ? { port: num(values.port) } : {},
|
|
2297
|
+
...str(values.host) ? { host: str(values.host) } : {},
|
|
2298
|
+
catalog: values["from-catalog"] === true
|
|
2299
|
+
}, io);
|
|
2300
|
+
}
|
|
2301
|
+
if (group === "stub" && command === "check") {
|
|
2302
|
+
if (!arg) {
|
|
2303
|
+
io.err("stub check needs a spec file");
|
|
2304
|
+
return 2;
|
|
2305
|
+
}
|
|
2306
|
+
return stubCheck(arg, io);
|
|
2307
|
+
}
|
|
2308
|
+
if (group === "onboard") {
|
|
2309
|
+
const list = (v) => (str(v) ?? "").split(",").map((x) => x.trim()).filter(Boolean);
|
|
2310
|
+
const fwOptions = () => ({
|
|
2311
|
+
...str(values.from) ? { from: str(values.from) } : {},
|
|
2312
|
+
...list(values.users).length ? { users: list(values.users) } : {},
|
|
2313
|
+
...list(values.package).length ? { packages: list(values.package) } : {}
|
|
2314
|
+
});
|
|
2315
|
+
if ((command === "check" || command === "accept") && arg === "framework") {
|
|
2316
|
+
const name = positionals[3];
|
|
2317
|
+
if (!name) {
|
|
2318
|
+
io.err(`onboard ${command} framework needs the model's name: atticus onboard ${command} framework <name>`);
|
|
2319
|
+
return 2;
|
|
2320
|
+
}
|
|
2321
|
+
return command === "check" ? onboardFrameworkCheck(root, name, fwOptions(), io) : onboardFrameworkAccept(root, name, { replace: values.replace === true }, io);
|
|
2322
|
+
}
|
|
2323
|
+
if (command === "framework") {
|
|
2324
|
+
if (!arg) {
|
|
2325
|
+
io.err("onboard framework needs a name and the framework's source: atticus onboard framework <name> --from <source|jar|tgz> [--users <repo>,...]");
|
|
2326
|
+
return 2;
|
|
2327
|
+
}
|
|
2328
|
+
const attempts2 = Number(str(values.attempts) ?? "3");
|
|
2329
|
+
if (!Number.isInteger(attempts2) || attempts2 < 1 || attempts2 > 10) {
|
|
2330
|
+
io.err("--attempts is a whole number from 1 to 10.");
|
|
2331
|
+
return 2;
|
|
2332
|
+
}
|
|
2333
|
+
let runtime;
|
|
2334
|
+
if (values["no-ai"] !== true)
|
|
2335
|
+
try {
|
|
2336
|
+
runtime = (await runtimeForCli(root, { ...str(values.mode) ? { mode: str(values.mode) } : {} })).runtime;
|
|
2337
|
+
} catch (e) {
|
|
2338
|
+
if (e instanceof (await loadAi()).AiOffError)
|
|
2339
|
+
io.out("AI is off here: the learned model alone is checked.");
|
|
2340
|
+
else if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
2341
|
+
io.err(e.message);
|
|
2342
|
+
return 2;
|
|
2343
|
+
} else
|
|
2344
|
+
throw e;
|
|
2345
|
+
}
|
|
2346
|
+
return onboardFramework(root, arg, { ...fwOptions(), attempts: attempts2 }, { ...runtime ? { runtime } : {} }, io);
|
|
2347
|
+
}
|
|
2348
|
+
if (command === "check") {
|
|
2349
|
+
const repo = str(values.repo);
|
|
2350
|
+
if (!arg || !repo) {
|
|
2351
|
+
io.err("onboard check needs a proposal and its repo: atticus onboard check <name> --repo <repo>");
|
|
2352
|
+
return 2;
|
|
2353
|
+
}
|
|
2354
|
+
return onboardCheck(root, arg, repo, io);
|
|
2355
|
+
}
|
|
2356
|
+
if (command === "accept") {
|
|
2357
|
+
if (!arg) {
|
|
2358
|
+
io.err("onboard accept needs the proposal's name: atticus onboard accept <name>");
|
|
2359
|
+
return 2;
|
|
2360
|
+
}
|
|
2361
|
+
return onboardAccept(root, arg, { replace: values.replace === true }, io);
|
|
2362
|
+
}
|
|
2363
|
+
if (command === "eval") {
|
|
2364
|
+
if (!arg) {
|
|
2365
|
+
io.err("onboard eval needs a folder of cases: atticus onboard eval fixtures/onboard-eval --mode model");
|
|
2366
|
+
return 2;
|
|
2367
|
+
}
|
|
2368
|
+
try {
|
|
2369
|
+
const { runtime } = await runtimeForCli(root, {
|
|
2370
|
+
...str(values.mode) ? { mode: str(values.mode) } : {}
|
|
2371
|
+
});
|
|
2372
|
+
return await onboardEval(root, arg, { json }, { runtime }, io);
|
|
2373
|
+
} catch (e) {
|
|
2374
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
2375
|
+
io.err(e.message);
|
|
2376
|
+
return 2;
|
|
2377
|
+
}
|
|
2378
|
+
throw e;
|
|
2379
|
+
}
|
|
2380
|
+
}
|
|
2381
|
+
if (!command) {
|
|
2382
|
+
io.err("onboard needs a repo: atticus onboard <repo-id|folder> [--name <dialect>] [--attempts 3] [--mode model]");
|
|
2383
|
+
return 2;
|
|
2384
|
+
}
|
|
2385
|
+
const attempts = Number(str(values.attempts) ?? "3");
|
|
2386
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 10) {
|
|
2387
|
+
io.err("--attempts is a whole number from 1 to 10.");
|
|
2388
|
+
return 2;
|
|
2389
|
+
}
|
|
2390
|
+
try {
|
|
2391
|
+
const { runtime } = await runtimeForCli(root, {
|
|
2392
|
+
...str(values.mode) ? { mode: str(values.mode) } : {}
|
|
2393
|
+
});
|
|
2394
|
+
return await onboardDraft(root, command, { ...str(values.name) ? { name: str(values.name) } : {}, attempts }, { runtime }, io);
|
|
2395
|
+
} catch (e) {
|
|
2396
|
+
if (e instanceof (await loadAi()).RuntimeConfigError) {
|
|
2397
|
+
io.err(e.message);
|
|
2398
|
+
return 2;
|
|
2399
|
+
}
|
|
2400
|
+
throw e;
|
|
2401
|
+
}
|
|
2402
|
+
}
|
|
2403
|
+
if (group === "frameworks" && command === "check")
|
|
2404
|
+
return frameworksCheck(root, arg, io);
|
|
2405
|
+
if (group === "frameworks" && command === "kit")
|
|
2406
|
+
return frameworksKit(resolve(arg ?? "frameworks-kit"), io);
|
|
2407
|
+
if (group === "frameworks" && command === "survey") {
|
|
2408
|
+
const pkg = str(values.package);
|
|
2409
|
+
return frameworksSurvey(root, {
|
|
2410
|
+
prefixes: pkg ? pkg.split(",").map((x) => x.trim()).filter(Boolean) : [],
|
|
2411
|
+
json: values.json === true
|
|
2412
|
+
}, io);
|
|
2413
|
+
}
|
|
2414
|
+
if (group === "frameworks" && command === "discover") {
|
|
2415
|
+
const strings = (v) => (Array.isArray(v) ? v : []).filter((x) => typeof x === "string");
|
|
2416
|
+
const groups = strings(values.group).flatMap((g) => g.split(",")).map((g) => g.trim()).filter(Boolean);
|
|
2417
|
+
return frameworksDiscover(root, {
|
|
2418
|
+
groups,
|
|
2419
|
+
jars: strings(values.jars),
|
|
2420
|
+
learn: values.learn === true,
|
|
2421
|
+
json: values.json === true
|
|
2422
|
+
}, io);
|
|
2423
|
+
}
|
|
2424
|
+
if (group === "frameworks") {
|
|
2425
|
+
const from = str(values.from);
|
|
2426
|
+
if (command !== "learn" || !arg || !from) {
|
|
2427
|
+
io.err("frameworks learn needs a name and the starter's source, for example: atticus frameworks learn tide-platform --from workspace/tide-platform");
|
|
2428
|
+
return 2;
|
|
2429
|
+
}
|
|
2430
|
+
const pkg = str(values.package);
|
|
2431
|
+
return frameworksLearn(root, arg, from, {
|
|
2432
|
+
...pkg ? { packages: pkg.split(",").map((x) => x.trim()) } : {},
|
|
2433
|
+
dryRun: values["dry-run"] === true
|
|
2434
|
+
}, io);
|
|
2435
|
+
}
|
|
2436
|
+
if (group === "plugin" && (command === "test" || command === "pin" || command === "add")) {
|
|
2437
|
+
if (!arg) {
|
|
2438
|
+
io.err(`plugin ${command} needs a plugin id, for example: atticus plugin ${command} ${command === "add" ? "vertex" : "forge-routes"}`);
|
|
2439
|
+
return 2;
|
|
2440
|
+
}
|
|
2441
|
+
return command === "test" ? pluginTest(root, arg, io) : command === "pin" ? pluginPin(root, arg, io) : pluginAdd(root, arg, io);
|
|
2442
|
+
}
|
|
2443
|
+
if (group === "dialect") {
|
|
2444
|
+
const rest = positionals.slice(3);
|
|
2445
|
+
if (command === "kit")
|
|
2446
|
+
return dialectKit(resolve(arg ?? "dialect-kit"), io);
|
|
2447
|
+
if (command === "tree") {
|
|
2448
|
+
if (!arg) {
|
|
2449
|
+
io.err("dialect tree needs a file: atticus dialect tree src/A.java [--language java]");
|
|
2450
|
+
return 2;
|
|
2451
|
+
}
|
|
2452
|
+
return dialectTree(arg, { ...str(values.language) ? { language: str(values.language) } : {} }, io);
|
|
2453
|
+
}
|
|
2454
|
+
if (!arg) {
|
|
2455
|
+
io.err(`dialect ${command ?? ""} needs a dialect name, for example: atticus dialect test forge`.replace(" ", " "));
|
|
2456
|
+
return 2;
|
|
2457
|
+
}
|
|
2458
|
+
if (command === "new") {
|
|
2459
|
+
const repos = [...str(values.from)?.split(",") ?? [], ...rest].map((r) => r.trim()).filter(Boolean);
|
|
2460
|
+
if (repos.length === 0) {
|
|
2461
|
+
io.err("dialect new needs sample repos, for example: atticus dialect new forge --from workspace/forge-ledger");
|
|
2462
|
+
return 2;
|
|
2463
|
+
}
|
|
2464
|
+
return dialectNew(root, arg, repos, io);
|
|
2465
|
+
}
|
|
2466
|
+
if (command === "test")
|
|
2467
|
+
return dialectTest(root, arg, io);
|
|
2468
|
+
if (command === "run") {
|
|
2469
|
+
if (!rest[0]) {
|
|
2470
|
+
io.err("dialect run needs a repo folder, for example: atticus dialect run forge workspace/forge-ledger");
|
|
2471
|
+
return 2;
|
|
2472
|
+
}
|
|
2473
|
+
return dialectRun(root, arg, rest[0], { json }, io);
|
|
2474
|
+
}
|
|
2475
|
+
if (command === "grade") {
|
|
2476
|
+
if (!rest[0]) {
|
|
2477
|
+
io.err("dialect grade needs a dialect file and an eval folder");
|
|
2478
|
+
return 2;
|
|
2479
|
+
}
|
|
2480
|
+
return dialectGrade(arg, rest[0], io);
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2483
|
+
if (group === "sources" && command === "tag" || group === "knowledge" || group === "bench" && command === "knowledge") {
|
|
2484
|
+
const handled = await knowledgeCli(root, positionals, values, io, who);
|
|
2485
|
+
if (handled !== void 0)
|
|
2486
|
+
return handled;
|
|
2487
|
+
}
|
|
2488
|
+
if (group === "sources" && command === "add") {
|
|
2489
|
+
const [kind, location] = positionals.slice(2);
|
|
2490
|
+
if (!kind || !location) {
|
|
2491
|
+
io.err("sources add needs a type and a location, for example: atticus sources add markdown-folder ../wiki");
|
|
2492
|
+
return 2;
|
|
2493
|
+
}
|
|
2494
|
+
const listOf = (v) => typeof v === "string" ? v.split(",").map((x) => x.trim()).filter(Boolean) : void 0;
|
|
2495
|
+
return sourcesAdd(root, kind, location, io, {
|
|
2496
|
+
...str(values.id) ? { id: str(values.id) } : {},
|
|
2497
|
+
...str(values.path) ? { path: str(values.path) } : {},
|
|
2498
|
+
...str(values.ref) ? { ref: str(values.ref) } : {},
|
|
2499
|
+
...values.submodule === true ? { submodule: true } : {},
|
|
2500
|
+
...listOf(values.kind) ? { kinds: listOf(values.kind) } : {},
|
|
2501
|
+
...listOf(values.framework) ? { frameworks: listOf(values.framework) } : {},
|
|
2502
|
+
...Array.isArray(values.owner) && values.owner[0] ? { owner: String(values.owner[0]) } : {},
|
|
2503
|
+
...values.save === true ? { save: true } : {}
|
|
2504
|
+
});
|
|
2505
|
+
}
|
|
2506
|
+
if (group === "sources" && command === "refresh")
|
|
2507
|
+
return sourcesRefreshCommand(root, { json }, io);
|
|
2508
|
+
if (group === "sources" && command === "estimate") {
|
|
2509
|
+
const bt = str(values["batch-tokens"]);
|
|
2510
|
+
return (await import("./chunk-77RSRG3A.js")).sourcesEstimate(root, {
|
|
2511
|
+
...str(values.source) ? { source: str(values.source) } : {},
|
|
2512
|
+
...bt && Number(bt) > 0 ? { batchTokens: Number(bt) } : {},
|
|
2513
|
+
...values.full === true ? { full: true } : {},
|
|
2514
|
+
json: values.json === true
|
|
2515
|
+
}, io);
|
|
2516
|
+
}
|
|
2517
|
+
if (group === "standards")
|
|
2518
|
+
return (await import("./chunk-77RSRG3A.js")).standardsCli(root, command, values, io);
|
|
2519
|
+
if (group === "sources" && command === "sync")
|
|
2520
|
+
return sourcesSync(root, io, {
|
|
2521
|
+
json: values.json === true,
|
|
2522
|
+
...str(values.source) ? { source: str(values.source) } : {}
|
|
2523
|
+
});
|
|
2524
|
+
if (group === "patterns" && command === "scan")
|
|
2525
|
+
return patternsScan(root, io, { json: values.json === true });
|
|
2526
|
+
if (group === "coverage")
|
|
2527
|
+
return coverageCommand(root, io, { json: values.json === true });
|
|
2528
|
+
if (group === "domain" && command === "profile")
|
|
2529
|
+
return domainProfileCommand(root, arg, str(values.out) ? { out: str(values.out) } : {}, io);
|
|
2530
|
+
if (group === "questions" && command)
|
|
2531
|
+
return questionsFiles(root, argv, io);
|
|
2532
|
+
if (group === "questions")
|
|
2533
|
+
return questionsCommand(root, io, { json: values.json === true });
|
|
2534
|
+
if (group === "reconcile")
|
|
2535
|
+
return reconcileCommand(root, positionals.slice(1), { json: values.json === true }, io);
|
|
2536
|
+
if (group === "orgpack" && (command === "draft" || command === "accept"))
|
|
2537
|
+
return (await import("./chunk-4UZJOQYK.js")).orgPackDraftCli(root, command, arg, values, io);
|
|
2538
|
+
if (group === "orgpack" && command === "owner")
|
|
2539
|
+
return (await import("./chunk-KXZR2BLL.js")).orgPackOwnerCli(root, arg, io);
|
|
2540
|
+
if (group === "orgpack" && command === "validate")
|
|
2541
|
+
return orgPackValidate(arg ? resolve(arg) : join((await import("./chunk-IVHN2VYG.js")).orgPackDirOf(root)), io);
|
|
2542
|
+
if (group === "stage" && command === "check")
|
|
2543
|
+
return (await import("./chunk-JBSD57N7.js")).stageCheck(root, arg, positionals[3], positionals[4], io);
|
|
2544
|
+
if (group === "handoff" && command === "done") {
|
|
2545
|
+
if (!arg) {
|
|
2546
|
+
io.err("handoff done needs the run id from the prompt, for example: atticus handoff done run-20261018060000-0001");
|
|
2547
|
+
return 2;
|
|
2548
|
+
}
|
|
2549
|
+
if (await (await import("./chunk-YWOMGMZB.js")).isTaskRun(root, arg))
|
|
2550
|
+
return taskHandoff(root, arg, {
|
|
2551
|
+
by: who(),
|
|
2552
|
+
approve: values.approve === true,
|
|
2553
|
+
json
|
|
2554
|
+
}, io);
|
|
2555
|
+
return handoffDone(root, arg, io, str(values.model) ? { model: str(values.model) } : {});
|
|
2556
|
+
}
|
|
2557
|
+
if (group === "openspec" && command === "setup")
|
|
2558
|
+
return openspecSetup(root, io);
|
|
2559
|
+
if (group === "openspec" && command === "check")
|
|
2560
|
+
return openspecCheck(root, io);
|
|
2561
|
+
if (group === "openspec") {
|
|
2562
|
+
const { openspecRun } = await import("./chunk-U5PDQTLA.js");
|
|
2563
|
+
return openspecRun(root, openspecArgsOf(argv), io);
|
|
2564
|
+
}
|
|
2565
|
+
if (group === "workspace" && command === "sync")
|
|
2566
|
+
return workspaceSync(root, repoIds, io, str(values.from) ? { from: resolve(str(values.from)) } : {});
|
|
2567
|
+
if (group === "workspace" && (command === "open" || command === "prune")) {
|
|
2568
|
+
if (!arg) {
|
|
2569
|
+
io.err(`workspace ${command} needs a change id, for example: atticus workspace ${command} add-transfer-limit`);
|
|
2570
|
+
return 2;
|
|
2571
|
+
}
|
|
2572
|
+
if (command === "open")
|
|
2573
|
+
return workspaceOpen(root, arg, repoIds, io);
|
|
2574
|
+
return workspacePrune(root, arg, { all: values.all === true, force: values.force === true }, io);
|
|
2575
|
+
}
|
|
2576
|
+
const { commandCatalog } = await import("./chunk-O6ILVBYB.js");
|
|
2577
|
+
const { nearestCommand } = await import("./chunk-4SKZDI62.js");
|
|
2578
|
+
const near = nearestCommand(positionals, commandCatalog(HELP).map((c) => c.id));
|
|
2579
|
+
io.err(`Unknown command: ${positionals.join(" ")}.${near ? ` Did you mean atticus ${near}?` : ""}`);
|
|
2580
|
+
io.err("atticus help lists the main commands, atticus legacy the rest; atticus help <command> explains one.");
|
|
2581
|
+
return 2;
|
|
2582
|
+
}
|
|
2583
|
+
var QUESTION_FLAGS = ["state", "option", "text", "scope", "type"];
|
|
2584
|
+
async function checkFlags(argv, positionals, io) {
|
|
2585
|
+
const { unknownFlags, unknownFlagMessages } = await import("./chunk-4SKZDI62.js");
|
|
2586
|
+
const quick = /* @__PURE__ */ new Set([...Object.keys(OPTIONS), ...QUESTION_FLAGS, "handoff"]);
|
|
2587
|
+
if (!unknownFlags(argv, quick).length)
|
|
2588
|
+
return void 0;
|
|
2589
|
+
const { commandCatalog } = await import("./chunk-O6ILVBYB.js");
|
|
2590
|
+
const catalog = commandCatalog(HELP);
|
|
2591
|
+
const known = /* @__PURE__ */ new Set([
|
|
2592
|
+
...quick,
|
|
2593
|
+
...catalog.flatMap((c) => c.flags.map((f) => f.name.replace(/^--/, "")))
|
|
2594
|
+
]);
|
|
2595
|
+
const unknown = unknownFlags(argv, known);
|
|
2596
|
+
if (!unknown.length)
|
|
2597
|
+
return void 0;
|
|
2598
|
+
for (const m of unknownFlagMessages(unknown, known))
|
|
2599
|
+
io.err(m);
|
|
2600
|
+
const { commandOf } = await import("./chunk-TQYBXDVH.js");
|
|
2601
|
+
const id = commandOf(positionals, catalog.map((c) => c.id));
|
|
2602
|
+
io.err(id ? `atticus help ${id} lists what it takes. Nothing was run.` : "atticus help --all lists every command and what it takes. Nothing was run.");
|
|
2603
|
+
return 2;
|
|
2604
|
+
}
|
|
2605
|
+
export {
|
|
2606
|
+
HELP_TEXT,
|
|
2607
|
+
VERSION,
|
|
2608
|
+
main,
|
|
2609
|
+
setUpAi
|
|
2610
|
+
};
|