dsh-oh-my-terminal 0.2.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +17 -3
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/docs/git-workflow.md +6 -1
- package/lib/client.js +23017 -470
- package/lib/index.js +12 -2
- package/package.json +3 -1
- package/src/client/compat.ts +10 -2
- package/src/client/sash.ts +307 -0
- package/src/client/settings/card.tsx +32 -1
- package/src/client/settings/profile-add-form.tsx +174 -0
- package/src/client/settings/profile-row.tsx +242 -0
- package/src/client/settings/profile-table.tsx +2 -387
- package/src/client/settings/store.ts +2 -1
- package/src/client/settings/types.ts +2 -0
- package/src/client/sidebar-tab.tsx +161 -121
- package/src/client/split-group.tsx +180 -0
- package/src/client/split-view.ts +522 -0
- package/src/client/styles.ts +28 -0
- package/src/client/term-pane.tsx +33 -7
- package/src/client/terminal/use-tabs.ts +16 -10
- package/src/client/terminal/use-terminal-state.ts +34 -28
- package/src/client/terminal-render.tsx +128 -0
- package/src/client/types.ts +2 -0
- package/src/client.tsx +148 -53
- package/src/index.ts +12 -0
- package/src/routes.ts +7 -4
- package/src/settings/namespace.ts +3 -1
- package/tests/unit/reducer.test.ts +332 -0
package/CLAUDE.md
CHANGED
|
@@ -67,6 +67,10 @@ src/
|
|
|
67
67
|
│ ├── shortcut-bridge.ts # shortcuts 服务接入信号桥(命令注册状态 + 面板切换回调,软探测兼容旧宿主)
|
|
68
68
|
│ ├── compat.ts # DSH-better-sidebar 兼容模式检测(软探测 ctx.betterSidebar + 服务最小接口声明)
|
|
69
69
|
│ ├── sidebar-tab.tsx # 侧边栏终端 tab 组件(兼容模式:嵌入 DSH-better-sidebar 底部工作台,不绑定 DSH sessionId)
|
|
70
|
+
│ ├── terminal-render.tsx # 终端组渲染共享函数(renderTerminalGroups + findProfile + findActiveInstance/Group,独立模式与兼容模式共用)
|
|
71
|
+
│ ├── sash.ts # 拖拽分隔条组件(复刻 VSCode Sash:mousedown→全局 mousemove/mouseup 事件 + cursor 注入 + iframe 禁用 + hover 延迟 + 双击重置)
|
|
72
|
+
│ ├── split-view.ts # 拆分布局管理器(复刻 VSCode SplitView:resize delta 分配算法 + layout 比例分配 + proportions 快照 + sash 启用状态计算)
|
|
73
|
+
│ ├── split-group.tsx # 拆分组 React 组件(用 SplitView 管理 pane 绝对定位 + Sash 拖拽,通过 react-dom createPortal 把 TermPane 渲染到 SplitView 的 view.element div)
|
|
70
74
|
│ ├── terminal/
|
|
71
75
|
│ │ ├── reducer.ts # 终端状态 reducer(terminalReducer 纯函数 + createInitialState)
|
|
72
76
|
│ │ ├── use-terminal-state.ts # 终端状态管理 Hook(useTerminalState:useReducer 封装 + 启动恢复)
|
|
@@ -76,7 +80,9 @@ src/
|
|
|
76
80
|
│ │ ├── types.ts # 设置页面类型定义(SettingsPageProps、ConfigWithProfiles)
|
|
77
81
|
│ │ ├── store.ts # 设置页面状态管理(useSettingsState Hook)
|
|
78
82
|
│ │ ├── card.tsx # 设置卡片组件(SettingsCard)
|
|
79
|
-
│ │ ├── profile-table.tsx #
|
|
83
|
+
│ │ ├── profile-table.tsx # 终端配置表格容器组件(ProfileTable:表头 + 行列表 + 新增表单入口)
|
|
84
|
+
│ │ ├── profile-row.tsx # 终端配置表格行组件(ProfileRow:inline 编辑 name/path + 删除按钮)
|
|
85
|
+
│ │ ├── profile-add-form.tsx # 新增终端配置表单组件(AddProfileForm:type/name/path 输入 + 添加/取消)
|
|
80
86
|
│ │ ├── api.ts # Settings Bridge HTTP 客户端(封装与宿主半 Settings Bridge 的 HTTP 交互)
|
|
81
87
|
│ │ └── styles.ts # 配置表单样式模块(injectSettingsStyles + CSS 自定义属性主题自适应)
|
|
82
88
|
│ ├── icons.tsx # SVG 图标组件集合(10 个纯函数)
|
|
@@ -125,15 +131,22 @@ src/
|
|
|
125
131
|
client/shortcut-bridge.ts → client/types.ts, constants.ts, logger.ts
|
|
126
132
|
client/compat.ts → logger.ts(软探测 ctx.betterSidebar,声明服务最小接口)
|
|
127
133
|
client/sidebar-tab.tsx → client/hooks.ts, client/term-pane.tsx, client/dropdown.tsx,
|
|
128
|
-
client/side-list.tsx, client/icons.tsx, client/compat.ts,
|
|
134
|
+
client/side-list.tsx, client/icons.tsx, client/compat.ts,
|
|
135
|
+
client.tsx(setHideHostTerminal), logger.ts
|
|
129
136
|
client/terminal/reducer.ts → client/types.ts, logger.ts
|
|
130
137
|
client/terminal/use-terminal-state.ts → client/terminal/reducer.ts, client/types.ts, logger.ts
|
|
131
138
|
client/terminal/use-panel-geometry.ts → client/types.ts, constants.ts, logger.ts
|
|
132
139
|
client/terminal/use-tabs.ts → client/types.ts, shortcut.ts, client/shortcut-bridge.ts, constants.ts, logger.ts
|
|
133
140
|
client/settings/card.tsx → client/settings/types.ts, client/settings/api.ts, client/settings/store.ts, client/settings/profile-table.tsx, client/icons.tsx
|
|
134
141
|
client/settings/store.ts → client/settings/types.ts
|
|
135
|
-
client/settings/profile-table.tsx → client/settings/types.ts, client/settings/api.ts
|
|
142
|
+
client/settings/profile-table.tsx → client/settings/types.ts, client/settings/api.ts, client/settings/profile-row.tsx, client/settings/profile-add-form.tsx
|
|
143
|
+
client/settings/profile-row.tsx → client/settings/types.ts
|
|
144
|
+
client/settings/profile-add-form.tsx → client/settings/types.ts
|
|
136
145
|
client/settings/api.ts → client/settings/types.ts
|
|
146
|
+
client/terminal-render.tsx → client/term-pane.tsx, client/split-group.tsx, client/types.ts, logger.ts
|
|
147
|
+
client/sash.ts → logger.ts(Disposable/Emitter/IDisposable 最小适配层 + Sash 类)
|
|
148
|
+
client/split-view.ts → client/sash.ts, logger.ts(SplitView 类,实现 IVerticalSashLayoutProvider)
|
|
149
|
+
client/split-group.tsx → client/split-view.ts, client/term-pane.tsx, client/types.ts, client/styles.ts, react-dom
|
|
137
150
|
client/dropdown.tsx → client/types.ts, client/icons.tsx
|
|
138
151
|
client/side-list.tsx → client/types.ts, client/icons.tsx
|
|
139
152
|
client/term-pane.tsx → client/types.ts, client/clipboard.ts, client/icons.tsx, client/styles.ts
|
|
@@ -182,6 +195,7 @@ src/
|
|
|
182
195
|
- **Windows 上 spawn 必须给完整路径**:node-pty 的 `spawn` 在 Windows 上**不做 PATH/PATHEXT 查找**,传裸命令名(`pwsh`、`cmd`、`bash`)直接以 `File not found: ` 失败(错误消息里的路径是空串,极易误判为 cwd 问题)。所有终端命令都要先经 `where`/`which` 解析成绝对路径,并过滤 `WindowsApps` 下的 App Execution Alias 占位符
|
|
183
196
|
- **跨半字段名必须逐字对齐**:宿主半与浏览器半经 HTTP 通信、无编译期校验,字段名拼写不一致会静默回落到默认分支(曾因客户端发 `terminalType`、宿主半读 `profileId`,导致下拉菜单选了任何类型都开出默认 shell,且无任何报错)
|
|
184
197
|
- **单文件行数阈值**:建议 <600 行。超过时按职责边界拆分到子模块,不要按"太长了"随意切半
|
|
198
|
+
- **DSH 宿主终端快捷键拦截**:DSH 桌面端用 **native keyboard bridge** 处理快捷键——快捷键通过 Electron 原生层截获,经 IPC 发给 renderer 的 `installNativeKeyboard`,直接调用 `registry.dispatch`,**完全绕过 DOM keydown 事件**。因此 `window.addEventListener('keydown', ...)` 拦截器在桌面端无效。必须用 DSH shortcuts 系统的 **fixed 命令机制**:注册与 `terminal.new` 相同绑定的 fixed 命令,使其从 `bindings`(生效)移入 `conflicts`(阻塞),dispatch 时返回 `blocked` 不执行;同时通过 `observeFixedInput` 监听 fixed input 触发打开我们的终端。用户可能在 DSH 设置里改过 `terminal.new` 的绑定,必须从 `shortcuts.catalog` 动态读取当前绑定而非硬编码。`shortcuts` 服务可能在插件 `apply` 之后才注册,必须用 `ctx.inject(['shortcuts'], ...)` 等待而非 `ctx.get` 即时探测。兼容模式下 `openTab` 需设 `target: 'bottom'` 才能打开到底部工作台而非右侧边栏(DSH-better-sidebar 默认在有 native surface 时打开到右侧边栏)
|
|
185
199
|
|
|
186
200
|
## 约束
|
|
187
201
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dsh-oh-my-terminal
|
|
2
2
|
|
|
3
|
-
[](package.json)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](package.json)
|
|
6
6
|
|
package/README.zh.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# dsh-oh-my-terminal
|
|
2
2
|
|
|
3
|
-
[](package.json)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](package.json)
|
|
6
6
|
|
package/docs/git-workflow.md
CHANGED
|
@@ -48,6 +48,8 @@
|
|
|
48
48
|
3. merge 后立即删除本地特性分支
|
|
49
49
|
4. 特性分支**不直接 merge 到 master**
|
|
50
50
|
5. 特性分支之间**不互相 merge**——如有依赖,先合并上游分支到 develop,再从 develop rebase
|
|
51
|
+
6. **所有日常操作从 `develop` 分支发起**——创建特性分支、pull 最新代码、日常提交均在 `develop` 或特性分支上进行,**不要在 `master` 上直接创建分支或提交**
|
|
52
|
+
7. develop 合并到 master 后,**立即切回 `develop` 分支**继续工作,不要停留在 `master` 分支上
|
|
51
53
|
|
|
52
54
|
### 1.3 AI Agent 分支约定
|
|
53
55
|
|
|
@@ -70,6 +72,7 @@ develop (稳定) ──merge──→ master ──tag──→ v0.x.y
|
|
|
70
72
|
3. 如需版本号变更,在 master 上修改 `package.json` 并提交
|
|
71
73
|
4. `git tag -a v0.x.y -m "v0.x.y: <发布摘要>"`
|
|
72
74
|
5. push master 和 tag
|
|
75
|
+
6. **发布完成后立即 `git checkout develop` 回到日常开发分支**——master 仅用于发布合并,不要在 master 上停留或创建特性分支
|
|
73
76
|
|
|
74
77
|
---
|
|
75
78
|
|
|
@@ -193,7 +196,7 @@ AI agent 在本仓库执行代码变更时,按以下清单自检:
|
|
|
193
196
|
### 开始前
|
|
194
197
|
|
|
195
198
|
- [ ] 确认当前在正确的特性分支上(不在 master/develop 上直接改)
|
|
196
|
-
- [ ] 确认特性分支从 develop 最新 HEAD
|
|
199
|
+
- [ ] 确认特性分支从 develop 最新 HEAD 创建(不从 master 建分支)
|
|
197
200
|
- [ ] 确认 Lead 分配的写作用户与其他 agent 不重叠
|
|
198
201
|
|
|
199
202
|
### 工作中
|
|
@@ -218,6 +221,8 @@ AI agent 在本仓库执行代码变更时,按以下清单自检:
|
|
|
218
221
|
| 禁止操作 | 原因 |
|
|
219
222
|
|---------|------|
|
|
220
223
|
| 直接在 master/develop 上 commit | 所有改动必须经特性分支 |
|
|
224
|
+
| 从 master 创建特性分支 | 特性分支只能从 develop 创建;master 仅用于发布合并 |
|
|
225
|
+
| merge 到 master 后停留在 master 分支 | 发布完成后应立即切回 develop 继续开发 |
|
|
221
226
|
| master → develop 的 merge | 破坏单向合并规则,产生混乱历史 |
|
|
222
227
|
| 特性分支之间互相 merge | 应通过 develop 中转 |
|
|
223
228
|
| force push 已推送的分支 | 除非 Lead 明确要求重写历史 |
|