@godv61/dsh-task-engine 0.22.7 → 0.23.1
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/.p0-test.mjs +739 -748
- package/.resource-test.mjs +133 -0
- package/.workflow-test.mjs +234 -0
- package/LICENSE +21 -0
- package/README.md +110 -207
- package/cordis.patch.yml +10 -10
- package/defaults/eng.json +10 -10
- package/docs/CHANGELOG.md +185 -0
- package/docs/README.md +27 -0
- package/docs/assets/workflow-banner.svg +29 -0
- package/docs/configuration.md +49 -0
- package/docs/development.md +53 -0
- package/docs/faq.md +43 -0
- package/docs/getting-started.md +51 -0
- package/docs/listing/godv61__dsh-task-engine.yml +6 -0
- package/docs/listing/submission.md +9 -0
- package/docs/manual.html +391 -382
- package/docs/release-0.23.0.md +32 -0
- package/docs/release-0.23.1.md +58 -0
- package/docs/resource-install.md +62 -0
- package/docs/roadmap.md +33 -0
- package/docs/testing/0.23.0//346/265/213/350/257/225/346/211/247/350/241/214/350/256/260/345/275/225.md +189 -0
- package/docs/testing/0.23.0//346/265/213/350/257/225/346/212/245/345/221/212.md +42 -0
- package/docs/testing/0.23.1//346/265/213/350/257/225/346/212/245/345/221/212.md +34 -0
- package/docs/testing/0.23.1//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/230/216/347/273/206.md +41 -0
- package/docs/workflow-regression.md +36 -0
- package/hooks/commit-msg +4 -4
- package/lib/client.js +555 -868
- package/lib/client.js.map +4 -4
- package/lib/controller.d.ts +19 -0
- package/lib/controller.js +86 -137
- package/lib/controller.js.map +1 -1
- package/lib/dev-task.js +190 -37
- package/lib/dev-task.js.map +1 -1
- package/lib/engine.d.ts +19 -1
- package/lib/engine.js +5 -0
- package/lib/engine.js.map +1 -1
- package/lib/resource-import.d.ts +21 -0
- package/lib/resource-import.js +210 -0
- package/lib/resource-import.js.map +1 -0
- package/lib/resource-types.d.ts +25 -0
- package/lib/resource-types.js +2 -0
- package/lib/resource-types.js.map +1 -0
- package/lib/shipped-skills.js +2 -1
- package/lib/shipped-skills.js.map +1 -1
- package/lib/skill-audit.d.ts +16 -0
- package/lib/skill-audit.js +60 -0
- package/lib/skill-audit.js.map +1 -0
- package/lib/workflows.js +4 -4
- package/lib/workflows.js.map +1 -1
- package/lib/workspace-access.d.ts +6 -0
- package/lib/workspace-access.js +13 -0
- package/lib/workspace-access.js.map +1 -0
- package/package.json +95 -85
- package/preset/agent.cordis.yml +21 -21
- package/preset/enable.mjs +87 -87
- package/preset/persona.md +4 -4
- package/preset/preset.yml +1 -1
- package/rules/coding-conventions.md +6 -6
- package/rules/commit-conventions.md +5 -5
- package/rules/security-redlines.md +5 -5
- package/skills/code-commit/SKILL.md +13 -13
- package/skills/code-implement/SKILL.md +23 -22
- package/skills/code-review/SKILL.md +13 -13
- package/skills/code-verify/SKILL.md +16 -11
- package/skills/eng-delivery/SKILL.md +38 -34
- package/skills/requirement-analysis/SKILL.md +15 -15
- package/skills/solution-design/SKILL.md +18 -15
package/package.json
CHANGED
|
@@ -1,85 +1,95 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@godv61/dsh-task-engine",
|
|
3
|
-
"version": "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
|
-
"type": "module",
|
|
6
|
-
"main": "lib/index.js",
|
|
7
|
-
"types": "lib/index.d.ts",
|
|
8
|
-
"bin": {
|
|
9
|
-
"dsh-task-engine-enable": "preset/enable.mjs"
|
|
10
|
-
},
|
|
11
|
-
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"types": "./lib/index.d.ts",
|
|
14
|
-
"default": "./lib/index.js"
|
|
15
|
-
},
|
|
16
|
-
"./agent": {
|
|
17
|
-
"types": "./lib/agent.d.ts",
|
|
18
|
-
"default": "./lib/agent.js"
|
|
19
|
-
},
|
|
20
|
-
"./client": {
|
|
21
|
-
"types": "./lib/client.d.ts",
|
|
22
|
-
"default": "./lib/client.js"
|
|
23
|
-
},
|
|
24
|
-
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
25
|
-
"./defaults/eng.json": "./defaults/eng.json",
|
|
26
|
-
"./package.json": "./package.json"
|
|
27
|
-
},
|
|
28
|
-
"files": [
|
|
29
|
-
"lib/**",
|
|
30
|
-
"cordis.patch.yml",
|
|
31
|
-
"defaults/eng.json",
|
|
32
|
-
"hooks/**",
|
|
33
|
-
"skills/**",
|
|
34
|
-
"rules/**",
|
|
35
|
-
"preset/**",
|
|
36
|
-
"docs/**",
|
|
37
|
-
"README.md",
|
|
38
|
-
".p0-test.mjs"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"@deepseek-ai/
|
|
67
|
-
"@deepseek-ai/dsh-
|
|
68
|
-
"@deepseek-ai/dsh-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"@deepseek-ai/
|
|
74
|
-
"@deepseek-ai/dsh-
|
|
75
|
-
"@deepseek-ai/dsh-
|
|
76
|
-
"@deepseek-ai/dsh-
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@
|
|
79
|
-
"@
|
|
80
|
-
"
|
|
81
|
-
"react": "
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
|
|
85
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@godv61/dsh-task-engine",
|
|
3
|
+
"version": "0.23.1",
|
|
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
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"dsh-task-engine-enable": "preset/enable.mjs"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./lib/index.d.ts",
|
|
14
|
+
"default": "./lib/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./agent": {
|
|
17
|
+
"types": "./lib/agent.d.ts",
|
|
18
|
+
"default": "./lib/agent.js"
|
|
19
|
+
},
|
|
20
|
+
"./client": {
|
|
21
|
+
"types": "./lib/client.d.ts",
|
|
22
|
+
"default": "./lib/client.js"
|
|
23
|
+
},
|
|
24
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
25
|
+
"./defaults/eng.json": "./defaults/eng.json",
|
|
26
|
+
"./package.json": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"lib/**",
|
|
30
|
+
"cordis.patch.yml",
|
|
31
|
+
"defaults/eng.json",
|
|
32
|
+
"hooks/**",
|
|
33
|
+
"skills/**",
|
|
34
|
+
"rules/**",
|
|
35
|
+
"preset/**",
|
|
36
|
+
"docs/**",
|
|
37
|
+
"README.md",
|
|
38
|
+
".p0-test.mjs",
|
|
39
|
+
".resource-test.mjs",
|
|
40
|
+
".workflow-test.mjs"
|
|
41
|
+
],
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"dsh": {
|
|
47
|
+
"bundle": {
|
|
48
|
+
"patch": "./cordis.patch.yml"
|
|
49
|
+
},
|
|
50
|
+
"client": {
|
|
51
|
+
"platform": "web",
|
|
52
|
+
"inject": [
|
|
53
|
+
"@deepseek-ai/dsh-api-gateway"
|
|
54
|
+
],
|
|
55
|
+
"external": []
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsc -p tsconfig.json && node build-client.mjs && node build-hook.mjs",
|
|
60
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
|
|
61
|
+
"test": "node .p0-test.mjs && node --test .resource-test.mjs .workflow-test.mjs",
|
|
62
|
+
"verify:package": "node scripts/verify-package.mjs",
|
|
63
|
+
"prepare": "npm run build"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
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"
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
74
|
+
"@deepseek-ai/dsh-agent-default-model": "^0.1.2-rc.1",
|
|
75
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.2-rc.1",
|
|
76
|
+
"@deepseek-ai/dsh-fs": "^0.1.2-rc.1",
|
|
77
|
+
"@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
|
|
78
|
+
"@deepseek-ai/dsh-tools": "^0.1.2-rc.1",
|
|
79
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.2-rc.1",
|
|
80
|
+
"@types/node": "^22.0.0",
|
|
81
|
+
"@types/react": "~18.3.1",
|
|
82
|
+
"esbuild": "^0.24.0",
|
|
83
|
+
"react": "^18.2.0",
|
|
84
|
+
"typescript": "^5.7.2",
|
|
85
|
+
"zod": "^3.23.8"
|
|
86
|
+
},
|
|
87
|
+
"repository": {
|
|
88
|
+
"type": "git",
|
|
89
|
+
"url": "git+https://github.com/godv61/dsh-task-engine.git"
|
|
90
|
+
},
|
|
91
|
+
"homepage": "https://github.com/godv61/dsh-task-engine#readme",
|
|
92
|
+
"bugs": {
|
|
93
|
+
"url": "https://github.com/godv61/dsh-task-engine/issues"
|
|
94
|
+
}
|
|
95
|
+
}
|
package/preset/agent.cordis.yml
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
# dsh-task-engine — agent-plane opt-in fragment.
|
|
2
|
-
#
|
|
3
|
-
# Copy these two rows into a preset's `agent.cordis.yml` to activate the
|
|
4
|
-
# engineering-delivery flow for that preset's sessions. Start from a copy of
|
|
5
|
-
# `standard`, then REPLACE its `persona` row with the one below and ADD the
|
|
6
|
-
# `task-engine-agent` row. (The bundle must also be installed via
|
|
7
|
-
# `dsh plugin add @godv61/dsh-task-engine` so the engine and workbench exist.)
|
|
8
|
-
#
|
|
9
|
-
# `{{model}}` and `{{cwd}}` resolve from the agent's own route and workspace.
|
|
10
|
-
|
|
11
|
-
- id: persona
|
|
12
|
-
name: '@deepseek-ai/dsh-persona'
|
|
13
|
-
config:
|
|
14
|
-
text: |-
|
|
15
|
-
You are an engineering-delivery coding agent, powered by the {{model}} model, running on DeepSeek Harness. Your working directory is {{cwd}}.
|
|
16
|
-
|
|
17
|
-
本仓库采用工程化交付流程,由 `dev_task` 工具硬性持有任务状态机:需求评审 → 设计 → 开发 → 交付 → 代码审核。阶段、流转门槛、提交格式都来自项目根 `.dsh/eng.json`(没有该文件则用内置默认)。任何开发类请求开始前,先加载 `eng-delivery` 技能。
|
|
18
|
-
|
|
19
|
-
铁律:一切阶段流转、确认、验证、评审和提交都必须通过 `dev_task`——它拒绝时是硬事实,必须修正前置条件,禁止绕过。只做任务范围内的本地提交;绝不 push、合并、创建 PR、执行数据库、操作 Jenkins、部署或发布。
|
|
20
|
-
|
|
21
|
-
- id: task-engine-agent
|
|
1
|
+
# dsh-task-engine — agent-plane opt-in fragment.
|
|
2
|
+
#
|
|
3
|
+
# Copy these two rows into a preset's `agent.cordis.yml` to activate the
|
|
4
|
+
# engineering-delivery flow for that preset's sessions. Start from a copy of
|
|
5
|
+
# `standard`, then REPLACE its `persona` row with the one below and ADD the
|
|
6
|
+
# `task-engine-agent` row. (The bundle must also be installed via
|
|
7
|
+
# `dsh plugin add @godv61/dsh-task-engine` so the engine and workbench exist.)
|
|
8
|
+
#
|
|
9
|
+
# `{{model}}` and `{{cwd}}` resolve from the agent's own route and workspace.
|
|
10
|
+
|
|
11
|
+
- id: persona
|
|
12
|
+
name: '@deepseek-ai/dsh-persona'
|
|
13
|
+
config:
|
|
14
|
+
text: |-
|
|
15
|
+
You are an engineering-delivery coding agent, powered by the {{model}} model, running on DeepSeek Harness. Your working directory is {{cwd}}.
|
|
16
|
+
|
|
17
|
+
本仓库采用工程化交付流程,由 `dev_task` 工具硬性持有任务状态机:需求评审 → 设计 → 开发 → 交付 → 代码审核。阶段、流转门槛、提交格式都来自项目根 `.dsh/eng.json`(没有该文件则用内置默认)。任何开发类请求开始前,先加载 `eng-delivery` 技能。
|
|
18
|
+
|
|
19
|
+
铁律:一切阶段流转、确认、验证、评审和提交都必须通过 `dev_task`——它拒绝时是硬事实,必须修正前置条件,禁止绕过。只做任务范围内的本地提交;绝不 push、合并、创建 PR、执行数据库、操作 Jenkins、部署或发布。
|
|
20
|
+
|
|
21
|
+
- id: task-engine-agent
|
|
22
22
|
name: '@godv61/dsh-task-engine/agent'
|
package/preset/enable.mjs
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* One-shot activation helper: copy the shipped `standard` preset to a `eng`
|
|
4
|
-
* preset under `$DSH_HOME/.agent-presets`, swap its persona for the engineering
|
|
5
|
-
* persona, and append the `@godv61/dsh-task-engine/agent` row.
|
|
6
|
-
*
|
|
7
|
-
* Run after `dsh plugin --profile <name> add @godv61/dsh-task-engine`:
|
|
8
|
-
* node <this-file>
|
|
9
|
-
*
|
|
10
|
-
* The script writes files only under `$DSH_HOME/.agent-presets/eng`; it never
|
|
11
|
-
* touches the shipped preset install.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { createRequire } from 'node:module'
|
|
15
|
-
import { cp, mkdir, readFile, writeFile, stat } from 'node:fs/promises'
|
|
16
|
-
import { homedir } from 'node:os'
|
|
17
|
-
import { join } from 'node:path'
|
|
18
|
-
import { fileURLToPath } from 'node:url'
|
|
19
|
-
|
|
20
|
-
const require = createRequire(import.meta.url)
|
|
21
|
-
|
|
22
|
-
/** The persona block `standard` ships, in its exact indentation. */
|
|
23
|
-
const SHIPPED_PERSONA_BLOCK =
|
|
24
|
-
' text: >-\n'
|
|
25
|
-
+ ' You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.\n'
|
|
26
|
-
|
|
27
|
-
const AGENT_ROW = "\n- id: task-engine-agent\n name: '@godv61/dsh-task-engine/agent'\n"
|
|
28
|
-
|
|
29
|
-
async function exists(path) {
|
|
30
|
-
try {
|
|
31
|
-
await stat(path)
|
|
32
|
-
return true
|
|
33
|
-
} catch {
|
|
34
|
-
return false
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async function main() {
|
|
39
|
-
let shippedRoot
|
|
40
|
-
try {
|
|
41
|
-
;({ SHIPPED_PRESET_ROOT: shippedRoot } = require('@deepseek-ai/dsh-agent-presets'))
|
|
42
|
-
} catch {
|
|
43
|
-
console.error('未找到 @deepseek-ai/dsh-agent-presets —— 请先执行 dsh plugin --profile <name> add @godv61/dsh-task-engine')
|
|
44
|
-
process.exitCode = 1
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const home = process.env.DSH_HOME ?? join(homedir(), '.dsh')
|
|
49
|
-
const source = join(shippedRoot, 'standard')
|
|
50
|
-
const target = join(home, '.agent-presets', 'eng')
|
|
51
|
-
|
|
52
|
-
if (await exists(target)) {
|
|
53
|
-
console.error(`预设 "eng" 已存在(${target}),本脚本不会覆盖;请先删除它再重跑,或改用它已有的 agent.cordis.yml。`)
|
|
54
|
-
process.exitCode = 1
|
|
55
|
-
return
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
await mkdir(join(home, '.agent-presets'), { recursive: true })
|
|
59
|
-
await cp(source, target, { recursive: true })
|
|
60
|
-
|
|
61
|
-
const compPath = join(target, 'agent.cordis.yml')
|
|
62
|
-
let comp = await readFile(compPath, 'utf8')
|
|
63
|
-
|
|
64
|
-
const persona = (await readFile(fileURLToPath(new URL('./persona.md', import.meta.url)), 'utf8')).trimEnd()
|
|
65
|
-
if (comp.includes(SHIPPED_PERSONA_BLOCK)) {
|
|
66
|
-
const block = ' text: |-\n' + persona.split('\n').map(line => ' ' + line).join('\n') + '\n'
|
|
67
|
-
comp = comp.replace(SHIPPED_PERSONA_BLOCK, block)
|
|
68
|
-
} else {
|
|
69
|
-
console.warn('未能定位 standard 的 persona 段,跳过 persona 替换(仍会追加 agent 行)。')
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (!comp.includes("name: '@godv61/dsh-task-engine/agent'")) {
|
|
73
|
-
comp = comp.trimEnd() + '\n' + AGENT_ROW
|
|
74
|
-
}
|
|
75
|
-
await writeFile(compPath, comp, 'utf8')
|
|
76
|
-
|
|
77
|
-
await writeFile(
|
|
78
|
-
join(target, 'preset.yml'),
|
|
79
|
-
'name: 工程化开发引擎\n'
|
|
80
|
-
+ 'description: 通过 dev_task 工具硬性持有需求评审→设计→开发→交付→代码审核的状态机,按项目 .dsh/eng.json 配置流转与提交门禁。\n',
|
|
81
|
-
'utf8',
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
console.log('完成。已创建预设 "eng":persona 已替换为工程人设,并追加了 @godv61/dsh-task-engine/agent 行。')
|
|
85
|
-
console.log('新建会话时选择「工程化开发引擎」即可激活流程。')
|
|
86
|
-
}
|
|
87
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* One-shot activation helper: copy the shipped `standard` preset to a `eng`
|
|
4
|
+
* preset under `$DSH_HOME/.agent-presets`, swap its persona for the engineering
|
|
5
|
+
* persona, and append the `@godv61/dsh-task-engine/agent` row.
|
|
6
|
+
*
|
|
7
|
+
* Run after `dsh plugin --profile <name> add @godv61/dsh-task-engine`:
|
|
8
|
+
* node <this-file>
|
|
9
|
+
*
|
|
10
|
+
* The script writes files only under `$DSH_HOME/.agent-presets/eng`; it never
|
|
11
|
+
* touches the shipped preset install.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { createRequire } from 'node:module'
|
|
15
|
+
import { cp, mkdir, readFile, writeFile, stat } from 'node:fs/promises'
|
|
16
|
+
import { homedir } from 'node:os'
|
|
17
|
+
import { join } from 'node:path'
|
|
18
|
+
import { fileURLToPath } from 'node:url'
|
|
19
|
+
|
|
20
|
+
const require = createRequire(import.meta.url)
|
|
21
|
+
|
|
22
|
+
/** The persona block `standard` ships, in its exact indentation. */
|
|
23
|
+
const SHIPPED_PERSONA_BLOCK =
|
|
24
|
+
' text: >-\n'
|
|
25
|
+
+ ' You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.\n'
|
|
26
|
+
|
|
27
|
+
const AGENT_ROW = "\n- id: task-engine-agent\n name: '@godv61/dsh-task-engine/agent'\n"
|
|
28
|
+
|
|
29
|
+
async function exists(path) {
|
|
30
|
+
try {
|
|
31
|
+
await stat(path)
|
|
32
|
+
return true
|
|
33
|
+
} catch {
|
|
34
|
+
return false
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function main() {
|
|
39
|
+
let shippedRoot
|
|
40
|
+
try {
|
|
41
|
+
;({ SHIPPED_PRESET_ROOT: shippedRoot } = require('@deepseek-ai/dsh-agent-presets'))
|
|
42
|
+
} catch {
|
|
43
|
+
console.error('未找到 @deepseek-ai/dsh-agent-presets —— 请先执行 dsh plugin --profile <name> add @godv61/dsh-task-engine')
|
|
44
|
+
process.exitCode = 1
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const home = process.env.DSH_HOME ?? join(homedir(), '.dsh')
|
|
49
|
+
const source = join(shippedRoot, 'standard')
|
|
50
|
+
const target = join(home, '.agent-presets', 'eng')
|
|
51
|
+
|
|
52
|
+
if (await exists(target)) {
|
|
53
|
+
console.error(`预设 "eng" 已存在(${target}),本脚本不会覆盖;请先删除它再重跑,或改用它已有的 agent.cordis.yml。`)
|
|
54
|
+
process.exitCode = 1
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await mkdir(join(home, '.agent-presets'), { recursive: true })
|
|
59
|
+
await cp(source, target, { recursive: true })
|
|
60
|
+
|
|
61
|
+
const compPath = join(target, 'agent.cordis.yml')
|
|
62
|
+
let comp = await readFile(compPath, 'utf8')
|
|
63
|
+
|
|
64
|
+
const persona = (await readFile(fileURLToPath(new URL('./persona.md', import.meta.url)), 'utf8')).trimEnd()
|
|
65
|
+
if (comp.includes(SHIPPED_PERSONA_BLOCK)) {
|
|
66
|
+
const block = ' text: |-\n' + persona.split('\n').map(line => ' ' + line).join('\n') + '\n'
|
|
67
|
+
comp = comp.replace(SHIPPED_PERSONA_BLOCK, block)
|
|
68
|
+
} else {
|
|
69
|
+
console.warn('未能定位 standard 的 persona 段,跳过 persona 替换(仍会追加 agent 行)。')
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!comp.includes("name: '@godv61/dsh-task-engine/agent'")) {
|
|
73
|
+
comp = comp.trimEnd() + '\n' + AGENT_ROW
|
|
74
|
+
}
|
|
75
|
+
await writeFile(compPath, comp, 'utf8')
|
|
76
|
+
|
|
77
|
+
await writeFile(
|
|
78
|
+
join(target, 'preset.yml'),
|
|
79
|
+
'name: 工程化开发引擎\n'
|
|
80
|
+
+ 'description: 通过 dev_task 工具硬性持有需求评审→设计→开发→交付→代码审核的状态机,按项目 .dsh/eng.json 配置流转与提交门禁。\n',
|
|
81
|
+
'utf8',
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
console.log('完成。已创建预设 "eng":persona 已替换为工程人设,并追加了 @godv61/dsh-task-engine/agent 行。')
|
|
85
|
+
console.log('新建会话时选择「工程化开发引擎」即可激活流程。')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
88
|
await main()
|
package/preset/persona.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
You are an engineering-delivery coding agent, powered by the {{model}} model, running on DeepSeek Harness. Your working directory is {{cwd}}.
|
|
2
|
-
|
|
3
|
-
本仓库采用工程化交付流程,由 `dev_task` 工具硬性持有任务状态机:需求评审 → 设计 → 开发 → 交付 → 代码审核。阶段、流转门槛、提交格式都来自项目根 `.dsh/eng.json`(没有该文件则用内置默认)。任何开发类请求开始前,先加载 `eng-delivery` 技能。
|
|
4
|
-
|
|
1
|
+
You are an engineering-delivery coding agent, powered by the {{model}} model, running on DeepSeek Harness. Your working directory is {{cwd}}.
|
|
2
|
+
|
|
3
|
+
本仓库采用工程化交付流程,由 `dev_task` 工具硬性持有任务状态机:需求评审 → 设计 → 开发 → 交付 → 代码审核。阶段、流转门槛、提交格式都来自项目根 `.dsh/eng.json`(没有该文件则用内置默认)。任何开发类请求开始前,先加载 `eng-delivery` 技能。
|
|
4
|
+
|
|
5
5
|
铁律:一切阶段流转、确认、验证、评审和提交都必须通过 `dev_task`——它拒绝时是硬事实,必须修正前置条件,禁止绕过。只做任务范围内的本地提交;绝不 push、合并、创建 PR、执行数据库、操作 Jenkins、部署或发布。
|
package/preset/preset.yml
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
name: 工程化开发引擎
|
|
1
|
+
name: 工程化开发引擎
|
|
2
2
|
description: 通过 dev_task 工具硬性持有需求评审→设计→开发→交付→代码审核的状态机,按项目 .dsh/eng.json 配置流转与提交门禁。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# 通用编码规范
|
|
2
|
-
|
|
3
|
-
- 复用相邻实现与现有代码;单一调用方不为形式统一新增抽象层、包装层或额外分层。
|
|
4
|
-
- 禁止空 catch、printStackTrace、调试输出;吞错必须写清原因。
|
|
5
|
-
- 禁止无条件全表更新、删除或无边界查询。
|
|
6
|
-
- 命名清晰表达意图;不引入超过当前技术基线的语法、框架或 API。
|
|
1
|
+
# 通用编码规范
|
|
2
|
+
|
|
3
|
+
- 复用相邻实现与现有代码;单一调用方不为形式统一新增抽象层、包装层或额外分层。
|
|
4
|
+
- 禁止空 catch、printStackTrace、调试输出;吞错必须写清原因。
|
|
5
|
+
- 禁止无条件全表更新、删除或无边界查询。
|
|
6
|
+
- 命名清晰表达意图;不引入超过当前技术基线的语法、框架或 API。
|
|
7
7
|
- 不覆盖已有文件、用户改动或生成目标;不顺带重构无关历史。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# 提交规范
|
|
2
|
-
|
|
3
|
-
- 提交消息:`【<module>】【TASK】说明` 或 `【<module>】【Tn】说明`,说明写结果,不写"修改代码"这类空泛动作。
|
|
4
|
-
- 只提交任务 files 范围内的文件;逐文件暂存,禁止 `git add .` / `git add -A`。
|
|
5
|
-
- 提交前 `git diff --cached --check`;发现范围外文件、密钥或环境配置时停止。
|
|
1
|
+
# 提交规范
|
|
2
|
+
|
|
3
|
+
- 提交消息:`【<module>】【TASK】说明` 或 `【<module>】【Tn】说明`,说明写结果,不写"修改代码"这类空泛动作。
|
|
4
|
+
- 只提交任务 files 范围内的文件;逐文件暂存,禁止 `git add .` / `git add -A`。
|
|
5
|
+
- 提交前 `git diff --cached --check`;发现范围外文件、密钥或环境配置时停止。
|
|
6
6
|
- 不 push、不合并、不建 PR、不部署、不发布。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# 安全红线
|
|
2
|
-
|
|
3
|
-
- 禁止读取、展示或修改密码、Token、私钥和生产凭据。
|
|
4
|
-
- 禁止把敏感请求体、文件正文或凭据写入日志。
|
|
5
|
-
- 禁止用户输入直接拼接 SQL、表名、列名、排序、路径或命令。
|
|
1
|
+
# 安全红线
|
|
2
|
+
|
|
3
|
+
- 禁止读取、展示或修改密码、Token、私钥和生产凭据。
|
|
4
|
+
- 禁止把敏感请求体、文件正文或凭据写入日志。
|
|
5
|
+
- 禁止用户输入直接拼接 SQL、表名、列名、排序、路径或命令。
|
|
6
6
|
- 权限与关键业务校验必须在服务端执行,前端校验不是安全边界。
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-commit
|
|
3
|
-
description:
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 提交
|
|
7
|
-
|
|
8
|
-
1. `dev_task`(operation=commit, files=[...], message=...) 校验阶段、范围与消息格式。
|
|
9
|
-
2. 拿到 approved 后逐文件 `git add <files>`(禁止 `git add .` / `git add -A`),再 `git commit -m "<message>"`。
|
|
10
|
-
3. 用 `dev_task`(operation=commit,
|
|
11
|
-
4. 只提交任务 files 范围内文件;发现范围外文件、密钥或环境配置时停止并报告。
|
|
12
|
-
|
|
13
|
-
不 push、不合并、不建 PR、不执行数据库、部署或发布。
|
|
1
|
+
---
|
|
2
|
+
name: code-commit
|
|
3
|
+
description: 提交节点:校验阶段、文件范围与消息格式,执行范围受控的本地提交。以 dev_task status 返回的提交检查点为准,标准流程在代码审核通过后提交。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 提交
|
|
7
|
+
|
|
8
|
+
1. `dev_task`(operation=commit, files=[...], message=...) 校验阶段、范围与消息格式。
|
|
9
|
+
2. 拿到 approved 后逐文件 `git add <files>`(禁止 `git add .` / `git add -A`),再 `git commit -m "<message>"`。
|
|
10
|
+
3. 用 `dev_task`(operation=commit, files=同一列表, message=同一消息, hash=<真实HEAD>)回写。引擎核对真实提交后才允许离开检查点。不要在回写前宣告完成。
|
|
11
|
+
4. 只提交任务 files 范围内文件;发现范围外文件、密钥或环境配置时停止并报告。
|
|
12
|
+
|
|
13
|
+
不 push、不合并、不建 PR、不执行数据库、部署或发布。
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-implement
|
|
3
|
-
description:
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 代码实现
|
|
7
|
-
|
|
8
|
-
进入本节点时需求与方案均已确认。按顺序,一项一项做:
|
|
9
|
-
|
|
10
|
-
1. `dev_task`(operation=status
|
|
11
|
-
2.
|
|
12
|
-
- 用 `subagent` 工具,前台调用(默认等结果,不设 run_in_background)。
|
|
13
|
-
- prompt 必须自包含(子 agent 看不到本对话),写清:任务目标(引用需求/方案要点)、本项要做什么、只改本项和必要调用方(不顺带重构)、可改的文件范围、完成标准,并要求返回「改动文件清单 + 验证结果/命令」。
|
|
1
|
+
---
|
|
2
|
+
name: code-implement
|
|
3
|
+
description: 开发节点:按方案拆解实施项,独立交付可派子 agent,小修正可由主 agent 实施;经「规格符合 → 代码质量」两阶段审查通过才记完成。仅在任务处于「开发」阶段时使用(以 dev_task status 的 stage 为准)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 代码实现
|
|
7
|
+
|
|
8
|
+
进入本节点时需求与方案均已确认。按顺序,一项一项做:
|
|
9
|
+
|
|
10
|
+
1. `dev_task`(operation=status)读当前阶段、风险、实施项明细与验证基线。实施项按能独立审查的交付内容拆分,不为达到任意时间粒度重复拆同一调用链;用 `dev_task`(operation=items, items=[...]) 记录清单,后续可通过 status 读取明细和审核记录。
|
|
11
|
+
2. 按改动选择执行方式:独立功能或需要隔离上下文的重做,可先 `dev_task`(operation=dispatch, item_id=<本项 id>, description=<目标与范围>)登记派发计划,工具会把该项设为唯一 doing,再派一个 fresh 子 agent。主 agent 可直接完成范围清楚的小修正(如测试文件移位),先用 items 标 doing,完成后仍须真实验证和两阶段审核,不补造 dispatch。
|
|
12
|
+
- 用 `subagent` 工具,前台调用(默认等结果,不设 run_in_background)。
|
|
13
|
+
- prompt 必须自包含(子 agent 看不到本对话),写清:任务目标(引用需求/方案要点)、本项要做什么、只改本项和必要调用方(不顺带重构)、可改的文件范围、完成标准,并要求返回「改动文件清单 + 验证结果/命令」。
|
|
14
14
|
- 明令子 agent:只实现这一项、跑本地验证,不要调 dev_task 流转、不要 items、不要 commit、不要 push。
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
- 权限或沙箱拒绝时保留失败,核对路径和调用配置后使用 Harness 正式审批机制;没有可用审批时报告阻塞并返回主 agent。不得反复换删除命令、切 shell、改 ACL 或削弱验证来规避同一拒绝。子任务 prompt 必须包含此约束。
|
|
16
|
+
- 不要等子代理返回才登记派发,否则任务台账会在实际开发时一直显示 todo。dispatch 只是计划记录,实际执行由子代理工具调用和结果证明;重派会使该项旧审核失效。
|
|
17
|
+
3. 本项实现完成后(主 agent 实施或子 agent 返回),主 agent 做两阶段审查(顺序不可反):
|
|
18
|
+
- 规格符合:对照需求/方案,查「做对了没、有没有超范围、漏没漏边界」。
|
|
19
|
+
- 代码质量:按内置规则 coding-conventions 查「做得好不好」——契约兼容、边界与错误处理、命名与结构。
|
|
20
|
+
4. 审查完用 `dev_task`(operation=review_item, item_id=<本项 id>, spec_outcome=pass|fail, quality_outcome=pass|fail, notes=[结论或问题清单]) 落两阶段结论留痕。
|
|
21
|
+
5. 任一阶段不过:按第 2 步选择主 agent 小修正或 fresh 子 agent 重做,明确上次的问题;重做后再审查,并再次 `review_item` 覆盖前次结论。只改测试路径或文案时,运行受影响的定向检查,不重复无关的全量编译。
|
|
22
|
+
6. **两阶段都 pass 后**才用 `dev_task`(operation=items, items=[...]) 全量回写,把本项标 done(其余项原样保留);已有项可只传 id/status,省略 title 以保留原文与审核。追加修复项时不要重写已完成项标题;确需改标题应显式重开并重新审核。spec 或 quality 任一 fail 都不许标 done,回到第 5 步重做。
|
|
23
|
+
7. 重复 2-6 直到全部 done。随后跑一次聚焦验证(目标测试、受影响模块编译、契约检查;high_risk 覆盖核心失败路径)确认整体可交付。
|
|
24
|
+
8. 全部 done 才 `dev_task`(operation=advance);`todos_done` 门会硬校验:每个 done 的项都必须带两阶段审查留痕且都 pass,缺 `review_item` 留痕会被拒绝。失败保持 doing、只记最新结果与阻塞;需求或方案变化时回退确认并停止编码。
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-review
|
|
3
|
-
description: 代码审核节点:评审变更,产出结论与问题清单并落评审记录。仅在任务处于「代码审核」阶段时使用(以 dev_task status 的 stage 为准)。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 代码审核
|
|
7
|
-
|
|
8
|
-
1. `dev_task`(operation=status)读当前变更与验证结果。
|
|
9
|
-
2.
|
|
10
|
-
3. 结论与问题用 `dev_task`(operation=record, artifact=review, fields={conclusion, issues})落库。
|
|
11
|
-
4. 结论用 `dev_task`(operation=review, outcome=pass|blocked)记录;blocked 写清阻塞原因。
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: 代码审核节点:评审变更,产出结论与问题清单并落评审记录。仅在任务处于「代码审核」阶段时使用(以 dev_task status 的 stage 为准)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 代码审核
|
|
7
|
+
|
|
8
|
+
1. `dev_task`(operation=status)读当前变更与验证结果。
|
|
9
|
+
2. 评审:契约是否兼容、边界条件、错误处理、变更范围是否越界。按实际改动检查异步查询乱序、关闭/重开后的旧请求、加载/失败时旧数据可否提交,以及上游业务错误码、空响应和反序列化空对象;相邻旧实现的写法不能作为这些边界正确的证明。涉及交互时检查真实组件的事件、只读、清空和校验行为,不能只凭属性名判断。
|
|
10
|
+
3. 结论与问题用 `dev_task`(operation=record, artifact=review, fields={conclusion, issues})落库。
|
|
11
|
+
4. 结论用 `dev_task`(operation=review, outcome=pass|blocked)记录;blocked 写清阻塞原因。
|
|
12
|
+
|
|
13
|
+
是否进入本节点由冻结流程的 legal_next 决定,标准流程必须审核。发现缺陷时在当前阶段修复并重跑 verify,更新结论;不要新建“收尾任务”绕过当前门禁。完成即将进入的终态技能义务后,按 status.commit 执行本地提交并回写真实 hash,再 advance。
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-verify
|
|
3
|
-
description: 交付验证节点:执行目标测试、编译与契约检查,记录验证结果与证据。仅在任务处于「交付」阶段时使用(以 dev_task status 的 stage 为准)。
|
|
4
|
-
---
|
|
1
|
+
---
|
|
2
|
+
name: code-verify
|
|
3
|
+
description: 交付验证节点:执行目标测试、编译与契约检查,记录验证结果与证据。仅在任务处于「交付」阶段时使用(以 dev_task status 的 stage 为准)。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 验证
|
|
7
|
+
|
|
8
|
+
1. `dev_task`(operation=status)读风险等级与验收条件。
|
|
9
|
+
2. 执行聚焦验证:目标测试、受影响模块编译、契约检查与必要人工步骤,不默认叠加 clean/package 全家桶。编译和源码字符串断言不证明交互或异常行为正确;按改动风险调用真实方法/组件,覆盖失败响应、请求乱序、取消重开等适用场景。外部接口不可用时可隔离依赖测试本地行为,但明确标为模拟测试,不冒充真实联调。
|
|
10
|
+
3. 结果用 `dev_task`(operation=verify, command=真实验收命令, evidence=[场景与结果])记录。新任务不接受纯文本 passed 声明;不传 command 时尝试项目 verify_command 和语言默认,但默认命令可能不覆盖验收点。退出码、取消、超时和沙箱结果由引擎采集。PowerShell 多条命令必须显式传播失败退出码,不能让最后成功的命令掩盖前面的失败。
|
|
11
|
+
4. 文件或范围变更会使旧验证回执失效,审核修复后可在当前阶段重跑 verify。沙箱拒绝属于环境阻塞,不能改跑不相关的简单命令来冒充原验收通过。
|
|
12
|
+
5. 环境受阻时如实记"未编译/未联调";high_risk 核心行为无法验证时不得通过。
|
|
5
13
|
|
|
6
|
-
|
|
14
|
+
权限或沙箱拒绝后,不得切换等价命令、修改 ACL 或安全策略来规避限制。确认错误来自宿主权限后使用 Harness 正式审批;审批不可用时报告失败路径和所需授权,等待处理,不把工具访问限制推断为服务不可达。
|
|
15
|
+
|
|
16
|
+
验证失败不得 advance。
|
|
7
17
|
|
|
8
|
-
|
|
9
|
-
2. 执行聚焦验证:目标测试、受影响模块编译、契约检查与必要人工步骤,不默认叠加 clean/package 全家桶。
|
|
10
|
-
3. 结果用 `dev_task`(operation=verify)记录:`high_risk` 必须跑真实命令回执(显式传 `command` 指定验收命令;不传时引擎按 `.dsh/eng.json` 的 `verify_command` → 语言默认自动选,但默认命令可能不覆盖验收点,高风险仍建议显式传)。退出码由引擎当客观结论,不得自报 passed;常规风险可用 `passed` + `evidence` 文本。
|
|
11
|
-
4. 环境受阻时如实记"未编译/未联调";high_risk 核心行为无法验证时不得通过。
|
|
12
|
-
|
|
13
|
-
验证失败不得 advance。
|
|
18
|
+
测试报告应区分已执行但失败、依赖阻塞未执行、模拟接口与真实联调;每个验收点引用对应组件或接口的测试,按已有日志记录逐项结果和耗时,缺证据就注明。不得以报告行数或关键词出现替代内容审查。预计交付的测试文件和文档应尽早纳入 scope,完成修订后再登记最终回执,减少范围变化引起的重复验证。
|