@godv61/dsh-task-engine 0.14.0 → 0.17.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 +50 -25
- package/defaults/eng.json +1 -22
- package/docs/manual.html +353 -0
- package/hooks/commit-msg +66 -36
- package/lib/client.js +290 -678
- package/lib/client.js.map +4 -4
- package/lib/controller.d.ts +16 -11
- package/lib/controller.js +33 -15
- package/lib/controller.js.map +1 -1
- package/lib/dev-task.js +43 -13
- package/lib/dev-task.js.map +1 -1
- package/lib/engine.d.ts +1 -3
- package/lib/engine.js +1 -16
- package/lib/engine.js.map +1 -1
- package/lib/workflows.d.ts +34 -0
- package/lib/workflows.js +122 -0
- package/lib/workflows.js.map +1 -0
- package/package.json +3 -2
- package/rules/coding-conventions.md +1 -1
- package/rules/security-redlines.md +1 -1
- package/skills/eng-delivery/SKILL.md +5 -1
- package/skills/solution-design/SKILL.md +1 -1
package/lib/workflows.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in engineering workflows. A workflow is a complete, engine-resolved
|
|
3
|
+
* `WorkflowConfig` a project adopts by id: the stage graph, transition guards,
|
|
4
|
+
* artifacts, commit rule, and default skill/rule bindings are all baked in
|
|
5
|
+
* here. A project overrides only its stage bindings (which skill/rule each
|
|
6
|
+
* node mounts); every other field is a fixed property of the chosen preset, so
|
|
7
|
+
* a project cannot hand-edit the gate semantics.
|
|
8
|
+
*
|
|
9
|
+
* @module dsh-task-engine/workflows
|
|
10
|
+
*/
|
|
11
|
+
/** The selectable preset workflows (shown in the workbench flow picker). */
|
|
12
|
+
export const FLOW_OPTIONS = [
|
|
13
|
+
{ id: 'standard', label: '标准研发', description: '需求评审 → 设计 → 开发 → 交付 → 代码审核,含产物门 + 确认门' },
|
|
14
|
+
{ id: 'agile', label: '敏捷轻量', description: '需求 → 开发 → 交付 → 审查,四阶段、少产物' },
|
|
15
|
+
{ id: 'minimal', label: '纯代码', description: '开发 → 交付,两阶段,只留提交门禁' },
|
|
16
|
+
];
|
|
17
|
+
/** Standard review-gated delivery: the default workflow. */
|
|
18
|
+
const STANDARD = {
|
|
19
|
+
stages: ['需求评审', '设计', '开发', '交付', '代码审核', '完成'],
|
|
20
|
+
start_stage: '需求评审',
|
|
21
|
+
transitions: [
|
|
22
|
+
{ from: '需求评审', to: '设计', requires: ['requirement_confirmation', 'artifacts_present'] },
|
|
23
|
+
{ from: '设计', to: '开发', requires: ['solution_confirmation', 'artifacts_present'] },
|
|
24
|
+
{ from: '开发', to: '交付', requires: ['todos_done'] },
|
|
25
|
+
{ from: '交付', to: '代码审核', requires: ['verified'] },
|
|
26
|
+
{ from: '代码审核', to: '完成', requires: ['review_passed', 'artifacts_present'] },
|
|
27
|
+
],
|
|
28
|
+
artifacts: [
|
|
29
|
+
{ stage: '需求评审', id: 'requirement', name: '需求说明', fields: ['scope', 'acceptance_criteria'] },
|
|
30
|
+
{ stage: '设计', id: 'design', name: '设计文档', fields: ['approach', 'risks', 'impact'] },
|
|
31
|
+
{ stage: '代码审核', id: 'review', name: '评审记录', fields: ['conclusion', 'issues'] },
|
|
32
|
+
],
|
|
33
|
+
commit: {
|
|
34
|
+
policy: 'task',
|
|
35
|
+
message_pattern: '^【(\\S+)】【(?:TASK|T\\d+)】.+',
|
|
36
|
+
message_hint: '【<module>】【TASK/T1】说明 —— 写结果,不写空泛动作',
|
|
37
|
+
checkpoints: ['交付'],
|
|
38
|
+
file_scope: true,
|
|
39
|
+
},
|
|
40
|
+
high_risk_requires_verification: true,
|
|
41
|
+
stage_bindings: {
|
|
42
|
+
'需求评审': { skills: ['requirement-analysis'], rules: ['security-redlines'] },
|
|
43
|
+
'设计': { skills: ['solution-design'] },
|
|
44
|
+
'开发': { skills: ['code-implement'], rules: ['coding-conventions'] },
|
|
45
|
+
'交付': { skills: ['code-verify', 'code-commit'], rules: ['coding-conventions', 'commit-conventions'] },
|
|
46
|
+
'代码审核': { skills: ['code-review'], rules: ['security-redlines'] },
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
/** Lighter four-stage flow with few artifacts, for fast-moving projects. */
|
|
50
|
+
const AGILE = {
|
|
51
|
+
stages: ['需求', '开发', '交付', '审查'],
|
|
52
|
+
start_stage: '需求',
|
|
53
|
+
transitions: [
|
|
54
|
+
{ from: '需求', to: '开发', requires: ['requirement_confirmation'] },
|
|
55
|
+
{ from: '开发', to: '交付', requires: ['todos_done'] },
|
|
56
|
+
{ from: '交付', to: '审查', requires: [] },
|
|
57
|
+
],
|
|
58
|
+
artifacts: [
|
|
59
|
+
{ stage: '需求', id: 'requirement', name: '需求说明', fields: ['scope'] },
|
|
60
|
+
],
|
|
61
|
+
commit: {
|
|
62
|
+
policy: 'item',
|
|
63
|
+
message_pattern: '^【(\\S+)】【T\\d+】.+',
|
|
64
|
+
message_hint: '【<module>】【T1】说明',
|
|
65
|
+
checkpoints: ['交付'],
|
|
66
|
+
file_scope: true,
|
|
67
|
+
},
|
|
68
|
+
high_risk_requires_verification: false,
|
|
69
|
+
stage_bindings: {
|
|
70
|
+
'需求': { skills: ['requirement-analysis'] },
|
|
71
|
+
'开发': { skills: ['code-implement'], rules: ['coding-conventions'] },
|
|
72
|
+
'交付': { skills: ['code-verify', 'code-commit'], rules: ['commit-conventions'] },
|
|
73
|
+
'审查': { skills: ['code-review'] },
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
/** Minimal two-stage flow: only a commit gate, no artifact doors. */
|
|
77
|
+
const MINIMAL = {
|
|
78
|
+
stages: ['开发', '交付'],
|
|
79
|
+
start_stage: '开发',
|
|
80
|
+
transitions: [
|
|
81
|
+
{ from: '开发', to: '交付', requires: ['todos_done'] },
|
|
82
|
+
],
|
|
83
|
+
artifacts: [],
|
|
84
|
+
commit: {
|
|
85
|
+
policy: 'task',
|
|
86
|
+
message_pattern: '',
|
|
87
|
+
message_hint: '无格式要求',
|
|
88
|
+
checkpoints: ['交付'],
|
|
89
|
+
file_scope: false,
|
|
90
|
+
},
|
|
91
|
+
high_risk_requires_verification: false,
|
|
92
|
+
stage_bindings: {
|
|
93
|
+
'开发': { skills: ['code-implement'] },
|
|
94
|
+
'交付': { skills: ['code-commit'], rules: ['commit-conventions'] },
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
export const FLOW_CONFIGS = {
|
|
98
|
+
standard: STANDARD,
|
|
99
|
+
agile: AGILE,
|
|
100
|
+
minimal: MINIMAL,
|
|
101
|
+
};
|
|
102
|
+
/** Whether `flow` names a built-in workflow. */
|
|
103
|
+
export function isKnownFlow(flow) {
|
|
104
|
+
return Object.prototype.hasOwnProperty.call(FLOW_CONFIGS, flow);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Resolve a preset workflow plus a project's stage-binding override into the
|
|
108
|
+
* complete engine config. Unknown `flow` ids fall back to `standard` when
|
|
109
|
+
* reading (a stale file must not break the gate); writes reject unknown ids
|
|
110
|
+
* before calling this.
|
|
111
|
+
* @param flow - workflow id from the project's `.dsh/eng.json`.
|
|
112
|
+
* @param override - optional whole `stage_bindings` map replacing the preset default.
|
|
113
|
+
* @returns the resolved workflow, always structurally complete.
|
|
114
|
+
*/
|
|
115
|
+
export function resolveFlowConfig(flow, override) {
|
|
116
|
+
const base = FLOW_CONFIGS[flow] ?? STANDARD;
|
|
117
|
+
if (override?.stage_bindings !== undefined) {
|
|
118
|
+
return { ...base, stage_bindings: { ...override.stage_bindings } };
|
|
119
|
+
}
|
|
120
|
+
return base;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACvF,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACxE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE;CACnE,CAAA;AAED,4DAA4D;AAC5D,MAAM,QAAQ,GAAmB;IAC/B,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;IAChD,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,0BAA0B,EAAE,mBAAmB,CAAC,EAAE;QACvF,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,EAAE;QAClF,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE;QAClD,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE;QAClD,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,mBAAmB,CAAC,EAAE;KAC7E;IACD,SAAS,EAAE;QACT,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE;QAC5F,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE;QACpF,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE;KAChF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,6BAA6B;QAC9C,YAAY,EAAE,qCAAqC;QACnD,WAAW,EAAE,CAAC,IAAI,CAAC;QACnB,UAAU,EAAE,IAAI;KACjB;IACD,+BAA+B,EAAE,IAAI;IACrC,cAAc,EAAE;QACd,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,CAAC,mBAAmB,CAAC,EAAE;QAC1E,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE;QACrC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE;QACnE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAAE;QACrG,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,mBAAmB,CAAC,EAAE;KAClE;CACF,CAAA;AAED,4EAA4E;AAC5E,MAAM,KAAK,GAAmB;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAChC,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,EAAE;QAChE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE;QAClD,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;KACvC;IACD,SAAS,EAAE;QACT,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;KACpE;IACD,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,oBAAoB;QACrC,YAAY,EAAE,kBAAkB;QAChC,WAAW,EAAE,CAAC,IAAI,CAAC;QACnB,UAAU,EAAE,IAAI;KACjB;IACD,+BAA+B,EAAE,KAAK;IACtC,cAAc,EAAE;QACd,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,sBAAsB,CAAC,EAAE;QAC1C,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE;QACnE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE;QAC/E,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE;KAClC;CACF,CAAA;AAED,qEAAqE;AACrE,MAAM,OAAO,GAAmB;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE;KACnD;IACD,SAAS,EAAE,EAAE;IACb,MAAM,EAAE;QACN,MAAM,EAAE,MAAM;QACd,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,CAAC,IAAI,CAAC;QACnB,UAAU,EAAE,KAAK;KAClB;IACD,+BAA+B,EAAE,KAAK;IACtC,cAAc,EAAE;QACd,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,gBAAgB,CAAC,EAAE;QACpC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,oBAAoB,CAAC,EAAE;KACjE;CACF,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAmC;IAC1D,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;CACjB,CAAA;AAED,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AACjE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAA4D;IAE5D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAA;IAC3C,IAAI,QAAQ,EAAE,cAAc,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,EAAE,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAA;IACpE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@godv61/dsh-task-engine",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.17.0",
|
|
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",
|
|
7
7
|
"types": "lib/index.d.ts",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"skills/**",
|
|
31
31
|
"rules/**",
|
|
32
32
|
"preset/**",
|
|
33
|
+
"docs/**",
|
|
33
34
|
"README.md"
|
|
34
35
|
],
|
|
35
36
|
"license": "MIT",
|
|
@@ -6,7 +6,11 @@ whenToUse: 开始任何开发、改 bug、加功能、代码评审或提交任
|
|
|
6
6
|
|
|
7
7
|
# 工程化交付
|
|
8
8
|
|
|
9
|
-
`dev_task`
|
|
9
|
+
`dev_task` 工具是流程的唯一事实来源与硬约束。阶段顺序、流转门槛、提交格式来自所选流程预设(standard / agile / minimal);项目根 `.dsh/eng.json` 只声明 `flow`(选哪套预设)和 `stage_bindings`(每个节点挂哪些 skill / rule)。
|
|
10
|
+
|
|
11
|
+
## 项目认知(可选前置)
|
|
12
|
+
|
|
13
|
+
接手一个还不熟悉(尤其二开 / 遗留)的项目、且项目根没有 `AGENTS.md` 时,先 `dev_task`(operation=init)扫描项目并生成项目根的 `AGENTS.md` 描述文件——DSH 会把它自动注入到每个会话,之后每个任务开工自带项目认知。生成落盘前硬校验 200 行上限,只写「项目是什么 → 怎么跑 → 结构 → 约定 → 坑」,超限即精简;已有 `AGENTS.md` 时先读回、合并后再带 overwrite 重写,不裸覆盖。
|
|
10
14
|
|
|
11
15
|
## 入口
|
|
12
16
|
|
|
@@ -9,7 +9,7 @@ description: 设计节点:产出最小方案、改动点与技术选择,落
|
|
|
9
9
|
|
|
10
10
|
1. `dev_task`(operation=status)读当前节点与待办。
|
|
11
11
|
2. 产出最小方案:技术基线、修改位置与做法、明确保持不变的部分。
|
|
12
|
-
3.
|
|
12
|
+
3. 不做投机性抽象:单一调用方不为"以后可能复用"新增抽象层或包装层,优先复用相邻实现;语言特定的分层与命名约定由项目挂载的 rule 约束,不在这里预设。
|
|
13
13
|
4. 用 `dev_task`(operation=record, artifact=design, fields={approach, risks, impact})落设计文档。
|
|
14
14
|
5. 完成后用 `dev_task`(operation=advance)流转;系统会向人发起「方案确认」审批,批准才放行。
|
|
15
15
|
|