dsh-patch-edit-plus 0.2.0 → 0.2.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/CHANGELOG.md +11 -0
- package/CHANGELOG.zh.md +11 -0
- package/README.ja.md +4 -5
- package/README.ko.md +4 -5
- package/README.md +5 -5
- package/README.zh.md +5 -5
- package/dsh.plugin.json +2 -2
- package/lib/config.js +2 -10
- package/lib/index.js +36 -18
- package/lib/types/config.d.ts +3 -38
- package/lib/types/index.d.ts +12 -15
- package/package.json +13 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.2] — 2026-09-29
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- **DSH line split**: this release serves the `0.1.5-rc` segment only — `peerDependencies`/`engines.dsh` capped to `>=0.1.5-rc.1 <0.1.6-0` (both manifests), published under the `dsh-0.1.5` dist-tag. `0.1.2-rc.1` ~ `0.1.4` remain served by the published `0.1.2` (main); `0.1.7` by `dsh-0.1.7` (v0.2.1+); `0.2.0` by `dsh-0.2.0` (v0.3.0+).
|
|
7
|
+
- devDependencies 4x `@deepseek-ai/dsh-*` `0.1.2-rc.1` → `0.1.5-rc.3`: the type baseline now matches the hosts this line serves (the stale `0.1.2` pin was the "fake green" pattern — a baseline older than the served line can mask real contract breaks).
|
|
8
|
+
- Docs x4 (README/INSTALL): compatibility matrix re-based to the `0.1.5-rc` segment.
|
|
9
|
+
|
|
10
|
+
### Verified
|
|
11
|
+
- No source changes required: `ShellExecutor.run(spec)` is intact across `0.1.5-rc.1`–`rc.3` (the `run` → `execute` rename lands in the 0.1.6→0.1.7 window), and the imperative settings fallback (`settings.register` / `installSection`) still exists on 0.1.5 hosts.
|
|
12
|
+
- build / typecheck / test (94) / lint / smoke / `typecheck:0.1.5` (static proof against real `0.1.5-rc.2` peers) all green; lockfile regenerated against `0.1.5-rc.3`.
|
|
13
|
+
|
|
3
14
|
## [0.1.2] — 2026-09-19
|
|
4
15
|
|
|
5
16
|
### Fixed
|
package/CHANGELOG.zh.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## [0.2.2] — 2026-09-29
|
|
4
|
+
|
|
5
|
+
### 变更
|
|
6
|
+
- **DSH 线拆分**:本版本只服务 `0.1.5-rc` 线段——`peerDependencies`/`engines.dsh` 封顶到 `>=0.1.5-rc.1 <0.1.6-0`(双清单),经 `dsh-0.1.5` dist-tag 发布。`0.1.2-rc.1` ~ `0.1.4` 仍由已发布的 `0.1.2`(main)服务;`0.1.7` 由 `dsh-0.1.7`(v0.2.1+)服务;`0.2.0` 由 `dsh-0.2.0`(v0.3.0+)服务。
|
|
7
|
+
- devDependencies 4 项 `@deepseek-ai/dsh-*` `0.1.2-rc.1` → `0.1.5-rc.3`:类型基线与本线服务的宿主对齐(过期的 `0.1.2` 钉版正是「假绿」形态——基线早于服务线会掩盖真实契约断裂)。
|
|
8
|
+
- 文档 ×4(README/INSTALL):兼容矩阵重基于 `0.1.5-rc` 线段。
|
|
9
|
+
|
|
10
|
+
### 验证
|
|
11
|
+
- 无需源码改动:`ShellExecutor.run(spec)` 在 `0.1.5-rc.1`–`rc.3` 全程未变(`run` → `execute` 改名落在 0.1.6→0.1.7 区间),且 0.1.5 宿主仍有命令式设置回退(`settings.register` / `installSection`)。
|
|
12
|
+
- build / typecheck / test(94)/ lint / smoke / `typecheck:0.1.5`(对真实 `0.1.5-rc.2` peer 静态核验)全绿;lockfile 按 `0.1.5-rc.3` 重新生成。
|
|
13
|
+
|
|
3
14
|
## [0.1.2] — 2026-09-19
|
|
4
15
|
|
|
5
16
|
### 修复
|
package/README.ja.md
CHANGED
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
| DSH バージョン | ステータス | 備考 |
|
|
8
8
|
|---|---|---|
|
|
9
|
-
| `0.1.
|
|
10
|
-
| `0.1.
|
|
11
|
-
| `0.1.5-rc.2` | ✅ 静的検証済み | `npm run typecheck:0.1.5` は実際の `0.1.5-rc.2` ピアパッケージに対して `src/` を型チェックします。`readByteRange` の使用はなく、0.1.5 専用の PTC 識別子もありません。 |
|
|
9
|
+
| `0.1.5-rc.1+` | ✅ サポート対象(本ライン、v0.2.2+) | 型ベースラインを実在の `0.1.5-rc.3` ピアに固定し、`peerDependencies`/`engines.dsh` は `>=0.1.5-rc.1 <0.1.6-0` にキャップ。`dsh-0.1.5` dist-tag で公開。 |
|
|
10
|
+
| `0.1.2-rc.1` ~ `0.1.4` | ↗ メンテナンスライン | 公開済みの `0.1.2`(main ブランチ)が担います。`0.1.6+` は別契約(shell の `run` → `execute`)であり、compat/0.1.7・compat/0.2.0 ラインが担います。 |
|
|
12
11
|
|
|
13
12
|
設定の登録はデュアル API フォールバック(0.1.2 以降では `settings.installSection`、旧ホストでは `settings.register`)を使用します。
|
|
14
13
|
|
|
@@ -109,8 +108,8 @@ dsh web --dump-config # verify the plugin row appears
|
|
|
109
108
|
|
|
110
109
|
```bash
|
|
111
110
|
npm install
|
|
112
|
-
npm run typecheck # against 0.1.
|
|
113
|
-
npm run typecheck:0.1.5 #
|
|
111
|
+
npm run typecheck # against 0.1.5-rc.3 peers (devDependencies)
|
|
112
|
+
npm run typecheck:0.1.5 # 実在の 0.1.5-rc.2 ピアに対する静的クロス検証
|
|
114
113
|
npm test # vitest, 90 tests
|
|
115
114
|
npm run lint
|
|
116
115
|
npm run build # lib/
|
package/README.ko.md
CHANGED
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
| DSH 버전 | 상태 | 비고 |
|
|
8
8
|
|---|---|---|
|
|
9
|
-
| `0.1.
|
|
10
|
-
| `0.1.
|
|
11
|
-
| `0.1.5-rc.2` | ✅ 정적 검증 완료 | `npm run typecheck:0.1.5`는 실제 `0.1.5-rc.2` peer 패키지를 대상으로 `src/`의 타입을 검사합니다. `readByteRange`를 사용하지 않으며, 0.1.5 전용 PTC 식별자도 없습니다. |
|
|
9
|
+
| `0.1.5-rc.1+` | ✅ 지원됨(본 라인, v0.2.2+) | 타입 베이스라인을 실제 `0.1.5-rc.3` peer에 고정하고, `peerDependencies`/`engines.dsh`는 `>=0.1.5-rc.1 <0.1.6-0`으로 제한합니다. `dsh-0.1.5` dist-tag로 게시됩니다. |
|
|
10
|
+
| `0.1.2-rc.1` ~ `0.1.4` | ↗ 유지보수 라인 | 게시된 `0.1.2`(main 브랜치)가 담당합니다. `0.1.6+`은 별도 계약(shell `run` → `execute`)이며 compat/0.1.7·compat/0.2.0 라인이 지원합니다. |
|
|
12
11
|
|
|
13
12
|
설정 등록은 이중 API 폴백을 사용합니다(0.1.2+ 에서는 `settings.installSection`, 이전 호스트에서는 `settings.register`).
|
|
14
13
|
|
|
@@ -109,8 +108,8 @@ dsh web --dump-config # verify the plugin row appears
|
|
|
109
108
|
|
|
110
109
|
```bash
|
|
111
110
|
npm install
|
|
112
|
-
npm run typecheck # against 0.1.
|
|
113
|
-
npm run typecheck:0.1.5 #
|
|
111
|
+
npm run typecheck # against 0.1.5-rc.3 peers (devDependencies)
|
|
112
|
+
npm run typecheck:0.1.5 # 실제 0.1.5-rc.2 peer 대상 정적 교차 검증
|
|
114
113
|
npm test # vitest, 90 tests
|
|
115
114
|
npm run lint
|
|
116
115
|
npm run build # lib/
|
package/README.md
CHANGED
|
@@ -6,10 +6,10 @@ Patch-style file editing for [DeepSeek Harness (DSH)](https://github.com/deepsee
|
|
|
6
6
|
|
|
7
7
|
| DSH version | Status | Notes |
|
|
8
8
|
|---|---|---|
|
|
9
|
-
| `0.1.
|
|
10
|
-
| `0.1.2-rc.1` ~ `0.1.
|
|
9
|
+
| `0.1.5-rc.1+` | ✅ supported (this line, v0.2.2+) | Type baseline pinned to the real `0.1.5-rc.3` peers; `peerDependencies`/`engines.dsh` capped to `>=0.1.5-rc.1 <0.1.6-0`. Published under the `dsh-0.1.5` dist-tag. |
|
|
10
|
+
| `0.1.2-rc.1` ~ `0.1.4` | ↗ maintenance line | Served by the published `0.1.2` (main branch). `0.1.6+` is a different contract (shell `run` → `execute`) and is served by the compat/0.1.7 and compat/0.2.0 lines. |
|
|
11
11
|
|
|
12
|
-
Settings
|
|
12
|
+
Settings registration uses the dual-API fallback (`settings.installSection` on 0.1.2+, `settings.register` on older hosts).
|
|
13
13
|
|
|
14
14
|
## Why patch at all? (tool routing guide)
|
|
15
15
|
|
|
@@ -108,8 +108,8 @@ Enable with `allowCodexPatch: true`. When a Codex patch arrives while disabled,
|
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
110
|
npm install
|
|
111
|
-
npm run typecheck # against 0.1.
|
|
112
|
-
npm run typecheck:0.1.5 # against 0.1.5-rc.2 peers
|
|
111
|
+
npm run typecheck # against 0.1.5-rc.3 peers (devDependencies)
|
|
112
|
+
npm run typecheck:0.1.5 # static cross-proof against real 0.1.5-rc.2 peers
|
|
113
113
|
npm test # vitest, 90 tests
|
|
114
114
|
npm run lint
|
|
115
115
|
npm run build # lib/
|
package/README.zh.md
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
| DSH 版本 | 状态 | 说明 |
|
|
8
8
|
|---|---|---|
|
|
9
|
-
| `0.1.
|
|
10
|
-
| `0.1.2-rc.1` ~ `0.1.
|
|
9
|
+
| `0.1.5-rc.1+` | ✅ 支持(本线,v0.2.2+) | 类型基线钉在真实 `0.1.5-rc.3` peer 包;`peerDependencies`/`engines.dsh` 封顶到 `>=0.1.5-rc.1 <0.1.6-0`。经 `dsh-0.1.5` dist-tag 发布。 |
|
|
10
|
+
| `0.1.2-rc.1` ~ `0.1.4` | ↗ 维护线 | 由已发布的 `0.1.2`(main 分支)服务。`0.1.6+` 是另一套契约(shell `run` → `execute`),由 compat/0.1.7 与 compat/0.2.0 线服务。 |
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
settings 注册走双 API 回退:0.1.2+ 的 `settings.installSection` 优先,旧版回退 `settings.register`。
|
|
13
13
|
|
|
14
14
|
## 工具路由指引(为什么该用谁)
|
|
15
15
|
|
|
@@ -107,8 +107,8 @@ dsh web --dump-config # 确认插件行出现
|
|
|
107
107
|
|
|
108
108
|
```bash
|
|
109
109
|
npm install
|
|
110
|
-
npm run typecheck # 针对 0.1.
|
|
111
|
-
npm run typecheck:0.1.5 #
|
|
110
|
+
npm run typecheck # 针对 0.1.5-rc.3 peer 包(devDependencies)
|
|
111
|
+
npm run typecheck:0.1.5 # 对真实 0.1.5-rc.2 peer 包做交叉静态核验
|
|
112
112
|
npm test # vitest,90 个用例
|
|
113
113
|
npm run lint
|
|
114
114
|
npm run build # lib/
|
package/dsh.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-patch-edit-plus",
|
|
3
3
|
"name": "dsh-patch-edit-plus",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.2",
|
|
5
5
|
"description": {
|
|
6
6
|
"en": "Patch-style file editing: one apply_patch tool for git/unified diff (default) and Codex apply_patch syntax (opt-in), with all-or-nothing application and sandbox-aware delete/move.",
|
|
7
7
|
"zh": "补丁风格文件编辑:单个 apply_patch 工具,接受 git/unified diff(默认)与 Codex apply_patch 语法(可选开启),全量验证后原子应用,删除/移动走沙箱感知 shell。"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"engines": {
|
|
16
|
-
"dsh": ">=0.1.
|
|
16
|
+
"dsh": ">=0.1.5-rc.1 <0.1.6-0"
|
|
17
17
|
},
|
|
18
18
|
"components": {
|
|
19
19
|
"host": "lib/index.js"
|
package/lib/config.js
CHANGED
|
@@ -12,7 +12,7 @@ export const Config = z.object({
|
|
|
12
12
|
conflictPolicy: z.union(['rename', 'skip', 'fail']).default('rename'),
|
|
13
13
|
renameSuffix: z.string().default('_1'),
|
|
14
14
|
allowUnifiedDiff: z.boolean().default(true),
|
|
15
|
-
allowCodexPatch: z.boolean().default(false)
|
|
15
|
+
allowCodexPatch: z.boolean().default(false),
|
|
16
16
|
deleteBackend: z.union(['shell', 'none']).default('shell'),
|
|
17
17
|
shellDialect: z.union(['auto', 'posix', 'pwsh']).default('auto'),
|
|
18
18
|
deleteCommand: z.string(),
|
|
@@ -23,14 +23,6 @@ export const Config = z.object({
|
|
|
23
23
|
maxPatchBytes: z.number().step(1).min(1024).default(512 * 1024),
|
|
24
24
|
maxDiffBytes: z.number().step(1).min(256).default(16 * 1024),
|
|
25
25
|
});
|
|
26
|
-
/** Read a `.volatile()` field: a live ref on 0.1.7+, a plain boolean otherwise. */
|
|
27
|
-
export function readVolatileBoolean(value, fallback) {
|
|
28
|
-
if (typeof value === 'boolean')
|
|
29
|
-
return value;
|
|
30
|
-
if (value && typeof value.get === 'function')
|
|
31
|
-
return Boolean(value.get());
|
|
32
|
-
return fallback;
|
|
33
|
-
}
|
|
34
26
|
/** Fill user config with defaults; `undefined`/null entries fall back too. */
|
|
35
27
|
export function resolveConfig(config) {
|
|
36
28
|
const c = config ?? {};
|
|
@@ -39,7 +31,7 @@ export function resolveConfig(config) {
|
|
|
39
31
|
conflictPolicy: c.conflictPolicy ?? 'rename',
|
|
40
32
|
renameSuffix: typeof c.renameSuffix === 'string' ? c.renameSuffix : '_1',
|
|
41
33
|
allowUnifiedDiff: c.allowUnifiedDiff ?? true,
|
|
42
|
-
allowCodexPatch:
|
|
34
|
+
allowCodexPatch: c.allowCodexPatch ?? false,
|
|
43
35
|
deleteBackend: c.deleteBackend ?? 'shell',
|
|
44
36
|
shellDialect: c.shellDialect ?? 'auto',
|
|
45
37
|
deleteCommand: typeof c.deleteCommand === 'string' && c.deleteCommand !== '' ? c.deleteCommand : undefined,
|
package/lib/index.js
CHANGED
|
@@ -4,15 +4,14 @@
|
|
|
4
4
|
* One `apply_patch` tool accepting git/unified diff (default) and Codex
|
|
5
5
|
* `apply_patch` syntax (opt-in). All-or-nothing application through the
|
|
6
6
|
* official fs write-intent dance; delete/move through the sandbox-aware
|
|
7
|
-
* shell.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 0.1.2-rc.1 ~ 0.1.5-rc.2 line stays on its maintenance branch.
|
|
7
|
+
* shell. Compatible with DSH 0.1.2-rc.1 through 0.1.5-rc.2: the tool
|
|
8
|
+
* authoring contract is byte-identical across those versions, so a single
|
|
9
|
+
* code path serves both; only settings registration needs the dual-API
|
|
10
|
+
* fallback (`installSection` first, `register` second).
|
|
12
11
|
*
|
|
13
12
|
* @module dsh-patch-edit-plus
|
|
14
13
|
*/
|
|
15
|
-
import { resolveConfig } from './config.js';
|
|
14
|
+
import { Config, resolveConfig } from './config.js';
|
|
16
15
|
import { registerApplyPatchTool } from './register.js';
|
|
17
16
|
/** Cordis plugin name used by Loader diagnostics. */
|
|
18
17
|
export const name = 'dsh-patch-edit-plus';
|
|
@@ -32,21 +31,26 @@ export const name = 'dsh-patch-edit-plus';
|
|
|
32
31
|
* in every profile that has no shell capability.
|
|
33
32
|
*/
|
|
34
33
|
export const inject = ['tools', 'fs'];
|
|
35
|
-
export { Config } from './config.js';
|
|
36
34
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
35
|
+
* Settings namespace. Must match dsh-settings `NAMESPACE_PATTERN`
|
|
36
|
+
* (`/^[a-z][a-z0-9-]*$/`) on every target version: letters, digits and
|
|
37
|
+
* hyphens only — an underscore made `register()` throw before anything
|
|
38
|
+
* persisted, so no migration is needed.
|
|
41
39
|
*/
|
|
40
|
+
export const SETTINGS_NAMESPACE = 'patch-edit-plus';
|
|
41
|
+
export { Config };
|
|
42
|
+
/** Register the tool and the settings namespace. Every registration is scoped to this plugin. */
|
|
42
43
|
export function apply(ctx, config) {
|
|
43
|
-
// 组合条目(0.1.7 起 volatile 字段在其中是 live 引用):rejudge 每次整体
|
|
44
|
-
// 重解析一次,一次调用内是同一份快照;跨调用的最新值由事件驱动重取。
|
|
45
44
|
const compositionEntry = config ?? {};
|
|
45
|
+
// 权威来源:设置层挂载时是解析后的 scope,否则是组合条目。
|
|
46
|
+
// installSection 保证在每次匹配的 onChange 之前先调用 setSource(attach 与 detach 各一次)。
|
|
47
|
+
let readSource = () => compositionEntry;
|
|
46
48
|
let disposer = null;
|
|
49
|
+
// 登记级 key。工具「描述」把可用语法固化进去了(tool.ts 拼 `Accepts ${styles}`),
|
|
50
|
+
// 所以判定必须覆盖整份 resolved config,而不是只看 allowCodexPatch。
|
|
47
51
|
let registeredKey = null;
|
|
48
52
|
const rejudge = () => {
|
|
49
|
-
const next = resolveConfig(
|
|
53
|
+
const next = resolveConfig(readSource());
|
|
50
54
|
const key = JSON.stringify(next);
|
|
51
55
|
if (key === registeredKey)
|
|
52
56
|
return;
|
|
@@ -62,9 +66,23 @@ export function apply(ctx, config) {
|
|
|
62
66
|
registeredKey = null;
|
|
63
67
|
};
|
|
64
68
|
});
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
ctx.inject(['settings'], (settingsCtx) => {
|
|
70
|
+
const settings = settingsCtx.settings
|
|
71
|
+
?? settingsCtx;
|
|
72
|
+
if (typeof settings?.installSection === 'function') {
|
|
73
|
+
settings.installSection(ctx, SETTINGS_NAMESPACE, Config, compositionEntry, {
|
|
74
|
+
setSource: (current) => { readSource = current; },
|
|
75
|
+
onChange: () => { rejudge(); },
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (typeof settings?.register === 'function') {
|
|
80
|
+
const scope = settings.register(SETTINGS_NAMESPACE, Config, { base: compositionEntry });
|
|
81
|
+
if (scope !== undefined) {
|
|
82
|
+
readSource = () => scope.get();
|
|
83
|
+
scope.watch(() => { rejudge(); });
|
|
84
|
+
rejudge();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
69
87
|
});
|
|
70
88
|
}
|
package/lib/types/config.d.ts
CHANGED
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
* @module dsh-patch-edit-plus/config
|
|
7
7
|
*/
|
|
8
8
|
import z from '@deepseek-ai/schemastery';
|
|
9
|
-
import type { Volatile } from '@deepseek-ai/cosmokit';
|
|
10
9
|
/** What to do when the configured tool name is already taken at registration. */
|
|
11
10
|
export type ConflictPolicy = 'rename' | 'skip' | 'fail';
|
|
12
11
|
/** Backend used for Delete/Move operations (`ctx.fs` has no delete/move). */
|
|
@@ -23,10 +22,8 @@ export interface Config {
|
|
|
23
22
|
renameSuffix?: string;
|
|
24
23
|
/** Accept git/unified diff patches. Defaults to true. */
|
|
25
24
|
allowUnifiedDiff?: boolean;
|
|
26
|
-
/** Accept Codex `apply_patch` syntax. Defaults to false.
|
|
27
|
-
|
|
28
|
-
* field — always read it through `readVolatileBoolean`, never cache the ref. */
|
|
29
|
-
allowCodexPatch?: boolean | Volatile<boolean>;
|
|
25
|
+
/** Accept Codex `apply_patch` syntax. Defaults to false. */
|
|
26
|
+
allowCodexPatch?: boolean;
|
|
30
27
|
/** Delete/Move backend. Defaults to `shell`. `none` rejects Delete/Move with a structured error. */
|
|
31
28
|
deleteBackend?: DeleteBackend;
|
|
32
29
|
/** Shell dialect for the constant delete/move templates. Defaults to `auto` (pwsh on win32). */
|
|
@@ -47,37 +44,7 @@ export interface Config {
|
|
|
47
44
|
maxDiffBytes?: number;
|
|
48
45
|
}
|
|
49
46
|
/** Schemastery schema for Loader defaults and generated configuration docs. */
|
|
50
|
-
export declare const Config: z<
|
|
51
|
-
toolName: z<string, string, "defined">;
|
|
52
|
-
conflictPolicy: z<"rename" | "skip" | "fail", "rename" | "skip" | "fail", "defined">;
|
|
53
|
-
renameSuffix: z<string, string, "defined">;
|
|
54
|
-
allowUnifiedDiff: z<boolean, boolean, "defined">;
|
|
55
|
-
allowCodexPatch: z<boolean, boolean, "volatile-defined">;
|
|
56
|
-
deleteBackend: z<"shell" | "none", "shell" | "none", "defined">;
|
|
57
|
-
shellDialect: z<"auto" | "posix" | "pwsh", "auto" | "posix" | "pwsh", "defined">;
|
|
58
|
-
deleteCommand: z<string, string, "plain">;
|
|
59
|
-
moveCommand: z<string, string, "plain">;
|
|
60
|
-
dryRunByDefault: z<boolean, boolean, "defined">;
|
|
61
|
-
followSymlinks: z<boolean, boolean, "defined">;
|
|
62
|
-
maxFiles: z<number, number, "defined">;
|
|
63
|
-
maxPatchBytes: z<number, number, "defined">;
|
|
64
|
-
maxDiffBytes: z<number, number, "defined">;
|
|
65
|
-
}>>, Schemastery.ObjectT<NoInfer<{
|
|
66
|
-
toolName: z<string, string, "defined">;
|
|
67
|
-
conflictPolicy: z<"rename" | "skip" | "fail", "rename" | "skip" | "fail", "defined">;
|
|
68
|
-
renameSuffix: z<string, string, "defined">;
|
|
69
|
-
allowUnifiedDiff: z<boolean, boolean, "defined">;
|
|
70
|
-
allowCodexPatch: z<boolean, boolean, "volatile-defined">;
|
|
71
|
-
deleteBackend: z<"shell" | "none", "shell" | "none", "defined">;
|
|
72
|
-
shellDialect: z<"auto" | "posix" | "pwsh", "auto" | "posix" | "pwsh", "defined">;
|
|
73
|
-
deleteCommand: z<string, string, "plain">;
|
|
74
|
-
moveCommand: z<string, string, "plain">;
|
|
75
|
-
dryRunByDefault: z<boolean, boolean, "defined">;
|
|
76
|
-
followSymlinks: z<boolean, boolean, "defined">;
|
|
77
|
-
maxFiles: z<number, number, "defined">;
|
|
78
|
-
maxPatchBytes: z<number, number, "defined">;
|
|
79
|
-
maxDiffBytes: z<number, number, "defined">;
|
|
80
|
-
}>>, "plain">;
|
|
47
|
+
export declare const Config: z<Config>;
|
|
81
48
|
/** Fully-resolved configuration used by the tool body. */
|
|
82
49
|
export interface ResolvedConfig {
|
|
83
50
|
toolName: string;
|
|
@@ -95,7 +62,5 @@ export interface ResolvedConfig {
|
|
|
95
62
|
maxPatchBytes: number;
|
|
96
63
|
maxDiffBytes: number;
|
|
97
64
|
}
|
|
98
|
-
/** Read a `.volatile()` field: a live ref on 0.1.7+, a plain boolean otherwise. */
|
|
99
|
-
export declare function readVolatileBoolean(value: boolean | Volatile<boolean> | undefined, fallback: boolean): boolean;
|
|
100
65
|
/** Fill user config with defaults; `undefined`/null entries fall back too. */
|
|
101
66
|
export declare function resolveConfig(config: Config | undefined): ResolvedConfig;
|
package/lib/types/index.d.ts
CHANGED
|
@@ -4,21 +4,16 @@
|
|
|
4
4
|
* One `apply_patch` tool accepting git/unified diff (default) and Codex
|
|
5
5
|
* `apply_patch` syntax (opt-in). All-or-nothing application through the
|
|
6
6
|
* official fs write-intent dance; delete/move through the sandbox-aware
|
|
7
|
-
* shell.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 0.1.2-rc.1 ~ 0.1.5-rc.2 line stays on its maintenance branch.
|
|
7
|
+
* shell. Compatible with DSH 0.1.2-rc.1 through 0.1.5-rc.2: the tool
|
|
8
|
+
* authoring contract is byte-identical across those versions, so a single
|
|
9
|
+
* code path serves both; only settings registration needs the dual-API
|
|
10
|
+
* fallback (`installSection` first, `register` second).
|
|
12
11
|
*
|
|
13
12
|
* @module dsh-patch-edit-plus
|
|
14
13
|
*/
|
|
15
14
|
import type { Context } from '@deepseek-ai/cordis';
|
|
15
|
+
import { Config } from './config.js';
|
|
16
16
|
import type { Config as PluginConfig } from './config.js';
|
|
17
|
-
declare module '@deepseek-ai/cordis' {
|
|
18
|
-
interface Events {
|
|
19
|
-
'loader/volatile-update': (paths: string[]) => void;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
17
|
/** Cordis plugin name used by Loader diagnostics. */
|
|
23
18
|
export declare const name = "dsh-patch-edit-plus";
|
|
24
19
|
/**
|
|
@@ -37,11 +32,13 @@ export declare const name = "dsh-patch-edit-plus";
|
|
|
37
32
|
* in every profile that has no shell capability.
|
|
38
33
|
*/
|
|
39
34
|
export declare const inject: string[];
|
|
40
|
-
export { Config } from './config.js';
|
|
41
35
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
36
|
+
* Settings namespace. Must match dsh-settings `NAMESPACE_PATTERN`
|
|
37
|
+
* (`/^[a-z][a-z0-9-]*$/`) on every target version: letters, digits and
|
|
38
|
+
* hyphens only — an underscore made `register()` throw before anything
|
|
39
|
+
* persisted, so no migration is needed.
|
|
46
40
|
*/
|
|
41
|
+
export declare const SETTINGS_NAMESPACE = "patch-edit-plus";
|
|
42
|
+
export { Config };
|
|
43
|
+
/** Register the tool and the settings namespace. Every registration is scoped to this plugin. */
|
|
47
44
|
export declare function apply(ctx: Context, config?: PluginConfig): void;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-patch-edit-plus",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "Patch-style file editing for DeepSeek Harness: one apply_patch tool accepting git/unified diff (default) and Codex apply_patch syntax (opt-in), with all-or-nothing application, read-before-write intent dance, sandbox-aware delete/move,
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "Patch-style file editing for DeepSeek Harness: one apply_patch tool accepting git/unified diff (default) and Codex apply_patch syntax (opt-in), with all-or-nothing application, read-before-write intent dance, sandbox-aware delete/move, and 0.1.5-rc line compatibility (dsh-0.1.5 dist-tag).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
},
|
|
48
48
|
"engines": {
|
|
49
49
|
"node": ">=20",
|
|
50
|
-
"dsh": ">=0.1.
|
|
50
|
+
"dsh": ">=0.1.5-rc.1 <0.1.6-0"
|
|
51
51
|
},
|
|
52
52
|
"license": "MIT",
|
|
53
53
|
"keywords": [
|
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
],
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
65
|
-
"@deepseek-ai/dsh-fs": ">=0.1.
|
|
66
|
-
"@deepseek-ai/dsh-sandbox": ">=0.1.
|
|
67
|
-
"@deepseek-ai/dsh-shell": ">=0.1.
|
|
68
|
-
"@deepseek-ai/dsh-tools": ">=0.1.
|
|
65
|
+
"@deepseek-ai/dsh-fs": ">=0.1.5-rc.1 <0.1.6-0",
|
|
66
|
+
"@deepseek-ai/dsh-sandbox": ">=0.1.5-rc.1 <0.1.6-0",
|
|
67
|
+
"@deepseek-ai/dsh-shell": ">=0.1.5-rc.1 <0.1.6-0",
|
|
68
|
+
"@deepseek-ai/dsh-tools": ">=0.1.5-rc.1 <0.1.6-0"
|
|
69
69
|
},
|
|
70
70
|
"peerDependenciesMeta": {
|
|
71
71
|
"@deepseek-ai/cordis": {
|
|
@@ -85,23 +85,19 @@
|
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
88
|
+
"@deepseek-ai/schemastery": "^3.18.2"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
92
|
-
"@deepseek-ai/dsh-fs": "0.1.
|
|
93
|
-
"@deepseek-ai/dsh-sandbox": "0.1.
|
|
94
|
-
"@deepseek-ai/dsh-shell": "0.1.
|
|
95
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
92
|
+
"@deepseek-ai/dsh-fs": "0.1.5-rc.3",
|
|
93
|
+
"@deepseek-ai/dsh-sandbox": "0.1.5-rc.3",
|
|
94
|
+
"@deepseek-ai/dsh-shell": "0.1.5-rc.3",
|
|
95
|
+
"@deepseek-ai/dsh-tools": "0.1.5-rc.3",
|
|
96
96
|
"@eslint/js": "^9.0.0",
|
|
97
97
|
"@types/node": "^22.0.0",
|
|
98
98
|
"eslint": "^9.0.0",
|
|
99
99
|
"typescript": "^5.6.0",
|
|
100
100
|
"typescript-eslint": "^8.0.0",
|
|
101
|
-
"vitest": "^3.0.0"
|
|
102
|
-
"@deepseek-ai/schemastery": "^3.18.4"
|
|
103
|
-
},
|
|
104
|
-
"publishConfig": {
|
|
105
|
-
"tag": "dsh-0.1.7"
|
|
101
|
+
"vitest": "^3.0.0"
|
|
106
102
|
}
|
|
107
103
|
}
|