@agi-fans/oh-my-dsh 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  **Into the Unknown**
8
8
 
9
- A focused, keyboard-first DeepSeek coding agent built on the plugin architecture of [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) and inspired by the interaction quality of [oh-my-pi](https://github.com/can1357/oh-my-pi).
9
+ A focused, keyboard-first DeepSeek coding agent built on the plugin architecture of [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) and inspired by the interaction quality of [oh-my-pi](https://github.com/can1357/oh-my-pi) and the original [Pi](https://github.com/earendil-works/pi) agent harness.
10
10
 
11
11
  [![npm version](https://img.shields.io/npm/v/%40agi-fans%2Foh-my-dsh?style=flat-square&logo=npm)](https://www.npmjs.com/package/@agi-fans/oh-my-dsh) [![npm downloads](https://img.shields.io/npm/dm/%40agi-fans%2Foh-my-dsh?style=flat-square&logo=npm)](https://www.npmjs.com/package/@agi-fans/oh-my-dsh) [![Node.js ^22.19 or >=24](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-339933?style=flat-square&logo=node.js)](https://nodejs.org/) [![MIT License](https://img.shields.io/npm/l/%40agi-fans%2Foh-my-dsh?style=flat-square)](https://github.com/agi-fans/oh-my-dsh/blob/main/LICENSE)
12
12
 
@@ -14,7 +14,7 @@ English · [简体中文](https://github.com/agi-fans/oh-my-dsh/blob/main/README
14
14
 
15
15
  </div>
16
16
 
17
- ![oh-my-dsh terminal interface](https://raw.githubusercontent.com/agi-fans/oh-my-dsh/main/docs/resources/screenshot.png)
17
+ ![oh-my-dsh terminal interface](https://raw.githubusercontent.com/agi-fans/oh-my-dsh/main/docs/resources/screenshot.webp)
18
18
 
19
19
  ## Quick start
20
20
 
@@ -32,14 +32,15 @@ Run `/login` once inside omdsh to validate and save your DeepSeek API key, then
32
32
  - **Durable conversations:** resume sessions, rewind to a human turn, retry, compact, and export complete transcripts as Markdown.
33
33
  - **Four real session controls:** choose a Harness Agent preset (Standard, PTC, Minimal, or Cordis), Workflow (Default or Plan), tool presentation (Native, Code, or Both), and Access (Read only, Workspace write, or Full access).
34
34
  - **Rich terminal input:** search project files with `@`, paste clipboard images, reuse persistent prompt history, edit multiline prompts externally, and retrieve queued follow-ups.
35
- - **Readable tool activity:** follow streaming calls, inspect distinct Input and Output sections, expand long results, and keep domain-specific presentation owned by tool plugins.
35
+ - **Readable tool activity:** follow streaming calls and live subagent progress, open a child's transcript from the Agents roster, steer a continuable child from that view, inspect distinct Input and Output sections, expand long results, and keep domain-specific presentation owned by tool plugins.
36
36
  - **Live operational context:** see Agent, Workflow, Tools, Access, model, reasoning effort, workspace, Git state, context pressure, tokens, TTFT, throughput, cache, timings, turns, and steps without leaving the composer.
37
37
  - **Responsive by design:** retain settled transcript layout, coalesce scroll updates, emit row-level terminal diffs, and preserve correct display-cell alignment for CJK text and emoji.
38
38
 
39
39
  ## Learn
40
40
 
41
- - [Tutorials](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/tutorials.md) — complete a first task, add precise context, guide queued work, recover long sessions, and customize the environment.
41
+ - [Tutorials](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/tutorials.md) — complete a first task, add precise context, guide queued work, recover long sessions, customize the environment, and write an installable plugin.
42
42
  - [Skills and MCP](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/skills-and-mcp.md) — extend a project with reusable instructions and external tools.
43
+ - [User plugins](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/plugins.md) — install DSH bundles into the omdsh Profile with `omdsh plugin`.
43
44
  - [Architecture](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/architecture.md) — understand the plugin boundaries and runtime data flow.
44
45
  - [Performance](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/performance.md) — inspect the benchmarks, methodology, and rendering optimizations.
45
46
 
@@ -80,7 +81,7 @@ See the reproducible [TUI performance report](https://github.com/agi-fans/oh-my-
80
81
 
81
82
  ## Configuration
82
83
 
83
- Run `/login` to open the DeepSeek API Key dashboard, enter a key in a masked prompt, validate it, and save it through the Harness credential store. An interactively selected key takes priority over an inherited `DEEPSEEK_API_KEY` on subsequent requests and across restarts. `/logout` removes the omdsh-managed choice and falls back to the environment when available.
84
+ Run `/login` to configure a provider API key. DeepSeek still opens the official key dashboard, validates the key, and prefers the stored credential over an inherited `DEEPSEEK_API_KEY`. The same command can also activate a catalog provider such as OpenAI or Anthropic, or add a custom provider with its own id, base URL, protocol, and model ids. `/model` then lists every live route. `/logout` removes an omdsh-managed choice and, for DeepSeek, falls back to the environment when available.
84
85
 
85
86
  Model settings can also come from `$DSH_HOME/settings.yaml`. Skills and MCP configuration are documented in [Skills and MCP](https://github.com/agi-fans/oh-my-dsh/blob/main/docs/skills-and-mcp.md).
86
87
 
@@ -98,7 +99,7 @@ pnpm smoke # interactive PTY smoke test
98
99
  pnpm smoke:happy # mock-LLM happy path
99
100
  ```
100
101
 
101
- The checkouts in `refs/deepseek-harness` and `refs/oh-my-pi` are read-only references. Do not use them as runtime dependencies or modify them while developing omdsh.
102
+ The checkouts in `refs/deepseek-harness`, `refs/oh-my-pi`, and `refs/pi` are read-only references. Do not use them as runtime dependencies or modify them while developing omdsh.
102
103
 
103
104
  ## Changelog
104
105
 
@@ -106,12 +107,13 @@ User-visible changes and release history are tracked in [CHANGELOG.md](https://g
106
107
 
107
108
  ## Acknowledgements
108
109
 
109
- oh-my-dsh exists because of two projects:
110
+ oh-my-dsh exists because of these projects:
110
111
 
111
112
  - [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) provides the runtime foundation, plugin architecture, and the conviction that agent capabilities should be composable rather than embedded in one application.
112
- - [oh-my-pi](https://github.com/can1357/oh-my-pi) demonstrates how thoughtful terminal interaction, compact information design, and careful keyboard workflows can make an agent feel fast and approachable.
113
+ - [Pi](https://github.com/earendil-works/pi) is the original open agent harness whose terminal interaction, differential rendering, and compact coding-agent craft still set the standard this community builds on.
114
+ - [oh-my-pi](https://github.com/can1357/oh-my-pi) continues that lineage and shows how thoughtful terminal interaction, compact information design, and careful keyboard workflows can make an agent feel fast and approachable.
113
115
 
114
- Thank you to both projects and their contributors. omdsh is an independent community project: it is built on DeepSeek Harness and learns from OMP, but is not an official distribution of either project.
116
+ Thank you to these projects and their contributors. omdsh is an independent community project: it is built on DeepSeek Harness and learns from Pi and OMP, but is not an official distribution of any of them.
115
117
 
116
118
  ## License
117
119
 
package/config/cordis.yml CHANGED
@@ -1,266 +1,274 @@
1
- # omdsh composition — the TUI coding agent over the DeepSeek Harness core
2
- # runtime. No Host, no HTTP, no browser layer: local executors, the
3
- # executor-less agent spine, the DeepSeek adapter, and the omdsh TUI seam
4
- # (provider + interactive runner).
1
+ # omdsh product bundle — one insert over an empty Profile root.
2
+ # TUI coding agent over the DeepSeek Harness core runtime. No Host, no HTTP, no
3
+ # browser layer: local executors, the executor-less agent spine, the DeepSeek
4
+ # adapter, and the omdsh TUI seam (provider + interactive runner).
5
5
  #
6
6
  # Model/provider rows read the CLI/environment overrides through the
7
7
  # harness's sanctioned dynamic-config mechanism (!!js under plugin config).
8
8
 
9
- - id: timer
10
- name: '@deepseek-ai/cordis-plugin-timer'
11
-
12
- - id: llm
13
- name: '@deepseek-ai/dsh-llm'
14
-
15
- - id: llm-deepseek
16
- name: '@deepseek-ai/dsh-llm-deepseek'
17
-
18
- - id: session
19
- name: '@deepseek-ai/dsh-session'
20
-
21
- - id: session-persistence
22
- name: '@deepseek-ai/dsh-session-persistence-jsonl'
23
- config:
24
- root: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/sessions'"
25
-
26
- - id: session-checkpoint
27
- name: '@deepseek-ai/dsh-session-checkpoint-policy'
28
-
29
- - id: session-projection
30
- name: '@deepseek-ai/dsh-session-projection'
31
-
32
- - id: session-title
33
- name: '@deepseek-ai/dsh-session-title'
34
- config:
35
- fallbackMaxWords: 8
36
- fallbackMaxBytes: 80
37
- maxTitleBytes: 120
38
-
39
- - id: session-stats
40
- name: '@deepseek-ai/dsh-session-stats'
41
-
42
- - id: attachments
43
- name: '@deepseek-ai/dsh-attachment-local'
44
- config:
45
- dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
46
-
47
- # User settings document ($DSH_HOME/settings.yaml) and credential sources
48
- # (inherited env, managed .credentials.yaml, project/user .env) — the same
49
- # rows the harness base mounts, so omdsh honors the user's existing model
50
- # route and API key setup out of the box.
51
- - id: settings
52
- name: '@deepseek-ai/dsh-settings-file'
53
- config:
54
- dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
55
-
56
- - id: credentials
57
- name: '@deepseek-ai/dsh-credentials-local'
58
- config:
59
- dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
60
-
61
- - id: agent
62
- name: '@deepseek-ai/dsh-agent'
63
-
64
- - id: agent-default-model
65
- name: '@deepseek-ai/dsh-agent-default-model'
66
- config:
67
- provider: !!js process.env.OMDSH_PROVIDER || 'deepseek-official'
68
- model: !!js process.env.OMDSH_MODEL || 'deepseek-v4-flash'
69
-
70
- - id: agent-presets
71
- name: '@deepseek-ai/dsh-agent-presets'
72
- config:
73
- default: standard
74
- roots:
75
- - path: !!js "process.getBuiltinModule('node:url').fileURLToPath(new URL('./agent-presets/', baseUrl))"
76
- trust: system
77
-
78
- - id: commands
79
- name: '@deepseek-ai/dsh-commands'
80
-
81
- - id: user-questions
82
- name: '@deepseek-ai/dsh-user-questions'
83
-
84
- - id: approval
85
- name: '@deepseek-ai/dsh-user-approval'
86
- config:
87
- policy: !!js "(process.env.OMDSH_PERMISSION_MODE || 'workspace-write') === 'danger-full-access' ? 'never' : 'ask'"
88
-
89
- # Every session starts with one explicit access preset. The environment is a
90
- # deployment override; the TUI switches it later through the /permission picker.
91
- - id: sandbox
92
- name: '@deepseek-ai/dsh-sandbox-local'
93
-
94
- - id: sandbox-policy
95
- name: '@deepseek-ai/dsh-sandbox-policy'
96
- config:
97
- mode: !!js process.env.OMDSH_PERMISSION_MODE || 'workspace-write'
98
- workspaceRoot: !!js process.cwd()
99
-
100
- - id: fs
101
- name: '@deepseek-ai/dsh-fs-local'
102
-
103
- - id: fs-observation-policy
104
- name: '@deepseek-ai/dsh-fs-observation-policy'
105
-
106
- - id: subprocess
107
- name: '@deepseek-ai/dsh-subprocess-local'
108
-
109
- - id: bash
110
- name: '@deepseek-ai/dsh-bash-sandbox'
111
-
112
- - id: permission
113
- name: '@deepseek-ai/dsh-permission-presets'
114
- config:
115
- presets:
116
- read-only:
117
- sandbox: read-only
118
- approval: ask
119
- name: Read only
120
- description: Inspect the workspace without writing; escalation requires approval.
121
- workspace-write:
122
- sandbox: workspace-write
123
- approval: ask
124
- name: Workspace write
125
- description: Write inside the workspace; wider access requires approval.
126
- danger-full-access:
127
- sandbox: danger-full-access
128
- approval: never
129
- name: Full access
130
- description: Full filesystem access without approval prompts.
131
-
132
- - id: spine
133
- name: '@deepseek-ai/dsh-agent-spine-demo'
134
- config:
135
- workspaceContext:
136
- maxBytes: 65536
137
- dshHome: !!js process.env.OMDSH_HOME || undefined
138
- skills:
139
- enabled: true
140
- goals:
141
- domain: {}
142
- tool: {}
143
- tools:
144
- mode: native
145
-
146
- - id: code-runtime
147
- name: '@deepseek-ai/dsh-code-runtime-worker-thread'
148
-
149
- - id: cordis-host-runner
150
- name: '@deepseek-ai/dsh-cordis-host-runner'
151
-
152
- # Human and model workflow contributions. The TUI discovers human commands
153
- # from dsh-commands and renders unknown tools through its safe fallback.
154
- - id: command-goal
155
- name: '@deepseek-ai/dsh-command-goal'
156
-
157
- - id: tool-ask-user
158
- name: '@deepseek-ai/dsh-tool-ask-user'
159
-
160
- - id: plan-mode
161
- name: '@deepseek-ai/dsh-plan-mode'
162
- config:
163
- section: |
164
- You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
165
-
166
- Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
167
-
168
- The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
169
-
170
- Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
171
-
172
- Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public interface, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
173
-
174
- When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
175
-
176
- - id: tool-fs
177
- name: '@deepseek-ai/dsh-tool-fs'
178
-
179
- - id: tool-fs-search
180
- name: '@deepseek-ai/dsh-tool-fs-search'
181
- config:
182
- sampleOverCapGlobResults: false
183
-
184
- - id: tool-todo
185
- name: '@deepseek-ai/dsh-tool-todo'
186
- config:
187
- allowParallelInProgress: true
9
+ - insert:
10
+ - id: timer
11
+ name: '@deepseek-ai/cordis-plugin-timer'
12
+
13
+ - id: llm
14
+ name: '@deepseek-ai/dsh-llm'
15
+
16
+ - id: llm-deepseek
17
+ name: '@deepseek-ai/dsh-llm-deepseek'
18
+
19
+ - id: session
20
+ name: '@deepseek-ai/dsh-session'
21
+
22
+ - id: session-persistence
23
+ name: '@deepseek-ai/dsh-session-persistence-jsonl'
24
+ config:
25
+ root: !!js "(process.env.OMDSH_HOME || process.env.DSH_HOME || process.env.HOME + '/.dsh') + '/sessions'"
26
+
27
+ - id: session-checkpoint
28
+ name: '@deepseek-ai/dsh-session-checkpoint-policy'
29
+
30
+ - id: session-projection
31
+ name: '@deepseek-ai/dsh-session-projection'
32
+
33
+ - id: session-title
34
+ name: '@deepseek-ai/dsh-session-title'
35
+ config:
36
+ fallbackMaxWords: 8
37
+ fallbackMaxBytes: 80
38
+ maxTitleBytes: 120
39
+
40
+ - id: session-stats
41
+ name: '@deepseek-ai/dsh-session-stats'
42
+
43
+ - id: attachments
44
+ name: '@deepseek-ai/dsh-attachment-local'
45
+ config:
46
+ dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
47
+
48
+ # User settings document ($DSH_HOME/settings.yaml) and credential sources
49
+ # (inherited env, managed .credentials.yaml, project/user .env) — the same
50
+ # rows the harness base mounts, so omdsh honors the user's existing model
51
+ # route and API key setup out of the box.
52
+ - id: settings
53
+ name: '@deepseek-ai/dsh-settings-file'
54
+ config:
55
+ dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
56
+
57
+ - id: credentials
58
+ name: '@deepseek-ai/dsh-credentials-local'
59
+ config:
60
+ dshHome: !!js process.env.OMDSH_HOME || process.env.DSH_HOME || undefined
61
+
62
+ # Dormant multi-provider twin: zero extra picker routes until a `llm-pi-ai:`
63
+ # settings section supplies profiles. /login writes those profiles; /model
64
+ # lists whatever routes become live. Keep llm-deepseek as the official
65
+ # DeepSeek identity — its route is `deepseek-official`, not catalog `deepseek`.
66
+ - id: llm-pi-ai
67
+ name: '@deepseek-ai/dsh-llm-pi-ai'
68
+
69
+ - id: agent
70
+ name: '@deepseek-ai/dsh-agent'
71
+
72
+ - id: agent-default-model
73
+ name: '@deepseek-ai/dsh-agent-default-model'
74
+ config:
75
+ provider: !!js process.env.OMDSH_PROVIDER || 'deepseek-official'
76
+ model: !!js process.env.OMDSH_MODEL || 'deepseek-v4-flash'
77
+
78
+ - id: agent-presets
79
+ name: '@deepseek-ai/dsh-agent-presets'
80
+ config:
81
+ default: standard
82
+ roots:
83
+ - path: !!js "process.getBuiltinModule('node:url').fileURLToPath(new URL('./agent-presets/', baseUrl))"
84
+ trust: system
85
+
86
+ - id: commands
87
+ name: '@deepseek-ai/dsh-commands'
88
+
89
+ - id: user-questions
90
+ name: '@deepseek-ai/dsh-user-questions'
91
+
92
+ - id: approval
93
+ name: '@deepseek-ai/dsh-user-approval'
94
+ config:
95
+ policy: !!js "(process.env.OMDSH_PERMISSION_MODE || 'workspace-write') === 'danger-full-access' ? 'never' : 'ask'"
96
+
97
+ # Every session starts with one explicit access preset. The environment is a
98
+ # deployment override; the TUI switches it later through the /permission picker.
99
+ - id: sandbox
100
+ name: '@deepseek-ai/dsh-sandbox-local'
101
+
102
+ - id: sandbox-policy
103
+ name: '@deepseek-ai/dsh-sandbox-policy'
104
+ config:
105
+ mode: !!js process.env.OMDSH_PERMISSION_MODE || 'workspace-write'
106
+ workspaceRoot: !!js process.cwd()
107
+
108
+ - id: fs
109
+ name: '@deepseek-ai/dsh-fs-local'
110
+
111
+ - id: fs-observation-policy
112
+ name: '@deepseek-ai/dsh-fs-observation-policy'
113
+
114
+ - id: subprocess
115
+ name: '@deepseek-ai/dsh-subprocess-local'
116
+
117
+ - id: bash
118
+ name: '@deepseek-ai/dsh-bash-sandbox'
119
+
120
+ - id: permission
121
+ name: '@deepseek-ai/dsh-permission-presets'
122
+ config:
123
+ presets:
124
+ read-only:
125
+ sandbox: read-only
126
+ approval: ask
127
+ name: Read only
128
+ description: Inspect the workspace without writing; escalation requires approval.
129
+ workspace-write:
130
+ sandbox: workspace-write
131
+ approval: ask
132
+ name: Workspace write
133
+ description: Write inside the workspace; wider access requires approval.
134
+ danger-full-access:
135
+ sandbox: danger-full-access
136
+ approval: never
137
+ name: Full access
138
+ description: Full filesystem access without approval prompts.
139
+
140
+ - id: spine
141
+ name: '@deepseek-ai/dsh-agent-spine-demo'
142
+ config:
143
+ workspaceContext:
144
+ maxBytes: 65536
145
+ dshHome: !!js process.env.OMDSH_HOME || undefined
146
+ skills:
147
+ enabled: true
148
+ goals:
149
+ domain: {}
150
+ tool: {}
151
+ tools:
152
+ mode: native
153
+
154
+ - id: code-runtime
155
+ name: '@deepseek-ai/dsh-code-runtime-worker-thread'
156
+
157
+ - id: cordis-host-runner
158
+ name: '@deepseek-ai/dsh-cordis-host-runner'
159
+
160
+ # Human and model workflow contributions. The TUI discovers human commands
161
+ # from dsh-commands and renders unknown tools through its safe fallback.
162
+ - id: command-goal
163
+ name: '@deepseek-ai/dsh-command-goal'
164
+
165
+ - id: tool-ask-user
166
+ name: '@deepseek-ai/dsh-tool-ask-user'
167
+
168
+ - id: plan-mode
169
+ name: '@deepseek-ai/dsh-plan-mode'
170
+ config:
171
+ section: |
172
+ You are in plan mode. Stay in plan mode until exit_plan_mode succeeds or the user switches the session mode. Imperative language to implement changes means plan the implementation, not execute it. A user's conversational agreement — including an answer confirming something you asked — approves nothing and does not end plan mode; fold the confirmed decision into the plan and submit it through exit_plan_mode.
173
+
174
+ Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
175
+
176
+ The tool catalog stays the same across modes for request-cache stability. These plan-mode rules override any later tool description or guidance that suggests using mutation tools; those tools remain listed to keep the tool catalog unchanged. Do not use todo_write to track this planning phase: it tracks implementation after an approved plan, while the plan itself belongs in exit_plan_mode.
177
+
178
+ Resolve discoverable facts by inspection. Use ask_user_question only for user-owned choices or material ambiguity that inspection cannot answer. Do not ask the user where code lives or how current behavior works when you can find out.
179
+
180
+ Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public interface, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
181
+
182
+ When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
183
+
184
+ - id: tool-fs
185
+ name: '@deepseek-ai/dsh-tool-fs'
186
+
187
+ - id: tool-fs-search
188
+ name: '@deepseek-ai/dsh-tool-fs-search'
189
+ config:
190
+ sampleOverCapGlobResults: false
191
+
192
+ - id: tool-todo
193
+ name: '@deepseek-ai/dsh-tool-todo'
194
+ config:
195
+ allowParallelInProgress: true
188
196
 
189
- - id: tool-str-replace-editor
190
- name: '@deepseek-ai/dsh-tool-str-replace-editor'
191
- config:
192
- maxOutputChars: 16000
197
+ - id: tool-str-replace-editor
198
+ name: '@deepseek-ai/dsh-tool-str-replace-editor'
199
+ config:
200
+ maxOutputChars: 16000
193
201
 
194
- - id: token-meter
195
- name: '@deepseek-ai/dsh-token-meter'
202
+ - id: token-meter
203
+ name: '@deepseek-ai/dsh-token-meter'
196
204
 
197
- - id: compaction
198
- name: '@deepseek-ai/dsh-compaction-basic'
205
+ - id: compaction
206
+ name: '@deepseek-ai/dsh-compaction-basic'
199
207
 
200
- - id: command-compact
201
- name: '@deepseek-ai/dsh-command-compact'
208
+ - id: command-compact
209
+ name: '@deepseek-ai/dsh-command-compact'
202
210
 
203
- - id: subagent
204
- name: '@deepseek-ai/dsh-subagent'
211
+ - id: subagent
212
+ name: '@deepseek-ai/dsh-subagent'
205
213
 
206
- - id: subagent-spawn
207
- name: '@deepseek-ai/dsh-subagent-spawn-in-process'
208
- config:
209
- providerName: spawn
210
-
211
- - id: subagent-control
212
- name: '@deepseek-ai/dsh-tool-subagent-control'
213
-
214
- - id: subagent-list
215
- name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
214
+ - id: subagent-spawn
215
+ name: '@deepseek-ai/dsh-subagent-spawn-in-process'
216
+ config:
217
+ providerName: spawn
218
+
219
+ - id: subagent-control
220
+ name: '@deepseek-ai/dsh-tool-subagent-control'
221
+
222
+ - id: subagent-list
223
+ name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'
216
224
 
217
- - id: tool-subagent
218
- name: '@deepseek-ai/dsh-tool-subagent'
219
- config:
220
- provider: spawn
221
- toolName: subagent
222
- backgroundMode: continuable
225
+ - id: tool-subagent
226
+ name: '@deepseek-ai/dsh-tool-subagent'
227
+ config:
228
+ provider: spawn
229
+ toolName: subagent
230
+ backgroundMode: continuable
223
231
 
224
- - id: tui
225
- name: '@agi-fans/dsh-tui'
226
- config:
227
- model: !!js process.env.OMDSH_MODEL || 'deepseek-v4-flash'
232
+ - id: tui
233
+ name: '@agi-fans/dsh-tui'
234
+ config:
235
+ model: !!js process.env.OMDSH_MODEL || 'deepseek-v4-flash'
228
236
 
229
- - id: tui-tool-presentation
230
- name: '@agi-fans/dsh-tui/tool-presentation'
237
+ - id: tui-tool-presentation
238
+ name: '@agi-fans/dsh-tui/tool-presentation'
231
239
 
232
- - id: tui-session-runtime
233
- name: '@agi-fans/dsh-tui/session-runtime'
240
+ - id: tui-session-runtime
241
+ name: '@agi-fans/dsh-tui/session-runtime'
234
242
 
235
- - id: tui-human-interaction
236
- name: '@agi-fans/dsh-tui/human-interaction'
243
+ - id: tui-human-interaction
244
+ name: '@agi-fans/dsh-tui/human-interaction'
237
245
 
238
- - id: tui-command-session
239
- name: '@agi-fans/dsh-tui/command-session'
246
+ - id: tui-command-session
247
+ name: '@agi-fans/dsh-tui/command-session'
240
248
 
241
- - id: tui-command-session-configuration
242
- name: '@agi-fans/dsh-tui/command-session-configuration'
249
+ - id: tui-command-session-configuration
250
+ name: '@agi-fans/dsh-tui/command-session-configuration'
243
251
 
244
- - id: tui-command-steer
245
- name: '@agi-fans/dsh-tui/command-steer'
252
+ - id: tui-command-steer
253
+ name: '@agi-fans/dsh-tui/command-steer'
246
254
 
247
- - id: tui-command-loop
248
- name: '@agi-fans/dsh-tui/command-loop'
255
+ - id: tui-command-loop
256
+ name: '@agi-fans/dsh-tui/command-loop'
249
257
 
250
- - id: tui-command-model
251
- name: '@agi-fans/dsh-tui/command-model'
258
+ - id: tui-command-model
259
+ name: '@agi-fans/dsh-tui/command-model'
252
260
 
253
- - id: tui-command-auth
254
- name: '@agi-fans/dsh-tui/command-auth'
261
+ - id: tui-command-auth
262
+ name: '@agi-fans/dsh-tui/command-auth'
255
263
 
256
- - id: tui-command-export
257
- name: '@agi-fans/dsh-tui/command-export'
264
+ - id: tui-command-export
265
+ name: '@agi-fans/dsh-tui/command-export'
258
266
 
259
- - id: tui-command-integrations
260
- name: '@agi-fans/dsh-tui/command-integrations'
267
+ - id: tui-command-integrations
268
+ name: '@agi-fans/dsh-tui/command-integrations'
261
269
 
262
- - id: tui-startup-notices
263
- name: '@agi-fans/dsh-tui/startup-notices'
270
+ - id: tui-startup-notices
271
+ name: '@agi-fans/dsh-tui/startup-notices'
264
272
 
265
- - id: runner
266
- name: '@agi-fans/dsh-tui/runner'
273
+ - id: runner
274
+ name: '@agi-fans/dsh-tui/runner'
package/lib/args.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * omdsh argument parsing: one optional prompt (positional words joined)
3
- * plus --model/--provider overrides, durable --resume, and help/version.
2
+ * omdsh argument parsing: one optional prompt, --model/--provider
3
+ * overrides, durable --resume, --dump-config, `omdsh plugin`, and help/version.
4
4
  * @module @agi-fans/oh-my-dsh
5
5
  */
6
6
  export interface OmdshInvocation {
@@ -12,6 +12,12 @@ export interface OmdshInvocation {
12
12
  provider: string | undefined;
13
13
  /** Durable session selected by --resume/-r. */
14
14
  resume: string | undefined;
15
+ /** Print the composed plugin tree and exit. */
16
+ dumpConfig: boolean;
17
+ /** `omdsh plugin` forwarded the remaining arguments to pnpm. */
18
+ plugin: boolean;
19
+ /** pnpm arguments after `omdsh plugin`. */
20
+ pluginArgs: string[];
15
21
  /** --help requested. */
16
22
  help: boolean;
17
23
  }