@godv61/dsh-task-engine 0.23.2 → 0.23.3
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/docs/CHANGELOG.md +14 -8
- package/lib/client.js +38 -36
- package/lib/client.js.map +2 -2
- package/package.json +5 -5
- package/lib/custom-flow.d.ts +0 -212
- package/lib/custom-flow.js +0 -50
- package/lib/custom-flow.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@godv61/dsh-task-engine",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.3",
|
|
4
4
|
"description": "Preset-workflow engineering delivery engine for DeepSeek Harness: a `dev_task` tool that hard-gates stage transitions and commit scope/message, per-node skill/rule bindings with progressive disclosure, a workbench to pick a flow preset and mount skills/rules, and preset-scoped activation — the tool and skills activate only for sessions on a preset that names the agent row.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -64,10 +64,10 @@
|
|
|
64
64
|
},
|
|
65
65
|
"peerDependencies": {
|
|
66
66
|
"@deepseek-ai/cordis": "^4.0.2",
|
|
67
|
-
"@deepseek-ai/dsh-agent-presets": "^0.1.2-rc.1 || ^0.1.3-alpha.1",
|
|
68
|
-
"@deepseek-ai/dsh-llm": "^0.1.2-rc.1 || ^0.1.3-alpha.1",
|
|
69
|
-
"@deepseek-ai/dsh-tools": "^0.1.2-rc.1 || ^0.1.3-alpha.1",
|
|
70
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1 || ^0.1.3-alpha.1"
|
|
67
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2",
|
|
68
|
+
"@deepseek-ai/dsh-llm": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2",
|
|
69
|
+
"@deepseek-ai/dsh-tools": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2",
|
|
70
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1 || ^0.1.3-alpha.1 || ^0.1.6-alpha.2"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"@deepseek-ai/cordis": "^4.0.2",
|
package/lib/custom-flow.d.ts
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
/** Portable, versioned sequential workflows. JSON and Remote inputs use this parser. */
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { type WorkflowConfig } from './engine.ts';
|
|
4
|
-
/** One active custom definition is stored in a project's custom_flow field. */
|
|
5
|
-
export interface CustomFlow {
|
|
6
|
-
schema: 1;
|
|
7
|
-
id: string;
|
|
8
|
-
label: string;
|
|
9
|
-
version: number;
|
|
10
|
-
config: WorkflowConfig;
|
|
11
|
-
}
|
|
12
|
-
/** Shared wire parser; semantic sequential validation is performed by parseCustomFlow. */
|
|
13
|
-
export declare const customFlowSchema: z.ZodObject<{
|
|
14
|
-
schema: z.ZodLiteral<1>;
|
|
15
|
-
id: z.ZodString;
|
|
16
|
-
label: z.ZodEffects<z.ZodString, string, string>;
|
|
17
|
-
version: z.ZodNumber;
|
|
18
|
-
config: z.ZodObject<{
|
|
19
|
-
stages: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
|
|
20
|
-
start_stage: z.ZodEffects<z.ZodString, string, string>;
|
|
21
|
-
transitions: z.ZodArray<z.ZodObject<{
|
|
22
|
-
from: z.ZodEffects<z.ZodString, string, string>;
|
|
23
|
-
to: z.ZodEffects<z.ZodString, string, string>;
|
|
24
|
-
requires: z.ZodDefault<z.ZodArray<z.ZodEnum<["confirmation", "requirement_confirmation", "solution_confirmation", "todos_done", "verified", "review_passed", "artifacts_present"]>, "many">>;
|
|
25
|
-
}, "strict", z.ZodTypeAny, {
|
|
26
|
-
from: string;
|
|
27
|
-
to: string;
|
|
28
|
-
requires: ("confirmation" | "requirement_confirmation" | "solution_confirmation" | "todos_done" | "verified" | "review_passed" | "artifacts_present")[];
|
|
29
|
-
}, {
|
|
30
|
-
from: string;
|
|
31
|
-
to: string;
|
|
32
|
-
requires?: ("confirmation" | "requirement_confirmation" | "solution_confirmation" | "todos_done" | "verified" | "review_passed" | "artifacts_present")[] | undefined;
|
|
33
|
-
}>, "many">;
|
|
34
|
-
artifacts: z.ZodArray<z.ZodObject<{
|
|
35
|
-
stage: z.ZodEffects<z.ZodString, string, string>;
|
|
36
|
-
id: z.ZodEffects<z.ZodString, string, string>;
|
|
37
|
-
name: z.ZodEffects<z.ZodString, string, string>;
|
|
38
|
-
fields: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
|
|
39
|
-
}, "strict", z.ZodTypeAny, {
|
|
40
|
-
stage: string;
|
|
41
|
-
id: string;
|
|
42
|
-
name: string;
|
|
43
|
-
fields: string[];
|
|
44
|
-
}, {
|
|
45
|
-
stage: string;
|
|
46
|
-
id: string;
|
|
47
|
-
name: string;
|
|
48
|
-
fields: string[];
|
|
49
|
-
}>, "many">;
|
|
50
|
-
commit: z.ZodObject<{
|
|
51
|
-
policy: z.ZodEnum<["task", "item", "manual"]>;
|
|
52
|
-
message_pattern: z.ZodString;
|
|
53
|
-
message_hint: z.ZodString;
|
|
54
|
-
checkpoints: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
|
|
55
|
-
file_scope: z.ZodBoolean;
|
|
56
|
-
}, "strict", z.ZodTypeAny, {
|
|
57
|
-
policy: "task" | "item" | "manual";
|
|
58
|
-
checkpoints: string[];
|
|
59
|
-
message_pattern: string;
|
|
60
|
-
message_hint: string;
|
|
61
|
-
file_scope: boolean;
|
|
62
|
-
}, {
|
|
63
|
-
policy: "task" | "item" | "manual";
|
|
64
|
-
checkpoints: string[];
|
|
65
|
-
message_pattern: string;
|
|
66
|
-
message_hint: string;
|
|
67
|
-
file_scope: boolean;
|
|
68
|
-
}>;
|
|
69
|
-
high_risk_requires_verification: z.ZodLiteral<true>;
|
|
70
|
-
evidence_scope: z.ZodLiteral<"stage">;
|
|
71
|
-
stage_bindings: z.ZodDefault<z.ZodRecord<z.ZodEffects<z.ZodString, string, string>, z.ZodObject<{
|
|
72
|
-
skills: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
73
|
-
rules: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
74
|
-
}, "strict", z.ZodTypeAny, {
|
|
75
|
-
skills: string[];
|
|
76
|
-
rules: string[];
|
|
77
|
-
}, {
|
|
78
|
-
skills?: string[] | undefined;
|
|
79
|
-
rules?: string[] | undefined;
|
|
80
|
-
}>>>;
|
|
81
|
-
}, "strict", z.ZodTypeAny, {
|
|
82
|
-
stages: string[];
|
|
83
|
-
start_stage: string;
|
|
84
|
-
transitions: {
|
|
85
|
-
from: string;
|
|
86
|
-
to: string;
|
|
87
|
-
requires: ("confirmation" | "requirement_confirmation" | "solution_confirmation" | "todos_done" | "verified" | "review_passed" | "artifacts_present")[];
|
|
88
|
-
}[];
|
|
89
|
-
artifacts: {
|
|
90
|
-
stage: string;
|
|
91
|
-
id: string;
|
|
92
|
-
name: string;
|
|
93
|
-
fields: string[];
|
|
94
|
-
}[];
|
|
95
|
-
commit: {
|
|
96
|
-
policy: "task" | "item" | "manual";
|
|
97
|
-
checkpoints: string[];
|
|
98
|
-
message_pattern: string;
|
|
99
|
-
message_hint: string;
|
|
100
|
-
file_scope: boolean;
|
|
101
|
-
};
|
|
102
|
-
high_risk_requires_verification: true;
|
|
103
|
-
evidence_scope: "stage";
|
|
104
|
-
stage_bindings: Record<string, {
|
|
105
|
-
skills: string[];
|
|
106
|
-
rules: string[];
|
|
107
|
-
}>;
|
|
108
|
-
}, {
|
|
109
|
-
stages: string[];
|
|
110
|
-
start_stage: string;
|
|
111
|
-
transitions: {
|
|
112
|
-
from: string;
|
|
113
|
-
to: string;
|
|
114
|
-
requires?: ("confirmation" | "requirement_confirmation" | "solution_confirmation" | "todos_done" | "verified" | "review_passed" | "artifacts_present")[] | undefined;
|
|
115
|
-
}[];
|
|
116
|
-
artifacts: {
|
|
117
|
-
stage: string;
|
|
118
|
-
id: string;
|
|
119
|
-
name: string;
|
|
120
|
-
fields: string[];
|
|
121
|
-
}[];
|
|
122
|
-
commit: {
|
|
123
|
-
policy: "task" | "item" | "manual";
|
|
124
|
-
checkpoints: string[];
|
|
125
|
-
message_pattern: string;
|
|
126
|
-
message_hint: string;
|
|
127
|
-
file_scope: boolean;
|
|
128
|
-
};
|
|
129
|
-
high_risk_requires_verification: true;
|
|
130
|
-
evidence_scope: "stage";
|
|
131
|
-
stage_bindings?: Record<string, {
|
|
132
|
-
skills?: string[] | undefined;
|
|
133
|
-
rules?: string[] | undefined;
|
|
134
|
-
}> | undefined;
|
|
135
|
-
}>;
|
|
136
|
-
}, "strict", z.ZodTypeAny, {
|
|
137
|
-
id: string;
|
|
138
|
-
schema: 1;
|
|
139
|
-
label: string;
|
|
140
|
-
version: number;
|
|
141
|
-
config: {
|
|
142
|
-
stages: string[];
|
|
143
|
-
start_stage: string;
|
|
144
|
-
transitions: {
|
|
145
|
-
from: string;
|
|
146
|
-
to: string;
|
|
147
|
-
requires: ("confirmation" | "requirement_confirmation" | "solution_confirmation" | "todos_done" | "verified" | "review_passed" | "artifacts_present")[];
|
|
148
|
-
}[];
|
|
149
|
-
artifacts: {
|
|
150
|
-
stage: string;
|
|
151
|
-
id: string;
|
|
152
|
-
name: string;
|
|
153
|
-
fields: string[];
|
|
154
|
-
}[];
|
|
155
|
-
commit: {
|
|
156
|
-
policy: "task" | "item" | "manual";
|
|
157
|
-
checkpoints: string[];
|
|
158
|
-
message_pattern: string;
|
|
159
|
-
message_hint: string;
|
|
160
|
-
file_scope: boolean;
|
|
161
|
-
};
|
|
162
|
-
high_risk_requires_verification: true;
|
|
163
|
-
evidence_scope: "stage";
|
|
164
|
-
stage_bindings: Record<string, {
|
|
165
|
-
skills: string[];
|
|
166
|
-
rules: string[];
|
|
167
|
-
}>;
|
|
168
|
-
};
|
|
169
|
-
}, {
|
|
170
|
-
id: string;
|
|
171
|
-
schema: 1;
|
|
172
|
-
label: string;
|
|
173
|
-
version: number;
|
|
174
|
-
config: {
|
|
175
|
-
stages: string[];
|
|
176
|
-
start_stage: string;
|
|
177
|
-
transitions: {
|
|
178
|
-
from: string;
|
|
179
|
-
to: string;
|
|
180
|
-
requires?: ("confirmation" | "requirement_confirmation" | "solution_confirmation" | "todos_done" | "verified" | "review_passed" | "artifacts_present")[] | undefined;
|
|
181
|
-
}[];
|
|
182
|
-
artifacts: {
|
|
183
|
-
stage: string;
|
|
184
|
-
id: string;
|
|
185
|
-
name: string;
|
|
186
|
-
fields: string[];
|
|
187
|
-
}[];
|
|
188
|
-
commit: {
|
|
189
|
-
policy: "task" | "item" | "manual";
|
|
190
|
-
checkpoints: string[];
|
|
191
|
-
message_pattern: string;
|
|
192
|
-
message_hint: string;
|
|
193
|
-
file_scope: boolean;
|
|
194
|
-
};
|
|
195
|
-
high_risk_requires_verification: true;
|
|
196
|
-
evidence_scope: "stage";
|
|
197
|
-
stage_bindings?: Record<string, {
|
|
198
|
-
skills?: string[] | undefined;
|
|
199
|
-
rules?: string[] | undefined;
|
|
200
|
-
}> | undefined;
|
|
201
|
-
};
|
|
202
|
-
}>;
|
|
203
|
-
/** Parse untrusted JSON; reject branches, loops, unused artifact requirements and invalid references. */
|
|
204
|
-
export declare function parseCustomFlow(value: unknown): {
|
|
205
|
-
ok: true;
|
|
206
|
-
value: CustomFlow;
|
|
207
|
-
} | {
|
|
208
|
-
ok: false;
|
|
209
|
-
problems: string[];
|
|
210
|
-
};
|
|
211
|
-
/** Copy a template without changing its bindings; new evidence belongs to the current stage. */
|
|
212
|
-
export declare function customFromTemplate(config: WorkflowConfig, label?: string): CustomFlow;
|
package/lib/custom-flow.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/** Portable, versioned sequential workflows. JSON and Remote inputs use this parser. */
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { validateWorkflow } from "./engine.js";
|
|
4
|
-
const name = z.string().trim().min(1).max(120).refine(v => !['__proto__', 'constructor', 'prototype'].includes(v), '保留名称不可用');
|
|
5
|
-
const names = z.array(name).max(100);
|
|
6
|
-
const guard = z.enum(['confirmation', 'requirement_confirmation', 'solution_confirmation', 'todos_done', 'verified', 'review_passed', 'artifacts_present']);
|
|
7
|
-
const configSchema = z.object({
|
|
8
|
-
stages: names.min(2).max(30), start_stage: name,
|
|
9
|
-
transitions: z.array(z.object({ from: name, to: name, requires: z.array(guard).max(7).default([]) }).strict()).max(29),
|
|
10
|
-
artifacts: z.array(z.object({ stage: name, id: name, name, fields: names.min(1) }).strict()).max(100),
|
|
11
|
-
commit: z.object({ policy: z.enum(['task', 'item', 'manual']), message_pattern: z.string().max(500), message_hint: z.string().max(1000), checkpoints: names, file_scope: z.boolean() }).strict(),
|
|
12
|
-
high_risk_requires_verification: z.literal(true),
|
|
13
|
-
evidence_scope: z.literal('stage'),
|
|
14
|
-
stage_bindings: z.record(name, z.object({ skills: names.default([]), rules: names.default([]) }).strict()).default({}),
|
|
15
|
-
}).strict();
|
|
16
|
-
/** Shared wire parser; semantic sequential validation is performed by parseCustomFlow. */
|
|
17
|
-
export const customFlowSchema = z.object({
|
|
18
|
-
schema: z.literal(1), id: z.string().regex(/^custom:[a-z0-9][a-z0-9-]{0,63}$/),
|
|
19
|
-
label: name, version: z.number().int().positive().safe(), config: configSchema,
|
|
20
|
-
}).strict();
|
|
21
|
-
/** Parse untrusted JSON; reject branches, loops, unused artifact requirements and invalid references. */
|
|
22
|
-
export function parseCustomFlow(value) {
|
|
23
|
-
const parsed = customFlowSchema.safeParse(value);
|
|
24
|
-
if (!parsed.success)
|
|
25
|
-
return { ok: false, problems: parsed.error.issues.map(i => `${i.path.join('.')}: ${i.message}`) };
|
|
26
|
-
const config = parsed.data.config;
|
|
27
|
-
const problems = validateWorkflow(config);
|
|
28
|
-
if (config.start_stage !== config.stages[0])
|
|
29
|
-
problems.push('起始阶段必须是列表中的第一个阶段');
|
|
30
|
-
if (config.transitions.length !== config.stages.length - 1 || config.transitions.some((t, i) => t.from !== config.stages[i] || t.to !== config.stages[i + 1])) {
|
|
31
|
-
problems.push('第一版只支持按阶段列表顺序逐步执行,不支持跳转、分支或循环');
|
|
32
|
-
}
|
|
33
|
-
for (const t of config.transitions) {
|
|
34
|
-
if (t.requires?.includes('artifacts_present') && !config.artifacts.some(a => a.stage === t.from))
|
|
35
|
-
problems.push(`${t.from}:请添加产物或取消「必填产物」`);
|
|
36
|
-
}
|
|
37
|
-
const terminal = config.stages[config.stages.length - 1];
|
|
38
|
-
if (config.artifacts.some(a => a.stage === terminal))
|
|
39
|
-
problems.push('完成阶段不能设置待验收产物,请放到前一个阶段');
|
|
40
|
-
if (config.commit.policy !== 'manual' && config.commit.checkpoints.length === 0)
|
|
41
|
-
problems.push('请选择至少一个允许提交的阶段');
|
|
42
|
-
return problems.length ? { ok: false, problems } : { ok: true, value: parsed.data };
|
|
43
|
-
}
|
|
44
|
-
/** Copy a template without changing its bindings; new evidence belongs to the current stage. */
|
|
45
|
-
export function customFromTemplate(config, label = '我的流程') {
|
|
46
|
-
return { schema: 1, id: 'custom:my-workflow', label, version: 1, config: {
|
|
47
|
-
...structuredClone(config), evidence_scope: 'stage', high_risk_requires_verification: true,
|
|
48
|
-
} };
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=custom-flow.js.map
|
package/lib/custom-flow.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"custom-flow.js","sourceRoot":"","sources":["../src/custom-flow.ts"],"names":[],"mappings":"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"}
|