@xbzbing/dsh-git-panel 0.1.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/LICENSE +21 -0
- package/README.md +90 -0
- package/README_EN.md +90 -0
- package/cordis.patch.yml +12 -0
- package/icon.svg +15 -0
- package/lib/client.js +249 -0
- package/lib/host/actions.d.ts +16 -0
- package/lib/host/core.d.ts +69 -0
- package/lib/host/git.d.ts +62 -0
- package/lib/host/index.d.ts +45 -0
- package/lib/host/index.js +1022 -0
- package/lib/host/parser.d.ts +28 -0
- package/lib/host/queries.d.ts +3 -0
- package/lib/host/types.d.ts +289 -0
- package/lib/host/version.d.ts +40 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +91 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git output parsers: porcelain status, log, branch, numstat, name-status.
|
|
3
|
+
* Pure functions over raw stdout, no I/O.
|
|
4
|
+
*/
|
|
5
|
+
import type { GitBranch, GitChange, GitFileStat, GraphCommit, GitRef } from './types.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Parse `git status --porcelain=v1 -z`. A mixed XY (both non-space, e.g. MM)
|
|
8
|
+
* is split into a staged side (X) and an unstaged side (Y). Untracked (??) is
|
|
9
|
+
* a single unstaged entry. Real conflicts (UU/AA/DD…) stay one entry.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseStatus(stdout: string): GitChange[];
|
|
12
|
+
/**
|
|
13
|
+
* Parse a graph log emitted with the record format:
|
|
14
|
+
* %H%x1f%h%x1f%P%x1f%an%x1f%aI%x1f%D%x1f%s%x1e
|
|
15
|
+
* (unit sep 0x1f between fields, record sep 0x1e between commits.)
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseGraphLog(stdout: string): GraphCommit[];
|
|
18
|
+
/** Parse the `%D` decoration into structured refs. */
|
|
19
|
+
export declare function parseRefs(decoration: string): GitRef[];
|
|
20
|
+
/** Parse `git for-each-ref` local/remote branch lines: `name\0shortHash\0track`. */
|
|
21
|
+
export declare function parseBranches(stdout: string): GitBranch[];
|
|
22
|
+
/** Parse `git show --name-status -z` file lines into stats. */
|
|
23
|
+
export declare function parseNameStatus(stdout: string): GitFileStat[];
|
|
24
|
+
/** Sum `git diff --numstat` output: { insertions, deletions }. Binary rows ("-") skipped. */
|
|
25
|
+
export declare function sumNumstat(stdout: string): {
|
|
26
|
+
insertions: number;
|
|
27
|
+
deletions: number;
|
|
28
|
+
};
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-git-panel host wire data model — the authoritative type source.
|
|
3
|
+
* The client half (src/client/rpc.ts) reuses these types directly, so the
|
|
4
|
+
* wire contract has a single definition and cannot drift.
|
|
5
|
+
*/
|
|
6
|
+
/** Wire request: the browser sends only session identity, never a path. */
|
|
7
|
+
export interface GitSnapshotRequest {
|
|
8
|
+
readonly sessionId: string;
|
|
9
|
+
}
|
|
10
|
+
export type GitSnapshotResult = {
|
|
11
|
+
readonly ok: true;
|
|
12
|
+
readonly value: GitSnapshot;
|
|
13
|
+
} | {
|
|
14
|
+
readonly ok: false;
|
|
15
|
+
readonly error: GitFailure;
|
|
16
|
+
};
|
|
17
|
+
export type GitFailure = {
|
|
18
|
+
readonly code: 'session-not-found';
|
|
19
|
+
readonly sessionId: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly code: 'cwd-unavailable';
|
|
22
|
+
readonly sessionId: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly code: 'not-a-git-repo';
|
|
25
|
+
readonly cwd?: string;
|
|
26
|
+
readonly showInputPill?: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
readonly code: 'git-unavailable';
|
|
29
|
+
readonly detail: string;
|
|
30
|
+
} | {
|
|
31
|
+
readonly code: 'timeout';
|
|
32
|
+
};
|
|
33
|
+
/** Immutable snapshot of one repository's status at `checkedAt`. */
|
|
34
|
+
export interface GitSnapshot {
|
|
35
|
+
/** Realpath of the repository root (work tree top). */
|
|
36
|
+
readonly root: string;
|
|
37
|
+
/** Current branch name; null when detached. */
|
|
38
|
+
readonly branch: string | null;
|
|
39
|
+
/** Short HEAD hash; null when the repository has no commits (unborn). */
|
|
40
|
+
readonly head: string | null;
|
|
41
|
+
/** True when the repository has no commits yet. */
|
|
42
|
+
readonly unborn: boolean;
|
|
43
|
+
/** staged + modified + untracked > 0. */
|
|
44
|
+
readonly dirty: boolean;
|
|
45
|
+
readonly staged: number;
|
|
46
|
+
readonly modified: number;
|
|
47
|
+
readonly untracked: number;
|
|
48
|
+
readonly ahead: number;
|
|
49
|
+
readonly behind: number;
|
|
50
|
+
readonly lastCommit: GitCommit | null;
|
|
51
|
+
readonly changes: readonly GitChange[];
|
|
52
|
+
/** True when the change list was capped at maxChanges. */
|
|
53
|
+
readonly truncated: boolean;
|
|
54
|
+
/** Polling interval the client should use after this snapshot (0 = off). */
|
|
55
|
+
readonly refreshIntervalMs: number;
|
|
56
|
+
/** Whether the input-bar git marker pill should render (user preference). */
|
|
57
|
+
readonly showInputPill: boolean;
|
|
58
|
+
/** Epoch millis of the snapshot. */
|
|
59
|
+
readonly checkedAt: number;
|
|
60
|
+
}
|
|
61
|
+
export interface GitCommit {
|
|
62
|
+
readonly hash: string;
|
|
63
|
+
readonly shortHash: string;
|
|
64
|
+
readonly subject: string;
|
|
65
|
+
readonly author: string;
|
|
66
|
+
readonly dateIso: string;
|
|
67
|
+
}
|
|
68
|
+
/** A commit with parent links and ref decorations (graph rendering). */
|
|
69
|
+
export interface GraphCommit extends GitCommit {
|
|
70
|
+
readonly parents: readonly string[];
|
|
71
|
+
readonly refs: readonly GitRef[];
|
|
72
|
+
}
|
|
73
|
+
export interface GitRef {
|
|
74
|
+
readonly kind: 'branch' | 'remote' | 'tag';
|
|
75
|
+
readonly name: string;
|
|
76
|
+
/** True for the `HEAD -> name` current branch. */
|
|
77
|
+
readonly head: boolean;
|
|
78
|
+
}
|
|
79
|
+
export type GitChangeStatus = 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked' | 'conflicted' | 'typechange';
|
|
80
|
+
/**
|
|
81
|
+
* One changed-file entry. A mixed porcelain XY (e.g. MM/AM) is split into two
|
|
82
|
+
* entries: a `staged: true` side (X column) and a `staged: false` side (Y
|
|
83
|
+
* column), so the UI can list "Staged" vs "Changes" IDE-style.
|
|
84
|
+
*/
|
|
85
|
+
export interface GitChange {
|
|
86
|
+
readonly path: string;
|
|
87
|
+
readonly status: GitChangeStatus;
|
|
88
|
+
readonly staged: boolean;
|
|
89
|
+
readonly isDirectory: boolean;
|
|
90
|
+
}
|
|
91
|
+
export type GitAction = {
|
|
92
|
+
readonly kind: 'stage';
|
|
93
|
+
readonly paths: readonly string[];
|
|
94
|
+
} | {
|
|
95
|
+
readonly kind: 'stage-all';
|
|
96
|
+
} | {
|
|
97
|
+
readonly kind: 'unstage';
|
|
98
|
+
readonly paths: readonly string[];
|
|
99
|
+
} | {
|
|
100
|
+
readonly kind: 'unstage-all';
|
|
101
|
+
} | {
|
|
102
|
+
readonly kind: 'discard';
|
|
103
|
+
readonly paths: readonly string[];
|
|
104
|
+
} | {
|
|
105
|
+
readonly kind: 'commit';
|
|
106
|
+
readonly message: string;
|
|
107
|
+
/** Commit only these paths; absent/empty commits everything staged. */
|
|
108
|
+
readonly paths?: readonly string[];
|
|
109
|
+
/** True → git commit --amend (replace the previous commit). */
|
|
110
|
+
readonly amend?: boolean;
|
|
111
|
+
} | {
|
|
112
|
+
readonly kind: 'branch-checkout';
|
|
113
|
+
readonly name: string;
|
|
114
|
+
} | {
|
|
115
|
+
readonly kind: 'fetch';
|
|
116
|
+
};
|
|
117
|
+
export type GitErrorCode = 'session-not-found' | 'cwd-unavailable' | 'not-a-git-repo' | 'git-unavailable' | 'invalid-path' | 'invalid-name' | 'git-error' | 'timeout' | 'empty-message' | 'local-changes-block';
|
|
118
|
+
export type GitActionResult = {
|
|
119
|
+
readonly ok: true;
|
|
120
|
+
readonly snapshot: GitSnapshot;
|
|
121
|
+
readonly output?: string;
|
|
122
|
+
} | {
|
|
123
|
+
readonly ok: false;
|
|
124
|
+
readonly error: {
|
|
125
|
+
readonly code: GitErrorCode;
|
|
126
|
+
readonly message?: string;
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
export interface GitActionRequest {
|
|
130
|
+
readonly sessionId: string;
|
|
131
|
+
readonly action: GitAction;
|
|
132
|
+
}
|
|
133
|
+
export type GitQuery = {
|
|
134
|
+
readonly kind: 'history';
|
|
135
|
+
readonly limit: number;
|
|
136
|
+
readonly skip: number;
|
|
137
|
+
/** Optional ref filter (branch/remote/tag); absent = --all. */
|
|
138
|
+
readonly ref?: string;
|
|
139
|
+
/** Text search: 7+ hex chars = hash prefix jump; else message regex (-i -E). */
|
|
140
|
+
readonly search?: string;
|
|
141
|
+
/** Author filter (--author). */
|
|
142
|
+
readonly author?: string;
|
|
143
|
+
/** Date lower bound (--since). */
|
|
144
|
+
readonly since?: string;
|
|
145
|
+
} | {
|
|
146
|
+
readonly kind: 'diff';
|
|
147
|
+
readonly path: string;
|
|
148
|
+
readonly base: 'worktree' | 'staged';
|
|
149
|
+
readonly context?: number;
|
|
150
|
+
} | {
|
|
151
|
+
readonly kind: 'diff';
|
|
152
|
+
readonly path: string;
|
|
153
|
+
readonly base: 'commit';
|
|
154
|
+
readonly commit: string;
|
|
155
|
+
readonly context?: number;
|
|
156
|
+
} | {
|
|
157
|
+
readonly kind: 'image-diff';
|
|
158
|
+
readonly path: string;
|
|
159
|
+
readonly base: 'worktree' | 'staged';
|
|
160
|
+
} | {
|
|
161
|
+
readonly kind: 'image-diff';
|
|
162
|
+
readonly path: string;
|
|
163
|
+
readonly base: 'commit';
|
|
164
|
+
readonly commit: string;
|
|
165
|
+
} | {
|
|
166
|
+
readonly kind: 'show';
|
|
167
|
+
readonly ref: string;
|
|
168
|
+
} | {
|
|
169
|
+
readonly kind: 'branches';
|
|
170
|
+
} | {
|
|
171
|
+
readonly kind: 'tags';
|
|
172
|
+
} | {
|
|
173
|
+
readonly kind: 'authors';
|
|
174
|
+
} | {
|
|
175
|
+
readonly kind: 'last-commit-message';
|
|
176
|
+
} | {
|
|
177
|
+
readonly kind: 'worktree-stats';
|
|
178
|
+
};
|
|
179
|
+
/** One commit's changed-file line (from --name-status). */
|
|
180
|
+
export interface GitFileStat {
|
|
181
|
+
readonly path: string;
|
|
182
|
+
readonly status: GitChangeStatus;
|
|
183
|
+
}
|
|
184
|
+
export interface GitBranch {
|
|
185
|
+
readonly name: string;
|
|
186
|
+
readonly shortHash: string | null;
|
|
187
|
+
readonly ahead?: number;
|
|
188
|
+
readonly behind?: number;
|
|
189
|
+
}
|
|
190
|
+
/** Working-tree statistics for the changes page header. */
|
|
191
|
+
export interface WorktreeStats {
|
|
192
|
+
/** Distinct changed-file paths (staged ∪ modified ∪ untracked). */
|
|
193
|
+
readonly fileCount: number;
|
|
194
|
+
readonly staged: number;
|
|
195
|
+
readonly modified: number;
|
|
196
|
+
readonly untracked: number;
|
|
197
|
+
/** Summed added lines across worktree + index diff (binary skipped). */
|
|
198
|
+
readonly insertions: number;
|
|
199
|
+
/** Summed deleted lines. */
|
|
200
|
+
readonly deletions: number;
|
|
201
|
+
/** Max mtime (epoch ms) among changed files; null when none/unavailable. */
|
|
202
|
+
readonly lastChangeAt: number | null;
|
|
203
|
+
/** HEAD commit time ISO; null when unborn. */
|
|
204
|
+
readonly headCommittedAt: string | null;
|
|
205
|
+
}
|
|
206
|
+
export type GitQueryResult = {
|
|
207
|
+
readonly kind: 'history';
|
|
208
|
+
readonly commits: readonly GraphCommit[];
|
|
209
|
+
readonly total: number;
|
|
210
|
+
} | {
|
|
211
|
+
readonly kind: 'diff';
|
|
212
|
+
readonly path: string;
|
|
213
|
+
readonly text: string;
|
|
214
|
+
} | {
|
|
215
|
+
/**
|
|
216
|
+
* Old/new images for a binary image diff, as data URLs. The sides mirror
|
|
217
|
+
* what the text diff compares: worktree rows read index vs working file,
|
|
218
|
+
* staged rows read HEAD vs index, commit rows read parent vs commit.
|
|
219
|
+
*/
|
|
220
|
+
readonly kind: 'image-diff';
|
|
221
|
+
readonly path: string;
|
|
222
|
+
/** null → the extension is not a browser-renderable image. */
|
|
223
|
+
readonly mime: string | null;
|
|
224
|
+
/** Pre-change image; absent when that side does not exist (added/untracked/root). */
|
|
225
|
+
readonly old?: string;
|
|
226
|
+
/** Post-change image; absent when that side does not exist (deleted). */
|
|
227
|
+
readonly new?: string;
|
|
228
|
+
/** A side exceeded the byte cap, so no URLs are returned. */
|
|
229
|
+
readonly tooLarge?: true;
|
|
230
|
+
} | {
|
|
231
|
+
readonly kind: 'show';
|
|
232
|
+
readonly ref: string;
|
|
233
|
+
readonly commit: GitCommit | null;
|
|
234
|
+
/** Full commit body (without the subject line); right-pane comment. */
|
|
235
|
+
readonly body: string;
|
|
236
|
+
readonly stats: readonly GitFileStat[];
|
|
237
|
+
} | {
|
|
238
|
+
readonly kind: 'branches';
|
|
239
|
+
readonly current: string | null;
|
|
240
|
+
readonly defaultBranch: string | null;
|
|
241
|
+
readonly local: readonly GitBranch[];
|
|
242
|
+
readonly remote: readonly GitBranch[];
|
|
243
|
+
} | {
|
|
244
|
+
readonly kind: 'tags';
|
|
245
|
+
readonly tags: readonly GitBranch[];
|
|
246
|
+
} | {
|
|
247
|
+
readonly kind: 'authors';
|
|
248
|
+
readonly authors: readonly string[];
|
|
249
|
+
} | {
|
|
250
|
+
readonly kind: 'last-commit-message';
|
|
251
|
+
readonly message: string;
|
|
252
|
+
} | {
|
|
253
|
+
readonly kind: 'worktree-stats';
|
|
254
|
+
readonly stats: WorktreeStats;
|
|
255
|
+
};
|
|
256
|
+
export type GitQueryResponse = {
|
|
257
|
+
readonly ok: true;
|
|
258
|
+
readonly value: GitQueryResult;
|
|
259
|
+
} | {
|
|
260
|
+
readonly ok: false;
|
|
261
|
+
readonly error: {
|
|
262
|
+
readonly code: GitErrorCode;
|
|
263
|
+
readonly message?: string;
|
|
264
|
+
};
|
|
265
|
+
};
|
|
266
|
+
export interface GitQueryRequest {
|
|
267
|
+
readonly sessionId: string;
|
|
268
|
+
readonly query: GitQuery;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extensions the image-diff query serves, mapped to MIME types. Part of the
|
|
272
|
+
* query's contract, so both halves gate on this one list and cannot drift.
|
|
273
|
+
*/
|
|
274
|
+
export declare const IMAGE_MIME: Readonly<Record<string, string>>;
|
|
275
|
+
/** MIME for a path's extension; null when it is not a served image type. */
|
|
276
|
+
export declare function imageMimeFor(path: string): string | null;
|
|
277
|
+
export interface GitVersionRequest {
|
|
278
|
+
/** True → query the GitHub releases API; false/absent → local view only. */
|
|
279
|
+
readonly check?: boolean;
|
|
280
|
+
}
|
|
281
|
+
export interface GitVersionInfo {
|
|
282
|
+
readonly current: string;
|
|
283
|
+
readonly repositoryUrl?: string;
|
|
284
|
+
readonly latest?: string;
|
|
285
|
+
readonly updateAvailable: boolean;
|
|
286
|
+
readonly releaseUrl?: string;
|
|
287
|
+
readonly checkedRemote: boolean;
|
|
288
|
+
readonly error?: string;
|
|
289
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type VersionFetch = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export interface VersionInfo {
|
|
3
|
+
/** Version declared in this plugin's package.json. */
|
|
4
|
+
readonly current: string;
|
|
5
|
+
/** Browsable GitHub repository URL, or undefined when it cannot be derived. */
|
|
6
|
+
readonly repositoryUrl?: string;
|
|
7
|
+
/** Latest release tag reported by GitHub, without the leading "v". */
|
|
8
|
+
readonly latest?: string;
|
|
9
|
+
/** True only when a strictly newer release than {@link current} exists. */
|
|
10
|
+
readonly updateAvailable: boolean;
|
|
11
|
+
/** Browsable URL of the latest release, or undefined when unknown. */
|
|
12
|
+
readonly releaseUrl?: string;
|
|
13
|
+
/** True when the remote registry was queried (false for the local-only view). */
|
|
14
|
+
readonly checkedRemote: boolean;
|
|
15
|
+
/** Present when the remote check could not complete. */
|
|
16
|
+
readonly error?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Extract "git+https://…/owner/repo.git", "github:owner/repo", or "owner/repo" into { owner, repo }. */
|
|
19
|
+
export declare function parseRepository(repository: unknown): {
|
|
20
|
+
owner: string;
|
|
21
|
+
repo: string;
|
|
22
|
+
} | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Compare dotted numeric versions with basic prerelease handling; returns 1
|
|
25
|
+
* when a > b, -1 when a < b, 0 when equal. A release outranks a prerelease
|
|
26
|
+
* sharing the same core (e.g. 0.2.0 > 0.2.0-beta.1).
|
|
27
|
+
*/
|
|
28
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
29
|
+
/** Local-only view: current version + repository URL, no network access. */
|
|
30
|
+
export declare function readVersionInfo(options?: {
|
|
31
|
+
manifestPath?: string;
|
|
32
|
+
}): Promise<VersionInfo>;
|
|
33
|
+
/**
|
|
34
|
+
* Query the GitHub releases API for the latest tag and compare it to the
|
|
35
|
+
* bundled version. Failures are reported through `error` instead of throwing.
|
|
36
|
+
*/
|
|
37
|
+
export declare function checkLatestVersion(options?: {
|
|
38
|
+
manifestPath?: string;
|
|
39
|
+
fetchFn?: VersionFetch;
|
|
40
|
+
}): Promise<VersionInfo>;
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xbzbing/dsh-git-panel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DeepSeek Harness (dsh) plugin: an IDE-style Git panel in the Web GUI — branch/history overview, uncommitted changes with commit & amend, diff stats, and a zsh-style branch marker in the input bar.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"icon": "./icon.svg",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/xbzbing/dsh-git-panel.git"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
17
|
+
},
|
|
18
|
+
"main": "lib/host/index.js",
|
|
19
|
+
"types": "lib/host/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./lib/host/index.d.ts",
|
|
23
|
+
"default": "./lib/host/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./client": {
|
|
26
|
+
"default": "./lib/client.js"
|
|
27
|
+
},
|
|
28
|
+
"./locale/*.json": "./locale/*.json",
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"lib/client.js",
|
|
33
|
+
"lib/host",
|
|
34
|
+
"locale/*.json",
|
|
35
|
+
"icon.svg",
|
|
36
|
+
"cordis.patch.yml",
|
|
37
|
+
"README.md",
|
|
38
|
+
"README_EN.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "node build.mjs",
|
|
43
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
44
|
+
"test:unit": "node build.mjs && node --test --test-force-exit test/unit/*.test.mjs",
|
|
45
|
+
"test:e2e": "node build.mjs && node test/e2e/setup.mjs && node test/e2e/run.mjs && node test/e2e/run2.mjs",
|
|
46
|
+
"test": "npm run test:unit && npm run test:e2e",
|
|
47
|
+
"check": "npm run typecheck && npm run test"
|
|
48
|
+
},
|
|
49
|
+
"dsh": {
|
|
50
|
+
"bundle": {
|
|
51
|
+
"patch": "./cordis.patch.yml"
|
|
52
|
+
},
|
|
53
|
+
"client": {
|
|
54
|
+
"platform": "web",
|
|
55
|
+
"inject": [
|
|
56
|
+
"@deepseek-ai/dsh-client-connection",
|
|
57
|
+
"@deepseek-ai/dsh-client-locale",
|
|
58
|
+
"@deepseek-ai/dsh-client-ui-conversation"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"keywords": [
|
|
63
|
+
"dsh",
|
|
64
|
+
"deepseek-harness",
|
|
65
|
+
"plugin",
|
|
66
|
+
"git",
|
|
67
|
+
"web-ui",
|
|
68
|
+
"diff",
|
|
69
|
+
"commit"
|
|
70
|
+
],
|
|
71
|
+
"peerDependencies": {
|
|
72
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
73
|
+
"@deepseek-ai/dsh-session": ">=0.1.2-rc.1",
|
|
74
|
+
"@deepseek-ai/dsh-subprocess": ">=0.1.2-rc.1",
|
|
75
|
+
"@deepseek-ai/dsh-typert-protocol": ">=0.1.2-rc.1",
|
|
76
|
+
"@deepseek-ai/schemastery": ">=3.18.4"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"highlight.js": "11.11.1"
|
|
80
|
+
},
|
|
81
|
+
"devDependencies": {
|
|
82
|
+
"@types/node": "22.10.5",
|
|
83
|
+
"@types/react": "18.3.18",
|
|
84
|
+
"@types/react-dom": "18.3.5",
|
|
85
|
+
"esbuild": "0.24.2",
|
|
86
|
+
"playwright-core": "1.63.0",
|
|
87
|
+
"react": "18.3.1",
|
|
88
|
+
"react-dom": "18.3.1",
|
|
89
|
+
"typescript": "5.7.3"
|
|
90
|
+
}
|
|
91
|
+
}
|