@askexenow/exe-os 0.9.409 → 0.9.411
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/deploy/stack-manifests/v0.9.json +408 -1
- package/dist/.dist-verified.json +3 -3
- package/dist/{active-agent-5AKPW2N7.js → active-agent-3YCLS7GB.js} +4 -4
- package/dist/{active-agent-2AMJC3SC.js → active-agent-MHWQDMML.js} +4 -4
- package/dist/agent-defs-generator-DNXMO34I.js +32 -0
- package/dist/{agentic-ontology-6RS7A7KP.js → agentic-ontology-RA6CMND6.js} +1 -1
- package/dist/{artifact-backup-6O4FNYPS.js → artifact-backup-EETHNFFP.js} +3 -3
- package/dist/{backfill-metadata-6YX6LGPJ.js → backfill-metadata-WYT257VG.js} +7 -7
- package/dist/backup-verify-AG54CYGR.js +62 -0
- package/dist/{behavior-injection-NRXTNROW.js → behavior-injection-G7GAUHGO.js} +10 -10
- package/dist/{behavior-promotion-MW7OQ72V.js → behavior-promotion-I2DIUFUR.js} +9 -9
- package/dist/{behaviors-7AOK44QK.js → behaviors-SKVKPCRW.js} +8 -8
- package/dist/bin/agentic-ontology-backfill.js +8 -8
- package/dist/bin/agentic-reflection-backfill.js +9 -9
- package/dist/bin/agentic-semantic-label.js +8 -8
- package/dist/bin/backfill-conversations.js +7 -7
- package/dist/bin/backfill-responses.js +7 -7
- package/dist/bin/backfill-vectors.js +7 -7
- package/dist/bin/bulk-sync-postgres.js +16 -16
- package/dist/bin/cc-doctor.js +8 -8
- package/dist/bin/cleanup-stale-review-tasks.js +13 -16
- package/dist/bin/cli.js +24 -24
- package/dist/bin/deferred-daemon-restart.js +97 -97
- package/dist/bin/exe-actions.js +1 -1
- package/dist/bin/exe-agent-config.js +3 -3
- package/dist/bin/exe-agent.js +12 -12
- package/dist/bin/exe-assign.js +8 -8
- package/dist/bin/exe-boot.js +35 -38
- package/dist/bin/exe-call.js +9 -9
- package/dist/bin/exe-cloud.js +26 -22
- package/dist/bin/exe-config-dump.js +3 -3
- package/dist/bin/exe-dispatch.js +14 -17
- package/dist/bin/exe-doctor.js +5 -5
- package/dist/bin/exe-export-behaviors.js +12 -12
- package/dist/bin/exe-forget.js +12 -12
- package/dist/bin/exe-gateway.js +9 -9
- package/dist/bin/exe-grant.js +6 -6
- package/dist/bin/exe-healthcheck.js +8 -8
- package/dist/bin/exe-heartbeat.js +19 -22
- package/dist/bin/exe-kill.js +18 -21
- package/dist/bin/exe-launch-agent.js +264 -110
- package/dist/bin/exe-mcp.js +5 -5
- package/dist/bin/exe-memory-reads.js +7 -7
- package/dist/bin/exe-new-employee.js +11 -11
- package/dist/bin/exe-os-mcp-proxy.js +5 -5
- package/dist/bin/exe-pending-messages.js +14 -17
- package/dist/bin/exe-pending-notifications.js +13 -16
- package/dist/bin/exe-pending-reviews.js +14 -17
- package/dist/bin/exe-rename.js +7 -7
- package/dist/bin/exe-review.js +17 -20
- package/dist/bin/exe-search.js +11 -11
- package/dist/bin/exe-session-cleanup.js +18 -21
- package/dist/bin/exe-settings.js +16 -16
- package/dist/bin/exe-start-codex.js +37 -19
- package/dist/bin/exe-start-opencode.js +35 -17
- package/dist/bin/exe-status.js +15 -18
- package/dist/bin/exe-support.js +3 -3
- package/dist/bin/exe-team.js +5 -5
- package/dist/bin/git-sweep.js +15 -17
- package/dist/bin/graph-backfill.js +8 -8
- package/dist/bin/graph-export.js +8 -8
- package/dist/bin/hooks-cli.js +1 -1
- package/dist/bin/import-history.js +11 -11
- package/dist/bin/install.js +99 -99
- package/dist/bin/intercom-check.js +5 -5
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +5 -5
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/pre-publish.js +1 -1
- package/dist/bin/reconcile-backlog.js +2 -2
- package/dist/bin/registry-proxy.js +1 -1
- package/dist/bin/repair-document-chunks.js +7 -7
- package/dist/bin/scan-tasks.js +14 -17
- package/dist/bin/setup.js +2 -2
- package/dist/bin/shard-migrate.js +8 -8
- package/dist/bin/stack-update.js +4 -4
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{boot-generation-HG6LLZLY.js → boot-generation-RPJVFAQJ.js} +4 -4
- package/dist/{boot-review-sections-STZ5EAIL.js → boot-review-sections-FOPPZTJI.js} +12 -15
- package/dist/{bug-landed-reconciler-EO72HUI2.js → bug-landed-reconciler-FN5KPBRK.js} +6 -6
- package/dist/build-info.json +3 -3
- package/dist/build-manifest.json +997 -987
- package/dist/{capability-cards-C3SMHB2E.js → capability-cards-YQWBEG7A.js} +3 -3
- package/dist/{capacity-monitor-UI553HRL.js → capacity-monitor-7SMEJHYG.js} +14 -17
- package/dist/{catchup-brief-VE2X4HML.js → catchup-brief-IBQ26LEB.js} +21 -23
- package/dist/{chunk-6ZW6BRI4.js → chunk-27NG2NTG.js} +2 -2
- package/dist/{chunk-EIM7OGTD.js → chunk-2BOLFLAU.js} +4 -2
- package/dist/{chunk-DM4VTXM6.js → chunk-2EYVXUGA.js} +4 -4
- package/dist/{chunk-LMF2YC5C.js → chunk-2YFMBXUU.js} +4 -4
- package/dist/{chunk-C426MZMD.js → chunk-2YGBJHC2.js} +3 -3
- package/dist/{chunk-6EY6OFBC.js → chunk-353XF4LU.js} +2 -2
- package/dist/{chunk-VMHZSZQJ.js → chunk-3ARSKDHC.js} +52 -0
- package/dist/{chunk-ZYOIH5NY.js → chunk-3DXAJVXE.js} +6 -6
- package/dist/{chunk-HFSFWMID.js → chunk-3GGMHSY2.js} +3 -3
- package/dist/{chunk-BM467PZN.js → chunk-3N24FV22.js} +1 -1
- package/dist/{chunk-SY53PYLU.js → chunk-47YGEM4N.js} +1 -1
- package/dist/{chunk-NVM3SKJ4.js → chunk-4CN3EE6U.js} +27 -21
- package/dist/{chunk-KIJRAZWR.js → chunk-4J77TCTX.js} +1 -1
- package/dist/{chunk-NHQWPKX7.js → chunk-54STF27U.js} +2 -2
- package/dist/{chunk-Q4GS5VW7.js → chunk-5BWDUUMH.js} +3 -3
- package/dist/{chunk-VYKXRSHU.js → chunk-5ZMNFSHV.js} +1 -1
- package/dist/{chunk-HNGAM3U4.js → chunk-657I6PUF.js} +3 -3
- package/dist/{chunk-OE7TAEOG.js → chunk-6777GNWI.js} +1 -1
- package/dist/{chunk-HYZV25LY.js → chunk-67IVG6CB.js} +1 -11
- package/dist/{chunk-5N34MMKS.js → chunk-6APOLYIZ.js} +43 -3
- package/dist/{chunk-TBYWOHTE.js → chunk-6BD6JYR2.js} +1 -1
- package/dist/{chunk-JJYAETCO.js → chunk-6DMURUBY.js} +4 -4
- package/dist/{chunk-W5XAB2SW.js → chunk-6HJF7IA3.js} +273 -206
- package/dist/{chunk-HRKN3DQE.js → chunk-6J2J3VJS.js} +11 -11
- package/dist/{chunk-XFGS22VE.js → chunk-6PXFF6IV.js} +1 -1
- package/dist/{chunk-RZ23QQCI.js → chunk-7HLAYQRG.js} +4 -4
- package/dist/{chunk-IUBCS6TA.js → chunk-7KPZQ65I.js} +3 -3
- package/dist/{chunk-SYUJCVJG.js → chunk-7PDZBPGW.js} +1 -1
- package/dist/{chunk-VLAENYCN.js → chunk-7SHU5MOD.js} +1 -1
- package/dist/{chunk-6RRPVE5O.js → chunk-A5I2GYVQ.js} +3 -3
- package/dist/{chunk-X4V5ZLNX.js → chunk-A75TAU2I.js} +628 -4
- package/dist/{chunk-SGR4ZQAV.js → chunk-BE3UETW6.js} +3 -3
- package/dist/{chunk-GG73NHZD.js → chunk-BG6RAOCJ.js} +63 -9
- package/dist/{chunk-DMYJVGQM.js → chunk-BIPTWAEO.js} +1 -1
- package/dist/{chunk-B3ISLIKE.js → chunk-BLTXAUP6.js} +2 -2
- package/dist/{chunk-G2M7WQ2M.js → chunk-CBC3JCIF.js} +1 -1
- package/dist/{chunk-FJKUFMNF.js → chunk-CFFSHBQF.js} +1 -1
- package/dist/{chunk-WYNIWJRN.js → chunk-CJ6CS2IH.js} +5 -5
- package/dist/{chunk-7LTAA55U.js → chunk-CRW63CDI.js} +1 -1
- package/dist/{chunk-BHDDDNC6.js → chunk-CWHTUNJX.js} +2 -2
- package/dist/{chunk-FZT4VQP7.js → chunk-D6NZNUVH.js} +1 -1
- package/dist/{chunk-GKPPLIMJ.js → chunk-DHLJZDWI.js} +4 -4
- package/dist/{chunk-JR3GTBV3.js → chunk-DRHTRVDT.js} +1 -1
- package/dist/{chunk-GTRB6DGI.js → chunk-DWRULKB3.js} +2 -2
- package/dist/{chunk-DIKLSAJE.js → chunk-EOWJXCYC.js} +25 -7
- package/dist/{chunk-4W7Y67B5.js → chunk-EWDBWOCX.js} +1 -1
- package/dist/{chunk-EHILXBVT.js → chunk-FPF2PJFK.js} +3 -3
- package/dist/{chunk-BPBEJD7U.js → chunk-FSXMKIDO.js} +1 -1
- package/dist/{chunk-E2Z3F26R.js → chunk-FUDXITKX.js} +1 -1
- package/dist/{chunk-SFGFNJBR.js → chunk-FYV2CTKP.js} +1 -1
- package/dist/{chunk-4M24XCTI.js → chunk-GATAYYAF.js} +53 -7
- package/dist/{chunk-L5CPS34O.js → chunk-GHYHNHDL.js} +1 -1
- package/dist/{chunk-OISOA6NX.js → chunk-GL5ZG72X.js} +1 -1
- package/dist/{chunk-XAGIZVYI.js → chunk-GM4UEZDE.js} +181 -1625
- package/dist/{chunk-4O7OUBEX.js → chunk-GZVFHFO3.js} +27 -140
- package/dist/{chunk-M4N7I2H5.js → chunk-HA6BIZ6L.js} +5 -5
- package/dist/chunk-HDQAVAV6.js +248 -0
- package/dist/{chunk-IPANAGA3.js → chunk-HDV2V25K.js} +1 -1
- package/dist/{chunk-XGPBHKU3.js → chunk-HTFM7ZDD.js} +2 -2
- package/dist/{chunk-KPLMY2GT.js → chunk-HUHR5CKJ.js} +4 -4
- package/dist/{chunk-IPBNHPTE.js → chunk-IC2AONBH.js} +9 -9
- package/dist/{chunk-23XUZHB7.js → chunk-IHAXXDBH.js} +245 -36
- package/dist/{chunk-4S6H2NWS.js → chunk-IPUDXR67.js} +1 -1
- package/dist/{chunk-UXJAW4IQ.js → chunk-J6U4ZR77.js} +2 -2
- package/dist/{chunk-7I6KVKFF.js → chunk-JAIZCE6W.js} +3 -3
- package/dist/{chunk-SA66WRBT.js → chunk-JGBYZTWH.js} +1 -1
- package/dist/{chunk-HRYWB4TO.js → chunk-JJZZXEAN.js} +3 -3
- package/dist/{chunk-IZ24HRDC.js → chunk-JNULO6I5.js} +3 -3
- package/dist/{chunk-YVS77JPW.js → chunk-JTJP4JK7.js} +3 -3
- package/dist/{chunk-BIV4IHED.js → chunk-JW5NUXPN.js} +15 -28
- package/dist/{chunk-NFNM64A7.js → chunk-K2HIXAIF.js} +22 -18
- package/dist/{chunk-F5ZRHLG5.js → chunk-KEDZRQI3.js} +2 -2
- package/dist/{chunk-QPMKVSHU.js → chunk-KN5GAVCG.js} +2 -2
- package/dist/{chunk-3MDUKF3N.js → chunk-L5JFVK5T.js} +5 -4
- package/dist/{chunk-FBZ32BD4.js → chunk-LBSCOP25.js} +1 -1
- package/dist/{chunk-K7DAE2HO.js → chunk-LLZUL7M2.js} +19 -6
- package/dist/{chunk-PCFYNK7V.js → chunk-LQGLGSBY.js} +2 -2
- package/dist/{chunk-APVU4Q5B.js → chunk-LSHUX7P4.js} +16 -16
- package/dist/{chunk-GRAMRMWS.js → chunk-M6AX64J2.js} +2 -2
- package/dist/{chunk-52Z435PH.js → chunk-M6SUJLNP.js} +15 -10
- package/dist/{chunk-GPWXUU3L.js → chunk-MZNLQC6W.js} +1 -1
- package/dist/{chunk-G3ZYXXO7.js → chunk-N7POJZJT.js} +10 -10
- package/dist/{chunk-DE2V7547.js → chunk-NCNT2C2P.js} +2 -2
- package/dist/{chunk-HK7HIDXP.js → chunk-O3BLL6MY.js} +1 -1
- package/dist/{chunk-YLWKWEJJ.js → chunk-O6KQAJCC.js} +3 -3
- package/dist/{chunk-QUK3UDZV.js → chunk-OHHZNNUD.js} +1 -1
- package/dist/{chunk-6JLVCMKH.js → chunk-PDQGR5LZ.js} +1 -1
- package/dist/{chunk-LE3DIA25.js → chunk-PTF5TB6O.js} +3 -3
- package/dist/{chunk-KBHK2WNO.js → chunk-PYXXL7N7.js} +1 -1
- package/dist/{chunk-QK3Z4TKQ.js → chunk-Q6KUBP6R.js} +5 -5
- package/dist/{chunk-NDCW4G55.js → chunk-QJWLQXR7.js} +1 -1
- package/dist/{chunk-ME733Y2F.js → chunk-QOFQY7BJ.js} +37 -9
- package/dist/{chunk-HFXBL7XE.js → chunk-QSW5DHMZ.js} +1 -1
- package/dist/{chunk-OFT5KSBM.js → chunk-QV26G2BF.js} +1 -1
- package/dist/{chunk-LVEMYNYH.js → chunk-RHHEYC6H.js} +3 -3
- package/dist/{chunk-QYIR64RR.js → chunk-RHJOTGEU.js} +1 -1
- package/dist/{chunk-HUMNRJZE.js → chunk-RJIH7JXM.js} +4 -4
- package/dist/{chunk-6TB7UXCA.js → chunk-RMC2A6EE.js} +1 -1
- package/dist/{chunk-XCPD7NGP.js → chunk-RYMXD2NT.js} +1 -1
- package/dist/{chunk-W2VDJKTB.js → chunk-RYYFFCJG.js} +1 -1
- package/dist/{chunk-YUAOQJVV.js → chunk-SINIRUYZ.js} +101 -9
- package/dist/{chunk-R7QZXQPU.js → chunk-SXUABANK.js} +216 -147
- package/dist/{backup-verify-QIAQ63VC.js → chunk-T3AM52YT.js} +411 -90
- package/dist/{chunk-NK4JHJNP.js → chunk-TCBWHLKH.js} +4 -4
- package/dist/{chunk-R6CKQLEA.js → chunk-TS4LSNRI.js} +2 -2
- package/dist/{chunk-4Q7H3TO7.js → chunk-TVWYMOZ4.js} +1 -1
- package/dist/{chunk-TCV3WA5I.js → chunk-VAHQOIQY.js} +1 -1
- package/dist/{chunk-ZEHBSA25.js → chunk-VQQPYI4X.js} +1 -1
- package/dist/{chunk-PZDAPIQL.js → chunk-VS7V5HNO.js} +1 -1
- package/dist/{chunk-7R7KDRKV.js → chunk-W7VKGB42.js} +1 -1
- package/dist/{chunk-M7774YLB.js → chunk-WC44PNZU.js} +1 -1
- package/dist/{chunk-3AL2LO3L.js → chunk-WHUQ44F2.js} +1 -1
- package/dist/{chunk-4RQ62XXK.js → chunk-X2ZHCNNB.js} +5 -5
- package/dist/{chunk-T2PAFWRK.js → chunk-X4FHT6ST.js} +5 -5
- package/dist/{chunk-N3JEYUDV.js → chunk-XC5OASHV.js} +1 -1
- package/dist/{agent-defs-generator-QN3J6FVJ.js → chunk-XDOCXKHW.js} +61 -21
- package/dist/{chunk-OEHZ46WQ.js → chunk-XEAZJXMZ.js} +2 -2
- package/dist/{chunk-DACRR362.js → chunk-XQ7BIVLI.js} +6 -6
- package/dist/{chunk-7P2TDFZL.js → chunk-Z3LGAFMG.js} +1 -1
- package/dist/{chunk-GEQQGN3J.js → chunk-ZJ6AMC4Y.js} +7 -7
- package/dist/{chunk-IURGBN5B.js → chunk-ZZR2WRNW.js} +4 -4
- package/dist/{cleanup-graph-garbage-NKAJSCWZ.js → cleanup-graph-garbage-SYGPMPUM.js} +8 -8
- package/dist/{cli-shutdown-F3DFDCB5.js → cli-shutdown-JI7CASE4.js} +1 -1
- package/dist/{cloud-sync-command-3YBLSMAL.js → cloud-sync-command-ZV3P5FP6.js} +2 -2
- package/dist/{cloud-sync-db-init-JWSPAFKY.js → cloud-sync-db-init-RQIHWKV4.js} +1 -1
- package/dist/{cloud-sync-shutdown-4R6RIO67.js → cloud-sync-shutdown-V2N7VLD3.js} +3 -3
- package/dist/{co-activation-2ZRANV3Q.js → co-activation-SRE6DIRX.js} +3 -3
- package/dist/{co-occurrence-6EELW2L2.js → co-occurrence-F5TMSEQZ.js} +6 -6
- package/dist/{consent-passphrase-TDR263MC.js → consent-passphrase-MWZRHJRC.js} +2 -2
- package/dist/content-extractor-GWF2T7FK.js +13 -0
- package/dist/{conversation-entity-extractor-KUJN3MOH.js → conversation-entity-extractor-XMOUHGMT.js} +3 -3
- package/dist/{crdt-sync-IX43KVQ3.js → crdt-sync-FXEKABM7.js} +4 -4
- package/dist/{crm-webhook-GSCIW6CE.js → crm-webhook-D6IJOPRQ.js} +2 -2
- package/dist/{cto-delegation-gate-ZWD4EFRR.js → cto-delegation-gate-BU3JRCYN.js} +12 -15
- package/dist/{daemon-orchestration-WL6V4QL4.js → daemon-orchestration-K4NKFYXO.js} +19 -21
- package/dist/{destructive-data-guard-JDUJ2ULM.js → destructive-data-guard-3TGAAE7K.js} +77 -23
- package/dist/{doc-graph-extractor-NJ7ZZC2C.js → doc-graph-extractor-TVK2NGAR.js} +6 -6
- package/dist/{documents-O7WYZFFE.js → documents-MDZ4VB5X.js} +8 -8
- package/dist/{dreaming-TUESPDT3.js → dreaming-L24PSS35.js} +17 -20
- package/dist/{employee-boot-brief-UCP6QLN4.js → employee-boot-brief-GQVL3FQC.js} +23 -25
- package/dist/{entity-boost-TK43XT24.js → entity-boost-OMFA5QCG.js} +2 -2
- package/dist/{exe-drift-QD6LUZT2.js → exe-drift-JDDG3OPT.js} +4 -4
- package/dist/{exe-export-QIUNHFSS.js → exe-export-EEGIE3JP.js} +10 -10
- package/dist/{exe-import-3UFOLHEW.js → exe-import-UJNC5Q2L.js} +10 -10
- package/dist/{exe-key-D5NDKGHT.js → exe-key-TYEY4W4E.js} +97 -97
- package/dist/{exe-org-UWDJBOCV.js → exe-org-B3ICTTEV.js} +32 -32
- package/dist/{exe-snapshot-P6SFODEN.js → exe-snapshot-VBFBONYN.js} +20 -23
- package/dist/{fast-db-init-SD7JZSEC.js → fast-db-init-TFRTK6EH.js} +1 -1
- package/dist/{founder-context-QIXDZIJX.js → founder-context-3X4QUWKD.js} +2 -2
- package/dist/{founder-monitor-envelope-TLOC4UYG.js → founder-monitor-envelope-54UNZNY4.js} +4 -4
- package/dist/gateway/index.js +11 -11
- package/dist/{gateway-client-CQTSYJLP.js → gateway-client-OUDO5GGV.js} +1 -1
- package/dist/{git-staleness-JSQTHB4Z.js → git-staleness-73YZ5PGU.js} +3 -3
- package/dist/{global-procedures-T3RKI4QX.js → global-procedures-PYNE2BQG.js} +20 -6
- package/dist/{graph-auto-extract-V75GSTNX.js → graph-auto-extract-PGUMEEQB.js} +6 -6
- package/dist/{graph-query-VAQN2RK3.js → graph-query-7YA3YNKL.js} +1 -1
- package/dist/{graph-rag-GBA5E3QC.js → graph-rag-UWOTK4AQ.js} +3 -3
- package/dist/{hook-integrity-II6QK6Y4.js → hook-integrity-6MNEPT6W.js} +1 -1
- package/dist/{hook-prefetch-5EHPOYY3.js → hook-prefetch-JOF6YZSR.js} +13 -16
- package/dist/hooks/bug-report-worker.js +17 -20
- package/dist/hooks/codex-stop-task-finalizer.js +19 -22
- package/dist/hooks/commit-complete.js +16 -19
- package/dist/hooks/error-recall.js +14 -14
- package/dist/hooks/exe-heartbeat-hook.js +5 -5
- package/dist/hooks/ingest-worker.js +18 -20
- package/dist/hooks/ingest.js +16 -16
- package/dist/hooks/instructions-loaded.js +7 -7
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +6 -6
- package/dist/hooks/post-compact.js +5 -5
- package/dist/hooks/post-tool-combined.js +13 -13
- package/dist/hooks/pre-compact.js +16 -19
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/prompt-submit.js +40 -39
- package/dist/hooks/session-end.js +21 -24
- package/dist/hooks/session-start.js +18 -18
- package/dist/hooks/stop.js +19 -22
- package/dist/hooks/subagent-stop.js +18 -21
- package/dist/hooks/summary-worker.js +20 -23
- package/dist/index.js +25 -28
- package/dist/{installer-XEEZSF3V.js → installer-34XZ7JMW.js} +7 -8
- package/dist/{installer-MPVQ5L22.js → installer-356RMQ2K.js} +7 -8
- package/dist/{installer-ILYC4LI5.js → installer-7TN36Z7T.js} +113 -30
- package/dist/{intercom-queue-QGHAW2KO.js → intercom-queue-ZJ3MNULM.js} +12 -15
- package/dist/lib/backup-verify-worker.js +157 -0
- package/dist/lib/cloud-sync.js +16 -20
- package/dist/lib/consolidation.js +9 -9
- package/dist/lib/crypto.js +3 -3
- package/dist/lib/database.js +3 -3
- package/dist/lib/db-backup.js +7 -3
- package/dist/lib/db-write-worker.js +3 -3
- package/dist/lib/db.js +3 -3
- package/dist/lib/device-registry.js +1 -1
- package/dist/lib/employee-templates.js +7 -7
- package/dist/lib/employees.js +3 -3
- package/dist/lib/error-detector.js +2 -2
- package/dist/lib/exe-daemon.js +89 -87
- package/dist/lib/hybrid-search.js +11 -11
- package/dist/lib/identity.js +5 -3
- package/dist/lib/keychain.js +1 -1
- package/dist/lib/license.js +2 -2
- package/dist/lib/messaging.js +13 -16
- package/dist/lib/post-tool-memory.js +16 -18
- package/dist/lib/registry-proxy.js +1 -1
- package/dist/lib/reminders.js +4 -4
- package/dist/lib/schedules.js +8 -8
- package/dist/lib/session-registry.js +5 -5
- package/dist/lib/skill-learning.js +9 -9
- package/dist/lib/store.js +7 -7
- package/dist/lib/task-router.js +4 -4
- package/dist/lib/tasks.js +14 -17
- package/dist/lib/tmux-routing.js +14 -41
- package/dist/lib/token-spend.js +4 -4
- package/dist/lib/ws-client.js +1 -1
- package/dist/{license-gate-CARN6AB6.js → license-gate-4BXUTHLB.js} +3 -3
- package/dist/{license-recheck-7Z3LS6YS.js → license-recheck-QFPUKISQ.js} +1 -1
- package/dist/{license-sync-PUQV3HSZ.js → license-sync-FDEDT4AC.js} +2 -2
- package/dist/mcp/register-tools.js +96 -96
- package/dist/mcp/server.js +96 -96
- package/dist/mcp/tools/complete-reminder.js +5 -5
- package/dist/mcp/tools/create-reminder.js +5 -5
- package/dist/mcp/tools/create-task.js +16 -19
- package/dist/mcp/tools/deactivate-behavior.js +10 -10
- package/dist/mcp/tools/list-reminders.js +5 -5
- package/dist/mcp/tools/list-tasks.js +16 -19
- package/dist/mcp/tools/send-message.js +15 -18
- package/dist/mcp/tools/update-task.js +15 -18
- package/dist/{mcp-http-config-RJKTZPHZ.js → mcp-http-config-GKP5QGAO.js} +5 -5
- package/dist/{mcp-session-identity-HN444A3G.js → mcp-session-identity-JHAGRB7B.js} +12 -15
- package/dist/{memory-cards-AT3QCCWU.js → memory-cards-O377ETAM.js} +8 -8
- package/dist/{memory-graph-extractor-B43UWGV5.js → memory-graph-extractor-4KJCCUOP.js} +7 -7
- package/dist/{memory-maintenance-WDLL3ZX3.js → memory-maintenance-RR5UPRW3.js} +1 -1
- package/dist/{memory-poisoning-defense-TS4WNW4S.js → memory-poisoning-defense-Y5TTKGOP.js} +3 -3
- package/dist/{memory-pressure-watchdog-6YH7S6W7.js → memory-pressure-watchdog-NGXTI4HR.js} +13 -16
- package/dist/{memory-reflection-N6NSYW6S.js → memory-reflection-EXNHRZL7.js} +8 -8
- package/dist/{memory-write-repository-D35RDO62.js → memory-write-repository-S4TX7WQB.js} +1 -1
- package/dist/{monitor-grants-FH4PNYN5.js → monitor-grants-57Q4NL25.js} +3 -3
- package/dist/{monitor-identity-LK5ZCCND.js → monitor-identity-3FQ52SYU.js} +2 -2
- package/dist/{notification-ledger-3WJYJGGS.js → notification-ledger-O6KQYYGK.js} +13 -16
- package/dist/{notifications-T5C2CVB3.js → notifications-6FCQCJ4P.js} +12 -15
- package/dist/{orchestration-events-73VEJT7Q.js → orchestration-events-2Z2BMMA5.js} +4 -4
- package/dist/{orchestrator-3O657734.js → orchestrator-AGOSKPHD.js} +14 -17
- package/dist/{org-brief-session-EGB35QLM.js → org-brief-session-WJHZVXXJ.js} +15 -15
- package/dist/{org-consent-policy-MSVSRI53.js → org-consent-policy-X43UGTHI.js} +5 -5
- package/dist/{org-join-4BK2XJJI.js → org-join-M3UTBMHC.js} +9 -9
- package/dist/{org-key-admin-EUSSGXQ3.js → org-key-admin-AA2DRHB2.js} +11 -11
- package/dist/{org-key-epoch-NMEWDT5L.js → org-key-epoch-Z5UIVUHT.js} +5 -5
- package/dist/{org-key-pin-HUSXGINB.js → org-key-pin-FE6YHEZ3.js} +3 -3
- package/dist/{org-membership-B74IWEM5.js → org-membership-3J2MIGE4.js} +4 -4
- package/dist/{org-partner-config-5FJTJABN.js → org-partner-config-5HATZYG4.js} +8 -8
- package/dist/{org-partner-runtime-GN4GFWI2.js → org-partner-runtime-UI35IHUC.js} +15 -15
- package/dist/{org-row-visibility-PBZ2TSCR.js → org-row-visibility-TRJERVYP.js} +1 -1
- package/dist/{pipeline-router-2IELBSVJ.js → pipeline-router-EKQ6D7ZA.js} +4 -4
- package/dist/{plan-limits-4GXK5PFT.js → plan-limits-3BGHIHX6.js} +6 -6
- package/dist/{platform-procedures-QP3W2NLH.js → platform-procedures-RXW46WNY.js} +1 -1
- package/dist/{pre-tool-use-impl-CY73PRJP.js → pre-tool-use-impl-7BT5TJVM.js} +35 -33
- package/dist/{project-name-337ERIAX.js → project-name-PGJGUEJY.js} +4 -4
- package/dist/{projection-worker-W476IG6V.js → projection-worker-3GEVFPAI.js} +2 -2
- package/dist/{prospective-memory-5INB7NUL.js → prospective-memory-GEN7CN7H.js} +3 -3
- package/dist/{push-notifications-YVOP4KGN.js → push-notifications-QW4BWRC7.js} +13 -16
- package/dist/{reproject-worktree-memories-OGBR3CMO.js → reproject-worktree-memories-DIULBEBD.js} +12 -15
- package/dist/{reranker-W7WCJH6Y.js → reranker-LQ6OPJOI.js} +1 -1
- package/dist/{retrieval-health-R6MGXLTP.js → retrieval-health-XDFYFEOP.js} +1 -1
- package/dist/{review-polling-TKAWVY6G.js → review-polling-ED33YLFT.js} +13 -16
- package/dist/runtime/index.js +20 -23
- package/dist/{session-events-HUCZ7TOR.js → session-events-7IJGTBVH.js} +13 -16
- package/dist/{session-kill-telemetry-RWRWOW4C.js → session-kill-telemetry-RUTEARJ3.js} +13 -16
- package/dist/{session-scope-5CDRHV75.js → session-scope-SSYA64L3.js} +12 -15
- package/dist/{setup-wizard-RBTJAZOP.js → setup-wizard-XD7FZVLJ.js} +2 -2
- package/dist/{shard-manager-LRPAAQA4.js → shard-manager-FH5JZRSE.js} +2 -2
- package/dist/{skill-refinement-MDXKDCY6.js → skill-refinement-UHD4E6GV.js} +4 -4
- package/dist/{skill-retrieval-OWY6MTCX.js → skill-retrieval-F6PAJ3I5.js} +11 -11
- package/dist/{skill-usage-GNV737U5.js → skill-usage-2MBTF7Y4.js} +4 -4
- package/dist/{stack-generate-manifest-S4SBLKBY.js → stack-generate-manifest-SU6OFFY7.js} +4 -4
- package/dist/{stack-promote-U4EZNLOV.js → stack-promote-MJF436JD.js} +4 -4
- package/dist/{stack-release-4VBGOYGK.js → stack-release-S37R57XC.js} +5 -5
- package/dist/{stack-update-C5YKHE7A.js → stack-update-XXDRKGGR.js} +3 -3
- package/dist/{steward-gate-QFPXQBUZ.js → steward-gate-EWG2BHYQ.js} +4 -4
- package/dist/{subagent-brief-injection-GDXO5WNS.js → subagent-brief-injection-YZGSWUEY.js} +25 -27
- package/dist/{support-bug-actions-4XEKXIIO.js → support-bug-actions-RU6WZ3UV.js} +3 -3
- package/dist/{support-inbox-Y7AFCOGM.js → support-inbox-A3S52SPS.js} +12 -12
- package/dist/{task-enforcement-CN3Q4PEH.js → task-enforcement-LVAS55AR.js} +13 -16
- package/dist/{task-request-inbox-AY3C6DND.js → task-request-inbox-2TN4ZUH2.js} +5 -5
- package/dist/{task-scope-AMR3Z3DJ.js → task-scope-NLKUVCP5.js} +12 -15
- package/dist/{tasks-crud-2GHKIZOM.js → tasks-crud-NQDPLHNZ.js} +14 -15
- package/dist/{tasks-notify-Z53446KM.js → tasks-notify-BDM2NEHP.js} +13 -16
- package/dist/{tasks-review-APRNSHMQ.js → tasks-review-3G7CAW2O.js} +12 -15
- package/dist/{telemetry-upload-5XR42SQN.js → telemetry-upload-6DR6AL3V.js} +8 -8
- package/dist/{token-budget-TTNJXI7W.js → token-budget-KNC2WGR7.js} +4 -4
- package/dist/{tool-telemetry-36ST422N.js → tool-telemetry-I3SEU5M5.js} +1 -1
- package/dist/tui/App.js +23 -26
- package/dist/{tui-data-AP5TPUOQ.js → tui-data-KJDWP4CB.js} +16 -19
- package/dist/{update-support-SFTI2PUD.js → update-support-UYDYMHVR.js} +11 -11
- package/dist/{whatsapp-5CXE3JHG.js → whatsapp-5EMPZHF5.js} +2 -2
- package/dist/{wiki-acl-N754BC2W.js → wiki-acl-M7BTQJBZ.js} +1 -1
- package/dist/{work-claims-OAICQBWO.js → work-claims-5CFMZTML.js} +4 -4
- package/dist/{work-state-heartbeat-MTTUGMPU.js → work-state-heartbeat-7IA2DZ2E.js} +1 -1
- package/dist/{workflow-engine-RID3QL2U.js → workflow-engine-S5JOE2YR.js} +2 -2
- package/dist/{worktree-XWVNDBRD.js → worktree-7V4ZMF3D.js} +5 -5
- package/dist/{worktree-sweep-6VEHGH7U.js → worktree-sweep-34MXJ7S6.js} +6 -6
- package/package.json +2 -1
- package/release-notes.json +25 -7
- package/stack.release.json +3 -3
- package/dist/chunk-ESO5JDOT.js +0 -70
- package/dist/chunk-KCRSJ3VU.js +0 -113
- package/dist/content-extractor-OVD7PTSN.js +0 -9
- /package/dist/{chunk-OLMLA377.js → chunk-542FBM5U.js} +0 -0
- /package/dist/{chunk-LDHJX4TZ.js → chunk-6D2O5SAH.js} +0 -0
- /package/dist/{chunk-33PG3KNY.js → chunk-6NRZLVK3.js} +0 -0
- /package/dist/{chunk-CLV7ALXV.js → chunk-CFO47VW4.js} +0 -0
- /package/dist/{chunk-FLO24BNN.js → chunk-EULAP6L6.js} +0 -0
- /package/dist/{chunk-PKM456D2.js → chunk-FYSKQPTE.js} +0 -0
- /package/dist/{chunk-WIDOLS7T.js → chunk-J4B4M5PH.js} +0 -0
- /package/dist/{chunk-YBB43SXC.js → chunk-J635FA7T.js} +0 -0
- /package/dist/{chunk-64UAHPXA.js → chunk-MOBZTIJQ.js} +0 -0
- /package/dist/{chunk-EZQ4W3WW.js → chunk-N45FAI6D.js} +0 -0
- /package/dist/{chunk-OEEHLATI.js → chunk-QDSNEGJE.js} +0 -0
- /package/dist/{chunk-YG4DZZ6J.js → chunk-SKSXROKP.js} +0 -0
- /package/dist/{chunk-FUZHMV7K.js → chunk-YVWXI2HM.js} +0 -0
- /package/dist/{core-memory-WR7I7DIP.js → core-memory-PZEO3OWH.js} +0 -0
- /package/dist/{memory-isolation-4RQJ5RCK.js → memory-isolation-MFNT2ITE.js} +0 -0
- /package/dist/{oauth-server-VBDMZIEV.js → oauth-server-CBGEWD6H.js} +0 -0
- /package/dist/{project-boot-G7T5WHO6.js → project-boot-VESAYDIH.js} +0 -0
|
@@ -14,37 +14,101 @@ import {
|
|
|
14
14
|
import {
|
|
15
15
|
buildClaudeHttpMcpEntry,
|
|
16
16
|
buildClaudeStdioProxyMcpEntry
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import {
|
|
19
|
-
ensureAllAgentSymlinks
|
|
20
|
-
} from "./chunk-ESO5JDOT.js";
|
|
17
|
+
} from "./chunk-27NG2NTG.js";
|
|
21
18
|
import {
|
|
22
19
|
MCP_LEGACY_KEY,
|
|
23
20
|
MCP_PRIMARY_KEY
|
|
24
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-67IVG6CB.js";
|
|
22
|
+
import {
|
|
23
|
+
loadEmployees
|
|
24
|
+
} from "./chunk-L5JFVK5T.js";
|
|
25
25
|
import {
|
|
26
26
|
loadConfigSync
|
|
27
27
|
} from "./chunk-MMS2HBRT.js";
|
|
28
28
|
|
|
29
29
|
// src/adapters/claude/installer.ts
|
|
30
30
|
import { readFile, writeFile, mkdir, readdir, rm } from "fs/promises";
|
|
31
|
-
import { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync, realpathSync, statSync } from "fs";
|
|
31
|
+
import { existsSync as existsSync2, readFileSync, writeFileSync, copyFileSync, mkdirSync as mkdirSync2, realpathSync, statSync } from "fs";
|
|
32
32
|
import { createHash } from "crypto";
|
|
33
|
-
import
|
|
34
|
-
import
|
|
33
|
+
import path2 from "path";
|
|
34
|
+
import os2 from "os";
|
|
35
35
|
import { execSync } from "child_process";
|
|
36
36
|
import { fileURLToPath } from "url";
|
|
37
|
+
|
|
38
|
+
// src/lib/agent-symlinks.ts
|
|
39
|
+
import os from "os";
|
|
40
|
+
import path from "path";
|
|
41
|
+
import {
|
|
42
|
+
existsSync,
|
|
43
|
+
lstatSync,
|
|
44
|
+
mkdirSync,
|
|
45
|
+
readlinkSync,
|
|
46
|
+
symlinkSync
|
|
47
|
+
} from "fs";
|
|
48
|
+
function claudeAgentsDir(homeDir) {
|
|
49
|
+
return path.join(homeDir, ".claude", "agents");
|
|
50
|
+
}
|
|
51
|
+
function identitySourcePath(homeDir, agentId) {
|
|
52
|
+
return path.join(homeDir, ".exe-os", "identity", `${agentId}.md`);
|
|
53
|
+
}
|
|
54
|
+
function claudeAgentLinkPath(homeDir, agentId) {
|
|
55
|
+
return path.join(claudeAgentsDir(homeDir), `${agentId}.md`);
|
|
56
|
+
}
|
|
57
|
+
function ensureAgentSymlink(agentId, homeDir = os.homedir()) {
|
|
58
|
+
const target = identitySourcePath(homeDir, agentId);
|
|
59
|
+
const link = claudeAgentLinkPath(homeDir, agentId);
|
|
60
|
+
mkdirSync(claudeAgentsDir(homeDir), { recursive: true });
|
|
61
|
+
if (existsSync(link)) {
|
|
62
|
+
let stat;
|
|
63
|
+
try {
|
|
64
|
+
stat = lstatSync(link);
|
|
65
|
+
} catch {
|
|
66
|
+
return { agentId, action: "conflict", target, link, conflict: "stat_failed" };
|
|
67
|
+
}
|
|
68
|
+
if (!stat.isSymbolicLink()) {
|
|
69
|
+
return { agentId, action: "conflict", target, link, conflict: "regular_file" };
|
|
70
|
+
}
|
|
71
|
+
let currentTarget;
|
|
72
|
+
try {
|
|
73
|
+
currentTarget = readlinkSync(link);
|
|
74
|
+
} catch {
|
|
75
|
+
return { agentId, action: "conflict", target, link, conflict: "readlink_failed" };
|
|
76
|
+
}
|
|
77
|
+
if (currentTarget === target) {
|
|
78
|
+
return { agentId, action: "already_correct", target, link };
|
|
79
|
+
}
|
|
80
|
+
return { agentId, action: "conflict", target, link, conflict: `points_to:${currentTarget}` };
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
symlinkSync(target, link);
|
|
84
|
+
} catch (err) {
|
|
85
|
+
return {
|
|
86
|
+
agentId,
|
|
87
|
+
action: "conflict",
|
|
88
|
+
target,
|
|
89
|
+
link,
|
|
90
|
+
conflict: err instanceof Error ? err.message : String(err)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return { agentId, action: "created", target, link };
|
|
94
|
+
}
|
|
95
|
+
async function ensureAllAgentSymlinks(homeDir = os.homedir()) {
|
|
96
|
+
const employees = await loadEmployees();
|
|
97
|
+
return employees.map((emp) => ensureAgentSymlink(emp.name, homeDir));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// src/adapters/claude/installer.ts
|
|
37
101
|
function assertCanonicalInstallRoot(packageRoot, opts = {}) {
|
|
38
102
|
if (process.env.EXE_ALLOW_NONCANONICAL_INSTALL === "1") return;
|
|
39
103
|
const real = (() => {
|
|
40
104
|
try {
|
|
41
105
|
return realpathSync(packageRoot);
|
|
42
106
|
} catch {
|
|
43
|
-
return
|
|
107
|
+
return path2.resolve(packageRoot);
|
|
44
108
|
}
|
|
45
109
|
})();
|
|
46
110
|
const tmpRoots = [...new Set(
|
|
47
|
-
[
|
|
111
|
+
[os2.tmpdir(), "/tmp", "/private/tmp", "/var/folders", "/private/var/folders"].flatMap(
|
|
48
112
|
(p) => {
|
|
49
113
|
try {
|
|
50
114
|
return [p, realpathSync(p)];
|
|
@@ -54,7 +118,7 @@ function assertCanonicalInstallRoot(packageRoot, opts = {}) {
|
|
|
54
118
|
}
|
|
55
119
|
)
|
|
56
120
|
)];
|
|
57
|
-
const sep =
|
|
121
|
+
const sep = path2.sep;
|
|
58
122
|
const ephemeral = tmpRoots.some((t) => real === t || real.startsWith(t + sep)) || real.includes(`${sep}.claude${sep}worktrees${sep}`);
|
|
59
123
|
if (ephemeral) {
|
|
60
124
|
throw new Error(
|
|
@@ -78,7 +142,7 @@ This checkout is a linked worktree (.git is a gitdir pointer file), so it is exp
|
|
|
78
142
|
}
|
|
79
143
|
}
|
|
80
144
|
function isLinkedGitWorktree(root) {
|
|
81
|
-
const dotGit =
|
|
145
|
+
const dotGit = path2.join(root, ".git");
|
|
82
146
|
try {
|
|
83
147
|
if (!statSync(dotGit).isFile()) return false;
|
|
84
148
|
} catch {
|
|
@@ -92,20 +156,20 @@ function isLinkedGitWorktree(root) {
|
|
|
92
156
|
}
|
|
93
157
|
function resolvePackageRoot() {
|
|
94
158
|
const thisFile = fileURLToPath(import.meta.url);
|
|
95
|
-
let dir =
|
|
96
|
-
const root =
|
|
159
|
+
let dir = path2.dirname(thisFile);
|
|
160
|
+
const root = path2.parse(dir).root;
|
|
97
161
|
while (dir !== root) {
|
|
98
|
-
const pkgPath =
|
|
99
|
-
if (
|
|
162
|
+
const pkgPath = path2.join(dir, "package.json");
|
|
163
|
+
if (existsSync2(pkgPath)) {
|
|
100
164
|
try {
|
|
101
165
|
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
102
166
|
if (pkg.name === "@askexenow/exe-os" || pkg.name === "exe-os") return dir;
|
|
103
167
|
} catch {
|
|
104
168
|
}
|
|
105
169
|
}
|
|
106
|
-
dir =
|
|
170
|
+
dir = path2.dirname(dir);
|
|
107
171
|
}
|
|
108
|
-
return
|
|
172
|
+
return path2.resolve(path2.dirname(thisFile), "..", "..", "..");
|
|
109
173
|
}
|
|
110
174
|
var RETIRED_TMUX_SKILLS = /* @__PURE__ */ new Set([
|
|
111
175
|
"launch",
|
|
@@ -117,51 +181,51 @@ var RETIRED_TMUX_SKILLS = /* @__PURE__ */ new Set([
|
|
|
117
181
|
"call",
|
|
118
182
|
"afk"
|
|
119
183
|
]);
|
|
120
|
-
async function copySlashCommands(packageRoot, homeDir =
|
|
184
|
+
async function copySlashCommands(packageRoot, homeDir = os2.homedir()) {
|
|
121
185
|
let copied = 0;
|
|
122
186
|
let skipped = 0;
|
|
123
|
-
const skillsBase =
|
|
124
|
-
const deprecatedExeLink =
|
|
125
|
-
if (
|
|
187
|
+
const skillsBase = path2.join(homeDir, ".claude", "skills");
|
|
188
|
+
const deprecatedExeLink = path2.join(skillsBase, "exe-link");
|
|
189
|
+
if (existsSync2(deprecatedExeLink)) {
|
|
126
190
|
await rm(deprecatedExeLink, { recursive: true, force: true });
|
|
127
191
|
}
|
|
128
192
|
for (const retired of RETIRED_TMUX_SKILLS) {
|
|
129
|
-
const staleDir =
|
|
130
|
-
if (
|
|
193
|
+
const staleDir = path2.join(skillsBase, `exe-${retired}`);
|
|
194
|
+
if (existsSync2(staleDir)) {
|
|
131
195
|
await rm(staleDir, { recursive: true, force: true });
|
|
132
196
|
}
|
|
133
197
|
}
|
|
134
|
-
const exeDir =
|
|
135
|
-
if (
|
|
198
|
+
const exeDir = path2.join(packageRoot, "src", "commands", "exe");
|
|
199
|
+
if (existsSync2(exeDir)) {
|
|
136
200
|
const entries = await readdir(exeDir);
|
|
137
201
|
const mdFiles = entries.filter((f) => f.endsWith(".md")).filter((f) => !RETIRED_TMUX_SKILLS.has(f.replace(/\.md$/, "")));
|
|
138
202
|
for (const file of mdFiles) {
|
|
139
203
|
const name = file.replace(".md", "");
|
|
140
|
-
const destDir =
|
|
204
|
+
const destDir = path2.join(skillsBase, `exe-${name}`);
|
|
141
205
|
await mkdir(destDir, { recursive: true });
|
|
142
|
-
const srcPath =
|
|
143
|
-
const destPath =
|
|
206
|
+
const srcPath = path2.join(exeDir, file);
|
|
207
|
+
const destPath = path2.join(destDir, "SKILL.md");
|
|
144
208
|
const result = await copyAsSkill(srcPath, destPath, `exe-${name}`);
|
|
145
209
|
if (result) copied++;
|
|
146
210
|
else skipped++;
|
|
147
211
|
}
|
|
148
212
|
}
|
|
149
|
-
const topLevelSrc =
|
|
150
|
-
if (
|
|
151
|
-
const destDir =
|
|
213
|
+
const topLevelSrc = path2.join(packageRoot, "src", "commands", "exe.md");
|
|
214
|
+
if (existsSync2(topLevelSrc)) {
|
|
215
|
+
const destDir = path2.join(skillsBase, "exe");
|
|
152
216
|
await mkdir(destDir, { recursive: true });
|
|
153
|
-
const destPath =
|
|
217
|
+
const destPath = path2.join(destDir, "SKILL.md");
|
|
154
218
|
const result = await copyAsSkill(topLevelSrc, destPath, "exe");
|
|
155
219
|
if (result) copied++;
|
|
156
220
|
else skipped++;
|
|
157
221
|
}
|
|
158
|
-
const referenceSrc =
|
|
159
|
-
if (
|
|
160
|
-
const destDir =
|
|
222
|
+
const referenceSrc = path2.join(packageRoot, "src", "commands", "exe-reference.md");
|
|
223
|
+
if (existsSync2(referenceSrc)) {
|
|
224
|
+
const destDir = path2.join(skillsBase, "exe");
|
|
161
225
|
await mkdir(destDir, { recursive: true });
|
|
162
|
-
const referenceDest =
|
|
226
|
+
const referenceDest = path2.join(destDir, "reference.md");
|
|
163
227
|
const referenceContent = await readFile(referenceSrc, "utf-8");
|
|
164
|
-
const unchanged =
|
|
228
|
+
const unchanged = existsSync2(referenceDest) && await readFile(referenceDest, "utf-8") === referenceContent;
|
|
165
229
|
if (unchanged) {
|
|
166
230
|
skipped++;
|
|
167
231
|
} else {
|
|
@@ -187,7 +251,7 @@ name: ${skillName}
|
|
|
187
251
|
`);
|
|
188
252
|
}
|
|
189
253
|
}
|
|
190
|
-
if (
|
|
254
|
+
if (existsSync2(destPath)) {
|
|
191
255
|
const existing = await readFile(destPath, "utf-8");
|
|
192
256
|
if (existing === content) return false;
|
|
193
257
|
}
|
|
@@ -203,25 +267,25 @@ function readJsonFile(filePath) {
|
|
|
203
267
|
}
|
|
204
268
|
function findAncestorMcpJsons(startDir, homeDir) {
|
|
205
269
|
const files = [];
|
|
206
|
-
let dir =
|
|
207
|
-
const root =
|
|
208
|
-
const stop =
|
|
270
|
+
let dir = path2.resolve(startDir);
|
|
271
|
+
const root = path2.parse(dir).root;
|
|
272
|
+
const stop = path2.resolve(homeDir);
|
|
209
273
|
while (dir !== root) {
|
|
210
|
-
const candidate =
|
|
211
|
-
if (
|
|
274
|
+
const candidate = path2.join(dir, ".mcp.json");
|
|
275
|
+
if (existsSync2(candidate)) files.push(candidate);
|
|
212
276
|
if (dir === stop) break;
|
|
213
|
-
dir =
|
|
277
|
+
dir = path2.dirname(dir);
|
|
214
278
|
}
|
|
215
279
|
return files;
|
|
216
280
|
}
|
|
217
281
|
function pathApplies(projectPath, cwd) {
|
|
218
|
-
const project =
|
|
219
|
-
const current =
|
|
220
|
-
return current === project || current.startsWith(project +
|
|
282
|
+
const project = path2.resolve(projectPath);
|
|
283
|
+
const current = path2.resolve(cwd);
|
|
284
|
+
return current === project || current.startsWith(project + path2.sep);
|
|
221
285
|
}
|
|
222
|
-
function detectMcpNameCollisions(homeDir =
|
|
223
|
-
const claudeJsonPath =
|
|
224
|
-
if (!
|
|
286
|
+
function detectMcpNameCollisions(homeDir = os2.homedir(), cwd = process.cwd()) {
|
|
287
|
+
const claudeJsonPath = path2.join(homeDir, ".claude.json");
|
|
288
|
+
if (!existsSync2(claudeJsonPath)) return [];
|
|
225
289
|
const claudeJson = readJsonFile(claudeJsonPath);
|
|
226
290
|
if (!claudeJson?.projects) return [];
|
|
227
291
|
const collisions = [];
|
|
@@ -252,7 +316,7 @@ function buildStdioMcpEntry(packageRoot) {
|
|
|
252
316
|
return {
|
|
253
317
|
type: "stdio",
|
|
254
318
|
command: "node",
|
|
255
|
-
args: [
|
|
319
|
+
args: [path2.join(packageRoot, "dist", "mcp", "server.js")],
|
|
256
320
|
env: {}
|
|
257
321
|
};
|
|
258
322
|
}
|
|
@@ -260,7 +324,7 @@ function mcpTransportMode() {
|
|
|
260
324
|
const value = process.env.EXE_OS_MCP_TRANSPORT?.trim().toLowerCase();
|
|
261
325
|
if (value === "stdio") return "stdio";
|
|
262
326
|
if (value === "http") return "http";
|
|
263
|
-
const totalGB =
|
|
327
|
+
const totalGB = os2.totalmem() / (1024 * 1024 * 1024);
|
|
264
328
|
if (totalGB <= 8) return "stdio";
|
|
265
329
|
return "http";
|
|
266
330
|
}
|
|
@@ -272,10 +336,10 @@ function useMcpProxy() {
|
|
|
272
336
|
return false;
|
|
273
337
|
}
|
|
274
338
|
}
|
|
275
|
-
async function registerMcpServer(packageRoot, homeDir =
|
|
276
|
-
const claudeJsonPath =
|
|
339
|
+
async function registerMcpServer(packageRoot, homeDir = os2.homedir()) {
|
|
340
|
+
const claudeJsonPath = path2.join(homeDir, ".claude.json");
|
|
277
341
|
let claudeJson = {};
|
|
278
|
-
if (
|
|
342
|
+
if (existsSync2(claudeJsonPath)) {
|
|
279
343
|
try {
|
|
280
344
|
claudeJson = JSON.parse(await readFile(claudeJsonPath, "utf-8"));
|
|
281
345
|
} catch {
|
|
@@ -288,8 +352,8 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
|
|
|
288
352
|
const transportMode = mcpTransportMode();
|
|
289
353
|
let proxyReady = false;
|
|
290
354
|
if (transportMode === "http" && useMcpProxy()) {
|
|
291
|
-
const proxyBin =
|
|
292
|
-
proxyReady =
|
|
355
|
+
const proxyBin = path2.join(packageRoot, "dist", "bin", "exe-os-mcp-proxy.js");
|
|
356
|
+
proxyReady = existsSync2(proxyBin);
|
|
293
357
|
if (!proxyReady) {
|
|
294
358
|
process.stderr.write(
|
|
295
359
|
`exe-os: WARNING MCP proxy requested (EXE_MCP_PROXY/mcpProxy) but ${proxyBin} is missing \u2014 falling back to direct HTTP MCP entry
|
|
@@ -331,8 +395,8 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
|
|
|
331
395
|
const currentOs = claudeJson.mcpServers[MCP_PRIMARY_KEY];
|
|
332
396
|
const osMatches = currentOs && JSON.stringify(currentOs) === JSON.stringify(newEntry);
|
|
333
397
|
if (osMatches) {
|
|
334
|
-
await cleanSettingsJsonMcp(
|
|
335
|
-
await migratePermissionsToExeOs(
|
|
398
|
+
await cleanSettingsJsonMcp(path2.join(homeDir, ".claude", "settings.json"));
|
|
399
|
+
await migratePermissionsToExeOs(path2.join(homeDir, ".claude", "settings.json"));
|
|
336
400
|
const collisions2 = detectMcpNameCollisions(homeDir, packageRoot).filter((c) => c.serverName === MCP_PRIMARY_KEY || c.serverName === MCP_LEGACY_KEY);
|
|
337
401
|
for (const c of collisions2) {
|
|
338
402
|
process.stderr.write(
|
|
@@ -345,11 +409,11 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
|
|
|
345
409
|
}
|
|
346
410
|
claudeJson.mcpServers[MCP_PRIMARY_KEY] = newEntry;
|
|
347
411
|
await writeFile(claudeJsonPath, JSON.stringify(claudeJson, null, 2) + "\n");
|
|
348
|
-
await cleanSettingsJsonMcp(
|
|
349
|
-
await migratePermissionsToExeOs(
|
|
412
|
+
await cleanSettingsJsonMcp(path2.join(homeDir, ".claude", "settings.json"));
|
|
413
|
+
await migratePermissionsToExeOs(path2.join(homeDir, ".claude", "settings.json"));
|
|
350
414
|
try {
|
|
351
|
-
const settingsPath =
|
|
352
|
-
if (
|
|
415
|
+
const settingsPath = path2.join(homeDir, ".claude", "settings.json");
|
|
416
|
+
if (existsSync2(settingsPath)) {
|
|
353
417
|
const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
|
|
354
418
|
if (!settings.autoUpdatesChannel || settings.autoUpdatesChannel === "latest") {
|
|
355
419
|
settings.autoUpdatesChannel = "stable";
|
|
@@ -369,11 +433,11 @@ async function registerMcpServer(packageRoot, homeDir = os.homedir()) {
|
|
|
369
433
|
return true;
|
|
370
434
|
}
|
|
371
435
|
async function registerExeRustMcpConfig(packageRoot, homeDir) {
|
|
372
|
-
const exeDir =
|
|
373
|
-
const exeMcpPath =
|
|
436
|
+
const exeDir = path2.join(homeDir, ".exe");
|
|
437
|
+
const exeMcpPath = path2.join(exeDir, "mcp.json");
|
|
374
438
|
await mkdir(exeDir, { recursive: true });
|
|
375
439
|
let config = { servers: {} };
|
|
376
|
-
if (
|
|
440
|
+
if (existsSync2(exeMcpPath)) {
|
|
377
441
|
try {
|
|
378
442
|
config = JSON.parse(await readFile(exeMcpPath, "utf-8"));
|
|
379
443
|
if (!config.servers) config.servers = {};
|
|
@@ -383,7 +447,7 @@ async function registerExeRustMcpConfig(packageRoot, homeDir) {
|
|
|
383
447
|
}
|
|
384
448
|
const stdioEntry = {
|
|
385
449
|
command: "node",
|
|
386
|
-
args: [
|
|
450
|
+
args: [path2.join(packageRoot, "dist", "mcp", "server.js")],
|
|
387
451
|
env: {},
|
|
388
452
|
shared: true
|
|
389
453
|
};
|
|
@@ -399,7 +463,7 @@ async function registerExeRustMcpConfig(packageRoot, homeDir) {
|
|
|
399
463
|
process.stderr.write("exe-os: registered MCP server in ~/.exe/mcp.json (Rust runtime)\n");
|
|
400
464
|
}
|
|
401
465
|
async function cleanSettingsJsonMcp(settingsPath) {
|
|
402
|
-
if (!
|
|
466
|
+
if (!existsSync2(settingsPath)) return;
|
|
403
467
|
try {
|
|
404
468
|
const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
|
|
405
469
|
const servers = settings.mcpServers;
|
|
@@ -420,7 +484,7 @@ async function cleanSettingsJsonMcp(settingsPath) {
|
|
|
420
484
|
}
|
|
421
485
|
}
|
|
422
486
|
async function migratePermissionsToExeOs(settingsPath) {
|
|
423
|
-
if (!
|
|
487
|
+
if (!existsSync2(settingsPath)) return;
|
|
424
488
|
try {
|
|
425
489
|
const settings = JSON.parse(await readFile(settingsPath, "utf-8"));
|
|
426
490
|
const permissions = settings.permissions;
|
|
@@ -448,14 +512,14 @@ async function migratePermissionsToExeOs(settingsPath) {
|
|
|
448
512
|
} catch {
|
|
449
513
|
}
|
|
450
514
|
}
|
|
451
|
-
async function mergeHooks(packageRoot, homeDir =
|
|
452
|
-
const settingsPath =
|
|
453
|
-
const logsDir =
|
|
454
|
-
const hookLogPath =
|
|
515
|
+
async function mergeHooks(packageRoot, homeDir = os2.homedir()) {
|
|
516
|
+
const settingsPath = path2.join(homeDir, ".claude", "settings.json");
|
|
517
|
+
const logsDir = path2.join(homeDir, ".exe-os", "logs");
|
|
518
|
+
const hookLogPath = path2.join(logsDir, "hooks.log");
|
|
455
519
|
const logSuffix = ` 2>> "${hookLogPath}"`;
|
|
456
520
|
await mkdir(logsDir, { recursive: true });
|
|
457
521
|
let settings = {};
|
|
458
|
-
if (
|
|
522
|
+
if (existsSync2(settingsPath)) {
|
|
459
523
|
try {
|
|
460
524
|
settings = JSON.parse(await readFile(settingsPath, "utf-8"));
|
|
461
525
|
} catch {
|
|
@@ -477,7 +541,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
477
541
|
hooks: [
|
|
478
542
|
{
|
|
479
543
|
type: "command",
|
|
480
|
-
command: `node "${
|
|
544
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "post-tool-combined.js")}"${logSuffix}`
|
|
481
545
|
}
|
|
482
546
|
]
|
|
483
547
|
},
|
|
@@ -489,7 +553,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
489
553
|
hooks: [
|
|
490
554
|
{
|
|
491
555
|
type: "command",
|
|
492
|
-
command: `node "${
|
|
556
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "session-start.js")}"${logSuffix}`,
|
|
493
557
|
timeout: 10
|
|
494
558
|
}
|
|
495
559
|
]
|
|
@@ -502,7 +566,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
502
566
|
hooks: [
|
|
503
567
|
{
|
|
504
568
|
type: "command",
|
|
505
|
-
command: `node "${
|
|
569
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "prompt-submit.js")}"${logSuffix}`
|
|
506
570
|
}
|
|
507
571
|
]
|
|
508
572
|
},
|
|
@@ -514,7 +578,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
514
578
|
hooks: [
|
|
515
579
|
{
|
|
516
580
|
type: "command",
|
|
517
|
-
command: `node "${
|
|
581
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "exe-heartbeat-hook.js")}"${logSuffix}`,
|
|
518
582
|
timeout: 5
|
|
519
583
|
}
|
|
520
584
|
]
|
|
@@ -527,7 +591,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
527
591
|
hooks: [
|
|
528
592
|
{
|
|
529
593
|
type: "command",
|
|
530
|
-
command: `node "${
|
|
594
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "stop.js")}"${logSuffix}`
|
|
531
595
|
}
|
|
532
596
|
]
|
|
533
597
|
},
|
|
@@ -536,11 +600,16 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
536
600
|
{
|
|
537
601
|
event: "PreToolUse",
|
|
538
602
|
group: {
|
|
539
|
-
|
|
603
|
+
// Bug 24488803: mcp__.* MUST be here — the sidechain task-mutation
|
|
604
|
+
// refusal (and other MCP-tool denials) live in pre-tool-use.js, but
|
|
605
|
+
// Claude Code never invokes the hook for MCP tool calls unless the
|
|
606
|
+
// matcher routes them. PostToolUse already matched mcp__.*; the
|
|
607
|
+
// omission was on the side that can actually deny.
|
|
608
|
+
matcher: "Write|Edit|Read|Bash|Task|Agent|mcp__.*",
|
|
540
609
|
hooks: [
|
|
541
610
|
{
|
|
542
611
|
type: "command",
|
|
543
|
-
command: `node "${
|
|
612
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "pre-tool-use.js")}"${logSuffix}`
|
|
544
613
|
}
|
|
545
614
|
]
|
|
546
615
|
},
|
|
@@ -552,7 +621,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
552
621
|
hooks: [
|
|
553
622
|
{
|
|
554
623
|
type: "command",
|
|
555
|
-
command: `node "${
|
|
624
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "subagent-stop.js")}"${logSuffix}`
|
|
556
625
|
}
|
|
557
626
|
]
|
|
558
627
|
},
|
|
@@ -564,7 +633,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
564
633
|
hooks: [
|
|
565
634
|
{
|
|
566
635
|
type: "command",
|
|
567
|
-
command: `node "${
|
|
636
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "pre-compact.js")}"${logSuffix}`,
|
|
568
637
|
timeout: 10
|
|
569
638
|
}
|
|
570
639
|
]
|
|
@@ -577,7 +646,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
577
646
|
hooks: [
|
|
578
647
|
{
|
|
579
648
|
type: "command",
|
|
580
|
-
command: `node "${
|
|
649
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "session-end.js")}"${logSuffix}`
|
|
581
650
|
}
|
|
582
651
|
]
|
|
583
652
|
},
|
|
@@ -589,7 +658,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
589
658
|
hooks: [
|
|
590
659
|
{
|
|
591
660
|
type: "command",
|
|
592
|
-
command: `node "${
|
|
661
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "notification.js")}"${logSuffix}`
|
|
593
662
|
}
|
|
594
663
|
]
|
|
595
664
|
},
|
|
@@ -601,7 +670,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
601
670
|
hooks: [
|
|
602
671
|
{
|
|
603
672
|
type: "command",
|
|
604
|
-
command: `node "${
|
|
673
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "post-compact.js")}"${logSuffix}`,
|
|
605
674
|
timeout: 10
|
|
606
675
|
}
|
|
607
676
|
]
|
|
@@ -614,7 +683,7 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
614
683
|
hooks: [
|
|
615
684
|
{
|
|
616
685
|
type: "command",
|
|
617
|
-
command: `node "${
|
|
686
|
+
command: `node "${path2.join(packageRoot, "dist", "hooks", "instructions-loaded.js")}"${logSuffix}`
|
|
618
687
|
}
|
|
619
688
|
]
|
|
620
689
|
},
|
|
@@ -738,13 +807,13 @@ async function mergeHooks(packageRoot, homeDir = os.homedir()) {
|
|
|
738
807
|
allowList.push(fullName);
|
|
739
808
|
}
|
|
740
809
|
}
|
|
741
|
-
await mkdir(
|
|
810
|
+
await mkdir(path2.dirname(settingsPath), { recursive: true });
|
|
742
811
|
await writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
743
812
|
return { added, skipped };
|
|
744
813
|
}
|
|
745
|
-
async function cleanOldShellFunctions(homeDir =
|
|
746
|
-
const rosterPath =
|
|
747
|
-
if (!
|
|
814
|
+
async function cleanOldShellFunctions(homeDir = os2.homedir()) {
|
|
815
|
+
const rosterPath = path2.join(homeDir, ".exe-os", "exe-employees.json");
|
|
816
|
+
if (!existsSync2(rosterPath)) return 0;
|
|
748
817
|
let employees;
|
|
749
818
|
try {
|
|
750
819
|
employees = JSON.parse(await readFile(rosterPath, "utf-8"));
|
|
@@ -759,13 +828,13 @@ async function cleanOldShellFunctions(homeDir = os.homedir()) {
|
|
|
759
828
|
return { name: n, funcDef, forLoop };
|
|
760
829
|
});
|
|
761
830
|
const rcFiles = [
|
|
762
|
-
|
|
763
|
-
|
|
831
|
+
path2.join(homeDir, ".zshrc"),
|
|
832
|
+
path2.join(homeDir, ".bashrc")
|
|
764
833
|
];
|
|
765
834
|
const REMOVED_MARKER = "# Removed by exe-os \u2014 wrappers now at ~/.exe-os/bin/";
|
|
766
835
|
let totalRemoved = 0;
|
|
767
836
|
for (const rcPath of rcFiles) {
|
|
768
|
-
if (!
|
|
837
|
+
if (!existsSync2(rcPath)) continue;
|
|
769
838
|
let content;
|
|
770
839
|
try {
|
|
771
840
|
content = await readFile(rcPath, "utf-8");
|
|
@@ -873,8 +942,8 @@ function escapeRegExp(s) {
|
|
|
873
942
|
var EXE_SECTION_START = "<!-- exe-os:orchestration-start -->";
|
|
874
943
|
var EXE_SECTION_END = "<!-- exe-os:orchestration-end -->";
|
|
875
944
|
async function removeLegacyOrchestrationRules(homeDir) {
|
|
876
|
-
const claudeDir =
|
|
877
|
-
const claudeMdPath =
|
|
945
|
+
const claudeDir = path2.join(homeDir, ".claude");
|
|
946
|
+
const claudeMdPath = path2.join(claudeDir, "CLAUDE.md");
|
|
878
947
|
await mkdir(claudeDir, { recursive: true });
|
|
879
948
|
let existing = "";
|
|
880
949
|
try {
|
|
@@ -890,19 +959,19 @@ async function removeLegacyOrchestrationRules(homeDir) {
|
|
|
890
959
|
}
|
|
891
960
|
return "absent";
|
|
892
961
|
}
|
|
893
|
-
async function installStatusLine(packageRoot, homeDir =
|
|
962
|
+
async function installStatusLine(packageRoot, homeDir = os2.homedir()) {
|
|
894
963
|
const prefs = loadPreferences(homeDir);
|
|
895
964
|
if (prefs.ccStatusLine === false) return "opted-out";
|
|
896
|
-
const claudeDir =
|
|
965
|
+
const claudeDir = path2.join(homeDir, ".claude");
|
|
897
966
|
await mkdir(claudeDir, { recursive: true });
|
|
898
|
-
const assetPath =
|
|
899
|
-
if (!
|
|
900
|
-
const destScript =
|
|
967
|
+
const assetPath = path2.join(packageRoot, "dist", "assets", "statusline-command.sh");
|
|
968
|
+
if (!existsSync2(assetPath)) return "asset-missing";
|
|
969
|
+
const destScript = path2.join(claudeDir, "statusline-command.sh");
|
|
901
970
|
const assetContent = await readFile(assetPath, "utf-8");
|
|
902
971
|
await writeFile(destScript, assetContent, { mode: 493 });
|
|
903
|
-
const settingsPath =
|
|
972
|
+
const settingsPath = path2.join(claudeDir, "settings.json");
|
|
904
973
|
let settings = {};
|
|
905
|
-
if (
|
|
974
|
+
if (existsSync2(settingsPath)) {
|
|
906
975
|
try {
|
|
907
976
|
settings = JSON.parse(await readFile(settingsPath, "utf-8"));
|
|
908
977
|
} catch {
|
|
@@ -940,13 +1009,13 @@ async function runInstaller(homeDir) {
|
|
|
940
1009
|
`Hooks: ${hookResult.added} added, ${hookResult.skipped} unchanged
|
|
941
1010
|
`
|
|
942
1011
|
);
|
|
943
|
-
const resolvedHome = homeDir ??
|
|
944
|
-
const exeWorkspace =
|
|
945
|
-
if (!
|
|
1012
|
+
const resolvedHome = homeDir ?? os2.homedir();
|
|
1013
|
+
const exeWorkspace = path2.join(resolvedHome, "exe");
|
|
1014
|
+
if (!existsSync2(exeWorkspace)) {
|
|
946
1015
|
try {
|
|
947
|
-
await mkdir(
|
|
948
|
-
await mkdir(
|
|
949
|
-
await mkdir(
|
|
1016
|
+
await mkdir(path2.join(exeWorkspace, "content"), { recursive: true });
|
|
1017
|
+
await mkdir(path2.join(exeWorkspace, "operations"), { recursive: true });
|
|
1018
|
+
await mkdir(path2.join(exeWorkspace, "output"), { recursive: true });
|
|
950
1019
|
process.stderr.write(
|
|
951
1020
|
`Created ~/exe/ \u2014 your automation workspace for non-code projects
|
|
952
1021
|
`
|
|
@@ -977,7 +1046,7 @@ async function runInstaller(homeDir) {
|
|
|
977
1046
|
);
|
|
978
1047
|
}
|
|
979
1048
|
try {
|
|
980
|
-
const { generateAgentDefs, summarizeAgentDefResults } = await import("./agent-defs-generator-
|
|
1049
|
+
const { generateAgentDefs, summarizeAgentDefResults } = await import("./agent-defs-generator-DNXMO34I.js");
|
|
981
1050
|
const defResults = generateAgentDefs({ homeDir: resolvedHome });
|
|
982
1051
|
process.stderr.write(`Agent definitions: ${summarizeAgentDefResults(defResults)}
|
|
983
1052
|
`);
|
|
@@ -992,33 +1061,33 @@ exe-os installed successfully.
|
|
|
992
1061
|
`);
|
|
993
1062
|
}
|
|
994
1063
|
function setupTmux(home) {
|
|
995
|
-
const homeDir = home ??
|
|
1064
|
+
const homeDir = home ?? os2.homedir();
|
|
996
1065
|
const prefs = loadPreferences(homeDir);
|
|
997
1066
|
if (prefs.tmux === false) {
|
|
998
1067
|
process.stderr.write("exe-os: tmux config skipped (user preference)\n");
|
|
999
1068
|
return;
|
|
1000
1069
|
}
|
|
1001
|
-
const exeDir =
|
|
1002
|
-
const exeTmuxConf =
|
|
1003
|
-
const userTmuxConf =
|
|
1070
|
+
const exeDir = path2.join(homeDir, ".exe-os");
|
|
1071
|
+
const exeTmuxConf = path2.join(exeDir, "tmux.conf");
|
|
1072
|
+
const userTmuxConf = path2.join(homeDir, ".tmux.conf");
|
|
1004
1073
|
const sourceLine = "source-file ~/.exe-os/tmux.conf";
|
|
1005
1074
|
const shellQuote = (value) => `'${value.replace(/'/g, "'\\''")}'`;
|
|
1006
1075
|
const pkgRoot = resolvePackageRoot();
|
|
1007
|
-
const assetPath =
|
|
1008
|
-
if (!
|
|
1076
|
+
const assetPath = path2.join(pkgRoot, "dist", "assets", "tmux.conf");
|
|
1077
|
+
if (!existsSync2(assetPath)) {
|
|
1009
1078
|
process.stderr.write(`exe-os: tmux.conf asset not found at ${assetPath} \u2014 skipping tmux setup
|
|
1010
1079
|
`);
|
|
1011
1080
|
return;
|
|
1012
1081
|
}
|
|
1013
|
-
|
|
1014
|
-
if (
|
|
1082
|
+
mkdirSync2(exeDir, { recursive: true });
|
|
1083
|
+
if (existsSync2(exeTmuxConf)) {
|
|
1015
1084
|
const currentContent = readFileSync(exeTmuxConf, "utf8");
|
|
1016
1085
|
const newContent = readFileSync(assetPath, "utf8");
|
|
1017
1086
|
const currentHash = createHash("sha256").update(currentContent).digest("hex");
|
|
1018
1087
|
const newHash = createHash("sha256").update(newContent).digest("hex");
|
|
1019
1088
|
if (currentHash !== newHash) {
|
|
1020
|
-
const shippedPath =
|
|
1021
|
-
const lastShippedHash =
|
|
1089
|
+
const shippedPath = path2.join(exeDir, ".tmux.conf.shipped-hash");
|
|
1090
|
+
const lastShippedHash = existsSync2(shippedPath) ? readFileSync(shippedPath, "utf8").trim() : "";
|
|
1022
1091
|
if (lastShippedHash && currentHash !== lastShippedHash) {
|
|
1023
1092
|
process.stderr.write("exe-os: tmux config has user customizations \u2014 skipping overwrite\n");
|
|
1024
1093
|
} else {
|
|
@@ -1033,13 +1102,13 @@ function setupTmux(home) {
|
|
|
1033
1102
|
copyFileSync(assetPath, exeTmuxConf);
|
|
1034
1103
|
const newContent = readFileSync(assetPath, "utf8");
|
|
1035
1104
|
const newHash = createHash("sha256").update(newContent).digest("hex");
|
|
1036
|
-
writeFileSync(
|
|
1105
|
+
writeFileSync(path2.join(exeDir, ".tmux.conf.shipped-hash"), newHash, "utf8");
|
|
1037
1106
|
}
|
|
1038
|
-
if (
|
|
1107
|
+
if (existsSync2(userTmuxConf)) {
|
|
1039
1108
|
const existing = readFileSync(userTmuxConf, "utf8");
|
|
1040
1109
|
if (!existing.includes(sourceLine)) {
|
|
1041
|
-
const backupPath =
|
|
1042
|
-
if (!
|
|
1110
|
+
const backupPath = path2.join(homeDir, ".tmux.conf.backup");
|
|
1111
|
+
if (!existsSync2(backupPath)) {
|
|
1043
1112
|
copyFileSync(userTmuxConf, backupPath);
|
|
1044
1113
|
process.stderr.write(`exe-os: backed up existing tmux config to ${backupPath}
|
|
1045
1114
|
`);
|
|
@@ -1059,15 +1128,15 @@ ${sourceLine}
|
|
|
1059
1128
|
process.stderr.write("exe-os: tmux config installed\n");
|
|
1060
1129
|
}
|
|
1061
1130
|
function setupGhostty(home) {
|
|
1062
|
-
const homeDir = home ??
|
|
1131
|
+
const homeDir = home ?? os2.homedir();
|
|
1063
1132
|
const prefs = loadPreferences(homeDir);
|
|
1064
1133
|
if (prefs.ghostty === false) {
|
|
1065
1134
|
process.stderr.write("exe-os: Ghostty config skipped (user preference)\n");
|
|
1066
1135
|
return;
|
|
1067
1136
|
}
|
|
1068
|
-
const xdgConfig =
|
|
1069
|
-
const macConfig =
|
|
1070
|
-
const ghosttyInstalled =
|
|
1137
|
+
const xdgConfig = path2.join(homeDir, ".config", "ghostty");
|
|
1138
|
+
const macConfig = path2.join(homeDir, "Library", "Application Support", "com.mitchellh.ghostty");
|
|
1139
|
+
const ghosttyInstalled = existsSync2(xdgConfig) || existsSync2(macConfig) || (() => {
|
|
1071
1140
|
try {
|
|
1072
1141
|
execSync("which ghostty 2>/dev/null");
|
|
1073
1142
|
return true;
|
|
@@ -1079,28 +1148,28 @@ function setupGhostty(home) {
|
|
|
1079
1148
|
return;
|
|
1080
1149
|
}
|
|
1081
1150
|
const pkgRoot = resolvePackageRoot();
|
|
1082
|
-
const assetPath =
|
|
1083
|
-
if (!
|
|
1151
|
+
const assetPath = path2.join(pkgRoot, "dist", "assets", "ghostty.conf");
|
|
1152
|
+
if (!existsSync2(assetPath)) {
|
|
1084
1153
|
process.stderr.write("exe-os: ghostty.conf asset not found \u2014 skipping Ghostty setup\n");
|
|
1085
1154
|
return;
|
|
1086
1155
|
}
|
|
1087
1156
|
const configDir = xdgConfig;
|
|
1088
|
-
const configPath =
|
|
1089
|
-
const backupPath =
|
|
1090
|
-
|
|
1157
|
+
const configPath = path2.join(configDir, "config");
|
|
1158
|
+
const backupPath = path2.join(configDir, "config.backup");
|
|
1159
|
+
mkdirSync2(configDir, { recursive: true });
|
|
1091
1160
|
const START_MARKER = "# \u2500\u2500 exe-os:ghostty-start \u2500\u2500";
|
|
1092
1161
|
const END_MARKER = "# \u2500\u2500 exe-os:ghostty-end \u2500\u2500";
|
|
1093
1162
|
const assetContent = readFileSync(assetPath, "utf8").trim();
|
|
1094
1163
|
const markedSection = `${START_MARKER}
|
|
1095
1164
|
${assetContent}
|
|
1096
1165
|
${END_MARKER}`;
|
|
1097
|
-
if (
|
|
1166
|
+
if (existsSync2(configPath)) {
|
|
1098
1167
|
const existing = readFileSync(configPath, "utf8");
|
|
1099
1168
|
if (existing.includes(START_MARKER) && existing.includes(END_MARKER)) {
|
|
1100
1169
|
process.stderr.write("exe-os: Ghostty config already installed \u2014 preserving local settings\n");
|
|
1101
1170
|
return;
|
|
1102
1171
|
} else if (existing.includes("Exe OS")) {
|
|
1103
|
-
if (!
|
|
1172
|
+
if (!existsSync2(backupPath)) {
|
|
1104
1173
|
copyFileSync(configPath, backupPath);
|
|
1105
1174
|
process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
|
|
1106
1175
|
`);
|
|
@@ -1110,7 +1179,7 @@ ${existing.trim()}
|
|
|
1110
1179
|
${END_MARKER}
|
|
1111
1180
|
`);
|
|
1112
1181
|
} else {
|
|
1113
|
-
if (!
|
|
1182
|
+
if (!existsSync2(backupPath)) {
|
|
1114
1183
|
copyFileSync(configPath, backupPath);
|
|
1115
1184
|
process.stderr.write(`exe-os: backed up existing Ghostty config to ${backupPath}
|
|
1116
1185
|
`);
|
|
@@ -1126,15 +1195,15 @@ ${existing}`);
|
|
|
1126
1195
|
process.stderr.write("exe-os: Ghostty config installed\n");
|
|
1127
1196
|
}
|
|
1128
1197
|
function setupWezterm(home) {
|
|
1129
|
-
const homeDir = home ??
|
|
1198
|
+
const homeDir = home ?? os2.homedir();
|
|
1130
1199
|
const prefs = loadPreferences(homeDir);
|
|
1131
1200
|
if (prefs.wezterm === false) {
|
|
1132
1201
|
process.stderr.write("exe-os: WezTerm config skipped (user preference)\n");
|
|
1133
1202
|
return;
|
|
1134
1203
|
}
|
|
1135
|
-
const weztermLua =
|
|
1136
|
-
const weztermDir =
|
|
1137
|
-
const weztermInstalled =
|
|
1204
|
+
const weztermLua = path2.join(homeDir, ".wezterm.lua");
|
|
1205
|
+
const weztermDir = path2.join(homeDir, ".config", "wezterm");
|
|
1206
|
+
const weztermInstalled = existsSync2(weztermLua) || existsSync2(weztermDir) || (() => {
|
|
1138
1207
|
try {
|
|
1139
1208
|
execSync("which wezterm 2>/dev/null", { encoding: "utf8", timeout: 5e3 });
|
|
1140
1209
|
return true;
|
|
@@ -1146,8 +1215,8 @@ function setupWezterm(home) {
|
|
|
1146
1215
|
return;
|
|
1147
1216
|
}
|
|
1148
1217
|
const pkgRoot = resolvePackageRoot();
|
|
1149
|
-
const assetPath =
|
|
1150
|
-
if (!
|
|
1218
|
+
const assetPath = path2.join(pkgRoot, "dist", "assets", "wezterm.lua");
|
|
1219
|
+
if (!existsSync2(assetPath)) {
|
|
1151
1220
|
process.stderr.write("exe-os: wezterm.lua asset not found \u2014 skipping WezTerm setup\n");
|
|
1152
1221
|
return;
|
|
1153
1222
|
}
|
|
@@ -1155,7 +1224,7 @@ function setupWezterm(home) {
|
|
|
1155
1224
|
const START_MARKER = "-- \u2500\u2500 exe-os:wezterm-start \u2500\u2500";
|
|
1156
1225
|
const END_MARKER = "-- \u2500\u2500 exe-os:wezterm-end \u2500\u2500";
|
|
1157
1226
|
const assetContent = readFileSync(assetPath, "utf8").trim();
|
|
1158
|
-
if (
|
|
1227
|
+
if (existsSync2(configPath)) {
|
|
1159
1228
|
const existing = readFileSync(configPath, "utf8");
|
|
1160
1229
|
if (existing.includes(START_MARKER) && existing.includes(END_MARKER)) {
|
|
1161
1230
|
process.stderr.write("exe-os: WezTerm config already installed \u2014 preserving local settings\n");
|
|
@@ -1164,9 +1233,9 @@ function setupWezterm(home) {
|
|
|
1164
1233
|
process.stderr.write(
|
|
1165
1234
|
"exe-os: existing WezTerm config found at ~/.wezterm.lua \u2014 skipping (manual integration needed)\nexe-os: see ~/.exe-os/assets/wezterm.lua for exe-os defaults you can merge\n"
|
|
1166
1235
|
);
|
|
1167
|
-
const refDir =
|
|
1168
|
-
|
|
1169
|
-
copyFileSync(assetPath,
|
|
1236
|
+
const refDir = path2.join(homeDir, ".exe-os", "assets");
|
|
1237
|
+
mkdirSync2(refDir, { recursive: true });
|
|
1238
|
+
copyFileSync(assetPath, path2.join(refDir, "wezterm.lua"));
|
|
1170
1239
|
return;
|
|
1171
1240
|
}
|
|
1172
1241
|
writeFileSync(configPath, assetContent + "\n");
|