@bryanhu/codexly 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +21 -14
- package/README.zh-CN.md +26 -19
- package/dist/{chunk-HGSPZCBB.js → chunk-MDJUQPOL.js} +16 -4
- package/dist/{chunk-PRIMEL2G.js → chunk-YG3QMLCD.js} +432 -43
- package/dist/cli.js +7 -7
- package/dist/providers/codex/index.js +1 -1
- package/dist/server/index.js +2 -2
- package/dist/web/.vite/manifest.json +111 -111
- package/dist/web/.vite/manifest.json.br +0 -0
- package/dist/web/.vite/manifest.json.gz +0 -0
- package/dist/web/assets/{agent-settings-panel-Ci9mJOS-.js → agent-settings-panel-STxloEc6.js} +1 -1
- package/dist/web/assets/agent-settings-panel-STxloEc6.js.br +0 -0
- package/dist/web/assets/agent-settings-panel-STxloEc6.js.gz +0 -0
- package/dist/web/assets/{attachments-uWbRsPJj.js → attachments-CSV8KBYa.js} +1 -1
- package/dist/web/assets/attachments-CSV8KBYa.js.br +0 -0
- package/dist/web/assets/attachments-CSV8KBYa.js.gz +0 -0
- package/dist/web/assets/{background-image-picker-qGpdQPQi.js → background-image-picker-JDrclQ6O.js} +1 -1
- package/dist/web/assets/background-image-picker-JDrclQ6O.js.br +0 -0
- package/dist/web/assets/background-image-picker-JDrclQ6O.js.gz +0 -0
- package/dist/web/assets/{bing-wallpaper-queries-uesKD16x.js → bing-wallpaper-queries-BqjgHv5k.js} +1 -1
- package/dist/web/assets/bing-wallpaper-queries-BqjgHv5k.js.br +0 -0
- package/dist/web/assets/bing-wallpaper-queries-BqjgHv5k.js.gz +0 -0
- package/dist/web/assets/{button-group-075rCj_f.js → button-group-mjeW2BTr.js} +1 -1
- package/dist/web/assets/button-group-mjeW2BTr.js.br +0 -0
- package/dist/web/assets/button-group-mjeW2BTr.js.gz +0 -0
- package/dist/web/assets/{code-block-C9eTeWWd.js → code-block-CmzWecTa.js} +1 -1
- package/dist/web/assets/code-block-CmzWecTa.js.br +0 -0
- package/dist/web/assets/code-block-CmzWecTa.js.gz +0 -0
- package/dist/web/assets/{commit-settings-panel-CaMMU0oA.js → commit-settings-panel-BQRIgAaq.js} +1 -1
- package/dist/web/assets/commit-settings-panel-BQRIgAaq.js.br +0 -0
- package/dist/web/assets/commit-settings-panel-BQRIgAaq.js.gz +0 -0
- package/dist/web/assets/{context-menu-Dj3lnor1.js → context-menu-Dfbnk16V.js} +1 -1
- package/dist/web/assets/context-menu-Dfbnk16V.js.br +0 -0
- package/dist/web/assets/context-menu-Dfbnk16V.js.gz +0 -0
- package/dist/web/assets/{file-review-dialog-D8XVZ21M.js → file-review-dialog-Bv3Hor8O.js} +1 -1
- package/dist/web/assets/file-review-dialog-Bv3Hor8O.js.br +0 -0
- package/dist/web/assets/file-review-dialog-Bv3Hor8O.js.gz +0 -0
- package/dist/web/assets/{git-history-panel-D2fKSR66.js → git-history-panel-CofR8yva.js} +1 -1
- package/dist/web/assets/git-history-panel-CofR8yva.js.br +0 -0
- package/dist/web/assets/git-history-panel-CofR8yva.js.gz +0 -0
- package/dist/web/assets/{global-search-dialog-BxT-UjpZ.js → global-search-dialog-m_blFw9z.js} +2 -2
- package/dist/web/assets/global-search-dialog-m_blFw9z.js.br +0 -0
- package/dist/web/assets/global-search-dialog-m_blFw9z.js.gz +0 -0
- package/dist/web/assets/{global-settings-about-DiblprcD.js → global-settings-about-CJkWRRdz.js} +1 -1
- package/dist/web/assets/global-settings-about-CJkWRRdz.js.br +0 -0
- package/dist/web/assets/global-settings-about-CJkWRRdz.js.gz +0 -0
- package/dist/web/assets/{global-settings-fields-D5T5SPXY.js → global-settings-fields-DqWp3WpN.js} +1 -1
- package/dist/web/assets/global-settings-fields-DqWp3WpN.js.br +0 -0
- package/dist/web/assets/global-settings-fields-DqWp3WpN.js.gz +0 -0
- package/dist/web/assets/{global-settings-model-COz331Sr.js → global-settings-model-CqgHQlxF.js} +1 -1
- package/dist/web/assets/global-settings-model-CqgHQlxF.js.br +0 -0
- package/dist/web/assets/global-settings-model-CqgHQlxF.js.gz +0 -0
- package/dist/web/assets/{global-settings-page-DEBGBxSg.js → global-settings-page-BiVZofyf.js} +2 -2
- package/dist/web/assets/global-settings-page-BiVZofyf.js.br +0 -0
- package/dist/web/assets/global-settings-page-BiVZofyf.js.gz +0 -0
- package/dist/web/assets/{global-settings-pets-DwJnj_6N.js → global-settings-pets-DkdiEzFY.js} +1 -1
- package/dist/web/assets/global-settings-pets-DkdiEzFY.js.br +0 -0
- package/dist/web/assets/global-settings-pets-DkdiEzFY.js.gz +0 -0
- package/dist/web/assets/{history-task-timeline-oQRRdMbY.js → history-task-timeline-BrLtwo5_.js} +1 -1
- package/dist/web/assets/history-task-timeline-BrLtwo5_.js.br +0 -0
- package/dist/web/assets/history-task-timeline-BrLtwo5_.js.gz +0 -0
- package/dist/web/assets/{index-DRfXjZ2a.js → index-D9lOU2_n.js} +3 -3
- package/dist/web/assets/index-D9lOU2_n.js.br +0 -0
- package/dist/web/assets/index-D9lOU2_n.js.gz +0 -0
- package/dist/web/assets/{installed-skills-pane-v1IcvRKL.js → installed-skills-pane-BRcMSvrv.js} +1 -1
- package/dist/web/assets/installed-skills-pane-BRcMSvrv.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-BRcMSvrv.js.gz +0 -0
- package/dist/web/assets/{lazy-message-response-B6dT9kbf.js → lazy-message-response-C3PwDwxE.js} +2 -2
- package/dist/web/assets/lazy-message-response-C3PwDwxE.js.br +0 -0
- package/dist/web/assets/lazy-message-response-C3PwDwxE.js.gz +0 -0
- package/dist/web/assets/{mcp-management-pane-DiPUaZAO.js → mcp-management-pane-CIXkOpXu.js} +1 -1
- package/dist/web/assets/mcp-management-pane-CIXkOpXu.js.br +0 -0
- package/dist/web/assets/mcp-management-pane-CIXkOpXu.js.gz +0 -0
- package/dist/web/assets/message-response-AwJefMK2.js +7 -0
- package/dist/web/assets/message-response-AwJefMK2.js.br +0 -0
- package/dist/web/assets/message-response-AwJefMK2.js.gz +0 -0
- package/dist/web/assets/{official-plugins-pane-Cis1hRgm.js → official-plugins-pane-C4i4LhS5.js} +1 -1
- package/dist/web/assets/official-plugins-pane-C4i4LhS5.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-C4i4LhS5.js.gz +0 -0
- package/dist/web/assets/{personalization-settings-panel-BB5nguhA.js → personalization-settings-panel-BVty2pDz.js} +1 -1
- package/dist/web/assets/personalization-settings-panel-BVty2pDz.js.br +0 -0
- package/dist/web/assets/personalization-settings-panel-BVty2pDz.js.gz +0 -0
- package/dist/web/assets/{project-file-popup-page-CAcF7DIa.js → project-file-popup-page-hTRv5v3H.js} +1 -1
- package/dist/web/assets/project-file-popup-page-hTRv5v3H.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-hTRv5v3H.js.gz +0 -0
- package/dist/web/assets/{project-source-dialog-DbOmvJBS.js → project-source-dialog-wuXJolJb.js} +1 -1
- package/dist/web/assets/project-source-dialog-wuXJolJb.js.br +0 -0
- package/dist/web/assets/project-source-dialog-wuXJolJb.js.gz +0 -0
- package/dist/web/assets/{project-source-panel-DGafRUDi.js → project-source-panel-PKAa_dbo.js} +1 -1
- package/dist/web/assets/project-source-panel-PKAa_dbo.js.br +0 -0
- package/dist/web/assets/project-source-panel-PKAa_dbo.js.gz +0 -0
- package/dist/web/assets/{prompt-input-DwT-XwSc.js → prompt-input-BHn4OExn.js} +1 -1
- package/dist/web/assets/prompt-input-BHn4OExn.js.br +0 -0
- package/dist/web/assets/prompt-input-BHn4OExn.js.gz +0 -0
- package/dist/web/assets/{prompt-input-controls-CLasQrSj.js → prompt-input-controls-D4wqb_zQ.js} +1 -1
- package/dist/web/assets/prompt-input-controls-D4wqb_zQ.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-D4wqb_zQ.js.gz +0 -0
- package/dist/web/assets/{scheduled-task-date-time-picker-CnSPVHna.js → scheduled-task-date-time-picker-jo6dkC-Z.js} +1 -1
- package/dist/web/assets/scheduled-task-date-time-picker-jo6dkC-Z.js.br +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-jo6dkC-Z.js.gz +0 -0
- package/dist/web/assets/{scheduled-task-schedule-BnMdRADi.js → scheduled-task-schedule-DD3Zt60h.js} +1 -1
- package/dist/web/assets/scheduled-task-schedule-DD3Zt60h.js.br +0 -0
- package/dist/web/assets/{scheduled-task-schedule-BnMdRADi.js.gz → scheduled-task-schedule-DD3Zt60h.js.gz} +0 -0
- package/dist/web/assets/{scheduled-tasks-container-CNCzsjiP.js → scheduled-tasks-container-CDsipwUR.js} +2 -2
- package/dist/web/assets/scheduled-tasks-container-CDsipwUR.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-CDsipwUR.js.gz +0 -0
- package/dist/web/assets/{settings-personalization-CB_nnUys.js → settings-personalization-BbAIVND-.js} +1 -1
- package/dist/web/assets/settings-personalization-BbAIVND-.js.br +0 -0
- package/dist/web/assets/settings-personalization-BbAIVND-.js.gz +0 -0
- package/dist/web/assets/{sheet-JpH2S7eZ.js → sheet-C6eLtEHx.js} +1 -1
- package/dist/web/assets/sheet-C6eLtEHx.js.br +0 -0
- package/dist/web/assets/sheet-C6eLtEHx.js.gz +0 -0
- package/dist/web/assets/{skills-market-container-BgtnwdI7.js → skills-market-container-DFzLg008.js} +2 -2
- package/dist/web/assets/skills-market-container-DFzLg008.js.br +0 -0
- package/dist/web/assets/skills-market-container-DFzLg008.js.gz +0 -0
- package/dist/web/assets/{task-timeline-store-BN41mX3t.js → task-timeline-store-Cj_Bcaqi.js} +1 -1
- package/dist/web/assets/task-timeline-store-Cj_Bcaqi.js.br +0 -0
- package/dist/web/assets/task-timeline-store-Cj_Bcaqi.js.gz +0 -0
- package/dist/web/assets/{third-party-marketplace-pane-CAI6XIWR.js → third-party-marketplace-pane-CoP9DTWX.js} +1 -1
- package/dist/web/assets/third-party-marketplace-pane-CoP9DTWX.js.br +0 -0
- package/dist/web/assets/third-party-marketplace-pane-CoP9DTWX.js.gz +0 -0
- package/dist/web/assets/workbench-composer-C6Sv8xDL.js +8 -0
- package/dist/web/assets/workbench-composer-C6Sv8xDL.js.br +0 -0
- package/dist/web/assets/workbench-composer-C6Sv8xDL.js.gz +0 -0
- package/dist/web/assets/{workbench-inspector-changes-Bl5nS-_2.js → workbench-inspector-changes-7z5diDTC.js} +1 -1
- package/dist/web/assets/workbench-inspector-changes-7z5diDTC.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-7z5diDTC.js.gz +0 -0
- package/dist/web/assets/{workbench-pet-canvas-CnwZR5HG.js → workbench-pet-canvas-dWliFlKE.js} +1 -1
- package/dist/web/assets/workbench-pet-canvas-dWliFlKE.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-dWliFlKE.js.gz +0 -0
- package/dist/web/assets/workbench-shell-fA7tfnac.js +3 -0
- package/dist/web/assets/workbench-shell-fA7tfnac.js.br +0 -0
- package/dist/web/assets/workbench-shell-fA7tfnac.js.gz +0 -0
- package/dist/web/index.html +1 -1
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/package.json +2 -2
- package/dist/web/assets/agent-settings-panel-Ci9mJOS-.js.br +0 -0
- package/dist/web/assets/agent-settings-panel-Ci9mJOS-.js.gz +0 -0
- package/dist/web/assets/attachments-uWbRsPJj.js.br +0 -0
- package/dist/web/assets/attachments-uWbRsPJj.js.gz +0 -0
- package/dist/web/assets/background-image-picker-qGpdQPQi.js.br +0 -0
- package/dist/web/assets/background-image-picker-qGpdQPQi.js.gz +0 -0
- package/dist/web/assets/bing-wallpaper-queries-uesKD16x.js.br +0 -0
- package/dist/web/assets/bing-wallpaper-queries-uesKD16x.js.gz +0 -0
- package/dist/web/assets/button-group-075rCj_f.js.br +0 -0
- package/dist/web/assets/button-group-075rCj_f.js.gz +0 -0
- package/dist/web/assets/code-block-C9eTeWWd.js.br +0 -0
- package/dist/web/assets/code-block-C9eTeWWd.js.gz +0 -0
- package/dist/web/assets/commit-settings-panel-CaMMU0oA.js.br +0 -0
- package/dist/web/assets/commit-settings-panel-CaMMU0oA.js.gz +0 -0
- package/dist/web/assets/context-menu-Dj3lnor1.js.br +0 -0
- package/dist/web/assets/context-menu-Dj3lnor1.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-D8XVZ21M.js.br +0 -0
- package/dist/web/assets/file-review-dialog-D8XVZ21M.js.gz +0 -0
- package/dist/web/assets/git-history-panel-D2fKSR66.js.br +0 -0
- package/dist/web/assets/git-history-panel-D2fKSR66.js.gz +0 -0
- package/dist/web/assets/global-search-dialog-BxT-UjpZ.js.br +0 -0
- package/dist/web/assets/global-search-dialog-BxT-UjpZ.js.gz +0 -0
- package/dist/web/assets/global-settings-about-DiblprcD.js.br +0 -0
- package/dist/web/assets/global-settings-about-DiblprcD.js.gz +0 -0
- package/dist/web/assets/global-settings-fields-D5T5SPXY.js.br +0 -0
- package/dist/web/assets/global-settings-fields-D5T5SPXY.js.gz +0 -0
- package/dist/web/assets/global-settings-model-COz331Sr.js.br +0 -0
- package/dist/web/assets/global-settings-model-COz331Sr.js.gz +0 -0
- package/dist/web/assets/global-settings-page-DEBGBxSg.js.br +0 -0
- package/dist/web/assets/global-settings-page-DEBGBxSg.js.gz +0 -0
- package/dist/web/assets/global-settings-pets-DwJnj_6N.js.br +0 -0
- package/dist/web/assets/global-settings-pets-DwJnj_6N.js.gz +0 -0
- package/dist/web/assets/history-task-timeline-oQRRdMbY.js.br +0 -0
- package/dist/web/assets/history-task-timeline-oQRRdMbY.js.gz +0 -0
- package/dist/web/assets/index-DRfXjZ2a.js.br +0 -0
- package/dist/web/assets/index-DRfXjZ2a.js.gz +0 -0
- package/dist/web/assets/installed-skills-pane-v1IcvRKL.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-v1IcvRKL.js.gz +0 -0
- package/dist/web/assets/lazy-message-response-B6dT9kbf.js.br +0 -0
- package/dist/web/assets/lazy-message-response-B6dT9kbf.js.gz +0 -0
- package/dist/web/assets/mcp-management-pane-DiPUaZAO.js.br +0 -0
- package/dist/web/assets/mcp-management-pane-DiPUaZAO.js.gz +0 -0
- package/dist/web/assets/message-response-BZZGbaVm.js +0 -7
- package/dist/web/assets/message-response-BZZGbaVm.js.br +0 -0
- package/dist/web/assets/message-response-BZZGbaVm.js.gz +0 -0
- package/dist/web/assets/official-plugins-pane-Cis1hRgm.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-Cis1hRgm.js.gz +0 -0
- package/dist/web/assets/personalization-settings-panel-BB5nguhA.js.br +0 -0
- package/dist/web/assets/personalization-settings-panel-BB5nguhA.js.gz +0 -0
- package/dist/web/assets/project-file-popup-page-CAcF7DIa.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-CAcF7DIa.js.gz +0 -0
- package/dist/web/assets/project-source-dialog-DbOmvJBS.js.br +0 -0
- package/dist/web/assets/project-source-dialog-DbOmvJBS.js.gz +0 -0
- package/dist/web/assets/project-source-panel-DGafRUDi.js.br +0 -0
- package/dist/web/assets/project-source-panel-DGafRUDi.js.gz +0 -0
- package/dist/web/assets/prompt-input-DwT-XwSc.js.br +0 -0
- package/dist/web/assets/prompt-input-DwT-XwSc.js.gz +0 -0
- package/dist/web/assets/prompt-input-controls-CLasQrSj.js.br +0 -0
- package/dist/web/assets/prompt-input-controls-CLasQrSj.js.gz +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-CnSPVHna.js.br +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-CnSPVHna.js.gz +0 -0
- package/dist/web/assets/scheduled-task-schedule-BnMdRADi.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-CNCzsjiP.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-CNCzsjiP.js.gz +0 -0
- package/dist/web/assets/settings-personalization-CB_nnUys.js.br +0 -0
- package/dist/web/assets/settings-personalization-CB_nnUys.js.gz +0 -0
- package/dist/web/assets/sheet-JpH2S7eZ.js.br +0 -0
- package/dist/web/assets/sheet-JpH2S7eZ.js.gz +0 -0
- package/dist/web/assets/skills-market-container-BgtnwdI7.js.br +0 -0
- package/dist/web/assets/skills-market-container-BgtnwdI7.js.gz +0 -0
- package/dist/web/assets/task-timeline-store-BN41mX3t.js.br +0 -0
- package/dist/web/assets/task-timeline-store-BN41mX3t.js.gz +0 -0
- package/dist/web/assets/third-party-marketplace-pane-CAI6XIWR.js.br +0 -0
- package/dist/web/assets/third-party-marketplace-pane-CAI6XIWR.js.gz +0 -0
- package/dist/web/assets/workbench-composer-dKix0zGK.js +0 -8
- package/dist/web/assets/workbench-composer-dKix0zGK.js.br +0 -0
- package/dist/web/assets/workbench-composer-dKix0zGK.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-Bl5nS-_2.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-Bl5nS-_2.js.gz +0 -0
- package/dist/web/assets/workbench-pet-canvas-CnwZR5HG.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-CnwZR5HG.js.gz +0 -0
- package/dist/web/assets/workbench-shell-B8lBrj2O.js +0 -3
- package/dist/web/assets/workbench-shell-B8lBrj2O.js.br +0 -0
- package/dist/web/assets/workbench-shell-B8lBrj2O.js.gz +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,26 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.24.0] - 2026-09-20
|
|
8
|
+
|
|
9
|
+
### 新增
|
|
10
|
+
|
|
11
|
+
- 支持在 Docker 部署中保留宿主工作区绝对路径、挂载全局 Git 配置与 SSH 凭据,便于复用已有项目和访问远程仓库。
|
|
12
|
+
- 持久化 Thread 历史附件元数据与正文,使附件在任务恢复、分叉和服务重启后仍可安全读取。
|
|
13
|
+
|
|
14
|
+
### 优化
|
|
15
|
+
|
|
16
|
+
- 升级内置 Codex 至 `0.155.1`,刷新 App Server Schema 基线并适配 Thread Attachment 通知协议。
|
|
17
|
+
|
|
18
|
+
### 修复
|
|
19
|
+
|
|
20
|
+
- 放宽自定义局域网密码对 Shell 特殊字符的限制,并限制局域网客户端调用仅适用于宿主设备的操作。
|
|
21
|
+
- 修复流式 Markdown 强调标记跨片段到达时可能错误渲染的问题。
|
|
22
|
+
|
|
23
|
+
### 工程
|
|
24
|
+
|
|
25
|
+
- 升级 Docker 构建、登录、元数据与多架构模拟相关 GitHub Actions。
|
|
26
|
+
|
|
7
27
|
## [0.23.0] - 2026-09-18
|
|
8
28
|
|
|
9
29
|
### 新增
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<img src="https://img.shields.io/badge/TypeScript-6.0-3178c6" alt="TypeScript" />
|
|
11
11
|
<img src="https://img.shields.io/badge/Vite-8-646cff" alt="Vite" />
|
|
12
12
|
<img src="https://img.shields.io/badge/Fastify-5-000000" alt="Fastify" />
|
|
13
|
-
<img src="https://img.shields.io/badge/OpenAI_Codex-0.
|
|
13
|
+
<img src="https://img.shields.io/badge/OpenAI_Codex-0.155.1-412991" alt="OpenAI Codex" />
|
|
14
14
|
<a href="./LICENSE">
|
|
15
15
|
<img src="https://img.shields.io/badge/License-MIT-0f766e" alt="MIT" />
|
|
16
16
|
</a>
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
- Node.js >=22.14.0
|
|
56
56
|
- Chrome/Chromium 116+, Firefox 124+, or Safari 17.4+
|
|
57
57
|
|
|
58
|
-
Codexly includes Codex CLI `0.
|
|
58
|
+
Codexly includes Codex CLI `0.155.1` through `@openai/codex`; a separate installation is not required. External binaries supplied through `--codex-bin <path>` or `CODEXLY_CODEX_BIN` must satisfy `>=0.155.0,<0.156.0`.
|
|
59
59
|
|
|
60
60
|
## Quick Start
|
|
61
61
|
|
|
@@ -94,23 +94,30 @@ docker compose up --detach
|
|
|
94
94
|
docker compose logs --tail=50 codexly
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
Open `http://127.0.0.1:3210` and use the random pairing code printed in the logs. The default named volume preserves Codex login data and Codexly's SQLite state. On Linux and macOS, the Compose file mounts the host root at `/workspace`, so every mounted disk is available to the project picker. Set `CODEXLY_WORKSPACE` to expose only one directory:
|
|
97
|
+
Open `http://127.0.0.1:3210` and use the random pairing code printed in the logs. The default named volume preserves Codex login data and Codexly's SQLite state. On Linux and macOS, the Compose file mounts the host root at `/workspace`, so every mounted disk is available to the project picker. Set `CODEXLY_WORKSPACE` to expose only one directory and preserve its absolute path inside the container:
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
100
|
CODEXLY_WORKSPACE=/path/to/projects docker compose up --detach
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
When binding the host `CODEXLY_CODEX_HOME`, also set `CODEXLY_WORKSPACE` to a common parent of the existing projects. Their absolute paths then remain identical on the host and in the container.
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
105
|
+
The container does not automatically inherit the host Git identity. Set `CODEXLY_GIT_CONFIG` to a global Git config file visible inside the container. With an identity-mapped Linux or macOS workspace, use the absolute path to the host `~/.gitconfig` directly. For SSH remotes, set `CODEXLY_SSH_HOME` to the absolute path of the host `~/.ssh` directory.
|
|
106
|
+
|
|
107
|
+
Docker can only access host paths shared with the Docker engine. On Windows, set `CODEXLY_WORKSPACE` to a shared drive such as `C:/` and set `CODEXLY_WORKSPACE_TARGET=/workspace`. Windows and Linux container paths use different absolute path formats, so a Codex Home containing host project records cannot be reused directly. Add extra bind mounts and repeat `--workspace` in `command` when multiple drives are required.
|
|
108
|
+
|
|
109
|
+
| Variable | Purpose |
|
|
110
|
+
| -------------------------- | ---------------------------------------------------------------------- |
|
|
111
|
+
| `CODEXLY_VERSION` | Select the GHCR image tag; defaults to `latest` |
|
|
112
|
+
| `CODEXLY_PORT` | Set both the host and container port; defaults to `3210` |
|
|
113
|
+
| `CODEXLY_WORKSPACE` | Restrict the workspace and preserve its absolute path; defaults to `/` |
|
|
114
|
+
| `CODEXLY_WORKSPACE_TARGET` | Override the container path; use `/workspace` on Windows |
|
|
115
|
+
| `CODEXLY_GIT_CONFIG` | Select a container-visible global Git config file |
|
|
116
|
+
| `CODEXLY_SSH_HOME` | Mount host SSH config, keys, and `known_hosts` read-only |
|
|
117
|
+
| `CODEXLY_CODEX_HOME` | Bind a host Codex home instead of the managed `codexly-data` volume |
|
|
118
|
+
| `CODEXLY_LAN_PASSWORD` | Set a strong fixed access password instead of the logged random code |
|
|
119
|
+
| `CODEXLY_ALLOWED_HOSTS` | Allow comma-separated exact reverse proxy domains |
|
|
120
|
+
| `CODEXLY_SESSION_TTL` | Set a fixed session lifetime such as `12h` |
|
|
114
121
|
|
|
115
122
|
The image entrypoint accepts all normal CLI arguments, so orchestration platforms can replace `command` when needed. See the [complete Docker Compose deployment guide](docs/docker-deployment.md) for workspace, multiple-disk, Codex Home, update, backup, and troubleshooting instructions. Run `pnpm docker:build && pnpm docker:test` in a development checkout to build and smoke-test the local image.
|
|
116
123
|
|
|
@@ -135,7 +142,7 @@ The terminal prints the LAN address and a random access password. Common options
|
|
|
135
142
|
| Option | Purpose |
|
|
136
143
|
| --------------------------- | ------------------------------------------------------------------------------------------ |
|
|
137
144
|
| `--port <port>` | Choose the starting port; occupied ports are skipped automatically |
|
|
138
|
-
| `--lan-password <password>` | Set a 16-128 character password containing uppercase, lowercase,
|
|
145
|
+
| `--lan-password <password>` | Set a 16-128 character password containing uppercase, lowercase, and number |
|
|
139
146
|
| `--allowed-host <domain>` | Allow an exact reverse proxy domain; repeat the option for multiple domains |
|
|
140
147
|
| `--session-ttl <duration>` | Set a fixed LAN session lifetime such as `12h`; omitted sessions last until server restart |
|
|
141
148
|
| `--workspace <path>` | Restrict project selection to this absolute root; repeat for multiple roots |
|
package/README.zh-CN.md
CHANGED
|
@@ -25,7 +25,7 @@ Codexly 是一个在浏览器中使用 Codex 的本地 AI 编程工作台。它
|
|
|
25
25
|
- Node.js >=22.14.0
|
|
26
26
|
- Chrome/Chromium 116+、Firefox 124+ 或 Safari 17.4+
|
|
27
27
|
|
|
28
|
-
Codexly 通过 `@openai/codex` 自带 Codex CLI `0.
|
|
28
|
+
Codexly 通过 `@openai/codex` 自带 Codex CLI `0.155.1`,无需单独安装。通过 `--codex-bin <path>` 或 `CODEXLY_CODEX_BIN` 指定的外部版本必须满足 `>=0.155.0,<0.156.0`。
|
|
29
29
|
|
|
30
30
|
## 快速开始
|
|
31
31
|
|
|
@@ -64,23 +64,30 @@ docker compose up --detach
|
|
|
64
64
|
docker compose logs --tail=50 codexly
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
打开 `http://127.0.0.1:3210`,使用日志中的随机配对码。默认命名卷会持久化 Codex 登录数据和 Codexly SQLite 状态。在 Linux 和 macOS 上,Compose 默认把宿主根目录挂载到 `/workspace`,项目选择器可读取所有已挂载磁盘。设置 `CODEXLY_WORKSPACE`
|
|
67
|
+
打开 `http://127.0.0.1:3210`,使用日志中的随机配对码。默认命名卷会持久化 Codex 登录数据和 Codexly SQLite 状态。在 Linux 和 macOS 上,Compose 默认把宿主根目录挂载到 `/workspace`,项目选择器可读取所有已挂载磁盘。设置 `CODEXLY_WORKSPACE` 后只暴露指定目录,并在容器中保留其绝对路径:
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
70
|
CODEXLY_WORKSPACE=/path/to/projects docker compose up --detach
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
绑定宿主 `CODEXLY_CODEX_HOME` 时,应同时把 `CODEXLY_WORKSPACE` 设置为已有项目的公共父目录。Codex 保存的项目绝对路径随后可在宿主和容器中保持一致。
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
|
80
|
-
|
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
75
|
+
容器不会自动继承宿主 Git 身份。将 `CODEXLY_GIT_CONFIG` 设置为容器可见的全局 Git 配置文件;在 Linux 和 macOS 的同路径工作区中可直接填写宿主 `~/.gitconfig` 的绝对路径。使用 SSH 远程时,将 `CODEXLY_SSH_HOME` 设置为宿主 `~/.ssh` 的绝对路径。
|
|
76
|
+
|
|
77
|
+
Docker 只能访问 Docker Engine 已共享的宿主路径。Windows 需将 `CODEXLY_WORKSPACE` 设置为已共享盘符(例如 `C:/`),并设置 `CODEXLY_WORKSPACE_TARGET=/workspace`。Windows 与 Linux 容器的绝对路径格式不同,不能直接复用包含宿主项目记录的 Codex Home;需要多个盘符时,在 Compose 中增加 bind mount,并在 `command` 中重复传入 `--workspace`。
|
|
78
|
+
|
|
79
|
+
| 变量 | 用途 |
|
|
80
|
+
| -------------------------- | --------------------------------------------------- |
|
|
81
|
+
| `CODEXLY_VERSION` | 指定 GHCR 镜像标签,默认 `latest` |
|
|
82
|
+
| `CODEXLY_PORT` | 同时设置宿主与容器端口,默认 `3210` |
|
|
83
|
+
| `CODEXLY_WORKSPACE` | 限制工作区并在容器内保留相同绝对路径,默认 `/` |
|
|
84
|
+
| `CODEXLY_WORKSPACE_TARGET` | 覆盖容器工作区路径,Windows 使用 `/workspace` |
|
|
85
|
+
| `CODEXLY_GIT_CONFIG` | 指定容器可见的全局 Git 配置文件 |
|
|
86
|
+
| `CODEXLY_SSH_HOME` | 只读挂载宿主 SSH 配置、私钥和 `known_hosts` |
|
|
87
|
+
| `CODEXLY_CODEX_HOME` | 绑定宿主 Codex Home,替代默认 `codexly-data` 命名卷 |
|
|
88
|
+
| `CODEXLY_LAN_PASSWORD` | 设置固定强密码,替代日志中生成的随机配对码 |
|
|
89
|
+
| `CODEXLY_ALLOWED_HOSTS` | 设置逗号分隔的反向代理精确域名 |
|
|
90
|
+
| `CODEXLY_SESSION_TTL` | 设置固定会话期限,例如 `12h` |
|
|
84
91
|
|
|
85
92
|
镜像入口支持全部 CLI 参数,编排平台可按需覆盖 `command`。工作区、多磁盘、Codex Home、更新、备份和故障排查参见[完整 Docker Compose 部署指南](docs/docker-deployment.md)。开发仓库可运行 `pnpm docker:build && pnpm docker:test` 构建并冒烟测试本地镜像。
|
|
86
93
|
|
|
@@ -102,13 +109,13 @@ codexly start --lan
|
|
|
102
109
|
|
|
103
110
|
终端会输出局域网地址和随机访问密码。常用选项如下:
|
|
104
111
|
|
|
105
|
-
| 选项 | 用途
|
|
106
|
-
| --------------------------- |
|
|
107
|
-
| `--port <port>` | 指定起始端口;端口被占用时自动尝试后续端口
|
|
108
|
-
| `--lan-password <password>` | 设置 16 至 128
|
|
109
|
-
| `--allowed-host <domain>` | 允许精确的反向代理域名;多个域名可重复传入
|
|
110
|
-
| `--session-ttl <duration>` | 设置固定会话期限,如 `12h`;省略时持续到 Server 重启
|
|
111
|
-
| `--workspace <path>` | 限制项目选择的绝对根目录;多个根目录可重复传入
|
|
112
|
+
| 选项 | 用途 |
|
|
113
|
+
| --------------------------- | ---------------------------------------------------- |
|
|
114
|
+
| `--port <port>` | 指定起始端口;端口被占用时自动尝试后续端口 |
|
|
115
|
+
| `--lan-password <password>` | 设置 16 至 128 位密码,必须包含大小写字母和数字 |
|
|
116
|
+
| `--allowed-host <domain>` | 允许精确的反向代理域名;多个域名可重复传入 |
|
|
117
|
+
| `--session-ttl <duration>` | 设置固定会话期限,如 `12h`;省略时持续到 Server 重启 |
|
|
118
|
+
| `--workspace <path>` | 限制项目选择的绝对根目录;多个根目录可重复传入 |
|
|
112
119
|
|
|
113
120
|
密码含 Shell 特殊字符时请使用引号。局域网模式使用未加密 HTTP,只能用于可信网络,禁止直接暴露到互联网。重启 Codexly 会使密码和全部会话失效。
|
|
114
121
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { value_exports } from './chunk-6JWQNFM2.js';
|
|
3
|
-
import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-
|
|
3
|
+
import { require_pino, require_safe_stable_stringify, CodexProtocolMappingError, CodexProviderConnectionError, RpcConnectionClosedError, RpcProtocolError, RpcResponseError, RpcTimeoutError } from './chunk-YG3QMLCD.js';
|
|
4
4
|
import { WorkbenchPetProviderError, listTaskCatalog, PendingRequestResolutionError, deleteArchivedTasks, queryCompletedTasks, CompletedTasksQueryError, submitTask, TaskSubmissionError, collectQuestionGroups, formatQuestionAnswers, ProjectTodoError, saveProjectTodo } from './chunk-B2673ODM.js';
|
|
5
5
|
import { Type, SkillInstallScopeSchema, ScheduledTaskSchema, SubmitTaskResponseSchema, AgentTaskSchema, AsyncQuestionGroupSchema, AnswerAsyncQuestionResultSchema, AgentTurnSchema, DEFAULT_COMMIT_MESSAGE_MODEL, TEMPORARY_TASK_API_PATH, TEMPORARY_TASK_SCOPE_ID, MAX_AGENT_FILE_BYTES, AccessStatusResponseSchema, PairAccessRequestSchema, BingWallpaperCatalogSchema, HealthResponseSchema, AppInfoResponseSchema, AppUpdateProgressResponseSchema, AgentMutationErrorSchema, InstallAppUpdateResponseSchema, InstallAppUpdateRequestSchema, EventStreamMetricsResponseSchema, AgentCapabilitiesSchema, AgentModelPageSchema, AgentGlobalSettingsResponseSchema, AgentGlobalSettingsSchema, MAX_AGENT_IMAGE_BYTES, MAX_AGENT_TEXT_BYTES, GlobalInstructionsSchema, MemorySettingsSchema, AgentPreferencesSchema, SaveGlobalInstructionsSchema, MemorySettingsUpdateSchema, PersonalizationResetSchema, AgentProviderConnectionStatusSchema, StartOfficialProviderLoginResponseSchema, StartOfficialProviderLoginRequestSchema, AgentProviderConnectionMutationResponseSchema, CancelProviderLoginRequestSchema, ConfigureCustomProviderResponseSchema, ConfigureCustomProviderRequestSchema, WorkbenchPetCatalogResponseSchema, WorkbenchPetDownloadResponseSchema, WorkbenchPetDownloadRequestSchema, ProjectPageSchema, HostFileListingSchema, HostFileQuerySchema, ProjectDirectoryListingSchema, ProjectDirectoryQuerySchema, ProjectOpenCapabilitiesResponseSchema, OpenProjectResponseSchema, ProjectRootQuerySchema, OpenProjectRequestSchema, ReorderProjectsResponseSchema, ReorderProjectsRequestSchema, AgentSkillPageSchema, AgentProjectDefaultsResponseSchema, AgentProjectDefaultsSchema, AddProjectResponseSchema, AddProjectRequestSchema, RenameProjectResponseSchema, RenameProjectRequestSchema, RemoveProjectResponseSchema, RemoveProjectRequestSchema, InstalledSkillPageSchema, OfficialPluginPageSchema, OfficialPluginDetailSchema, OfficialPluginInstallResponseSchema, OfficialPluginUninstallResponseSchema, ClawhubSkillPageSchema, ClawhubSkillDetailSchema, ConfiguredMcpServerPageSchema, OpenSkillDirectoryResponseSchema, SetSkillEnabledResponseSchema, SetMcpServerEnabledResponseSchema, SkillInstallResponseSchema, ScheduledTaskPreviewSchema, ScheduledTaskPreviewRequestSchema, ScheduledTaskPageSchema, ScheduledTaskMutationResponseSchema, ScheduledTaskInputSchema, DeleteScheduledTaskResponseSchema, SetScheduledTaskEnabledRequestSchema, AgentTaskPageSchema, UnsubscribeAgentTaskResponseSchema, AgentTaskSnapshotResponseSchema, AgentMcpServerPageSchema, AgentBackgroundTerminalPageSchema, TerminateAgentBackgroundTerminalResponseSchema, PinAgentTaskResponseSchema, PinAgentTaskRequestSchema, RenameAgentTaskResponseSchema, RenameAgentTaskRequestSchema, ArchiveAgentTaskResponseSchema, ArchiveAgentTaskRequestSchema, UnarchiveAgentTaskResponseSchema, UnarchiveAgentTaskRequestSchema, DeleteAgentTaskResponseSchema, DeleteAgentTaskRequestSchema, TaskSearchPageSchema, TaskSearchQuerySchema, SearchOccurrencesPageSchema, SearchOccurrencesQuerySchema, StartAgentTaskResponseSchema, StartAgentTaskRequestSchema, StartAgentTurnResponseSchema, StartAgentTurnRequestSchema, SteerAgentTurnResponseSchema, SteerAgentTurnRequestSchema, InterruptAgentTurnResponseSchema, InterruptAgentTurnRequestSchema, ResolvePendingRequestResponseSchema, ResolvePendingRequestRequestSchema, SubmitTaskRequestSchema, AsyncQuestionPageSchema, AnswerAsyncQuestionResponseSchema, AnswerAsyncQuestionRequestSchema, DismissAsyncQuestionsRequestSchema, ProjectTodoPageSchema, ProjectTodoResponseSchema, ProjectTodoDraftSchema, SaveProjectTodoRequestSchema, DeleteProjectTodoResponseSchema, DeleteProjectTodoRequestSchema, AgentQueuedSubmissionListSchema, AddAgentQueuedSubmissionResponseSchema, AddAgentQueuedSubmissionRequestSchema, UpdateAgentQueuedSubmissionResponseSchema, UpdateAgentQueuedSubmissionRequestSchema, DeleteAgentQueuedSubmissionResponseSchema, ReorderAgentQueuedSubmissionsResponseSchema, ReorderAgentQueuedSubmissionsRequestSchema, StartAgentQueuedSubmissionResponseSchema, StartAgentQueuedSubmissionRequestSchema, AgentPromptInputSchema, AgentProviderConnectionRecordSchema, MAX_AGENT_IMAGES, MAX_AGENT_IMAGE_TOTAL_BYTES, MAX_AGENT_FILE_TOTAL_BYTES, ProjectGitStatusSchema, ProjectGitStatusQuerySchema, ProjectGitHistoryPageSchema, ProjectGitHistoryQuerySchema, ProjectGitCommitFilesPageSchema, ProjectGitCommitFilesQuerySchema, ProjectGitCommitFileDiffSchema, ProjectGitCommitFileDiffQuerySchema, SwitchProjectBranchRequestSchema, CreateProjectBranchRequestSchema, GenerateCommitMessageResponseSchema, GenerateCommitMessageRequestSchema, CommitProjectChangesResponseSchema, CommitProjectChangesRequestSchema, ProjectFileTreeSchema, ProjectFileTreeQuerySchema, ProjectFileSearchPageSchema, ProjectFileSearchQuerySchema, StopProjectFileSearchResponseSchema, StopProjectFileSearchRequestSchema, ProjectSourceFileQuerySchema, ProjectSourceFileSchema, AgentAttachmentUploadResponseSchema, HostFileKindSchema, ImportHostAttachmentRequestSchema, AgentAttachmentKindSchema, AgentTaskSettingsResponseSchema, AgentTaskSettingsSchema, ReloadAgentMcpServersResponseSchema, ReloadAgentMcpServersRequestSchema, ReviewAgentTaskResponseSchema, ReviewAgentTaskRequestSchema, CompactAgentTaskResponseSchema, CompactAgentTaskRequestSchema, ForkAgentTaskResponseSchema, ForkAgentTaskRequestSchema, UploadAgentFeedbackResponseSchema, UploadAgentFeedbackRequestSchema, DeleteArchivedTasksResponseSchema, DeleteArchivedTasksRequestSchema, AgentTaskCatalogSchema, TaskCatalogQuerySchema, CompletedTasksPageSchema, CompletedTasksQuerySchema, UpdateTaskSettingsAndDefaultsResponseSchema, UpdateTaskSettingsAndDefaultsRequestSchema, NavigableAgentTaskResponseSchema, OpenAgentTaskAttachmentResponseSchema, OpenAgentTaskAttachmentRequestSchema, UpdateAgentGoalResponseSchema, UpdateAgentGoalRequestSchema, ClearAgentGoalResponseSchema, ProjectTodoSchema, AgentMessageAttachmentSchema, ProjectGitWorktreePageSchema, CreateProjectWorktreeResponseSchema, CreateProjectWorktreeRequestSchema, ProjectWorktreeMutationResponseSchema, SwitchProjectWorktreeRequestSchema, RenameProjectFileResponseSchema, RenameProjectFileRequestSchema, DeleteProjectFileResponseSchema, DeleteProjectFileRequestSchema, MAX_EVENT_BATCH_SIZE } from './chunk-ZXTTTT25.js';
|
|
6
6
|
import { __commonJS, __require, __toESM } from './chunk-K6J42667.js';
|
|
@@ -61757,6 +61757,10 @@ function createGitEnvironment() {
|
|
|
61757
61757
|
([key]) => !UNSAFE_GIT_ENVIRONMENT_KEYS.has(key.toLowerCase())
|
|
61758
61758
|
)
|
|
61759
61759
|
);
|
|
61760
|
+
const globalConfig = process.env["CODEXLY_GIT_CONFIG"];
|
|
61761
|
+
if (globalConfig !== void 0 && globalConfig.length > 0) {
|
|
61762
|
+
environment["GIT_CONFIG_GLOBAL"] = globalConfig;
|
|
61763
|
+
}
|
|
61760
61764
|
environment["GIT_OPTIONAL_LOCKS"] = "0";
|
|
61761
61765
|
return environment;
|
|
61762
61766
|
}
|
|
@@ -61769,11 +61773,13 @@ function createGitCommandExecutor(options = {}) {
|
|
|
61769
61773
|
abort: controller.signal,
|
|
61770
61774
|
baseDir: repositoryRoot,
|
|
61771
61775
|
maxConcurrentProcesses: 1,
|
|
61772
|
-
trimmed: false
|
|
61776
|
+
trimmed: false,
|
|
61777
|
+
// GIT_CONFIG_GLOBAL 仅能由 CODEXLY_GIT_CONFIG 映射,允许 simple-git 使用该受控路径。
|
|
61778
|
+
unsafe: { allowUnsafeConfigPaths: true }
|
|
61773
61779
|
};
|
|
61774
61780
|
if (options.binary !== void 0) {
|
|
61775
61781
|
clientOptions.binary = options.binary;
|
|
61776
|
-
clientOptions.unsafe = { allowUnsafeCustomBinary: true };
|
|
61782
|
+
clientOptions.unsafe = { allowUnsafeConfigPaths: true, allowUnsafeCustomBinary: true };
|
|
61777
61783
|
}
|
|
61778
61784
|
const git = simpleGit(clientOptions);
|
|
61779
61785
|
let failure;
|
|
@@ -64583,6 +64589,12 @@ var ProjectOpenTargetInvalidError = class extends Error {
|
|
|
64583
64589
|
this.name = "ProjectOpenTargetInvalidError";
|
|
64584
64590
|
}
|
|
64585
64591
|
};
|
|
64592
|
+
function createDisabledProjectOpenService(platform = process.platform) {
|
|
64593
|
+
return {
|
|
64594
|
+
getCapabilities: () => Promise.resolve({ apps: [], platform }),
|
|
64595
|
+
open: (_projectRoot, appId) => Promise.reject(new ProjectOpenAppUnavailableError(appId))
|
|
64596
|
+
};
|
|
64597
|
+
}
|
|
64586
64598
|
function isOutsideProject3(relativePath) {
|
|
64587
64599
|
return relativePath === ".." || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath);
|
|
64588
64600
|
}
|
|
@@ -72999,7 +73011,7 @@ async function createCodexlyServer(options) {
|
|
|
72999
73011
|
});
|
|
73000
73012
|
const readImageFile = options.readProjectImageFile ?? readProjectImageFile;
|
|
73001
73013
|
const readSourceFile = options.readProjectSourceFile ?? readProjectSourceFile;
|
|
73002
|
-
const projectOpenService = options.projectOpenService ?? createProjectOpenService();
|
|
73014
|
+
const projectOpenService = options.access === void 0 ? options.projectOpenService ?? createProjectOpenService() : createDisabledProjectOpenService();
|
|
73003
73015
|
const workspaceBrowserOptions = options.workspaceRoots === void 0 ? {} : { workspaceRoots: options.workspaceRoots };
|
|
73004
73016
|
const browseProjectDirectory = options.readProjectDirectory ?? ((path, browserOptions) => readProjectDirectory(path, { ...browserOptions, ...workspaceBrowserOptions }));
|
|
73005
73017
|
const selectProjectDirectory = options.resolveProjectDirectory ?? ((path) => resolveProjectDirectory(path, workspaceBrowserOptions));
|