excaliagent 0.3.0 → 0.4.0
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/README.md +113 -29
- package/dist/server/args.js +14 -1
- package/dist/server/characters.js +540 -0
- package/dist/server/cli.js +16 -1
- package/dist/server/http.js +95 -6
- package/dist/server/hub.js +17 -3
- package/dist/server/panes/herdr.js +29 -3
- package/dist/server/sources/claude.js +36 -1
- package/dist/server/sources/codex-live.js +279 -0
- package/dist/server/sources/codex-rollout.js +154 -0
- package/dist/server/sources/codex.js +363 -0
- package/dist/server/sources/jsonl.js +142 -0
- package/dist/server/sources/multi.js +53 -0
- package/dist/server/sources/opencode-live.js +144 -0
- package/dist/server/sources/opencode.js +265 -0
- package/dist/server/sources/proc.js +34 -0
- package/dist/server/sources/transcript.js +9 -103
- package/dist/shared/packs.js +62 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/{abnfDiagram-VCTEODGH-DV-5IMmB.js → abnfDiagram-VCTEODGH-BxrKsDoB.js} +1 -1
- package/dist/web/assets/{ar-SA-G6X2FPQ2-n3XdOipE.js → ar-SA-G6X2FPQ2-Cc6gbg88.js} +1 -1
- package/dist/web/assets/{architecture-7GRP2DOG-C497sWO2.js → architecture-7GRP2DOG-CIqN5I9B.js} +1 -1
- package/dist/web/assets/{architectureDiagram-5GKGNRK7-DuCJZflG.js → architectureDiagram-5GKGNRK7-DsXC8AqK.js} +1 -1
- package/dist/web/assets/{az-AZ-76LH7QW2-DSYFdGPZ.js → az-AZ-76LH7QW2-BH8VzNec.js} +1 -1
- package/dist/web/assets/{bg-BG-XCXSNQG7-aq-bPVBx.js → bg-BG-XCXSNQG7-ClFUbics.js} +1 -1
- package/dist/web/assets/{blockDiagram-I7D4REHJ-D6rbmy9X.js → blockDiagram-I7D4REHJ-CltS-Zt2.js} +1 -1
- package/dist/web/assets/{bn-BD-2XOGV67Q-BsnX_gLN.js → bn-BD-2XOGV67Q-BVUiOO4B.js} +1 -1
- package/dist/web/assets/{c4Diagram-7LVT6UL2-bkZh0r6f.js → c4Diagram-7LVT6UL2-C-C_SvWm.js} +1 -1
- package/dist/web/assets/{ca-ES-6MX7JW3Y-CvtjFAUU.js → ca-ES-6MX7JW3Y-CEK8mB8J.js} +1 -1
- package/dist/web/assets/channel-Dom8D_0o.js +1 -0
- package/dist/web/assets/{chunk-4HAMMTFA-DZJ_s-sA.js → chunk-4HAMMTFA-Bfdmb0Hg.js} +1 -1
- package/dist/web/assets/{chunk-75Z2AOVW-DU74RPBJ.js → chunk-75Z2AOVW-NYwkutzS.js} +1 -1
- package/dist/web/assets/{chunk-DU6HZSFF-CChYnq-U.js → chunk-DU6HZSFF-SqE0xdu5.js} +1 -1
- package/dist/web/assets/{chunk-EIO257PC-DIGaCD3q.js → chunk-EIO257PC-DpOeKaLq.js} +1 -1
- package/dist/web/assets/{chunk-F27PBJKO-C65b5F8o.js → chunk-F27PBJKO-g9bJrSwZ.js} +1 -1
- package/dist/web/assets/{chunk-GMAD6QVW-CJy4srfe.js → chunk-GMAD6QVW-B1y2ol5w.js} +1 -1
- package/dist/web/assets/{chunk-GVQU2GXP-CedQyfJw.js → chunk-GVQU2GXP-BUjRNRXo.js} +1 -1
- package/dist/web/assets/{chunk-IMKFNOWR-DPwApfTy.js → chunk-IMKFNOWR-DyeQep8U.js} +1 -1
- package/dist/web/assets/{chunk-L3NEJ4N5-DXku7BIn.js → chunk-L3NEJ4N5-BcTVhsWp.js} +1 -1
- package/dist/web/assets/{chunk-OSK3NFVY-BstcDrHK.js → chunk-OSK3NFVY-Db7B8jPm.js} +1 -1
- package/dist/web/assets/{chunk-P2QGCYS3-BHerElni.js → chunk-P2QGCYS3-Cx5iBC5z.js} +1 -1
- package/dist/web/assets/{chunk-POPQ4Y6H-ZS2hGTJJ.js → chunk-POPQ4Y6H-CqVRZDA8.js} +1 -1
- package/dist/web/assets/{chunk-PWAF6VOD-BUUBZvSR.js → chunk-PWAF6VOD-Cf2j9yew.js} +1 -1
- package/dist/web/assets/{chunk-SHT3W25Y-CMdySuQW.js → chunk-SHT3W25Y-0_N13xgE.js} +1 -1
- package/dist/web/assets/{chunk-SVP7TREG-E_6g4L6l.js → chunk-SVP7TREG-DkRJF9jr.js} +1 -1
- package/dist/web/assets/{chunk-TICWLB2K-CBTJSW3m.js → chunk-TICWLB2K-D6OC50xH.js} +1 -1
- package/dist/web/assets/classDiagram-ZZMXUADV-BMEkgkEJ.js +1 -0
- package/dist/web/assets/classDiagram-v2-VYDZK3BY-BMEkgkEJ.js +1 -0
- package/dist/web/assets/{cs-CZ-2BRQDIVT-DLt9XJMu.js → cs-CZ-2BRQDIVT-DWt1RUsP.js} +1 -1
- package/dist/web/assets/{cynefin-OW5HDTMX-BYqJDvxe.js → cynefin-OW5HDTMX-Dx0HzRCl.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-5FMLGOSQ-iwuMBkRk.js → cynefinDiagram-5FMLGOSQ-C8AMQNhe.js} +1 -1
- package/dist/web/assets/{da-DK-5WZEPLOC-BnzwheRI.js → da-DK-5WZEPLOC-BPggh0j6.js} +1 -1
- package/dist/web/assets/{dagre-GXQ25YYZ-DGskQLMq.js → dagre-GXQ25YYZ-f9qU6BFq.js} +1 -1
- package/dist/web/assets/{de-DE-XR44H4JA-B05-7snG.js → de-DE-XR44H4JA-B1q1pJrQ.js} +1 -1
- package/dist/web/assets/{diagram-S7CK7UJ4-Sclpr_lb.js → diagram-S7CK7UJ4-Bcq77Nl3.js} +1 -1
- package/dist/web/assets/{diagram-UQ7AKVKN-CkRKjDjq.js → diagram-UQ7AKVKN-DXzlgVTk.js} +1 -1
- package/dist/web/assets/{diagram-VSXAHHWV-DKAzSk6r.js → diagram-VSXAHHWV-C1vz2FvT.js} +1 -1
- package/dist/web/assets/{diagram-VX7I27RA-Bjdeg2uG.js → diagram-VX7I27RA-_c4ucp3r.js} +1 -1
- package/dist/web/assets/{diagram-Z3DM3KII-4jN9UD5P.js → diagram-Z3DM3KII-cUg91K-F.js} +1 -1
- package/dist/web/assets/{dist-BQE0NGB-.js → dist-DcwmvBdV.js} +4 -4
- package/dist/web/assets/{ebnfDiagram-PWID7BFC-BSFSSJ77.js → ebnfDiagram-PWID7BFC-9iWfohHg.js} +1 -1
- package/dist/web/assets/{el-GR-BZB4AONW-ShhNmsmN.js → el-GR-BZB4AONW-CrhwvNDD.js} +1 -1
- package/dist/web/assets/{en-B4ZKOASM-BNw5UiKn.js → en-B4ZKOASM-DCjnkz5L.js} +1 -1
- package/dist/web/assets/{erDiagram-RLTQ6QDP-CXr09bBy.js → erDiagram-RLTQ6QDP-A72uVlS3.js} +1 -1
- package/dist/web/assets/{es-ES-U4NZUMDT-2jCdm2lH.js → es-ES-U4NZUMDT-D0sRCoDL.js} +1 -1
- package/dist/web/assets/{eu-ES-A7QVB2H4-BhBUGvkL.js → eu-ES-A7QVB2H4-DLG-liPb.js} +1 -1
- package/dist/web/assets/{eventmodeling-NTZA5JFV-DLX5id4n.js → eventmodeling-NTZA5JFV-CIKZvDAj.js} +1 -1
- package/dist/web/assets/{fa-IR-HGAKTJCU-B-Z0NFoQ.js → fa-IR-HGAKTJCU-BW3pPOVT.js} +1 -1
- package/dist/web/assets/{fi-FI-Z5N7JZ37-C3a93Lzr.js → fi-FI-Z5N7JZ37-D2XaqwPp.js} +1 -1
- package/dist/web/assets/flowDiagram-HODETNUW-DhQSc3KP.js +1 -0
- package/dist/web/assets/{fr-FR-RHASNOE6-BfJc7jwO.js → fr-FR-RHASNOE6-B-BjRA7r.js} +1 -1
- package/dist/web/assets/{ganttDiagram-EL5Y4UJY-V2sHQ0x1.js → ganttDiagram-EL5Y4UJY-cgwUfr0G.js} +1 -1
- package/dist/web/assets/{gitGraph-4MIJSDKK-BGpxF8pu.js → gitGraph-4MIJSDKK-CeKopPn3.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-WWUBYQGX-asoaR4Hx.js → gitGraphDiagram-WWUBYQGX-BWjAy7ei.js} +1 -1
- package/dist/web/assets/{gl-ES-HMX3MZ6V-C8eeUPra.js → gl-ES-HMX3MZ6V-DYUAqB0N.js} +1 -1
- package/dist/web/assets/{he-IL-6SHJWFNN-DB0HanYn.js → he-IL-6SHJWFNN-CXkYqbuu.js} +1 -1
- package/dist/web/assets/{hi-IN-IWLTKZ5I-B3Gf328f.js → hi-IN-IWLTKZ5I-BwVBsHWG.js} +1 -1
- package/dist/web/assets/{hu-HU-A5ZG7DT2-7jNfqM7f.js → hu-HU-A5ZG7DT2-DkmlE7Aa.js} +1 -1
- package/dist/web/assets/{id-ID-SAP4L64H-DZd1jLNQ.js → id-ID-SAP4L64H-CwkytHX_.js} +1 -1
- package/dist/web/assets/{image-GAAHSSAO-DKJMzS7d.js → image-GAAHSSAO-u-hBxkaK.js} +1 -1
- package/dist/web/assets/index-D43I17T9.js +212 -0
- package/dist/web/assets/{index-DtRVLazd.css → index-DxXUknKX.css} +1 -1
- package/dist/web/assets/{info-A6RAGUB7-Dw0JaEzD.js → info-A6RAGUB7-DmadBmci.js} +1 -1
- package/dist/web/assets/{infoDiagram-27XIBGKW-DhivBaFe.js → infoDiagram-27XIBGKW-D93CKwhy.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-5VMMS53U-DHIyFGlH.js → ishikawaDiagram-5VMMS53U-BQ-x5YXp.js} +1 -1
- package/dist/web/assets/{it-IT-JPQ66NNP-BF7oahO7.js → it-IT-JPQ66NNP-Bc-Qa6KI.js} +1 -1
- package/dist/web/assets/{ja-JP-DBVTYXUO-CtGU47sH.js → ja-JP-DBVTYXUO-BPmQCryQ.js} +1 -1
- package/dist/web/assets/{journeyDiagram-3NMN7TZE-wwS9CODt.js → journeyDiagram-3NMN7TZE-CO_LXx1E.js} +1 -1
- package/dist/web/assets/{kaa-6HZHGXH3-CyohUVIM.js → kaa-6HZHGXH3-DuBFVAjv.js} +1 -1
- package/dist/web/assets/{kab-KAB-ZGHBKWFO-2acNr90z.js → kab-KAB-ZGHBKWFO-DhEFzSTh.js} +1 -1
- package/dist/web/assets/{kanban-definition-UXKFOSKX-vqJ11RID.js → kanban-definition-UXKFOSKX-B72Jztau.js} +1 -1
- package/dist/web/assets/{kk-KZ-P5N5QNE5-C56zTJ0v.js → kk-KZ-P5N5QNE5-CW7PxU2h.js} +1 -1
- package/dist/web/assets/{km-KH-HSX4SM5Z-Bg7FoxwJ.js → km-KH-HSX4SM5Z-CYy7yySD.js} +1 -1
- package/dist/web/assets/{ko-KR-MTYHY66A-wlZa8Fb7.js → ko-KR-MTYHY66A-C5O645Qe.js} +1 -1
- package/dist/web/assets/{ku-TR-6OUDTVRD-DpMT6JcJ.js → ku-TR-6OUDTVRD-CKcd_iWr.js} +1 -1
- package/dist/web/assets/{line-Cy2R8zKE.js → line-Ckd3sAmP.js} +1 -1
- package/dist/web/assets/{lt-LT-XHIRWOB4-0nDOQqUM.js → lt-LT-XHIRWOB4-ya2_xWiy.js} +1 -1
- package/dist/web/assets/{lv-LV-5QDEKY6T-DGNAIt-v.js → lv-LV-5QDEKY6T-cYYwyzmz.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-C-IWeUrh.js → mermaid-parser.core-Dbqkvrw-.js} +3 -3
- package/dist/web/assets/{mindmap-definition-YA3MSWOX-DDX8XN8u.js → mindmap-definition-YA3MSWOX-B4onxNgk.js} +1 -1
- package/dist/web/assets/{mr-IN-CRQNXWMA-CHXpujpK.js → mr-IN-CRQNXWMA-CfaHpVWe.js} +1 -1
- package/dist/web/assets/{my-MM-5M5IBNSE-Bg0H7WJb.js → my-MM-5M5IBNSE-BfKiTATq.js} +1 -1
- package/dist/web/assets/{nb-NO-T6EIAALU-BE_hPlhF.js → nb-NO-T6EIAALU-Cz3yDFYg.js} +1 -1
- package/dist/web/assets/{nl-NL-IS3SIHDZ-fdiiEQqB.js → nl-NL-IS3SIHDZ-DDX026n5.js} +1 -1
- package/dist/web/assets/{nn-NO-6E72VCQL-C7j1gMVo.js → nn-NO-6E72VCQL-BcokL_SN.js} +1 -1
- package/dist/web/assets/{oc-FR-POXYY2M6-Q5CdkT-D.js → oc-FR-POXYY2M6-bNFsGpEp.js} +1 -1
- package/dist/web/assets/{pa-IN-N4M65BXN-DJyQmbX0.js → pa-IN-N4M65BXN-iIHN9Z8W.js} +1 -1
- package/dist/web/assets/{packet-AYTQ26CC-D4ouOVez.js → packet-AYTQ26CC-BzBpP9hg.js} +1 -1
- package/dist/web/assets/{pegDiagram-XKGWAZYB-DAWOkGLy.js → pegDiagram-XKGWAZYB-BPScRPVZ.js} +1 -1
- package/dist/web/assets/percentages-BXMCSKIN-EDfR-TFr.js +1 -0
- package/dist/web/assets/{pie-WAS4IAKB-MCWueKc-.js → pie-WAS4IAKB-N-9RHtKL.js} +1 -1
- package/dist/web/assets/{pieDiagram-E7YTZNPT-BLlQT9t_.js → pieDiagram-E7YTZNPT-Bpd_yCG-.js} +1 -1
- package/dist/web/assets/{pl-PL-T2D74RX3-CcWFE9AN.js → pl-PL-T2D74RX3-DeqOx-a4.js} +1 -1
- package/dist/web/assets/{pt-BR-5N22H2LF-D6QCOM38.js → pt-BR-5N22H2LF-DG1PCIkb.js} +1 -1
- package/dist/web/assets/{pt-PT-UZXXM6DQ-ByJh7ZNa.js → pt-PT-UZXXM6DQ-BsUJk2fq.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-AXDQQJYC-CIinawCS.js → quadrantDiagram-AXDQQJYC-CSLCp0xS.js} +1 -1
- package/dist/web/assets/{radar-RG4KPBEZ-Cm5qT3Hl.js → radar-RG4KPBEZ-rKULJroO.js} +1 -1
- package/dist/web/assets/{railroad-74A4TZTK-DO3FGMCu.js → railroad-74A4TZTK-hDn0WPg3.js} +1 -1
- package/dist/web/assets/{railroad-abnf-HS5TGJTU-DqC68RR5.js → railroad-abnf-HS5TGJTU-DfI0hiCR.js} +1 -1
- package/dist/web/assets/{railroad-ebnf-LZEXJU2U-Cby7H3Dj.js → railroad-ebnf-LZEXJU2U-paFQAnqR.js} +1 -1
- package/dist/web/assets/{railroad-peg-WCYAUIDC-CJpoUW06.js → railroad-peg-WCYAUIDC-B-2Um3QI.js} +1 -1
- package/dist/web/assets/{railroadDiagram-O6MQD6OU-CIJ1E8KE.js → railroadDiagram-O6MQD6OU-WkZPN5MA.js} +1 -1
- package/dist/web/assets/{requirementDiagram-BXWQKSXE-BTDHXcSN.js → requirementDiagram-BXWQKSXE-BJULFhuR.js} +1 -1
- package/dist/web/assets/{ro-RO-JPDTUUEW-BlhbQCSw.js → ro-RO-JPDTUUEW-yKjTMizq.js} +1 -1
- package/dist/web/assets/{ru-RU-B4JR7IUQ-Cd8b9tGe.js → ru-RU-B4JR7IUQ-DITGdMQL.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-P5KCCOFB-DFx8uxV2.js → sankeyDiagram-P5KCCOFB-b_vfju3s.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-WJ2MYXX4-Dr8vTa3e.js → sequenceDiagram-WJ2MYXX4-D5n2aEN6.js} +1 -1
- package/dist/web/assets/{si-LK-N5RQ5JYF-Y7h5xFBD.js → si-LK-N5RQ5JYF-DaFciStR.js} +1 -1
- package/dist/web/assets/{sk-SK-C5VTKIMK-DU5G4wEe.js → sk-SK-C5VTKIMK-CpyCIFtD.js} +1 -1
- package/dist/web/assets/{sl-SI-NN7IZMDC-4olCD7lc.js → sl-SI-NN7IZMDC-cnwvs7FN.js} +1 -1
- package/dist/web/assets/{stateDiagram-D77RDMKH-CRqebLR8.js → stateDiagram-D77RDMKH-CbFjpKDm.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-MP3YSRHH-MOkTt8Mv.js +1 -0
- package/dist/web/assets/subset-shared.chunk-CWAaXrHb.js +1 -0
- package/dist/web/assets/{subset-worker.chunk-Bqgy-Y1W.js → subset-worker.chunk-Cebu2JDe.js} +1 -1
- package/dist/web/assets/{sv-SE-XGPEYMSR-Cp0rVzLX.js → sv-SE-XGPEYMSR-dOntI1Fk.js} +1 -1
- package/dist/web/assets/{swimlanes-42K2YHIH-BYd8YoU8.js → swimlanes-42K2YHIH-DtmsuzRR.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-VR7AAH4N-v2ue4raa.js +8 -0
- package/dist/web/assets/{ta-IN-2NMHFXQM-DPDOL5cy.js → ta-IN-2NMHFXQM-Comju6i2.js} +1 -1
- package/dist/web/assets/{th-TH-HPSO5L25-CN82X-G0.js → th-TH-HPSO5L25-uPCBvbue.js} +1 -1
- package/dist/web/assets/{timeline-definition-24CTP7MA-DeQFCevv.js → timeline-definition-24CTP7MA-DKZOmZFD.js} +1 -1
- package/dist/web/assets/{tr-TR-DEFEU3FU-DZkONFun.js → tr-TR-DEFEU3FU-LaP2C4go.js} +1 -1
- package/dist/web/assets/{treeView-Q6P3EWNA-C4dlZskR.js → treeView-Q6P3EWNA-DJii9IFr.js} +1 -1
- package/dist/web/assets/{treemap-WGGIJYW6-oSQNu9HW.js → treemap-WGGIJYW6-U42pUP2Q.js} +1 -1
- package/dist/web/assets/{uk-UA-QMV73CPH-da8znbfC.js → uk-UA-QMV73CPH-u-WBulor.js} +1 -1
- package/dist/web/assets/{vennDiagram-4TSXK5OY-e4T6zK4z.js → vennDiagram-4TSXK5OY-C8_zJPdp.js} +1 -1
- package/dist/web/assets/{vi-VN-M7AON7JQ-QWCjquXm.js → vi-VN-M7AON7JQ-DOSv3aq5.js} +1 -1
- package/dist/web/assets/{wardley-WFR3VGLG-BzQw11Sd.js → wardley-WFR3VGLG-DU89dbbh.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-VM6X3IG4-DyPpKV2H.js → wardleyDiagram-VM6X3IG4-BGnASelu.js} +1 -1
- package/dist/web/assets/{xychartDiagram-S5SC5T6Z-DKjIes2P.js → xychartDiagram-S5SC5T6Z-js8-abv7.js} +1 -1
- package/dist/web/assets/{zh-CN-LNUGB5OW-BbT-kvRj.js → zh-CN-LNUGB5OW-B8soJHf3.js} +1 -1
- package/dist/web/assets/{zh-HK-E62DVLB3-BPw2AWZD.js → zh-HK-E62DVLB3-DKByBmSJ.js} +1 -1
- package/dist/web/assets/{zh-TW-RAJ6MFWO-BE9F3OdK.js → zh-TW-RAJ6MFWO-CYBStGL6.js} +1 -1
- package/dist/web/favicon-32.png +0 -0
- package/dist/web/favicon.svg +12 -0
- package/dist/web/index.html +6 -3
- package/package.json +4 -2
- package/dist/web/assets/channel-B_LXUtkZ.js +0 -1
- package/dist/web/assets/classDiagram-ZZMXUADV-zYihe46b.js +0 -1
- package/dist/web/assets/classDiagram-v2-VYDZK3BY-zYihe46b.js +0 -1
- package/dist/web/assets/flowDiagram-HODETNUW-CnV5VPNb.js +0 -1
- package/dist/web/assets/index-BLscnX3-.js +0 -212
- package/dist/web/assets/percentages-BXMCSKIN-B3ZxlSu3.js +0 -1
- package/dist/web/assets/stateDiagram-v2-MP3YSRHH-DWV16uKx.js +0 -1
- package/dist/web/assets/subset-shared.chunk-1t88pPR-.js +0 -1
- package/dist/web/assets/swimlanesDiagram-VR7AAH4N-CACbHpLI.js +0 -8
package/README.md
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
# excaliagent
|
|
2
2
|
|
|
3
|
-
A
|
|
3
|
+
A 2D board for your coding agents, on an Excalidraw canvas.
|
|
4
|
+
|
|
5
|
+
When you run many coding agents at once, it is hard to remember which one was
|
|
6
|
+
doing what. excaliagent is a memory palace for your agents: each session is a
|
|
7
|
+
card you place on a canvas, and when you come back, its place reminds you what
|
|
8
|
+
it was about.
|
|
9
|
+
|
|
10
|
+
Works with Claude Code, OpenAI Codex and OpenCode.
|
|
4
11
|
|
|
5
12
|

|
|
6
13
|
|
|
7
14
|
Every session is a card. You drag cards wherever they make sense to you (parked,
|
|
8
15
|
blocked on a colleague, come back to, done) and draw anything around them. The
|
|
9
|
-
app keeps each card's **color and label** in sync with the session and
|
|
10
|
-
|
|
16
|
+
app keeps each card's **color and label** in sync with the session (and its
|
|
17
|
+
height fitted to a one- or two-line title, until you resize the card yourself)
|
|
18
|
+
and never moves, resizes, or edits anything else on its own; cards move only
|
|
19
|
+
when you drop one on a lane title or ask for a tidy-up.
|
|
11
20
|
|
|
12
21
|
```
|
|
13
|
-
Fix flaky checkout
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
🐔 Fix flaky checkout ✳ ← character, title (handwritten, larger), harness logo
|
|
23
|
+
test
|
|
24
|
+
demo-app · fix/flaky ← repo · branch
|
|
25
|
+
needs user: input needed · 2m ← status · what it waits for · last activity
|
|
26
|
+
cache warm 41m ← prompt-cache warmth
|
|
27
|
+
herdr: demo-app › oauth ← herdr workspace › tab
|
|
28
|
+
PR #12 ← last PR link
|
|
19
29
|
```
|
|
20
30
|
|
|
21
31
|
| Color | Meaning |
|
|
@@ -28,6 +38,39 @@ PR #12 ← last PR link
|
|
|
28
38
|
|
|
29
39
|

|
|
30
40
|
|
|
41
|
+
## What it is for
|
|
42
|
+
|
|
43
|
+
The spatial board is the point. Everything else (live status, characters,
|
|
44
|
+
lanes, jumping to a pane, resuming, more agents) is there to make that board a
|
|
45
|
+
better place to keep your sessions. Beyond that, nothing is off the table: new
|
|
46
|
+
features and ideas of any kind are welcome on top of it.
|
|
47
|
+
|
|
48
|
+
## Supported agents
|
|
49
|
+
|
|
50
|
+
| Agent | Live sessions and status | Dormant sessions | Resume | Stop |
|
|
51
|
+
|---|---|---|---|---|
|
|
52
|
+
| Claude Code | registry in `~/.claude/sessions`: busy, idle, needs input, ... | transcripts | `claude --resume <id>` | yes |
|
|
53
|
+
| Codex (0.163) | Linux only: running threads; busy or idle (approval prompts show as busy) | rollouts in `~/.codex/sessions` | `codex resume <id>` | yes |
|
|
54
|
+
| OpenCode (1.19) | Linux only, best effort (see below); busy or idle | `~/.local/share/opencode/opencode.db` | `opencode -s <id>` | yes |
|
|
55
|
+
|
|
56
|
+
Codex cards carry no prompt-cache line or PR link (Codex records neither), and
|
|
57
|
+
on macOS Codex sessions are only offered as dormant ones. Stop is offered only
|
|
58
|
+
when the board knows the Codex process for sure (`codex resume <id>`, or
|
|
59
|
+
`codex exec`), not when it matched a `codex` started without an id by its
|
|
60
|
+
folder. Rollouts older than a week may be compressed; reading those needs
|
|
61
|
+
Node 22.15+. Codex is looked up in
|
|
62
|
+
`$CODEX_HOME`, else `~/.codex` (`--codex-dir` to change, `--no-codex` to
|
|
63
|
+
turn it off). Details: [design](docs/design.md#codex-data-verified-on-01630).
|
|
64
|
+
|
|
65
|
+
OpenCode keeps no record of which session a running TUI shows, so the board
|
|
66
|
+
infers it: a TUI started with `opencode -s <id>` shows that session, any other
|
|
67
|
+
TUI the newest session of its directory that changed since it started. After
|
|
68
|
+
`/new` or switching sessions inside a TUI the wrong card can be live; see
|
|
69
|
+
[design](docs/design.md#opencode-data-verified-on-1193). Stop is offered only
|
|
70
|
+
for a TUI started with `opencode -s <id>`. OpenCode support needs Node 22.13+
|
|
71
|
+
(for `node:sqlite`; the rest of the board runs on Node 22); `--opencode-dir`
|
|
72
|
+
points at another data dir, `--no-opencode` turns it off.
|
|
73
|
+
|
|
31
74
|
## Run
|
|
32
75
|
|
|
33
76
|
```sh
|
|
@@ -43,45 +86,84 @@ bookmark. Running it again while a board is up just opens that board.
|
|
|
43
86
|
lanes next to it (To Do, In Progress, Review, Blocked, Parked, Done, and two
|
|
44
87
|
blank ones to name yourself); they are plain shapes you can move, resize,
|
|
45
88
|
rename (double-click) or delete. **+ Lane** (top right) adds one more at the
|
|
46
|
-
right end.
|
|
47
|
-
|
|
48
|
-
|
|
89
|
+
right end.
|
|
90
|
+
- **Line cards up in a lane**: while you drag a card, every lane title shows a
|
|
91
|
+
faint *drop to stack* hint; drop the card on one (it lights up) and the card
|
|
92
|
+
goes into the lane's column, below the lowest card there.
|
|
93
|
+
Dropped anywhere else, a card stays exactly where you put it. Right-click a
|
|
94
|
+
lane → *Tidy cards* stacks its cards in one column, top to bottom (on the
|
|
95
|
+
inbox it packs its columns). **Tidy all** (top right, or the main menu)
|
|
96
|
+
does every lane and the inbox at once. Stacked cards are always 20 px
|
|
97
|
+
apart; if a title later grows a second line, its card may overlap the one
|
|
98
|
+
below a little until you tidy again. Cards
|
|
99
|
+
that are locked, rotated, attached to an arrow or grouped with something
|
|
100
|
+
else stay put; the column goes around them. Ctrl+Z undoes a tidy (or Tidy
|
|
101
|
+
all) in one step and a drop in two (the snap, then the drag). Turn the
|
|
102
|
+
title drop off in the main menu (*Drop on lane title stacks cards*).
|
|
103
|
+
- **Dormant sessions** are added from the **Sessions** panel (top right). On a
|
|
104
|
+
narrow window the top-right buttons show only their icons; hover for the name.
|
|
49
105
|
- **Double-click a card** to jump to it: a live session focuses its
|
|
50
106
|
[herdr](https://herdr.dev) pane and raises the terminal window (Hyprland,
|
|
51
|
-
Sway, macOS). A dormant session is resumed
|
|
52
|
-
tab, in the workspace for that repo. Without herdr, the resume command is
|
|
53
|
-
copied instead.
|
|
107
|
+
Sway, macOS). A dormant session is resumed (`claude --resume <id>`,
|
|
108
|
+
`codex resume <id>`) in a new herdr tab, in the workspace for that repo. Without herdr, the resume command is
|
|
109
|
+
copied instead. A single click on the harness logo in the card's corner
|
|
110
|
+
does the same.
|
|
54
111
|
- **Right-click a card** for an excaliagent section on top of the Excalidraw
|
|
55
112
|
menu: focus or resume, copy the resume command (with or without `cd`), open
|
|
56
|
-
the PR
|
|
113
|
+
the PR, or stop a running session (asks first; the conversation is kept and
|
|
114
|
+
can be resumed).
|
|
57
115
|
- A **PR link** (GitHub, Bitbucket, GitLab) shows on the card; the card's link
|
|
58
116
|
icon opens it.
|
|
117
|
+
- Every card has a **character**, so you remember which agent is which: an
|
|
118
|
+
animal by default, different for every card on the board, and the same one
|
|
119
|
+
each time that session comes back. Right-click → *Change character…* picks
|
|
120
|
+
one by hand (or *Shuffle*, *Reset to automatic*, or *None*; deleting the
|
|
121
|
+
character from a card also keeps it off). The **Characters** panel
|
|
122
|
+
(top right) switches the pack (Animals, Cats & friends, Sea, Fantasy, Food)
|
|
123
|
+
and makes your own packs from emoji and images: type or paste an emoji, or
|
|
124
|
+
paste, drop or upload png, gif, webp, jpeg or svg files (up to 1 MB each). A
|
|
125
|
+
custom pack is a folder, `packs/<name>/` in the state directory, so you can
|
|
126
|
+
also drop image files there by hand, and list emoji in its `pack.json` as
|
|
127
|
+
`{"emoji": ["🧟", "👻"]}`.
|
|
128
|
+
|
|
129
|
+

|
|
130
|
+
|
|
59
131
|
- The board is saved to `$XDG_STATE_HOME/excaliagent/scene.json`
|
|
60
132
|
(default `~/.local/state/excaliagent/`), pasted images under `files/` next
|
|
61
|
-
to it.
|
|
133
|
+
to it, character choices in `characters.json` and your packs under `packs/`.
|
|
62
134
|
- **Start over**: main menu → *Reset the canvas* (undoable) lays out a fresh
|
|
63
135
|
board with the live sessions. Or try a clean board without touching yours:
|
|
64
136
|
`npx excaliagent --state-dir /tmp/excaliagent-fresh`.
|
|
65
137
|
|
|
66
|
-
Options: `--port`, `--no-open`, `--state-dir`, `--claude-dir`, `--
|
|
138
|
+
Options: `--port`, `--no-open`, `--state-dir`, `--claude-dir`, `--codex-dir`,
|
|
139
|
+
`--no-codex`, `--opencode-dir`, `--no-opencode`, `--no-herdr`, `--no-raise`.
|
|
67
140
|
See `npx excaliagent --help`.
|
|
68
141
|
|
|
69
142
|
## Privacy and security
|
|
70
143
|
|
|
71
144
|
- Reads `~/.claude/sessions/*.json` and the transcript files under
|
|
72
145
|
`~/.claude/projects/` (only metadata lines: title, branch, timestamps, token
|
|
73
|
-
usage, PR links; never message content).
|
|
146
|
+
usage, PR links; never message content). For Codex it reads the rollouts
|
|
147
|
+
under `~/.codex/sessions/` (metadata, turn starts and ends, and the first
|
|
148
|
+
prompt, cut short, as the title, like `codex resume` shows it),
|
|
149
|
+
`session_index.jsonl` (names), the lock files in `thread-writer-locks/`, and
|
|
150
|
+
`/proc` (`/proc/locks`, and the command line and working directory of
|
|
151
|
+
`codex` processes) to tell which threads are running. For OpenCode it reads
|
|
152
|
+
`opencode.db` read-only (session titles, directories, times, and whether the
|
|
153
|
+
newest message is finished; never message content) and the command line,
|
|
154
|
+
working directory and start time of `opencode` processes. Installs no hooks, writes nothing
|
|
74
155
|
outside its state directory.
|
|
75
156
|
- Listens on loopback only. A random token (created once, kept in the state
|
|
76
157
|
directory, readable only by you) is put into the URL it opens and exchanged
|
|
77
158
|
for an HttpOnly cookie; every request needs it, so other users on the same
|
|
78
159
|
machine stay out. Requests with a
|
|
79
160
|
foreign `Host` (DNS rebinding) or cross-origin writes are refused.
|
|
80
|
-
- Its only actions: focus a herdr pane, raise the terminal window,
|
|
81
|
-
`claude --resume <id>` in a new herdr pane
|
|
82
|
-
session.
|
|
83
|
-
|
|
84
|
-
|
|
161
|
+
- Its only actions: focus a herdr pane, raise the terminal window, start
|
|
162
|
+
`claude --resume <id>`, `codex resume <id>` or `opencode -s <id>` in a new herdr pane, and stop a session when you ask
|
|
163
|
+
(right-click → Stop session, confirmed; it exits as if its terminal closed).
|
|
164
|
+
It never types into a running session.
|
|
165
|
+
- Images you paste onto the board, and the images of your character packs,
|
|
166
|
+
are stored next to the scene, in the state directory.
|
|
85
167
|
- The only outside request: Chinese, Japanese or Korean text on the board loads
|
|
86
168
|
Excalidraw's CJK font from esm.sh (it is not bundled, to keep the package
|
|
87
169
|
small). Everything else, including all other fonts, is served locally.
|
|
@@ -106,17 +188,19 @@ The repo ships a Nix flake with Node 24 and Chromium for the browser tests:
|
|
|
106
188
|
direnv allow # or: nix develop
|
|
107
189
|
npm install
|
|
108
190
|
npm test # unit tests (vitest)
|
|
109
|
-
npm run test:e2e # browser tests (playwright) against
|
|
191
|
+
npm run test:e2e # browser tests (playwright) against mock Claude, Codex and OpenCode homes
|
|
110
192
|
npm run demo # the board with a seeded, synthetic set of sessions
|
|
111
|
-
npm run dev # server + Vite hot reload against your real ~/.claude
|
|
193
|
+
npm run dev # server + Vite hot reload against your real ~/.claude, ~/.codex and OpenCode data
|
|
112
194
|
```
|
|
113
195
|
|
|
114
|
-
Tests never read your real `~/.claude` or
|
|
115
|
-
`test/mock-claude.ts`
|
|
196
|
+
Tests never read your real `~/.claude`, `~/.codex` or OpenCode data or talk to
|
|
197
|
+
your running herdr: `test/mock-claude.ts`, `test/mock-codex.ts` and
|
|
198
|
+
`test/mock-opencode.ts` seed throwaway homes with dummy processes, and the
|
|
116
199
|
herdr tests start an isolated `herdr server` with its own temp home and socket.
|
|
117
200
|
A privacy test fails if any fixture contains this machine's home path or user
|
|
118
201
|
name.
|
|
119
202
|
|
|
120
203
|
Docs: [product](docs/product.md), [design](docs/design.md), [roadmap](docs/roadmap.md). Agents start at [AGENTS.md](AGENTS.md).
|
|
121
204
|
|
|
122
|
-
MIT licensed.
|
|
205
|
+
MIT licensed. Built-in characters are Unicode emoji, drawn by your system's
|
|
206
|
+
emoji font. The harness logos on cards (from [simple-icons](https://simpleicons.org), CC0) are trademarks of their owners and only identify which agent a card belongs to. simple-icons has no OpenAI mark, so Codex cards show a neutral `>_` glyph drawn for this project; the OpenCode mark is from simple-icons too.
|
package/dist/server/args.js
CHANGED
|
@@ -3,7 +3,7 @@ import { parseArgs } from "node:util";
|
|
|
3
3
|
export const DEFAULT_PORT = 7357;
|
|
4
4
|
export const USAGE = `Usage: excaliagent [options]
|
|
5
5
|
|
|
6
|
-
A spatial Excalidraw board for your Claude Code
|
|
6
|
+
A spatial Excalidraw board for your coding-agent sessions (Claude Code, Codex, OpenCode).
|
|
7
7
|
|
|
8
8
|
Options:
|
|
9
9
|
--port <n> Port on 127.0.0.1 (default: 7357, or a random free port
|
|
@@ -11,6 +11,11 @@ Options:
|
|
|
11
11
|
--no-open Do not open the browser, just print the URL
|
|
12
12
|
--state-dir <dir> Where scene.json lives (default: $XDG_STATE_HOME/excaliagent)
|
|
13
13
|
--claude-dir <dir> Claude Code home (default: ~/.claude)
|
|
14
|
+
--codex-dir <dir> Codex home (default: $CODEX_HOME, else ~/.codex)
|
|
15
|
+
--no-codex Do not show Codex sessions
|
|
16
|
+
--opencode-dir <dir> OpenCode data dir, holding opencode.db (default:
|
|
17
|
+
$XDG_DATA_HOME/opencode, else ~/.local/share/opencode)
|
|
18
|
+
--no-opencode Do not show OpenCode sessions
|
|
14
19
|
--no-herdr Do not link sessions to herdr panes
|
|
15
20
|
--no-raise Focus the herdr pane but do not raise its terminal window
|
|
16
21
|
(raising supports Hyprland, Sway and macOS)
|
|
@@ -31,6 +36,10 @@ export function parseCliArgs(argv) {
|
|
|
31
36
|
raise: { type: "boolean", default: true },
|
|
32
37
|
"state-dir": { type: "string" },
|
|
33
38
|
"claude-dir": { type: "string" },
|
|
39
|
+
codex: { type: "boolean", default: true },
|
|
40
|
+
"codex-dir": { type: "string" },
|
|
41
|
+
opencode: { type: "boolean", default: true },
|
|
42
|
+
"opencode-dir": { type: "string" },
|
|
34
43
|
help: { type: "boolean", short: "h", default: false },
|
|
35
44
|
version: { type: "boolean", short: "v", default: false },
|
|
36
45
|
},
|
|
@@ -49,6 +58,10 @@ export function parseCliArgs(argv) {
|
|
|
49
58
|
raise: values.raise,
|
|
50
59
|
stateDir: values["state-dir"],
|
|
51
60
|
claudeDir: values["claude-dir"],
|
|
61
|
+
codex: values.codex,
|
|
62
|
+
codexDir: values["codex-dir"],
|
|
63
|
+
opencode: values.opencode,
|
|
64
|
+
opencodeDir: values["opencode-dir"],
|
|
52
65
|
help: values.help,
|
|
53
66
|
version: values.version,
|
|
54
67
|
};
|