@hunan36/dsh-git-flow 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +253 -2
- package/README.zh.md +262 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +2138 -0
- package/lib/index.js +1347 -0
- package/lib/types/client/BranchChip.d.ts +8 -0
- package/lib/types/client/BranchMenu.d.ts +27 -0
- package/lib/types/client/CommitDialog.d.ts +45 -0
- package/lib/types/client/GitFlowDialog.d.ts +37 -0
- package/lib/types/client/api.d.ts +42 -0
- package/lib/types/client/index.d.ts +14 -0
- package/lib/types/client/locales.d.ts +236 -0
- package/lib/types/client/styles.d.ts +12 -0
- package/lib/types/contract.d.ts +207 -0
- package/lib/types/git.d.ts +86 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/message.d.ts +27 -0
- package/lib/types/routes.d.ts +14 -0
- package/lib/types/service.d.ts +178 -0
- package/package.json +92 -4
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git process seam: one argument-array runner over `ctx.subprocess` plus the
|
|
3
|
+
* porcelain parsers the plugin needs. Nothing here touches the network or
|
|
4
|
+
* accepts a shell string, so a path from the browser can never become a
|
|
5
|
+
* command line.
|
|
6
|
+
*/
|
|
7
|
+
import type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess';
|
|
8
|
+
/** Structured failure codes; the browser half turns them into copy. */
|
|
9
|
+
export type GitErrorCode = 'git/not-installed' | 'git/not-a-repository' | 'git/timeout' | 'git/failed' | 'git/dirty-worktree' | 'git/detached-head' | 'git/invalid-input' | 'git/no-files-selected' | 'git/no-route' | 'git/develop-missing' | 'git/merge-conflict' | 'git/tag-exists' | 'git/gitflow-branch-required';
|
|
10
|
+
/** A git operation that cannot be represented as a normal exit code. */
|
|
11
|
+
export declare class GitError extends Error {
|
|
12
|
+
readonly code: GitErrorCode;
|
|
13
|
+
constructor(code: GitErrorCode, message: string);
|
|
14
|
+
}
|
|
15
|
+
/** One completed git invocation. */
|
|
16
|
+
export interface GitResult {
|
|
17
|
+
exitCode: number;
|
|
18
|
+
stdout: string;
|
|
19
|
+
stderr: string;
|
|
20
|
+
}
|
|
21
|
+
/** Turn `git status --porcelain=v2 --branch -z` into the facts the UI renders. */
|
|
22
|
+
export interface GitStatus {
|
|
23
|
+
/** Branch name, `'(detached)'` when detached, `'(unknown)'` in an empty repo. */
|
|
24
|
+
head: string;
|
|
25
|
+
oid: string;
|
|
26
|
+
/** Upstream ref name, when the branch tracks one. */
|
|
27
|
+
upstream?: string;
|
|
28
|
+
/** Commits ahead of / behind the upstream, when it tracks one. */
|
|
29
|
+
ahead: number;
|
|
30
|
+
behind: number;
|
|
31
|
+
/** Tracked changes plus untracked paths. */
|
|
32
|
+
files: GitFileEntry[];
|
|
33
|
+
}
|
|
34
|
+
/** One changed path in the worktree or index. */
|
|
35
|
+
export interface GitFileEntry {
|
|
36
|
+
/** Repository-relative path; for a rename this is the new path. */
|
|
37
|
+
path: string;
|
|
38
|
+
/** Renamed-from path, present only for `R` entries. */
|
|
39
|
+
oldPath?: string;
|
|
40
|
+
/** Index-vs-HEAD code (`'.'` when clean there). */
|
|
41
|
+
indexStatus: string;
|
|
42
|
+
/** Worktree-vs-index code (`'.'` when clean there). */
|
|
43
|
+
worktreeStatus: string;
|
|
44
|
+
/** True when the path already has staged content. */
|
|
45
|
+
staged: boolean;
|
|
46
|
+
/** True for `??` records. */
|
|
47
|
+
untracked: boolean;
|
|
48
|
+
/** True for `u` records. */
|
|
49
|
+
conflicted: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Run git without a shell and without ambient credentials leaking in.
|
|
53
|
+
* One instance per service; the executable is resolved lazily and cached.
|
|
54
|
+
*/
|
|
55
|
+
export declare class GitRunner {
|
|
56
|
+
private readonly subprocess;
|
|
57
|
+
private readonly timeoutMs;
|
|
58
|
+
private executable;
|
|
59
|
+
constructor(subprocess: SubprocessRuntime, timeoutMs: number);
|
|
60
|
+
private program;
|
|
61
|
+
/**
|
|
62
|
+
* @param cwd - directory the command runs in.
|
|
63
|
+
* @param args - git subcommand and flags; never interpolated into a shell.
|
|
64
|
+
* @returns exit code and collected streams; a non-zero exit is a result.
|
|
65
|
+
* @throws {GitError} when git is missing, the run times out, or spawn fails.
|
|
66
|
+
*/
|
|
67
|
+
run(cwd: string, args: readonly string[]): Promise<GitResult>;
|
|
68
|
+
/** Run git and treat a non-zero exit as a `git/failed` error. */
|
|
69
|
+
runOk(cwd: string, args: readonly string[]): Promise<GitResult>;
|
|
70
|
+
}
|
|
71
|
+
/** Trim git's stderr into one line suitable for a UI detail message. */
|
|
72
|
+
export declare function describeFailure(args: readonly string[], result: GitResult): string;
|
|
73
|
+
/**
|
|
74
|
+
* Parse `git status --porcelain=v2 --branch -z`.
|
|
75
|
+
*
|
|
76
|
+
* The `-z` form is the only one whose paths can be trusted: in the line-based
|
|
77
|
+
* form git C-quotes any path holding a non-ASCII byte, a double quote, or a
|
|
78
|
+
* backslash, so a Chinese file name arrives as `"docs/00-\350\265\204..."`
|
|
79
|
+
* with the quotes and escapes intact. Handing that text back to git as a
|
|
80
|
+
* pathspec fails with `pathspec ... did not match any files`, which is why
|
|
81
|
+
* committing a Chinese-named file used to break. `-z` terminates every record
|
|
82
|
+
* (headers included) with NUL and never quotes a path.
|
|
83
|
+
* @param stdout - raw porcelain output.
|
|
84
|
+
* @returns branch facts and one entry per changed path.
|
|
85
|
+
*/
|
|
86
|
+
export declare function parseStatus(stdout: string): GitStatus;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-git-flow, node half. The bundle patch mounts {@link GitFlow} as
|
|
3
|
+
* `ctx.gitFlow`; it provides the workspace git operations and registers
|
|
4
|
+
* `/api/dsh-git-flow/*` on the web profile. The browser half ships through
|
|
5
|
+
* `exports['./client']` and the package.json `dsh.client` declaration.
|
|
6
|
+
* @module dsh-git-flow
|
|
7
|
+
*/
|
|
8
|
+
import { GitFlow } from './service.ts';
|
|
9
|
+
export { GitFlow };
|
|
10
|
+
export default GitFlow;
|
|
11
|
+
export type { GitFlowConfig } from './service.ts';
|
|
12
|
+
export type * from './contract.ts';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI commit messages: one auxiliary model call over the selected diff, riding
|
|
3
|
+
* the route the session's own conversation already used (the same way session
|
|
4
|
+
* titles are produced), with a template fallback so the panel never blocks.
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
7
|
+
import type { GitFileView, GitMessageView } from './contract.ts';
|
|
8
|
+
import type { Session } from '@deepseek-ai/dsh-session';
|
|
9
|
+
/** Everything the prompt needs, already gathered by the service. */
|
|
10
|
+
export interface CommitMessageInput {
|
|
11
|
+
ctx: Context;
|
|
12
|
+
/** Live session for this request id; its logged header supplies the route. */
|
|
13
|
+
session: Session | undefined;
|
|
14
|
+
language: 'zh' | 'en';
|
|
15
|
+
head: string;
|
|
16
|
+
selected: readonly string[];
|
|
17
|
+
files: readonly GitFileView[];
|
|
18
|
+
diff: string;
|
|
19
|
+
truncated: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Produce one commit message for the selection.
|
|
23
|
+
* @throws {GitError} `git/no-route` when the session has no logged model route.
|
|
24
|
+
* @returns the message plus whether the template fallback had to be used, and
|
|
25
|
+
* why it was, so the panel can report a broken route instead of a vague notice.
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateCommitMessage(input: CommitMessageInput): Promise<GitMessageView>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/api/dsh-git-flow/*` — the browser half's only door into git. Requests carry
|
|
3
|
+
* a session id and nothing else; the service derives the repository from the
|
|
4
|
+
* session's registered workspace, so a page can never name a directory.
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
7
|
+
import type { GitFlow } from './service.ts';
|
|
8
|
+
/**
|
|
9
|
+
* Register every route on the mounted context.
|
|
10
|
+
* @param ctx - context that already sees `webServer`.
|
|
11
|
+
* @param service - the git surface to expose.
|
|
12
|
+
* @returns a disposer removing all routes.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerGitFlowRoutes(ctx: Context, service: GitFlow): () => void;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ctx.gitFlow` — the workspace git surface behind `/api/dsh-git-flow/*`.
|
|
3
|
+
* Every operation is keyed by session id: the repository directory is resolved
|
|
4
|
+
* by the host from the session's workspace, so the browser can never name a
|
|
5
|
+
* path for git to run in.
|
|
6
|
+
*/
|
|
7
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
8
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
9
|
+
import z from '@deepseek-ai/schemastery';
|
|
10
|
+
import type { GitBranchesView, GitCommitView, GitFlowFinishView, GitFlowKind, GitFlowStateView, GitMessageView, GitStatusView, MessageLanguage } from './contract.ts';
|
|
11
|
+
export type { MessageLanguage };
|
|
12
|
+
/** Mountable configuration. */
|
|
13
|
+
export interface GitFlowConfig {
|
|
14
|
+
/** Deadline for read-only and local git commands. */
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
/** Deadline for `git push`, which waits on a remote. */
|
|
17
|
+
pushTimeoutMs?: number;
|
|
18
|
+
/** Upper bound on diff bytes handed to the model. */
|
|
19
|
+
messageMaxDiffBytes?: number;
|
|
20
|
+
/** Default commit message language; the commit panel can override it per call. */
|
|
21
|
+
messageLanguage?: MessageLanguage;
|
|
22
|
+
/** Branch every release and hotfix is merged back into. */
|
|
23
|
+
productionBranch?: string;
|
|
24
|
+
/** Integration branch features start from and merge back into. */
|
|
25
|
+
developBranch?: string;
|
|
26
|
+
featurePrefix?: string;
|
|
27
|
+
releasePrefix?: string;
|
|
28
|
+
hotfixPrefix?: string;
|
|
29
|
+
/** Prefix of the tag a finished release or hotfix creates. */
|
|
30
|
+
tagPrefix?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Branch switching, panel-scoped commits, pushes, and AI commit messages for
|
|
34
|
+
* the session's workspace.
|
|
35
|
+
*/
|
|
36
|
+
export declare class GitFlow extends Service {
|
|
37
|
+
/**
|
|
38
|
+
* `workspaceRegistry` is read through `ctx.get` rather than declared here: a
|
|
39
|
+
* profile without one (the shipped `headless` profile) must still activate
|
|
40
|
+
* this entry instead of reporting a permanently pending plugin. Every git
|
|
41
|
+
* call in such a profile answers `git/not-a-repository`, since no session can
|
|
42
|
+
* resolve a repository.
|
|
43
|
+
*/
|
|
44
|
+
static inject: string[];
|
|
45
|
+
static Config: z<GitFlowConfig>;
|
|
46
|
+
private readonly config;
|
|
47
|
+
private readonly git;
|
|
48
|
+
/** Remote-waiting calls (push, pull) outlive the default runner deadline, so the runner is per-call-site. */
|
|
49
|
+
private readonly remoteGit;
|
|
50
|
+
constructor(ctx: Context, config?: GitFlowConfig);
|
|
51
|
+
/**
|
|
52
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
53
|
+
* @returns branch, ahead/behind, and one row per changed path.
|
|
54
|
+
*/
|
|
55
|
+
status(sessionId: string): Promise<GitStatusView>;
|
|
56
|
+
/**
|
|
57
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
58
|
+
* @returns local and remote-tracking branch rows, current one flagged.
|
|
59
|
+
*/
|
|
60
|
+
branches(sessionId: string): Promise<GitBranchesView>;
|
|
61
|
+
/**
|
|
62
|
+
* Switch branches, optionally creating a local branch for a unique remote one.
|
|
63
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
64
|
+
* @param name - branch to check out.
|
|
65
|
+
* @param force - discard conflicting worktree changes; never used silently.
|
|
66
|
+
*/
|
|
67
|
+
checkout(sessionId: string, name: string, force?: boolean): Promise<GitStatusView>;
|
|
68
|
+
/**
|
|
69
|
+
* Create one branch from `base` (default: current HEAD) and switch to it.
|
|
70
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
71
|
+
* @param name - new branch name.
|
|
72
|
+
* @param base - existing ref to start from.
|
|
73
|
+
*/
|
|
74
|
+
createBranch(sessionId: string, name: string, base?: string): Promise<GitStatusView>;
|
|
75
|
+
/**
|
|
76
|
+
* Throw away the worktree and index changes for the selected paths: tracked
|
|
77
|
+
* paths go back to HEAD (a staged addition is removed from the index and from
|
|
78
|
+
* disk), and untracked paths are deleted. Destructive by definition, so the
|
|
79
|
+
* caller confirms first; conflicted paths are refused rather than guessed at.
|
|
80
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
81
|
+
* @param files - paths as reported by {@link status}; anything else is rejected.
|
|
82
|
+
*/
|
|
83
|
+
discard(sessionId: string, files: readonly string[]): Promise<GitStatusView>;
|
|
84
|
+
/**
|
|
85
|
+
* Stage exactly the selected paths, commit them, and optionally push.
|
|
86
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
87
|
+
* @param files - paths as reported by {@link status}; anything else is rejected.
|
|
88
|
+
* @param message - commit message text.
|
|
89
|
+
* @param push - push the resulting commit to the branch upstream.
|
|
90
|
+
*/
|
|
91
|
+
commit(sessionId: string, files: readonly string[], message: string, push?: boolean): Promise<GitCommitView>;
|
|
92
|
+
/**
|
|
93
|
+
* Push the current branch to its upstream. Never force, and never to a
|
|
94
|
+
* caller-supplied remote or refspec.
|
|
95
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
96
|
+
* @returns git's push summary.
|
|
97
|
+
*/
|
|
98
|
+
push(sessionId: string): Promise<string>;
|
|
99
|
+
/**
|
|
100
|
+
* Pull the current branch's upstream with `--ff-only`: a fast-forward is the
|
|
101
|
+
* only allowed outcome, so a diverged branch fails instead of producing a
|
|
102
|
+
* merge commit or rewriting local commits. This is the plugin's one
|
|
103
|
+
* user-initiated network call outside push; nothing fetches in the background.
|
|
104
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
105
|
+
* @returns git's pull summary.
|
|
106
|
+
*/
|
|
107
|
+
pull(sessionId: string): Promise<string>;
|
|
108
|
+
/** The resolved branch layout, as the panel renders it. */
|
|
109
|
+
private layout;
|
|
110
|
+
/**
|
|
111
|
+
* Describe the flow state of the current branch: which family it belongs to,
|
|
112
|
+
* the version its name carries, whether the branches a run needs exist, and
|
|
113
|
+
* whether the tag a finish would create is already taken.
|
|
114
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
115
|
+
*/
|
|
116
|
+
gitflowState(sessionId: string): Promise<GitFlowStateView>;
|
|
117
|
+
/**
|
|
118
|
+
* Create a flow branch from the branch its family starts at and switch to it.
|
|
119
|
+
* A missing develop is reported as `git/develop-missing` so the panel can
|
|
120
|
+
* offer to create it rather than dead-ending on a raw git failure.
|
|
121
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
122
|
+
* @param kind - branch family to start.
|
|
123
|
+
* @param name - name inside the family, without the prefix.
|
|
124
|
+
*/
|
|
125
|
+
startFlow(sessionId: string, kind: GitFlowKind, name: string): Promise<GitStatusView>;
|
|
126
|
+
/**
|
|
127
|
+
* Create the develop branch from the production branch and switch to it.
|
|
128
|
+
* Only offered when develop is missing; an existing one is left untouched.
|
|
129
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
130
|
+
*/
|
|
131
|
+
initDevelop(sessionId: string): Promise<GitStatusView>;
|
|
132
|
+
/**
|
|
133
|
+
* Finish the current flow branch: merge it back (`--no-ff`), tag a release or
|
|
134
|
+
* hotfix, write its version, push, and delete the branch.
|
|
135
|
+
*
|
|
136
|
+
* Every check that can fail without side effects runs first: the worktree is
|
|
137
|
+
* clean, the merge would not conflict, and the tag is free. Past that point
|
|
138
|
+
* steps are not rolled back, because each one is a committed fact; a failure
|
|
139
|
+
* reports which step stopped the run and leaves the repository as it stands.
|
|
140
|
+
* @param sessionId - session whose workspace backs the repository.
|
|
141
|
+
* @param version - `package.json` version to write, release and hotfix only.
|
|
142
|
+
*/
|
|
143
|
+
finishFlow(sessionId: string, version?: string): Promise<GitFlowFinishView>;
|
|
144
|
+
/** Merge one branch into a target with a merge commit, refusing on conflict. */
|
|
145
|
+
private mergeInto;
|
|
146
|
+
/** Push each merged target and the new tag; the first failure is reported, not thrown. */
|
|
147
|
+
private pushFinished;
|
|
148
|
+
/** Write `version` into the root `package.json`; a non-Node repo skips it. */
|
|
149
|
+
private writeVersion;
|
|
150
|
+
/** Version currently declared by the root package.json, when there is one. */
|
|
151
|
+
private currentVersion;
|
|
152
|
+
private countAhead;
|
|
153
|
+
private tagExists;
|
|
154
|
+
/**
|
|
155
|
+
* Ask the session's own model route for a commit message over the selected diff.
|
|
156
|
+
* @param sessionId - session whose workspace and route back the call.
|
|
157
|
+
* @param files - paths as reported by {@link status}.
|
|
158
|
+
* @param language - per-call override for the configured message language.
|
|
159
|
+
*/
|
|
160
|
+
generateMessage(sessionId: string, files: readonly string[], language?: MessageLanguage): Promise<GitMessageView>;
|
|
161
|
+
/** Collect the selected diff without staging anything. */
|
|
162
|
+
private collectDiff;
|
|
163
|
+
/** Repository top level for one session's workspace. */
|
|
164
|
+
private resolveRepo;
|
|
165
|
+
private resolveWorkspace;
|
|
166
|
+
/**
|
|
167
|
+
* Keep only the selected paths whose staged content differs from HEAD.
|
|
168
|
+
* `add -A` has just run, so the index is the truth; a path that resolves to
|
|
169
|
+
* the HEAD blob (reverted, or touched between the status snapshot and now)
|
|
170
|
+
* would make `commit --only` reject the entire commit.
|
|
171
|
+
* @returns pathspecs in the same order git reported them, `-z` so a non-ASCII
|
|
172
|
+
* name is never C-quoted.
|
|
173
|
+
*/
|
|
174
|
+
private changedInIndex;
|
|
175
|
+
private hasLocalBranch;
|
|
176
|
+
private remoteBranches;
|
|
177
|
+
private runSwitch;
|
|
178
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,94 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hunan36/dsh-git-flow",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Workspace git branch switcher, commit composer with AI-written messages, and push for DeepSeek Harness",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dsh",
|
|
7
|
+
"deepseek",
|
|
8
|
+
"deepseek-harness",
|
|
9
|
+
"plugin",
|
|
10
|
+
"dsh-plugin",
|
|
11
|
+
"git",
|
|
12
|
+
"branch",
|
|
13
|
+
"commit"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./lib/index.js",
|
|
18
|
+
"types": "./lib/types/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./lib/types/index.d.ts",
|
|
22
|
+
"default": "./lib/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./client": {
|
|
25
|
+
"types": "./lib/types/client/index.d.ts",
|
|
26
|
+
"default": "./lib/client.js"
|
|
27
|
+
},
|
|
28
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"lib/index.js",
|
|
33
|
+
"lib/client.js",
|
|
34
|
+
"lib/types/**/*.d.ts",
|
|
35
|
+
"cordis.patch.yml",
|
|
36
|
+
"README.md",
|
|
37
|
+
"README.zh.md",
|
|
38
|
+
"LICENSE"
|
|
39
|
+
],
|
|
40
|
+
"dsh": {
|
|
41
|
+
"bundle": {
|
|
42
|
+
"patch": "./cordis.patch.yml"
|
|
43
|
+
},
|
|
44
|
+
"client": {
|
|
45
|
+
"platform": "web",
|
|
46
|
+
"inject": [
|
|
47
|
+
"@deepseek-ai/dsh-client-locale",
|
|
48
|
+
"@deepseek-ai/dsh-client-ui-conversation",
|
|
49
|
+
"@deepseek-ai/dsh-client-ui-session"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"packageManager": "pnpm@10.22.0",
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@deepseek-ai/cordis": "^4.0.5"
|
|
59
|
+
},
|
|
60
|
+
"peerDependenciesMeta": {
|
|
61
|
+
"@deepseek-ai/cordis": {
|
|
62
|
+
"optional": true
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@deepseek-ai/cordis": "^4.0.5",
|
|
67
|
+
"@deepseek-ai/dsh-client-locale": "0.2.1-rc.2",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.2",
|
|
69
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.2",
|
|
70
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.2",
|
|
71
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.2",
|
|
72
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.2",
|
|
73
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.1-rc.2",
|
|
74
|
+
"@deepseek-ai/dsh-llm": "0.2.1-rc.2",
|
|
75
|
+
"@deepseek-ai/dsh-session": "0.2.1-rc.2",
|
|
76
|
+
"@deepseek-ai/dsh-subprocess": "0.2.1-rc.2",
|
|
77
|
+
"@deepseek-ai/dsh-workspace": "0.2.1-rc.2",
|
|
78
|
+
"@deepseek-ai/schemastery": "^3.18.5",
|
|
79
|
+
"@types/node": "^22.19.0",
|
|
80
|
+
"@types/react": "~18.3.1",
|
|
81
|
+
"@types/react-dom": "~18.3.7",
|
|
82
|
+
"react": "^18.2.0",
|
|
83
|
+
"tsdown": "^0.22.2",
|
|
84
|
+
"typescript": "^5.9.3"
|
|
85
|
+
},
|
|
86
|
+
"scripts": {
|
|
87
|
+
"build": "rm -rf lib && tsc -p tsconfig.build.json && tsdown",
|
|
88
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
89
|
+
"watch": "tsdown --watch"
|
|
90
|
+
},
|
|
91
|
+
"publishConfig": {
|
|
92
|
+
"access": "public"
|
|
93
|
+
}
|
|
94
|
+
}
|