atoo-studio 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.github.md +322 -0
- package/README.md +112 -0
- package/README.npm.md +112 -0
- package/bin/atoo-studio.js +90 -0
- package/dist/src/agents/claude-code-terminal/adapter.d.ts +42 -0
- package/dist/src/agents/claude-code-terminal/adapter.js +166 -0
- package/dist/src/agents/claude-code-terminal/index.d.ts +13 -0
- package/dist/src/agents/claude-code-terminal/index.js +45 -0
- package/dist/src/agents/claude-code-terminal/spawner.d.ts +9 -0
- package/dist/src/agents/claude-code-terminal/spawner.js +37 -0
- package/dist/src/agents/claude-code-terminal-chatro/adapter.d.ts +51 -0
- package/dist/src/agents/claude-code-terminal-chatro/adapter.js +301 -0
- package/dist/src/agents/claude-code-terminal-chatro/index.d.ts +13 -0
- package/dist/src/agents/claude-code-terminal-chatro/index.js +45 -0
- package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.d.ts +67 -0
- package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.js +431 -0
- package/dist/src/agents/claude-code-terminal-chatro/spawner.d.ts +9 -0
- package/dist/src/agents/claude-code-terminal-chatro/spawner.js +37 -0
- package/dist/src/agents/codex-terminal/adapter.d.ts +40 -0
- package/dist/src/agents/codex-terminal/adapter.js +160 -0
- package/dist/src/agents/codex-terminal/index.d.ts +13 -0
- package/dist/src/agents/codex-terminal/index.js +47 -0
- package/dist/src/agents/codex-terminal/spawner.d.ts +9 -0
- package/dist/src/agents/codex-terminal/spawner.js +56 -0
- package/dist/src/agents/codex-terminal-chatro/adapter.d.ts +58 -0
- package/dist/src/agents/codex-terminal-chatro/adapter.js +266 -0
- package/dist/src/agents/codex-terminal-chatro/index.d.ts +13 -0
- package/dist/src/agents/codex-terminal-chatro/index.js +50 -0
- package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.d.ts +36 -0
- package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.js +205 -0
- package/dist/src/agents/codex-terminal-chatro/spawner.d.ts +9 -0
- package/dist/src/agents/codex-terminal-chatro/spawner.js +57 -0
- package/dist/src/agents/lib/chain-builder.d.ts +21 -0
- package/dist/src/agents/lib/chain-builder.js +139 -0
- package/dist/src/agents/lib/claude/fs-sessions.d.ts +31 -0
- package/dist/src/agents/lib/claude/fs-sessions.js +329 -0
- package/dist/src/agents/lib/claude/jsonl-writer.d.ts +32 -0
- package/dist/src/agents/lib/claude/jsonl-writer.js +342 -0
- package/dist/src/agents/lib/claude/workspace-trust.d.ts +1 -0
- package/dist/src/agents/lib/claude/workspace-trust.js +29 -0
- package/dist/src/agents/lib/codex/fs-sessions.d.ts +34 -0
- package/dist/src/agents/lib/codex/fs-sessions.js +255 -0
- package/dist/src/agents/lib/codex/jsonl-mapper.d.ts +11 -0
- package/dist/src/agents/lib/codex/jsonl-mapper.js +154 -0
- package/dist/src/agents/lib/codex/jsonl-writer.d.ts +8 -0
- package/dist/src/agents/lib/codex/jsonl-writer.js +440 -0
- package/dist/src/agents/lib/fs-tracking.d.ts +36 -0
- package/dist/src/agents/lib/fs-tracking.js +109 -0
- package/dist/src/agents/lib/pty-activity-tracker.d.ts +37 -0
- package/dist/src/agents/lib/pty-activity-tracker.js +105 -0
- package/dist/src/agents/lib/session-id-utils.d.ts +46 -0
- package/dist/src/agents/lib/session-id-utils.js +147 -0
- package/dist/src/agents/lib/session-precreate.d.ts +17 -0
- package/dist/src/agents/lib/session-precreate.js +177 -0
- package/dist/src/agents/registry.d.ts +72 -0
- package/dist/src/agents/registry.js +337 -0
- package/dist/src/agents/types.d.ts +135 -0
- package/dist/src/agents/types.js +1 -0
- package/dist/src/auth/crypto-key.d.ts +6 -0
- package/dist/src/auth/crypto-key.js +45 -0
- package/dist/src/auth/middleware.d.ts +18 -0
- package/dist/src/auth/middleware.js +54 -0
- package/dist/src/auth/password.d.ts +2 -0
- package/dist/src/auth/password.js +12 -0
- package/dist/src/auth/session.d.ts +10 -0
- package/dist/src/auth/session.js +33 -0
- package/dist/src/auth/totp.d.ts +12 -0
- package/dist/src/auth/totp.js +61 -0
- package/dist/src/auth/webauthn.d.ts +6 -0
- package/dist/src/auth/webauthn.js +117 -0
- package/dist/src/config.d.ts +10 -0
- package/dist/src/config.js +16 -0
- package/dist/src/database/connection-manager.d.ts +25 -0
- package/dist/src/database/connection-manager.js +211 -0
- package/dist/src/database/discovery/container.d.ts +6 -0
- package/dist/src/database/discovery/container.js +226 -0
- package/dist/src/database/discovery/env-parser.d.ts +9 -0
- package/dist/src/database/discovery/env-parser.js +525 -0
- package/dist/src/database/discovery/local-files.d.ts +6 -0
- package/dist/src/database/discovery/local-files.js +58 -0
- package/dist/src/database/discovery/port-scan.d.ts +7 -0
- package/dist/src/database/discovery/port-scan.js +61 -0
- package/dist/src/database/drivers/cassandra.d.ts +12 -0
- package/dist/src/database/drivers/cassandra.js +91 -0
- package/dist/src/database/drivers/clickhouse.d.ts +11 -0
- package/dist/src/database/drivers/clickhouse.js +127 -0
- package/dist/src/database/drivers/elasticsearch.d.ts +12 -0
- package/dist/src/database/drivers/elasticsearch.js +169 -0
- package/dist/src/database/drivers/influxdb.d.ts +14 -0
- package/dist/src/database/drivers/influxdb.js +194 -0
- package/dist/src/database/drivers/memcached.d.ts +11 -0
- package/dist/src/database/drivers/memcached.js +117 -0
- package/dist/src/database/drivers/mongodb.d.ts +12 -0
- package/dist/src/database/drivers/mongodb.js +128 -0
- package/dist/src/database/drivers/mysql.d.ts +11 -0
- package/dist/src/database/drivers/mysql.js +112 -0
- package/dist/src/database/drivers/neo4j.d.ts +11 -0
- package/dist/src/database/drivers/neo4j.js +158 -0
- package/dist/src/database/drivers/postgresql.d.ts +11 -0
- package/dist/src/database/drivers/postgresql.js +133 -0
- package/dist/src/database/drivers/redis.d.ts +11 -0
- package/dist/src/database/drivers/redis.js +91 -0
- package/dist/src/database/drivers/sqlite.d.ts +10 -0
- package/dist/src/database/drivers/sqlite.js +100 -0
- package/dist/src/database/query-stream.d.ts +5 -0
- package/dist/src/database/query-stream.js +75 -0
- package/dist/src/database/types.d.ts +71 -0
- package/dist/src/database/types.js +1 -0
- package/dist/src/events/index.d.ts +3 -0
- package/dist/src/events/index.js +3 -0
- package/dist/src/events/types.d.ts +214 -0
- package/dist/src/events/types.js +22 -0
- package/dist/src/events/wire.d.ts +114 -0
- package/dist/src/events/wire.js +296 -0
- package/dist/src/fs-monitor-types.d.ts +24 -0
- package/dist/src/fs-monitor-types.js +1 -0
- package/dist/src/fs-monitor.d.ts +80 -0
- package/dist/src/fs-monitor.js +637 -0
- package/dist/src/handlers/auth.d.ts +1 -0
- package/dist/src/handlers/auth.js +170 -0
- package/dist/src/handlers/changes.d.ts +1 -0
- package/dist/src/handlers/changes.js +203 -0
- package/dist/src/handlers/containers.d.ts +12 -0
- package/dist/src/handlers/containers.js +379 -0
- package/dist/src/handlers/databases.d.ts +3 -0
- package/dist/src/handlers/databases.js +327 -0
- package/dist/src/handlers/environments.d.ts +3 -0
- package/dist/src/handlers/environments.js +286 -0
- package/dist/src/handlers/github.d.ts +1 -0
- package/dist/src/handlers/github.js +153 -0
- package/dist/src/handlers/projects.d.ts +1 -0
- package/dist/src/handlers/projects.js +895 -0
- package/dist/src/handlers/ssh.d.ts +1 -0
- package/dist/src/handlers/ssh.js +162 -0
- package/dist/src/handlers/users.d.ts +1 -0
- package/dist/src/handlers/users.js +195 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +228 -0
- package/dist/src/mcp/config.d.ts +32 -0
- package/dist/src/mcp/config.js +227 -0
- package/dist/src/mcp/server.d.ts +1 -0
- package/dist/src/mcp/server.js +574 -0
- package/dist/src/serial/cuse-device.d.ts +19 -0
- package/dist/src/serial/cuse-device.js +260 -0
- package/dist/src/serial/manager.d.ts +63 -0
- package/dist/src/serial/manager.js +206 -0
- package/dist/src/serial/pty-pair.d.ts +16 -0
- package/dist/src/serial/pty-pair.js +68 -0
- package/dist/src/services/fs-browser.d.ts +14 -0
- package/dist/src/services/fs-browser.js +98 -0
- package/dist/src/services/git-ops.d.ts +78 -0
- package/dist/src/services/git-ops.js +288 -0
- package/dist/src/services/github-ops.d.ts +104 -0
- package/dist/src/services/github-ops.js +192 -0
- package/dist/src/services/obfuscation.d.ts +2 -0
- package/dist/src/services/obfuscation.js +16 -0
- package/dist/src/services/preview/headless-backend.d.ts +62 -0
- package/dist/src/services/preview/headless-backend.js +698 -0
- package/dist/src/services/preview/injected-scripts.d.ts +9 -0
- package/dist/src/services/preview/injected-scripts.js +232 -0
- package/dist/src/services/preview/preview-backend.d.ts +92 -0
- package/dist/src/services/preview/preview-backend.js +15 -0
- package/dist/src/services/preview/universal-setter.d.ts +7 -0
- package/dist/src/services/preview/universal-setter.js +46 -0
- package/dist/src/services/preview-manager.d.ts +50 -0
- package/dist/src/services/preview-manager.js +216 -0
- package/dist/src/services/project-watcher.d.ts +6 -0
- package/dist/src/services/project-watcher.js +307 -0
- package/dist/src/services/remote-fs-browser.d.ts +11 -0
- package/dist/src/services/remote-fs-browser.js +50 -0
- package/dist/src/services/remote-git-ops.d.ts +71 -0
- package/dist/src/services/remote-git-ops.js +215 -0
- package/dist/src/services/session-search.d.ts +56 -0
- package/dist/src/services/session-search.js +303 -0
- package/dist/src/services/ssh-manager.d.ts +44 -0
- package/dist/src/services/ssh-manager.js +359 -0
- package/dist/src/session-writer.d.ts +9 -0
- package/dist/src/session-writer.js +66 -0
- package/dist/src/spawner.d.ts +56 -0
- package/dist/src/spawner.js +135 -0
- package/dist/src/state/db.d.ts +214 -0
- package/dist/src/state/db.js +897 -0
- package/dist/src/state/store.d.ts +37 -0
- package/dist/src/state/store.js +108 -0
- package/dist/src/state/types.d.ts +13 -0
- package/dist/src/state/types.js +1 -0
- package/dist/src/web/devtools-proxy.d.ts +7 -0
- package/dist/src/web/devtools-proxy.js +176 -0
- package/dist/src/web/port-proxy.d.ts +15 -0
- package/dist/src/web/port-proxy.js +124 -0
- package/dist/src/web/preview-ws.d.ts +5 -0
- package/dist/src/web/preview-ws.js +207 -0
- package/dist/src/web/server.d.ts +6 -0
- package/dist/src/web/server.js +1694 -0
- package/dist/src/ws/agent-ws.d.ts +5 -0
- package/dist/src/ws/agent-ws.js +93 -0
- package/frontend/dist/assets/_basePickBy-B-LibQ4-.js +1 -0
- package/frontend/dist/assets/_baseUniq-CprifHap.js +1 -0
- package/frontend/dist/assets/_createAssigner-ByDUqGii.js +1 -0
- package/frontend/dist/assets/abap-DuT-3z4x.js +1 -0
- package/frontend/dist/assets/addon-fit-CxQet2ja.js +1 -0
- package/frontend/dist/assets/addon-web-links-D_jRkPIl.js +1 -0
- package/frontend/dist/assets/apex-B-em86xX.js +1 -0
- package/frontend/dist/assets/api-SUPuHhSY.js +2 -0
- package/frontend/dist/assets/arc-Z0_eVteO.js +1 -0
- package/frontend/dist/assets/architecture-PBZL5I3N-hvVXGhqd.js +1 -0
- package/frontend/dist/assets/architectureDiagram-2XIMDMQ5-DiHPxX4j.js +36 -0
- package/frontend/dist/assets/array-CwG8vNfn.js +1 -0
- package/frontend/dist/assets/auth-store-R7eW5SVu.js +1 -0
- package/frontend/dist/assets/azcli-Bg9wQloi.js +1 -0
- package/frontend/dist/assets/bat-BM46z99L.js +1 -0
- package/frontend/dist/assets/bicep-DcBsJUfh.js +2 -0
- package/frontend/dist/assets/blockDiagram-WCTKOSBZ-C40u_hLo.js +132 -0
- package/frontend/dist/assets/c4Diagram-IC4MRINW-Ct7LjWFQ.js +10 -0
- package/frontend/dist/assets/cameligo-zw7JTtim.js +1 -0
- package/frontend/dist/assets/channel-ClCsE6HN.js +1 -0
- package/frontend/dist/assets/chunk-4BX2VUAB-zZ6P90VO.js +1 -0
- package/frontend/dist/assets/chunk-55IACEB6-DXllTDQl.js +1 -0
- package/frontend/dist/assets/chunk-7E7YKBS2-7zRaOLjj.js +1 -0
- package/frontend/dist/assets/chunk-7R4GIKGN-Csst1274.js +80 -0
- package/frontend/dist/assets/chunk-C72U2L5F-_JbQPbLN.js +1 -0
- package/frontend/dist/assets/chunk-CFjPhJqf.js +1 -0
- package/frontend/dist/assets/chunk-EGIJ26TM-B--aFyPw.js +1 -0
- package/frontend/dist/assets/chunk-FMBD7UC4-DVR34RNb.js +15 -0
- package/frontend/dist/assets/chunk-GEFDOKGD-CnmN6cC8.js +2 -0
- package/frontend/dist/assets/chunk-JSJVCQXG-CWxHBzeJ.js +1 -0
- package/frontend/dist/assets/chunk-KX2RTZJC-DkRk56s7.js +1 -0
- package/frontend/dist/assets/chunk-KYZI473N-DCCsG2dK.js +53 -0
- package/frontend/dist/assets/chunk-L3YUKLVL-C-DkZTMr.js +1 -0
- package/frontend/dist/assets/chunk-MX3YWQON-OUdzv5sZ.js +1 -0
- package/frontend/dist/assets/chunk-NQ4KR5QH-Bpu9FsM7.js +220 -0
- package/frontend/dist/assets/chunk-O4XLMI2P-BMLK6_ib.js +7 -0
- package/frontend/dist/assets/chunk-OZEHJAEY-CNNiJtG0.js +1 -0
- package/frontend/dist/assets/chunk-PQ6SQG4A-evVHD3KM.js +1 -0
- package/frontend/dist/assets/chunk-PU5JKC2W-DPFTYuvl.js +70 -0
- package/frontend/dist/assets/chunk-QZHKN3VN-JRdddPvu.js +1 -0
- package/frontend/dist/assets/chunk-R5LLSJPH-CHQzVVOV.js +1 -0
- package/frontend/dist/assets/chunk-WL4C6EOR-BNFU6IIi.js +189 -0
- package/frontend/dist/assets/chunk-XIRO2GV7-98T93G85.js +1 -0
- package/frontend/dist/assets/chunk-XZSTWKYB-BcW3cyNp.js +94 -0
- package/frontend/dist/assets/chunk-YBOYWFTD-BgKO1qAJ.js +1 -0
- package/frontend/dist/assets/classDiagram-VBA2DB6C-DikXzgcD.js +1 -0
- package/frontend/dist/assets/classDiagram-v2-RAHNMMFH-D7E3tQUK.js +1 -0
- package/frontend/dist/assets/clojure-FspFoNNQ.js +1 -0
- package/frontend/dist/assets/clone-mOXuZa7C.js +1 -0
- package/frontend/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/frontend/dist/assets/coffee-13n8Bk2W.js +1 -0
- package/frontend/dist/assets/cose-bilkent-S5V4N54A-zUOWQqLe.js +1 -0
- package/frontend/dist/assets/cpp-BVm2xGEs.js +1 -0
- package/frontend/dist/assets/csharp-D2kAWmUm.js +1 -0
- package/frontend/dist/assets/csp-Ezvgpf0e.js +1 -0
- package/frontend/dist/assets/css-CYxRwcFy.js +3 -0
- package/frontend/dist/assets/css.worker-Cd5h-ZOL.js +89 -0
- package/frontend/dist/assets/cssMode-CrXej49V.js +1 -0
- package/frontend/dist/assets/cypher-jg3SGErc.js +1 -0
- package/frontend/dist/assets/cytoscape.esm-kyyvzxNV.js +321 -0
- package/frontend/dist/assets/dagre-DH4bgZO7.js +1 -0
- package/frontend/dist/assets/dagre-KLK3FWXG-DNSqDkwT.js +4 -0
- package/frontend/dist/assets/dart-179jqhK4.js +1 -0
- package/frontend/dist/assets/defaultLocale-Dda4OpKy.js +1 -0
- package/frontend/dist/assets/diagram-E7M64L7V-RqPNT5Vs.js +24 -0
- package/frontend/dist/assets/diagram-IFDJBPK2-B-5NRyaE.js +43 -0
- package/frontend/dist/assets/diagram-P4PSJMXO-BrP69Hk0.js +24 -0
- package/frontend/dist/assets/dist-CU_Nb1G5.js +1 -0
- package/frontend/dist/assets/dockerfile-CIAtSGxS.js +1 -0
- package/frontend/dist/assets/ecl-CGVKfDxD.js +1 -0
- package/frontend/dist/assets/editor-Br_kD0ds.css +1 -0
- package/frontend/dist/assets/editor.api2-YXkDn0Gm.js +872 -0
- package/frontend/dist/assets/editor.main-fBaXZjJ0.js +6 -0
- package/frontend/dist/assets/elixir-BZ-6w0y3.js +1 -0
- package/frontend/dist/assets/erDiagram-INFDFZHY-BYiB9NYg.js +70 -0
- package/frontend/dist/assets/flow9-CVuOjTMv.js +1 -0
- package/frontend/dist/assets/flowDiagram-PKNHOUZH-Cwq47rsR.js +162 -0
- package/frontend/dist/assets/freemarker2-DM-pztJU.js +3 -0
- package/frontend/dist/assets/fsharp-q0pGJYr6.js +1 -0
- package/frontend/dist/assets/ganttDiagram-A5KZAMGK-Dnx3szD9.js +292 -0
- package/frontend/dist/assets/gitGraph-HDMCJU4V-COlTQ7bA.js +1 -0
- package/frontend/dist/assets/gitGraphDiagram-K3NZZRJ6-BaUxboNc.js +65 -0
- package/frontend/dist/assets/go-dzSPfdEO.js +1 -0
- package/frontend/dist/assets/graphlib-kEFlkt3U.js +1 -0
- package/frontend/dist/assets/graphql-CG4OUoEV.js +1 -0
- package/frontend/dist/assets/handlebars-BbK53Vec.js +1 -0
- package/frontend/dist/assets/hcl-Cy14JPk3.js +1 -0
- package/frontend/dist/assets/html-DYtTQNOG.js +1 -0
- package/frontend/dist/assets/html.worker-BjVEKLoU.js +502 -0
- package/frontend/dist/assets/htmlMode-C6GTouth.js +1 -0
- package/frontend/dist/assets/index-DMLxes_u.js +157 -0
- package/frontend/dist/assets/index-DmzeqkB1.css +1 -0
- package/frontend/dist/assets/info-3K5VOQVL-DBtHyA4C.js +1 -0
- package/frontend/dist/assets/infoDiagram-LFFYTUFH-yBXLgMPI.js +2 -0
- package/frontend/dist/assets/ini-Pbg8HGVD.js +1 -0
- package/frontend/dist/assets/init-D6KNwrax.js +1 -0
- package/frontend/dist/assets/ishikawaDiagram-PHBUUO56-Bld4two_.js +70 -0
- package/frontend/dist/assets/java-BmVu6Qrl.js +1 -0
- package/frontend/dist/assets/javascript-PbfQEdcJ.js +1 -0
- package/frontend/dist/assets/journeyDiagram-4ABVD52K-4HyMd4R2.js +139 -0
- package/frontend/dist/assets/json.worker-DqU5Wxnl.js +58 -0
- package/frontend/dist/assets/jsonMode-CASsGppE.js +7 -0
- package/frontend/dist/assets/julia-3cGnieBq.js +1 -0
- package/frontend/dist/assets/kanban-definition-K7BYSVSG-DpgsZmpG.js +89 -0
- package/frontend/dist/assets/katex-CEw3x5bf.js +261 -0
- package/frontend/dist/assets/kotlin-BuWkVcfV.js +1 -0
- package/frontend/dist/assets/less-CJ_VPy2C.js +2 -0
- package/frontend/dist/assets/lexon-BygAuZPu.js +1 -0
- package/frontend/dist/assets/line-CA_wh_TY.js +1 -0
- package/frontend/dist/assets/linear-BAcLW45z.js +1 -0
- package/frontend/dist/assets/liquid-kz84dle6.js +1 -0
- package/frontend/dist/assets/lspLanguageFeatures-C7hAHFn1.js +4 -0
- package/frontend/dist/assets/lua-C8Xs3dCx.js +1 -0
- package/frontend/dist/assets/m3-DTJeKBk4.js +1 -0
- package/frontend/dist/assets/markdown-QCgx8JqZ.js +1 -0
- package/frontend/dist/assets/math-D0YcMJAn.js +1 -0
- package/frontend/dist/assets/mdx-yRw0ap-E.js +1 -0
- package/frontend/dist/assets/mermaid-parser.core-DAeTodBQ.js +4 -0
- package/frontend/dist/assets/mindmap-definition-YRQLILUH-CoNlFyVl.js +68 -0
- package/frontend/dist/assets/mips-DopWaYgE.js +1 -0
- package/frontend/dist/assets/monaco.contribution-DeY0Qei-.js +2 -0
- package/frontend/dist/assets/msdax-BDis4ARV.js +1 -0
- package/frontend/dist/assets/mysql-BV6MLsOI.js +1 -0
- package/frontend/dist/assets/objective-c-B1UuzKs6.js +1 -0
- package/frontend/dist/assets/ordinal-jM7S0YHN.js +1 -0
- package/frontend/dist/assets/packet-RMMSAZCW-FF6-Tmai.js +1 -0
- package/frontend/dist/assets/pascal-BkvESCrc.js +1 -0
- package/frontend/dist/assets/pascaligo-lTy0kZYr.js +1 -0
- package/frontend/dist/assets/path-DNPd7Py7.js +1 -0
- package/frontend/dist/assets/perl-CrtUPXLV.js +1 -0
- package/frontend/dist/assets/pgsql-B9IbNWx2.js +1 -0
- package/frontend/dist/assets/php-CXvQBY2p.js +1 -0
- package/frontend/dist/assets/pie-UPGHQEXC-CFvXY2o-.js +1 -0
- package/frontend/dist/assets/pieDiagram-SKSYHLDU-CM_hbCcn.js +30 -0
- package/frontend/dist/assets/pla-DxBxuqWu.js +1 -0
- package/frontend/dist/assets/postiats-OkEuT5YF.js +1 -0
- package/frontend/dist/assets/powerquery-CMx5Tq4K.js +1 -0
- package/frontend/dist/assets/powershell-CstRxrEc.js +1 -0
- package/frontend/dist/assets/preload-helper-D4M6sveU.js +1 -0
- package/frontend/dist/assets/protobuf-Bx0Z-uRj.js +2 -0
- package/frontend/dist/assets/pug--W8vanWl.js +1 -0
- package/frontend/dist/assets/python-DA0rnlw3.js +1 -0
- package/frontend/dist/assets/qsharp-CRtr0YbN.js +1 -0
- package/frontend/dist/assets/quadrantDiagram-337W2JSQ-B3n3IUhC.js +7 -0
- package/frontend/dist/assets/r-C6E1d6iv.js +1 -0
- package/frontend/dist/assets/radar-KQ55EAFF-MPZu7SdX.js +1 -0
- package/frontend/dist/assets/razor-yd73uata.js +1 -0
- package/frontend/dist/assets/redis-Dx13voP3.js +1 -0
- package/frontend/dist/assets/redshift-D66HwlyV.js +1 -0
- package/frontend/dist/assets/requirementDiagram-Z7DCOOCP-CorP7L7F.js +73 -0
- package/frontend/dist/assets/restructuredtext-DQT2NKJ2.js +1 -0
- package/frontend/dist/assets/rough.esm-DxAX5Vpo.js +1 -0
- package/frontend/dist/assets/ruby-iFXI8hwH.js +1 -0
- package/frontend/dist/assets/rust-CSKiei34.js +1 -0
- package/frontend/dist/assets/sankeyDiagram-WA2Y5GQK-RDx6Bd-B.js +10 -0
- package/frontend/dist/assets/sb-Bo3ttdP2.js +1 -0
- package/frontend/dist/assets/scala-BC1D-Nxp.js +1 -0
- package/frontend/dist/assets/scheme-Z4OAo4Lv.js +1 -0
- package/frontend/dist/assets/scss-BvrdPs6B.js +3 -0
- package/frontend/dist/assets/sequenceDiagram-2WXFIKYE-JMqJSFq6.js +145 -0
- package/frontend/dist/assets/shell-Bh_aCyF-.js +1 -0
- package/frontend/dist/assets/solidity-CWHj6tSe.js +1 -0
- package/frontend/dist/assets/sophia-raoNtKtm.js +1 -0
- package/frontend/dist/assets/sparql-XzmoGnue.js +1 -0
- package/frontend/dist/assets/sql-BD0i9Gvg.js +1 -0
- package/frontend/dist/assets/src-Bn-kKzs7.js +1 -0
- package/frontend/dist/assets/st-DtVKyms6.js +1 -0
- package/frontend/dist/assets/stateDiagram-RAJIS63D-CgFfENdy.js +1 -0
- package/frontend/dist/assets/stateDiagram-v2-FVOUBMTO-C4Hh2P-U.js +1 -0
- package/frontend/dist/assets/swift--UZs77wT.js +1 -0
- package/frontend/dist/assets/systemverilog-CDnBSWUd.js +1 -0
- package/frontend/dist/assets/tcl-DdCEuTHZ.js +1 -0
- package/frontend/dist/assets/timeline-definition-YZTLITO2-BnatPBR5.js +61 -0
- package/frontend/dist/assets/treemap-KZPCXAKY-qb1Pl9la.js +1 -0
- package/frontend/dist/assets/ts.worker-DyPAEIuH.js +67719 -0
- package/frontend/dist/assets/tsMode-iuvyEpyO.js +11 -0
- package/frontend/dist/assets/twig-SSL-Altf.js +1 -0
- package/frontend/dist/assets/typescript-17918Hud.js +1 -0
- package/frontend/dist/assets/typespec-BT7S0ETg.js +1 -0
- package/frontend/dist/assets/vb-CrIgucua.js +1 -0
- package/frontend/dist/assets/vennDiagram-LZ73GAT5-DygS4Zzd.js +34 -0
- package/frontend/dist/assets/wgsl-BeKc3oEp.js +298 -0
- package/frontend/dist/assets/workers-DTfwKVoM.js +1 -0
- package/frontend/dist/assets/xml-CBMr_Wbw.js +1 -0
- package/frontend/dist/assets/xterm-BrP-ENHg.css +1 -0
- package/frontend/dist/assets/xterm-CBX2m0YM.js +36 -0
- package/frontend/dist/assets/xychartDiagram-JWTSCODW-D6wY1Jwd.js +7 -0
- package/frontend/dist/assets/yaml-CTjCH7Bv.js +1 -0
- package/frontend/dist/fonts/inter-300.ttf +0 -0
- package/frontend/dist/fonts/inter-400.ttf +0 -0
- package/frontend/dist/fonts/inter-500.ttf +0 -0
- package/frontend/dist/fonts/inter-600.ttf +0 -0
- package/frontend/dist/fonts/inter-700.ttf +0 -0
- package/frontend/dist/index.html +49 -0
- package/frontend/dist/logo_192x192.png +0 -0
- package/frontend/dist/logo_32x32.png +0 -0
- package/frontend/dist/logo_512x512.png +0 -0
- package/frontend/dist/logo_64x64.png +0 -0
- package/frontend/dist/logobg_192x192.png +0 -0
- package/frontend/dist/logobg_512x512.png +0 -0
- package/frontend/dist/logobg_64x64.png +0 -0
- package/frontend/dist/manifest.json +25 -0
- package/frontend/dist/sw.js +22 -0
- package/package.json +74 -7
- package/preload/Makefile +12 -0
- package/preload/atoo-studio-preload.c +647 -0
- package/preload/atoo-studio-preload.so +0 -0
- package/setup-cuse.sh +260 -0
- package/setup.sh +81 -0
- package/src/serial/native/binding.gyp +10 -0
- package/src/serial/native/pty_pair.c +222 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import fsp from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
const SKIP_NAMES = new Set(['.git', '.atoo-studio', 'node_modules', '.next', '.nuxt', 'dist', 'build', '__pycache__', '.venv', 'venv', '.cache', '.parcel-cache', 'coverage', '.svn', '.hg']);
|
|
5
|
+
const MAX_DEPTH = 8;
|
|
6
|
+
const MAX_ENTRIES = 2000;
|
|
7
|
+
export async function getFileTree(dirPath, depth = 0, showHidden = false, maxDepth = MAX_DEPTH) {
|
|
8
|
+
if (depth > maxDepth)
|
|
9
|
+
return [];
|
|
10
|
+
let entries;
|
|
11
|
+
try {
|
|
12
|
+
entries = await fsp.readdir(dirPath, { withFileTypes: true });
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
const result = [];
|
|
18
|
+
let count = 0;
|
|
19
|
+
// Sort: dirs first, then files, alphabetically
|
|
20
|
+
entries.sort((a, b) => {
|
|
21
|
+
if (a.isDirectory() !== b.isDirectory())
|
|
22
|
+
return a.isDirectory() ? -1 : 1;
|
|
23
|
+
return a.name.localeCompare(b.name);
|
|
24
|
+
});
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (count >= MAX_ENTRIES)
|
|
27
|
+
break;
|
|
28
|
+
if (entry.isDirectory()) {
|
|
29
|
+
if (!showHidden && SKIP_NAMES.has(entry.name))
|
|
30
|
+
continue;
|
|
31
|
+
if (depth >= maxDepth) {
|
|
32
|
+
// At max depth, include dir without loading children
|
|
33
|
+
result.push({ name: entry.name, type: 'dir' });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const children = await getFileTree(path.join(dirPath, entry.name), depth + 1, showHidden, maxDepth);
|
|
37
|
+
result.push({ name: entry.name, type: 'dir', children });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
41
|
+
if (!showHidden && SKIP_NAMES.has(entry.name))
|
|
42
|
+
continue;
|
|
43
|
+
result.push({ name: entry.name, type: 'file' });
|
|
44
|
+
}
|
|
45
|
+
count++;
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
const EXT_LANG_MAP = {
|
|
50
|
+
ts: 'typescript', tsx: 'typescript', js: 'javascript', jsx: 'javascript',
|
|
51
|
+
py: 'python', rs: 'rust', go: 'go', java: 'java', c: 'c', cpp: 'cpp', h: 'c',
|
|
52
|
+
cs: 'csharp', rb: 'ruby', php: 'php', swift: 'swift', kt: 'kotlin',
|
|
53
|
+
json: 'json', yaml: 'yaml', yml: 'yaml', toml: 'toml', xml: 'xml',
|
|
54
|
+
md: 'markdown', html: 'html', css: 'css', scss: 'scss', less: 'less',
|
|
55
|
+
sql: 'sql', sh: 'shell', bash: 'shell', zsh: 'shell',
|
|
56
|
+
dockerfile: 'dockerfile', makefile: 'makefile',
|
|
57
|
+
astro: 'html', vue: 'html', svelte: 'html',
|
|
58
|
+
};
|
|
59
|
+
const BINARY_EXTENSIONS = new Set([
|
|
60
|
+
'png', 'jpg', 'jpeg', 'gif', 'bmp', 'ico', 'webp', 'tiff', 'tif', 'psd', 'avif',
|
|
61
|
+
'mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'wma',
|
|
62
|
+
'mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', 'webm',
|
|
63
|
+
'zip', 'tar', 'gz', 'bz2', '7z', 'rar', 'xz', 'zst',
|
|
64
|
+
'exe', 'dll', 'so', 'dylib', 'bin', 'msi', 'deb', 'rpm', 'appimage',
|
|
65
|
+
'woff', 'woff2', 'ttf', 'otf', 'eot',
|
|
66
|
+
'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx',
|
|
67
|
+
'class', 'pyc', 'pyo', 'o', 'obj', 'wasm', 'a', 'lib',
|
|
68
|
+
'sqlite', 'db', 'sqlite3',
|
|
69
|
+
]);
|
|
70
|
+
export function isBinaryFile(filePath) {
|
|
71
|
+
const ext = path.extname(filePath).toLowerCase().replace('.', '');
|
|
72
|
+
if (BINARY_EXTENSIONS.has(ext))
|
|
73
|
+
return true;
|
|
74
|
+
// Check first 8KB for null bytes
|
|
75
|
+
try {
|
|
76
|
+
const fd = fs.openSync(filePath, 'r');
|
|
77
|
+
const buf = Buffer.alloc(8192);
|
|
78
|
+
const bytesRead = fs.readSync(fd, buf, 0, 8192, 0);
|
|
79
|
+
fs.closeSync(fd);
|
|
80
|
+
for (let i = 0; i < bytesRead; i++) {
|
|
81
|
+
if (buf[i] === 0)
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch { }
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
export function readFileContent(filePath) {
|
|
89
|
+
const ext = path.extname(filePath).toLowerCase().replace('.', '');
|
|
90
|
+
const basename = path.basename(filePath).toLowerCase();
|
|
91
|
+
const lang = EXT_LANG_MAP[ext] || EXT_LANG_MAP[basename] || 'plaintext';
|
|
92
|
+
if (isBinaryFile(filePath)) {
|
|
93
|
+
const stat = fs.statSync(filePath);
|
|
94
|
+
return { content: '', lang, isBinary: true, size: stat.size };
|
|
95
|
+
}
|
|
96
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
97
|
+
return { content, lang };
|
|
98
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export declare function gitInit(cwd: string): Promise<void>;
|
|
2
|
+
export declare function gitClone(url: string, dest: string): Promise<void>;
|
|
3
|
+
export declare function gitStatus(cwd: string): Promise<{
|
|
4
|
+
status: string;
|
|
5
|
+
file: string;
|
|
6
|
+
staged: boolean;
|
|
7
|
+
indexStatus: string;
|
|
8
|
+
workTreeStatus: string;
|
|
9
|
+
oldPath: string | undefined;
|
|
10
|
+
}[]>;
|
|
11
|
+
export declare function gitLog(cwd: string, branch?: string, count?: number): Promise<{
|
|
12
|
+
hash: string;
|
|
13
|
+
fullHash: string;
|
|
14
|
+
msg: string;
|
|
15
|
+
fullMessage: string;
|
|
16
|
+
author: string;
|
|
17
|
+
date: string;
|
|
18
|
+
files: never[];
|
|
19
|
+
merge: boolean;
|
|
20
|
+
}[]>;
|
|
21
|
+
export declare function gitCommitFiles(cwd: string, hash: string): Promise<({
|
|
22
|
+
path: string;
|
|
23
|
+
status: string;
|
|
24
|
+
oldPath: string;
|
|
25
|
+
additions: number;
|
|
26
|
+
deletions: number;
|
|
27
|
+
} | {
|
|
28
|
+
path: string;
|
|
29
|
+
status: string;
|
|
30
|
+
additions: number;
|
|
31
|
+
deletions: number;
|
|
32
|
+
oldPath?: undefined;
|
|
33
|
+
})[]>;
|
|
34
|
+
export declare function gitBranches(cwd: string): Promise<{
|
|
35
|
+
branches: string[];
|
|
36
|
+
currentBranch: string;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function gitCheckout(cwd: string, branch: string): Promise<void>;
|
|
39
|
+
export declare function gitCommit(cwd: string, message: string): Promise<void>;
|
|
40
|
+
export declare function gitPush(cwd: string): Promise<void>;
|
|
41
|
+
export declare function gitStash(cwd: string): Promise<void>;
|
|
42
|
+
export declare function gitStashList(cwd: string): Promise<{
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
}[]>;
|
|
46
|
+
export declare function gitStashApply(cwd: string, id: string): Promise<void>;
|
|
47
|
+
export declare function gitStashDrop(cwd: string, id: string): Promise<void>;
|
|
48
|
+
export declare function gitCreateBranch(cwd: string, name: string): Promise<void>;
|
|
49
|
+
export declare function gitFetch(cwd: string): Promise<void>;
|
|
50
|
+
export declare function gitRemotes(cwd: string): Promise<{
|
|
51
|
+
name: string;
|
|
52
|
+
url: string;
|
|
53
|
+
type: string;
|
|
54
|
+
}[]>;
|
|
55
|
+
export declare function gitAddRemote(cwd: string, name: string, url: string): Promise<void>;
|
|
56
|
+
export declare function gitRemoveRemote(cwd: string, name: string): Promise<void>;
|
|
57
|
+
export declare function gitEditRemote(cwd: string, name: string, url: string): Promise<void>;
|
|
58
|
+
export declare function gitDiff(cwd: string, file?: string): Promise<string>;
|
|
59
|
+
export declare function gitRevert(cwd: string, file?: string): Promise<void>;
|
|
60
|
+
export declare function gitUnstageFile(cwd: string, file: string): Promise<void>;
|
|
61
|
+
export declare function gitStageFile(cwd: string, file: string): Promise<void>;
|
|
62
|
+
export declare function gitShowFile(cwd: string, file: string, ref?: string): Promise<string>;
|
|
63
|
+
export declare function gitBlame(cwd: string, file: string): Promise<string>;
|
|
64
|
+
export declare function gitFileLog(cwd: string, file: string): Promise<{
|
|
65
|
+
hash: string;
|
|
66
|
+
author: string;
|
|
67
|
+
date: string;
|
|
68
|
+
msg: string;
|
|
69
|
+
}[]>;
|
|
70
|
+
export declare function gitWorktreeList(cwd: string): Promise<{
|
|
71
|
+
path: string;
|
|
72
|
+
head: string;
|
|
73
|
+
branch: string;
|
|
74
|
+
bare?: boolean;
|
|
75
|
+
}[]>;
|
|
76
|
+
export declare function gitWorktreeAdd(cwd: string, path: string, branch?: string, newBranch?: boolean): Promise<void>;
|
|
77
|
+
export declare function gitWorktreeRemove(cwd: string, worktreePath: string): Promise<void>;
|
|
78
|
+
export declare function gitBranchDelete(cwd: string, branch: string): Promise<void>;
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const TIMEOUT = 15000;
|
|
4
|
+
function git(args, cwd) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
execFile('git', args, { cwd, timeout: TIMEOUT, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {
|
|
7
|
+
if (err) {
|
|
8
|
+
reject(new Error(stderr?.trim() || err.message));
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
resolve(stdout);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export async function gitInit(cwd) {
|
|
17
|
+
await git(['init'], cwd);
|
|
18
|
+
}
|
|
19
|
+
export async function gitClone(url, dest) {
|
|
20
|
+
const { execFile } = await import('child_process');
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
execFile('git', ['clone', url, dest], { timeout: 120000, maxBuffer: 10 * 1024 * 1024 }, (err, _stdout, stderr) => {
|
|
23
|
+
if (err)
|
|
24
|
+
reject(new Error(stderr?.trim() || err.message));
|
|
25
|
+
else
|
|
26
|
+
resolve();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export async function gitStatus(cwd) {
|
|
31
|
+
const output = await git(['status', '--porcelain', '-uall', '-M'], cwd);
|
|
32
|
+
const entries = output.split('\n').filter(Boolean).map(line => {
|
|
33
|
+
const x = line[0]; // index (staged) status
|
|
34
|
+
const y = line[1]; // working tree status
|
|
35
|
+
const rest = line.substring(3);
|
|
36
|
+
// Handle renames: porcelain format "R old_path -> new_path"
|
|
37
|
+
let file = rest;
|
|
38
|
+
let oldPath;
|
|
39
|
+
if (x === 'R' || y === 'R') {
|
|
40
|
+
const arrowIdx = rest.indexOf(' -> ');
|
|
41
|
+
if (arrowIdx >= 0) {
|
|
42
|
+
oldPath = rest.substring(0, arrowIdx);
|
|
43
|
+
file = rest.substring(arrowIdx + 4);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
let status = (x + y).trim() || '?';
|
|
47
|
+
const staged = x !== ' ' && x !== '?' && x !== '!';
|
|
48
|
+
return { status, file, staged, indexStatus: x, workTreeStatus: y, oldPath };
|
|
49
|
+
});
|
|
50
|
+
// Detect unstaged renames: pair D (deleted) + ?? (untracked) by comparing file content hashes
|
|
51
|
+
// Skip when there are too many entries — the O(n*m) hash comparisons would be very slow
|
|
52
|
+
const deleted = entries.filter(e => e.status === 'D' || e.status === ' D');
|
|
53
|
+
const untracked = entries.filter(e => e.status === '??');
|
|
54
|
+
if (deleted.length > 0 && untracked.length > 0 && deleted.length + untracked.length <= 200) {
|
|
55
|
+
try {
|
|
56
|
+
// Get hashes for deleted files (from HEAD) and untracked files (from working tree)
|
|
57
|
+
const deletedHashes = new Map();
|
|
58
|
+
for (const d of deleted) {
|
|
59
|
+
try {
|
|
60
|
+
const hash = (await git(['hash-object', '--stdin-path', d.file], cwd)).trim();
|
|
61
|
+
// Actually use show to get the blob hash from HEAD
|
|
62
|
+
const h = (await git(['rev-parse', `HEAD:${d.file}`], cwd)).trim();
|
|
63
|
+
deletedHashes.set(h, d.file);
|
|
64
|
+
}
|
|
65
|
+
catch { }
|
|
66
|
+
}
|
|
67
|
+
const matched = new Set();
|
|
68
|
+
for (const u of untracked) {
|
|
69
|
+
try {
|
|
70
|
+
const h = (await git(['hash-object', path.join(cwd, u.file)], cwd)).trim();
|
|
71
|
+
const oldFile = deletedHashes.get(h);
|
|
72
|
+
if (oldFile) {
|
|
73
|
+
// Found a match — convert to rename
|
|
74
|
+
u.status = 'R';
|
|
75
|
+
u.indexStatus = 'R';
|
|
76
|
+
u.oldPath = oldFile;
|
|
77
|
+
u.staged = false;
|
|
78
|
+
matched.add(oldFile);
|
|
79
|
+
deletedHashes.delete(h);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
}
|
|
84
|
+
// Remove matched deleted entries
|
|
85
|
+
if (matched.size > 0) {
|
|
86
|
+
return entries.filter(e => !(matched.has(e.file) && (e.status === 'D' || e.status === ' D')));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
}
|
|
91
|
+
return entries;
|
|
92
|
+
}
|
|
93
|
+
export async function gitLog(cwd, branch, count = 30) {
|
|
94
|
+
const SEP = '---GIT-LOG-SEP---';
|
|
95
|
+
const args = ['log', `--format=${SEP}%n%H%n%h%n%an%n%ar%n%s%n%B`, '-n', String(count)];
|
|
96
|
+
if (branch)
|
|
97
|
+
args.push(branch);
|
|
98
|
+
const output = await git(args, cwd);
|
|
99
|
+
const entries = output.split(SEP).filter(e => e.trim());
|
|
100
|
+
return entries.map(entry => {
|
|
101
|
+
const lines = entry.trim().split('\n');
|
|
102
|
+
const fullHash = lines[0] || '';
|
|
103
|
+
const hash = lines[1] || '';
|
|
104
|
+
const author = lines[2] || '';
|
|
105
|
+
const date = lines[3] || '';
|
|
106
|
+
const msg = lines[4] || '';
|
|
107
|
+
const fullMessage = lines.slice(5).join('\n').trim() || msg;
|
|
108
|
+
const isMerge = msg.toLowerCase().startsWith('merge');
|
|
109
|
+
return { hash, fullHash, msg, fullMessage, author, date, files: [], merge: isMerge };
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export async function gitCommitFiles(cwd, hash) {
|
|
113
|
+
const output = await git(['diff-tree', '--no-commit-id', '-r', '--name-status', '-M', hash], cwd);
|
|
114
|
+
return output.trim().split('\n').filter(Boolean).map(line => {
|
|
115
|
+
const parts = line.split('\t');
|
|
116
|
+
const statusChar = parts[0]?.[0] || 'M';
|
|
117
|
+
const statusMap = { A: 'A', M: 'M', D: 'D', R: 'R', C: 'C' };
|
|
118
|
+
const status = statusMap[statusChar] || 'M';
|
|
119
|
+
// Renames/copies have format: R100\told_path\tnew_path
|
|
120
|
+
if ((statusChar === 'R' || statusChar === 'C') && parts.length >= 3) {
|
|
121
|
+
return { path: parts[2], status, oldPath: parts[1], additions: 0, deletions: 0 };
|
|
122
|
+
}
|
|
123
|
+
return { path: parts[1] || '', status, additions: 0, deletions: 0 };
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
export async function gitBranches(cwd) {
|
|
127
|
+
const output = await git(['branch', '-a', '--no-color'], cwd);
|
|
128
|
+
const branches = [];
|
|
129
|
+
let currentBranch = '';
|
|
130
|
+
output.split('\n').filter(Boolean).forEach(line => {
|
|
131
|
+
const trimmed = line.trim();
|
|
132
|
+
if (trimmed.startsWith('* ')) {
|
|
133
|
+
currentBranch = trimmed.substring(2);
|
|
134
|
+
branches.push(currentBranch);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
branches.push(trimmed);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// No commits yet: git branch returns nothing, but symbolic-ref shows the unborn branch
|
|
141
|
+
if (!currentBranch) {
|
|
142
|
+
try {
|
|
143
|
+
const ref = await git(['symbolic-ref', '--short', 'HEAD'], cwd);
|
|
144
|
+
currentBranch = ref.trim();
|
|
145
|
+
if (currentBranch)
|
|
146
|
+
branches.push(currentBranch);
|
|
147
|
+
}
|
|
148
|
+
catch { }
|
|
149
|
+
}
|
|
150
|
+
return { branches, currentBranch };
|
|
151
|
+
}
|
|
152
|
+
export async function gitCheckout(cwd, branch) {
|
|
153
|
+
await git(['checkout', branch], cwd);
|
|
154
|
+
}
|
|
155
|
+
export async function gitCommit(cwd, message) {
|
|
156
|
+
await git(['add', '-A'], cwd);
|
|
157
|
+
await git(['commit', '-m', message], cwd);
|
|
158
|
+
}
|
|
159
|
+
export async function gitPush(cwd) {
|
|
160
|
+
await git(['push'], cwd);
|
|
161
|
+
}
|
|
162
|
+
export async function gitStash(cwd) {
|
|
163
|
+
await git(['stash', 'push'], cwd);
|
|
164
|
+
}
|
|
165
|
+
export async function gitStashList(cwd) {
|
|
166
|
+
const output = await git(['stash', 'list'], cwd);
|
|
167
|
+
return output.split('\n').filter(Boolean).map((line, i) => ({
|
|
168
|
+
id: `stash@{${i}}`,
|
|
169
|
+
name: line,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
export async function gitStashApply(cwd, id) {
|
|
173
|
+
await git(['stash', 'apply', id], cwd);
|
|
174
|
+
}
|
|
175
|
+
export async function gitStashDrop(cwd, id) {
|
|
176
|
+
await git(['stash', 'drop', id], cwd);
|
|
177
|
+
}
|
|
178
|
+
export async function gitCreateBranch(cwd, name) {
|
|
179
|
+
await git(['checkout', '-b', name], cwd);
|
|
180
|
+
}
|
|
181
|
+
export async function gitFetch(cwd) {
|
|
182
|
+
await git(['fetch', '--all'], cwd);
|
|
183
|
+
}
|
|
184
|
+
export async function gitRemotes(cwd) {
|
|
185
|
+
const output = await git(['remote', '-v'], cwd);
|
|
186
|
+
const remotes = [];
|
|
187
|
+
const seen = new Set();
|
|
188
|
+
output.split('\n').filter(Boolean).forEach(line => {
|
|
189
|
+
const parts = line.split(/\s+/);
|
|
190
|
+
const name = parts[0];
|
|
191
|
+
const url = parts[1];
|
|
192
|
+
if (!seen.has(name)) {
|
|
193
|
+
seen.add(name);
|
|
194
|
+
remotes.push({ name, url, type: url.includes('@') ? 'ssh' : 'https' });
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
return remotes;
|
|
198
|
+
}
|
|
199
|
+
export async function gitAddRemote(cwd, name, url) {
|
|
200
|
+
await git(['remote', 'add', name, url], cwd);
|
|
201
|
+
}
|
|
202
|
+
export async function gitRemoveRemote(cwd, name) {
|
|
203
|
+
await git(['remote', 'remove', name], cwd);
|
|
204
|
+
}
|
|
205
|
+
export async function gitEditRemote(cwd, name, url) {
|
|
206
|
+
await git(['remote', 'set-url', name, url], cwd);
|
|
207
|
+
}
|
|
208
|
+
export async function gitDiff(cwd, file) {
|
|
209
|
+
const args = ['diff'];
|
|
210
|
+
if (file)
|
|
211
|
+
args.push('--', file);
|
|
212
|
+
return await git(args, cwd);
|
|
213
|
+
}
|
|
214
|
+
export async function gitRevert(cwd, file) {
|
|
215
|
+
if (file) {
|
|
216
|
+
await git(['checkout', '--', file], cwd);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
await git(['checkout', '.'], cwd);
|
|
220
|
+
await git(['clean', '-fd'], cwd);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export async function gitUnstageFile(cwd, file) {
|
|
224
|
+
await git(['reset', 'HEAD', '--', file], cwd);
|
|
225
|
+
}
|
|
226
|
+
export async function gitStageFile(cwd, file) {
|
|
227
|
+
await git(['add', file], cwd);
|
|
228
|
+
}
|
|
229
|
+
export async function gitShowFile(cwd, file, ref = 'HEAD') {
|
|
230
|
+
return await git(['show', `${ref}:${file}`], cwd);
|
|
231
|
+
}
|
|
232
|
+
export async function gitBlame(cwd, file) {
|
|
233
|
+
const output = await git(['blame', '--porcelain', file], cwd);
|
|
234
|
+
return output;
|
|
235
|
+
}
|
|
236
|
+
export async function gitFileLog(cwd, file) {
|
|
237
|
+
const output = await git(['log', '--format=%h|%an|%ar|%s', '-n', '20', '--follow', '--', file], cwd);
|
|
238
|
+
return output.split('\n').filter(Boolean).map(line => {
|
|
239
|
+
const [hash, author, date, ...msgParts] = line.split('|');
|
|
240
|
+
return { hash, author, date, msg: msgParts.join('|') };
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
export async function gitWorktreeList(cwd) {
|
|
244
|
+
const output = await git(['worktree', 'list', '--porcelain'], cwd);
|
|
245
|
+
const worktrees = [];
|
|
246
|
+
let current = {};
|
|
247
|
+
for (const line of output.split('\n')) {
|
|
248
|
+
if (line.startsWith('worktree ')) {
|
|
249
|
+
if (current.path)
|
|
250
|
+
worktrees.push(current);
|
|
251
|
+
current = { path: line.substring(9) };
|
|
252
|
+
}
|
|
253
|
+
else if (line.startsWith('HEAD ')) {
|
|
254
|
+
current.head = line.substring(5);
|
|
255
|
+
}
|
|
256
|
+
else if (line.startsWith('branch ')) {
|
|
257
|
+
current.branch = line.substring(7).replace('refs/heads/', '');
|
|
258
|
+
}
|
|
259
|
+
else if (line === 'bare') {
|
|
260
|
+
current.bare = true;
|
|
261
|
+
}
|
|
262
|
+
else if (line === 'detached') {
|
|
263
|
+
current.branch = '(detached)';
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (current.path)
|
|
267
|
+
worktrees.push(current);
|
|
268
|
+
return worktrees;
|
|
269
|
+
}
|
|
270
|
+
export async function gitWorktreeAdd(cwd, path, branch, newBranch) {
|
|
271
|
+
const args = ['worktree', 'add'];
|
|
272
|
+
if (newBranch && branch) {
|
|
273
|
+
args.push('-b', branch, path);
|
|
274
|
+
}
|
|
275
|
+
else if (branch) {
|
|
276
|
+
args.push(path, branch);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
args.push(path);
|
|
280
|
+
}
|
|
281
|
+
await git(args, cwd);
|
|
282
|
+
}
|
|
283
|
+
export async function gitWorktreeRemove(cwd, worktreePath) {
|
|
284
|
+
await git(['worktree', 'remove', worktreePath], cwd);
|
|
285
|
+
}
|
|
286
|
+
export async function gitBranchDelete(cwd, branch) {
|
|
287
|
+
await git(['branch', '-D', branch], cwd);
|
|
288
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export interface GitHubStatus {
|
|
2
|
+
available: boolean;
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
canWrite: boolean;
|
|
6
|
+
unavailableReason?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface GitHubIssue {
|
|
9
|
+
number: number;
|
|
10
|
+
title: string;
|
|
11
|
+
state: string;
|
|
12
|
+
author: {
|
|
13
|
+
login: string;
|
|
14
|
+
};
|
|
15
|
+
labels: {
|
|
16
|
+
name: string;
|
|
17
|
+
color: string;
|
|
18
|
+
}[];
|
|
19
|
+
createdAt: string;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
comments: {
|
|
22
|
+
totalCount: number;
|
|
23
|
+
};
|
|
24
|
+
url: string;
|
|
25
|
+
assignees: {
|
|
26
|
+
login: string;
|
|
27
|
+
}[];
|
|
28
|
+
milestone?: {
|
|
29
|
+
title: string;
|
|
30
|
+
} | null;
|
|
31
|
+
}
|
|
32
|
+
export interface GitHubPull {
|
|
33
|
+
number: number;
|
|
34
|
+
title: string;
|
|
35
|
+
state: string;
|
|
36
|
+
author: {
|
|
37
|
+
login: string;
|
|
38
|
+
};
|
|
39
|
+
labels: {
|
|
40
|
+
name: string;
|
|
41
|
+
color: string;
|
|
42
|
+
}[];
|
|
43
|
+
createdAt: string;
|
|
44
|
+
updatedAt: string;
|
|
45
|
+
comments: {
|
|
46
|
+
totalCount: number;
|
|
47
|
+
};
|
|
48
|
+
url: string;
|
|
49
|
+
headRefName: string;
|
|
50
|
+
baseRefName: string;
|
|
51
|
+
isDraft: boolean;
|
|
52
|
+
mergeable: string;
|
|
53
|
+
reviewDecision: string;
|
|
54
|
+
additions: number;
|
|
55
|
+
deletions: number;
|
|
56
|
+
assignees: {
|
|
57
|
+
login: string;
|
|
58
|
+
}[];
|
|
59
|
+
}
|
|
60
|
+
export interface GitHubListResult<T> {
|
|
61
|
+
items: T[];
|
|
62
|
+
hasMore: boolean;
|
|
63
|
+
}
|
|
64
|
+
export declare function getGitHubStatus(cwd: string): Promise<GitHubStatus>;
|
|
65
|
+
export declare function clearStatusCache(cwd?: string): void;
|
|
66
|
+
export declare function listIssues(cwd: string, opts?: {
|
|
67
|
+
state?: string;
|
|
68
|
+
search?: string;
|
|
69
|
+
limit?: number;
|
|
70
|
+
endCursor?: string;
|
|
71
|
+
}): Promise<GitHubListResult<GitHubIssue>>;
|
|
72
|
+
export declare function listPulls(cwd: string, opts?: {
|
|
73
|
+
state?: string;
|
|
74
|
+
search?: string;
|
|
75
|
+
limit?: number;
|
|
76
|
+
}): Promise<GitHubListResult<GitHubPull>>;
|
|
77
|
+
export interface GitHubComment {
|
|
78
|
+
author: {
|
|
79
|
+
login: string;
|
|
80
|
+
};
|
|
81
|
+
body: string;
|
|
82
|
+
createdAt: string;
|
|
83
|
+
updatedAt: string;
|
|
84
|
+
}
|
|
85
|
+
export interface GitHubIssueDetail extends GitHubIssue {
|
|
86
|
+
body: string;
|
|
87
|
+
comments_list: GitHubComment[];
|
|
88
|
+
}
|
|
89
|
+
export interface GitHubPullDetail extends GitHubPull {
|
|
90
|
+
body: string;
|
|
91
|
+
comments_list: GitHubComment[];
|
|
92
|
+
}
|
|
93
|
+
export declare function getIssueDetail(cwd: string, number: number): Promise<GitHubIssueDetail>;
|
|
94
|
+
export declare function getPullDetail(cwd: string, number: number): Promise<GitHubPullDetail>;
|
|
95
|
+
export declare function updateIssueState(cwd: string, number: number, action: 'close' | 'reopen'): Promise<void>;
|
|
96
|
+
export declare function updatePullState(cwd: string, number: number, action: 'close' | 'reopen'): Promise<void>;
|
|
97
|
+
export declare function createPullRequest(cwd: string, opts: {
|
|
98
|
+
title: string;
|
|
99
|
+
body?: string;
|
|
100
|
+
base?: string;
|
|
101
|
+
}): Promise<{
|
|
102
|
+
number: number;
|
|
103
|
+
url: string;
|
|
104
|
+
}>;
|