@godv61/dsh-task-engine 0.23.0 → 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.
Files changed (52) hide show
  1. package/.p0-test.mjs +739 -734
  2. package/.workflow-test.mjs +234 -0
  3. package/README.md +78 -184
  4. package/cordis.patch.yml +10 -10
  5. package/defaults/eng.json +10 -10
  6. package/docs/CHANGELOG.md +185 -0
  7. package/docs/README.md +27 -0
  8. package/docs/assets/workflow-banner.svg +29 -0
  9. package/docs/configuration.md +49 -0
  10. package/docs/development.md +53 -0
  11. package/docs/faq.md +43 -0
  12. package/docs/getting-started.md +51 -0
  13. package/docs/manual.html +17 -11
  14. package/docs/release-0.23.0.md +3 -5
  15. package/docs/release-0.23.1.md +58 -0
  16. package/docs/resource-install.md +55 -11
  17. package/docs/roadmap.md +33 -0
  18. package/docs/testing/0.23.1//346/265/213/350/257/225/346/212/245/345/221/212.md +34 -0
  19. 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
  20. package/docs/workflow-regression.md +36 -0
  21. package/hooks/commit-msg +4 -4
  22. package/lib/client.js +15 -14
  23. package/lib/client.js.map +3 -3
  24. package/lib/controller.js +5 -15
  25. package/lib/controller.js.map +1 -1
  26. package/lib/dev-task.js +188 -36
  27. package/lib/dev-task.js.map +1 -1
  28. package/lib/engine.d.ts +17 -1
  29. package/lib/engine.js +5 -0
  30. package/lib/engine.js.map +1 -1
  31. package/lib/shipped-skills.js +2 -1
  32. package/lib/shipped-skills.js.map +1 -1
  33. package/lib/skill-audit.d.ts +16 -0
  34. package/lib/skill-audit.js +60 -0
  35. package/lib/skill-audit.js.map +1 -0
  36. package/lib/workflows.js +4 -4
  37. package/lib/workflows.js.map +1 -1
  38. package/package.json +4 -3
  39. package/preset/agent.cordis.yml +21 -21
  40. package/preset/enable.mjs +87 -87
  41. package/preset/persona.md +4 -4
  42. package/preset/preset.yml +1 -1
  43. package/rules/coding-conventions.md +6 -6
  44. package/rules/commit-conventions.md +5 -5
  45. package/rules/security-redlines.md +5 -5
  46. package/skills/code-commit/SKILL.md +13 -13
  47. package/skills/code-implement/SKILL.md +23 -22
  48. package/skills/code-review/SKILL.md +13 -13
  49. package/skills/code-verify/SKILL.md +16 -11
  50. package/skills/eng-delivery/SKILL.md +38 -34
  51. package/skills/requirement-analysis/SKILL.md +15 -15
  52. package/skills/solution-design/SKILL.md +18 -15
@@ -0,0 +1,58 @@
1
+ # 0.23.1:真实项目回归后的流程修复
2
+
3
+ [← 文档导航](README.md)
4
+
5
+ 本版集中修复真实开发中暴露的资源来源、技能执行、审核记录、验证与提交问题,并改善错误提示。仍使用三个预设流程,不包含自定义流程编排。
6
+
7
+ ## 问题与处理
8
+
9
+ | 问题 | 处理方法 | 约束性质 |
10
+ | --- | --- | --- |
11
+ | 项目与个人同名技能被覆盖,界面来源误标 | 管理目录保留全部来源,绑定按名称去重;项目同名规则优先于个人规则 | 代码修复;技能正文最终解析由 Harness 负责 |
12
+ | Windows 的 BOM/CRLF 导致内置技能加载失败 | 技能注册、列表和正文读取兼容两种格式 | 代码修复及安装包测试 |
13
+ | 技能只披露而不执行,终态技能来不及参与验收 | 新任务检查成功的 skill 工具事件;附加技能登记真实命令回执;终态绑定在进入完成前执行 | 流转和提交门禁 |
14
+ | 内置技能被误当附加技能,重复登记导致多余阻塞 | status 列出 command_receipts_required;可选内置回执不升级为额外门禁 | 代码修复 |
15
+ | 更新实施项丢失审核;模型重写旧标题使审核消失 | 同 ID/标题保留审核,已有项可省略标题;已审核项改名须明确重开 | 写入前校验 |
16
+ | 子代理开工后任务项仍显示待办 | dispatch 提前登记并激活唯一进行项;重派清除旧审核 | 计划记录,不能证明子代理实际执行 |
17
+ | 验证未继承调用会话的权限与取消状态 | 验证传递会话沙箱策略、取消信号,保存退出码、超时和沙箱结果 | 代码修复 |
18
+ | 审核后错过提交窗口,完成缺少实际 Git 证据 | 新标准流程 v2 审核后提交;核对真实 HEAD、摘要及文件,回写哈希后完成 | 新任务门禁 |
19
+ | 文件变化后仍沿用旧测试结论 | 回执关联声明文件摘要,变化后重验 | 流转和提交门禁 |
20
+ | status 显示允许提交,实际被过期回执拒绝 | status.commit.allowed 同时检查技能与回执,evidence_blockers 列出过期原因 | 状态与执行校验一致 |
21
+ | 模型发明记录字段,需求写入被拒绝 | status.artifact_requirements 主动列出当前阶段允许字段和缺项;错误附恢复说明且不保存 | 保持严格校验,改善可发现性 |
22
+ | 小修正也强制派子代理,失败后重复换命令试探 | 小修正允许主代理实施,仍需审核与验证;权限拒绝走正式审批或报告阻塞 | 技能指引,不是硬拦截 |
23
+ | 猜测接口字段、混淆模拟测试与真实联调 | 设计核对原始契约与实际组件;报告区分对象、执行状态及证据来源 | 技能指引和人工审核 |
24
+
25
+ ## 新的状态信息
26
+
27
+ 标准流程在需求阶段返回的字段提示示例:
28
+
29
+ ```json
30
+ {
31
+ "artifact_requirements": [
32
+ {
33
+ "id": "requirement",
34
+ "name": "需求说明",
35
+ "fields": ["scope", "acceptance_criteria"],
36
+ "missing_fields": ["scope", "acceptance_criteria"]
37
+ }
38
+ ]
39
+ }
40
+ ```
41
+
42
+ 字段来自任务冻结流程,不硬编码同一套字段给所有预设。例如敏捷流程只有 scope;疑问和技术取舍写在已有字段正文,不增加字段名。无记录要求的阶段返回空列表。查询不会更改台账。
43
+
44
+ `legal_next` 是流程图中的候选去向,不表示门禁已经通过。`commit.allowed` 是阶段、技能和回执层面的提交资格;实际 commit 仍会检查此次输入的文件范围、摘要及所回写的 Git 证据。
45
+
46
+ ## 验证结果与边界
47
+
48
+ 自动化及安装包结果见 [0.23.1 测试说明](testing/0.23.1/测试报告.md)。候选版 rc.3 在一项真实需求中完成了需求/方案审批、8个实施项双阶段审核、测试技能执行、真实验证和本地提交回写。rc.5 与本次字段提示修复有定向回归及包验证,未再次执行整轮真实需求。
49
+
50
+ 该实机过程包含观察方纠正契约、复现异步缺陷和修订报告的干预,不能称为完全自主交付。业务结构树真实联调仍有环境与请求差异待核实,不能用插件本地闭环证明业务端到端可用。
51
+
52
+ 以下问题不由本版解决:Harness 内的文件删除权限限制、同步子代理反馈传播、模型服务鉴权/额度、旧业务项目的 Node/webpack 和测试运行器兼容问题。插件保留失败证据并指导正式恢复,不修改宿主权限系统或模型凭证。
53
+
54
+ 命令退出码成功不证明覆盖充分;本地记录不是防篡改存储;声明文件摘要不涵盖数据库、远程服务和未声明文件。报告准确性与代码质量仍需审核。
55
+
56
+ ## 升级与后续重跑
57
+
58
+ 升级安装后重启 Harness。既有任务沿用冻结流程及原执行约定,不自动迁移到新标准流程;新的执行证据门禁用于带 execution_version=1 的任务。需要比较插件效果时,归档上一轮任务和业务差异,在独立测试项目中将本需求改动恢复到同一基线,再用新会话完整重跑。保留插件修复及历轮证据,不能为重跑无差别清理用户文件。
@@ -1,18 +1,62 @@
1
- # 安装技能和规则
1
+ # 技能与规则安装
2
2
 
3
- 在 Harness 打开「工程流程」,先选择目标工作区,再进入「技能」或「规则」。
3
+ [← 文档导航](README.md)
4
4
 
5
- 1. 点「安装技能」,在系统文件选择器中选择技能文件夹;或点「安装规则」选择一个 Markdown 文件。
6
- 2. 查看预览中的名称、正文、目标路径、文件数、体积和冲突提示。
7
- 3. 选择项目或个人范围。切换范围后重新预览。
8
- 4. 点「确认安装」。成功后列表刷新;同名资源拒绝覆盖。新安装的技能仍需在「流程配置」中挂到对应节点。
5
+ 技能用于复用工作方法,规则用于描述项目约定。打开工作台后,先选择目标工作区,再进入“技能”或“规则”。
9
6
 
10
- 技能根目录包含 UTF-8 的 `SKILL.md`,frontmatter 提供单行 `name` 和 `description`。名称使用小写字母、数字和连字符,例如 `code-check`。规则名称来自 `.md` 文件名,同样采用上述格式。支持 UTF-8 BOM 和 CRLF;其他文本编码请先转换。技能的脚本与附件保留原始字节,安装不会执行脚本。
7
+ ## 安装四步
11
8
 
12
- 项目范围写入所选工作区 `.dsh/skills` 或 `.dsh/rules`;个人范围写入 `$DSH_HOME/skills` 或 `$DSH_HOME/rules`(默认用户主目录下 `.dsh`)。删除确认框显示实际路径;删除不经过回收站。
9
+ 1. **选择资源**:点“安装技能”选择文件夹;点“安装规则”选择一个 `.md` 文件。
10
+ 2. **检查预览**:查看名称、正文、文件数、体积、目标路径与同名冲突。
11
+ 3. **选择范围**:选择项目或个人,改变范围后会重新预览。
12
+ 4. **确认安装**:成功后列表刷新,再到“流程配置”把资源挂到对应阶段。
13
13
 
14
- 浏览器选择器访问浏览器所在电脑的文件;高级目录模式访问 Harness 主机的目录。两者在远程部署中可能不是同一台电脑。浏览器不会暴露源文件绝对路径或符号链接元数据,不能宣称浏览器上传也完成了源链接检查。
14
+ 预览不写入目标目录。已有同名资源时拒绝覆盖;请先检查现有内容,或给新资源使用不同名称。
15
15
 
16
- 导入限制为 1000 文件、100 MB 总量、20 MB 单文件、20 层相对路径;清单和规则正文最多 1 MB。自动排除 `node_modules`、`.git`、`__pycache__`、`.venv`、`venv`、`.cache` 和 `.DS_Store`。禁止路径穿越、Windows ADS、保留名称、大小写重名及文件/目录冲突。高级目录扫描拒绝链接和特殊文件。合法包的上传仍会在内存中编码及校验,大包经远程网关的容量和并发性能未完成压力测试。
16
+ ## 准备文件
17
17
 
18
- 预览不写入目标。确认时重新校验内容和目标的摘要,并使用独占创建避免覆盖现有资源;失败时清理本次新建的技能目录。此机制不构成针对具有同等主机文件权限的恶意进程的完整隔离。
18
+ 技能文件夹中需要 UTF-8 编码的 `SKILL.md`,frontmatter 包含单行 `name` 和 `description`。名称使用小写字母、数字和连字符,例如 `code-check`。脚本、模板和二进制附件可与清单一同安装。
19
+
20
+ 规则是一个 UTF-8 编码的 Markdown 文件,名称来自文件名,使用同样的命名规则,例如 `code-check.md`。支持 BOM 与 CRLF;其他编码请先转换。安装不会执行脚本。
21
+
22
+ ## 选择存放位置
23
+
24
+ | 范围 | 技能 | 规则 |
25
+ | :--- | :--- | :--- |
26
+ | 项目 | 工作区 `.dsh/skills` | 工作区 `.dsh/rules` |
27
+ | 个人 | `$DSH_HOME/skills` | `$DSH_HOME/rules` |
28
+
29
+ `DSH_HOME` 默认是用户主目录下的 `.dsh`。删除确认框显示实际路径;确认删除后不经过回收站。内置资源只读,项目和个人资源可以查看、编辑和删除。
30
+
31
+ ## 格式与大小限制
32
+
33
+ | 项目 | 上限 |
34
+ | :--- | ---: |
35
+ | 技能文件数量 | 1,000 |
36
+ | 总体积 | 100 MB |
37
+ | 单文件 | 20 MB |
38
+ | 相对目录深度 | 20 层 |
39
+ | SKILL.md 或规则正文 | 1 MB |
40
+
41
+ 常见缓存目录会自动排除,包括 `node_modules`、`.git`、`__pycache__`、`.venv`、`venv`、`.cache` 和 `.DS_Store`。不接受越级路径、Windows ADS、保留名称、大小写重名以及文件/目录冲突。
42
+
43
+ ## 安装失败时
44
+
45
+ | 提示或现象 | 处理方式 |
46
+ | :--- | :--- |
47
+ | 缺少 SKILL.md 或有多个技能 | 直接选择一个技能的根文件夹。 |
48
+ | 名称无效 | 修改源清单的 name 或规则文件名,再重新选择。 |
49
+ | 同名冲突 | 取消安装,检查现有资源;需要共存时使用不同名称。 |
50
+ | 超过限制 | 移除不需要的构建产物与大文件,再重新选择。 |
51
+ | 预览后内容或目标变化 | 重新预览后再确认。 |
52
+
53
+ 确认时会重新校验内容和目标摘要,并使用独占创建避免覆盖。技能写入中途失败时,会清理本次新建的技能目录。
54
+
55
+ <details>
56
+ <summary>高级:主机目录模式与上传限制</summary>
57
+
58
+ 系统选择器读取浏览器所在电脑的文件;高级目录模式读取 Harness 进程所在电脑的目录。本机个人使用时通常是同一台电脑。主机扫描拒绝符号链接、junction 和特殊文件;浏览器文件 API 不提供源链接元数据。
59
+
60
+ 上传内容在内存中编码、校验。100 MB 是代码限制,不是已经完成大包和并发压力测试的容量承诺;分块、进度和取消见[功能规划](roadmap.md)。
61
+
62
+ </details>
@@ -0,0 +1,33 @@
1
+ # 功能规划
2
+
3
+ [← 文档导航](README.md)
4
+
5
+ 本页记录讨论中的方向,不代表已发布功能。当前 npm 版本为 0.23.0;实现范围在开始编码前确认。
6
+
7
+ ## 优先讨论:自定义流程
8
+
9
+ 三个内置流程继续开箱即用,用户可以复制成自己的模板,通过可视化表单配置:
10
+
11
+ | 能力 | 建议第一版范围 |
12
+ | :--- | :--- |
13
+ | 阶段 | 添加、重命名、删除和调整顺序。 |
14
+ | 条件 | 为阶段设置人工确认、实施完成、验证、审核或必填产物。 |
15
+ | 资源 | 自由添加、替换和移除阶段技能/规则。 |
16
+ | 产物 | 配置名称与必填字段。 |
17
+ | 提交 | 配置提交阶段、方式、格式与文件范围要求。 |
18
+ | 复用 | 保存到项目,支持配置导入/导出。 |
19
+
20
+ 建议采用左侧阶段列表、右侧配置、底部流程预览。第一版以顺序流程为主;分支、循环和并行需要单独设计证据失效和任务恢复逻辑。
21
+
22
+ 运行中的任务保持原流程快照。多次验证、审核和人工确认应绑定到各自阶段,不能自动复用前一个阶段的通过状态。配置保存还应保留 verify_command 等已有项目字段。
23
+
24
+ ## 后续体验方向
25
+
26
+ - 资源导入:文件选择取消、大包进度、分块上传与取消。
27
+ - 资源维护:来源与版本记录、升级差异预览、备份和恢复。
28
+ - 工作台:未保存内容保护、台账扩展、语言与可访问性完善。
29
+ - 项目展示:真实工作台截图、案例和插件市场收录。
30
+
31
+ ## 产品范围
32
+
33
+ 本项目服务本机个人开发工作台。多用户服务器的会话权限架构不列为当前版本的必修项。日常改进优先解决工作区目标清晰、文件误操作、任务连续性和操作反馈。
@@ -0,0 +1,34 @@
1
+ # 0.23.1 发布验证
2
+
3
+ [← 发布说明](../../release-0.23.1.md)
4
+
5
+ 日期:2026-09-16。对象:插件 0.23.1。此文记录插件验证,不等同业务项目端到端验收。
6
+
7
+ ## 检查范围
8
+
9
+ | 检查 | 内容 | 状态 |
10
+ | --- | --- | --- |
11
+ | 新字段提示回归 | 两个新增用例先失败,修复后通过;错误输入不写入台账,提示按冻结流程变化 | 通过 |
12
+ | 流程回归 | 15项:审核保留、标题保护、派工状态、任务发现、技能回执、沙箱透传、Git回写、过期提示、字段披露及技能来源/注册 | 通过 |
13
+ | host/client 类型检查 | 两个 TypeScript 编译面 | 通过 |
14
+ | P0 与资源测试 | 126项基础检查、18项资源测试 | 通过 |
15
+ | 安装包黑盒 | 打包、干净项目安装、入口导入、客户端注册、包内测试和启用脚本语法 | 通过 |
16
+
17
+ 流程用例名称及断言位于包内 `.workflow-test.mjs`,资源用例位于 `.resource-test.mjs`,基础断言位于 `.p0-test.mjs`。发布前执行日志保留在发布工作区。`npm run typecheck` 与 `npm run verify:package` 均退出0,安装包检查包含实际安装后的包内测试。逐项运行明细见[自动化测试明细](自动化测试明细.md)。
18
+
19
+ ## 新增用例覆盖
20
+
21
+ 1. 当前需求阶段披露 scope/acceptance_criteria;返回准确缺项;未定义字段拒绝时整个记录保持不变;修正字段后可继续。
22
+ 2. 敏捷流程仅披露 scope,设计阶段披露自身字段,无记录阶段返回空列表。字段提示从冻结配置读取,不改变历史任务。
23
+
24
+ 新增测试在修复前均失败,避免只断言实现自身返回成功。状态查询一致性、真实提交、验证过期及失败技能等既有回归一并执行。
25
+
26
+ ## 实机证据的适用范围
27
+
28
+ rc.3 在真实业务需求中走完同一任务的审批、8项实施审核、测试技能、真实命令验证、范围受控本地提交及哈希回写。新增文档后过期的验证和测试技能回执实际阻止过提交,重验后恢复。rc.5 的状态提示修复及本次字段披露有自动化证据;由于用户暂停业务重跑,没有本版完整业务重跑证据。
29
+
30
+ 实机包含观察方干预,不算完全自主。业务结构树真实联调未通过;额外布局与虚拟滚动需求未实施。没有以这些未完成事项宣称产品业务全通过。
31
+
32
+ ## 发布限制
33
+
34
+ 仅已执行检查可标通过。包测试使用模拟宿主与干净安装,不能覆盖所有 Harness 版本、模型行为或共享部署权限场景。技能指引不能强制模型报告内容准确,所有完成结论仍须结合证据审查。
@@ -0,0 +1,41 @@
1
+ # 0.23.1 自动化测试明细
2
+
3
+ 执行日期:2026-09-16。命令:`node --test --test-reporter=tap .resource-test.mjs .workflow-test.mjs`。
4
+
5
+ 结果:33项全部通过(资源18项、流程15项),失败0、跳过0。以下耗时来自该次TAP日志,单位毫秒。P0的126项逐条断言另由安装包黑盒运行并通过,不合并计算为本表用例。
6
+
7
+ | 序号 | 用例 | 状态 | 耗时(ms) | 失败原因 |
8
+ | --- | --- | --- | ---: | --- |
9
+ | 1 | preview has no filesystem side effects and reports exact bytes | 通过 | 14.1514 | — |
10
+ | 2 | confirmed install preserves binary assets and refuses duplicates | 通过 | 10.1495 | — |
11
+ | 3 | changed content and changed installation target invalidate preview | 通过 | 3.697 | — |
12
+ | 4 | path traversal, Windows ADS and reserved names are rejected | 通过 | 1.2775 | — |
13
+ | 5 | case-colliding filenames are rejected | 通过 | 1.307 | — |
14
+ | 6 | bundled names and ambiguous containers are rejected | 通过 | 1.1597 | — |
15
+ | 7 | single-file rule accepts UTF-8 BOM and CRLF; empty rules are refused | 通过 | 4.3463 | — |
16
+ | 8 | file and directory prefix conflicts fail during preview | 通过 | 1.1838 | — |
17
+ | 9 | failed installation removes only its own incomplete directory | 通过 | 10.333 | — |
18
+ | 10 | host directory scanner resolves one container child and excludes caches | 通过 | 5.7372 | — |
19
+ | 11 | host scanner rejects symlink or junction source paths | 通过 | 2.4564 | — |
20
+ | 12 | deep directories and oversized files fail before installation | 通过 | 32.4539 | — |
21
+ | 13 | invalid UTF-8, encoding and absent source directories report errors | 通过 | 1.8314 | — |
22
+ | 14 | registered host workspace wins over client spelling; unknown paths fail | 通过 | 2.952 | — |
23
+ | 15 | legacy host retains its explicit workspace policy | 通过 | 0.3168 | — |
24
+ | 16 | host registry failures are not downgraded to legacy permissions | 通过 | 0.1657 | — |
25
+ | 17 | ledger shows absent storage as empty and propagates access errors | 通过 | 21.1636 | — |
26
+ | 18 | ledger rejects malformed records instead of pretending there are no tasks | 通过 | 0.3444 | — |
27
+ | 19 | 审查通过后更新状态并激活下一项,保留已完成项的审计 | 通过 | 9.621 | — |
28
+ | 20 | 追加修复项可按 id 保留旧标题,拒绝已完成项改名后静默丢审核 | 通过 | 2.9022 | — |
29
+ | 21 | 派发立即反映进行中,重派不复用旧审核且保持单一进行项 | 通过 | 2.2759 | — |
30
+ | 22 | 无任务 id 的 status 发现当前工作区任务并支持分支过滤 | 通过 | 0.904 | — |
31
+ | 23 | 状态明确区分内置节点门禁与附加技能命令回执,避免重复验证 | 通过 | 2.5274 | — |
32
+ | 24 | status 披露当前阶段记录字段和缺项,字段误用不写入且可按提示恢复 | 通过 | 2.3448 | — |
33
+ | 25 | 记录字段来自冻结流程,精简流程不硬编码标准字段,无记录阶段返回空列表 | 通过 | 3.7337 | — |
34
+ | 26 | 可选内置技能回执不会因范围变更升级成额外流转门禁 | 通过 | 1.993 | — |
35
+ | 27 | 验证使用会话策略与取消信号,并明确返回失败及沙箱信息 | 通过 | 0.9705 | — |
36
+ | 28 | 只声明已测试、或加载失败,均不能冒充执行绑定技能 | 通过 | 1.2714 | — |
37
+ | 29 | 绑定技能失败阻止完成;成功后仍须提交真实 Git 回执 | 通过 | 4.7971 | — |
38
+ | 30 | 验证后修改代码会使旧回执失效,必须重新验证 | 通过 | 1.7267 | — |
39
+ | 31 | status 提交提示与真实门禁一致,分别披露过期验证和附加技能回执且不改台账 | 通过 | 4.7468 | — |
40
+ | 32 | 同名技能与规则在项目和个人目录各自保留管理入口 | 通过 | 19.3435 | — |
41
+ | 33 | 安装包的七个内置技能实际注册且可在资源目录发现 | 通过 | 2.9187 | — |
@@ -0,0 +1,36 @@
1
+ # 真实项目回归迭代
2
+
3
+ 版本:0.23.1,汇总本轮候选修复;完整业务流程的实机证据来自 rc.3,后续修复有针对性回归及包验证。
4
+
5
+ 以 EAM 设备结构树和单选弹窗需求重跑工作台,业务代码由工作台执行;插件修复与独立观察分开记录。
6
+
7
+ | 上一轮问题 | 本轮处理 |
8
+ | :--- | :--- |
9
+ | 项目技能被同名个人技能覆盖 | 资源目录保留各来源;绑定选择按名称去重。 |
10
+ | 无任务 ID 的入口 status 报错 | 返回候选列表,支持分支过滤,不猜测当前任务。 |
11
+ | 更新实施项状态清空审核记录 | 同 ID、同标题保留审核;重开或改标题使审核失效。 |
12
+ | verify 丢会话沙箱上下文 | 透传会话策略与取消信号,记录沙箱结果。 |
13
+ | 审核后已错过提交窗口 | 标准 v2 改为审核通过后提交,离开前核对 Git 回执。 |
14
+ | 完成才披露测试技能,未执行 | 终态绑定提前执行;加载记录和附加技能命令回执参与门禁。 |
15
+ | 内置技能被误当成附加技能重复登记 | 状态列出必需回执技能;可选内置回执过期不额外拦截。 |
16
+ | 子代理已开工而实施项仍待办 | 派工前登记并自动设进行中,禁止另一项同时进行;实际执行仍核对日志。 |
17
+ | 追加修复项重写标题使审核丢失 | 已有项支持省略标题;已审核项改名须先重新打开。 |
18
+ | 方案猜测字段、驳回后直接重试 | 要求核对资料和真实组件行为,先收集反馈再修订送审。 |
19
+
20
+ 新任务验证使用真实命令,并关联声明文件内容。改动代码后重跑验证;不会把“我测过了”直接转换为通过。附加技能可用交付文件内容校验命令,但不能用恒成功命令充当验收。
21
+
22
+ 旧任务使用冻结配置及原执行约定,不自动修改历史记录。规则解析优先级为内置、项目、个人;技能正文的选择由 Harness 技能目录负责。
23
+
24
+ 边界:文件摘要只涵盖声明的任务文件,不涵盖数据库、远端接口、依赖和未声明文件;成功退出码不证明测试充分。审核意见仍需人工判断。当前没有对任务记录做签名,也不防止有权限的人直接手改状态。
25
+
26
+ 验收要求:同一个真实需求走完确认、设计、开发、技能测试、验证、审核、受控提交;不得另建收尾任务绕过门禁,不得以简单命令替代失败的核心验证。插件发布与业务验收分开记录,未完成的真实联调不宣称通过。
27
+
28
+ 执行指引:范围清楚的小修正可由主代理完成,保留状态、审核及定向验证,不强制重复派子代理;权限或沙箱拒绝须走正式审批或报告阻塞,禁止反复换命令或修改 ACL 规避。上述行为指引不能替代 Harness 的权限执行,也尚未证明可消除模型误用。
29
+
30
+ 本轮 EAMDEV-R2 已在同一任务达到完成(revision 60),8 项审核齐全,software-testing 在终态前执行并记录真实回执,业务提交 95892e8 回写成功;未推送或发布。结构树真实请求返回非 JSON,配置大小写差异待授权修正,不能声称端到端验收通过。
31
+
32
+ 实机发现状态查询仍将过期回执任务显示为可提交,但真实 commit 门禁拒绝。rc.5 让 status 使用与 commit 相同的技能和摘要阻塞检查,新增 evidence_blockers,保持状态查询只读。报告证据归属错误仍需审查,技能加载和退出码不能证明报告内容准确。
33
+
34
+ 后续任务出现未定义记录字段:校验正确拒绝,但模型缺少主动字段提示。0.23.1 新增 artifact_requirements,按冻结流程返回当前阶段字段及缺项,错误附恢复说明;兼容敏捷流程只有 scope 的情况,两个新增用例先失败后通过。
35
+
36
+ 完整重跑方法:每轮归档业务差异、任务和问题证据,修复插件后将本轮业务改动恢复到同一基线,用独立会话重新交付完整需求。保留插件改进,不把上一轮实现复制为下一轮成果。暂停期间不调用模型;额度/鉴权问题属于服务状态,不由本包修改凭证处理。
package/hooks/commit-msg CHANGED
@@ -137,7 +137,7 @@ var STANDARD = {
137
137
  policy: "task",
138
138
  message_pattern: "^\u3010(\\S+)\u3011\u3010(?:TASK|T\\d+)\u3011.+",
139
139
  message_hint: "\u3010<task_id>\u3011\u3010TASK/T1\u3011\u8BF4\u660E \u2014\u2014 \u7B2C\u4E00\u6BB5\u586B\u672C\u4EFB\u52A1 id\uFF08\u5982 GREET-001\uFF09\uFF0C\u5199\u7ED3\u679C\u4E0D\u5199\u7A7A\u6CDB\u52A8\u4F5C",
140
- checkpoints: ["\u4EA4\u4ED8"],
140
+ checkpoints: ["\u4EE3\u7801\u5BA1\u6838"],
141
141
  file_scope: true
142
142
  },
143
143
  high_risk_requires_verification: true,
@@ -145,8 +145,8 @@ var STANDARD = {
145
145
  "\u9700\u6C42\u8BC4\u5BA1": { skills: ["requirement-analysis"], rules: ["security-redlines"] },
146
146
  "\u8BBE\u8BA1": { skills: ["solution-design"] },
147
147
  "\u5F00\u53D1": { skills: ["code-implement"], rules: ["coding-conventions"] },
148
- "\u4EA4\u4ED8": { skills: ["code-verify", "code-commit"], rules: ["coding-conventions", "commit-conventions"] },
149
- "\u4EE3\u7801\u5BA1\u6838": { skills: ["code-review"], rules: ["security-redlines"] }
148
+ "\u4EA4\u4ED8": { skills: ["code-verify"], rules: ["coding-conventions"] },
149
+ "\u4EE3\u7801\u5BA1\u6838": { skills: ["code-review", "code-commit"], rules: ["security-redlines", "commit-conventions"] }
150
150
  }
151
151
  };
152
152
  var AGILE = {
@@ -208,7 +208,7 @@ function preset(id, version, label, description, config2) {
208
208
  return { id, version, label, description, capabilities: deriveCapabilities(config2), config: config2 };
209
209
  }
210
210
  var FLOW_PRESETS = {
211
- standard: preset("standard", 1, "\u6807\u51C6\u7814\u53D1", "\u9700\u6C42\u8BC4\u5BA1 \u2192 \u8BBE\u8BA1 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u4EE3\u7801\u5BA1\u6838\uFF0C\u542B\u4EA7\u7269\u95E8 + \u786E\u8BA4\u95E8", STANDARD),
211
+ standard: preset("standard", 2, "\u6807\u51C6\u7814\u53D1", "\u9700\u6C42\u8BC4\u5BA1 \u2192 \u8BBE\u8BA1 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u4EE3\u7801\u5BA1\u6838\uFF0C\u5BA1\u6838\u540E\u63D0\u4EA4", STANDARD),
212
212
  agile: preset("agile", 1, "\u654F\u6377\u8F7B\u91CF", "\u9700\u6C42 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u5BA1\u67E5\uFF0C\u56DB\u9636\u6BB5\u3001\u5C11\u4EA7\u7269", AGILE),
213
213
  minimal: preset("minimal", 1, "\u7EAF\u4EE3\u7801", "\u5F00\u53D1 \u2192 \u4EA4\u4ED8\uFF0C\u4E24\u9636\u6BB5\uFF0C\u53EA\u7559\u63D0\u4EA4\u95E8\u7981", MINIMAL)
214
214
  };
package/lib/client.js CHANGED
@@ -28,7 +28,7 @@ __export(index_exports, {
28
28
  });
29
29
  module.exports = __toCommonJS(index_exports);
30
30
 
31
- // node_modules/zod/v3/external.js
31
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/external.js
32
32
  var external_exports = {};
33
33
  __export(external_exports, {
34
34
  BRAND: () => BRAND,
@@ -140,7 +140,7 @@ __export(external_exports, {
140
140
  void: () => voidType
141
141
  });
142
142
 
143
- // node_modules/zod/v3/helpers/util.js
143
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/helpers/util.js
144
144
  var util;
145
145
  (function(util2) {
146
146
  util2.assertEqual = (_) => {
@@ -274,7 +274,7 @@ var getParsedType = (data) => {
274
274
  }
275
275
  };
276
276
 
277
- // node_modules/zod/v3/ZodError.js
277
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/ZodError.js
278
278
  var ZodIssueCode = util.arrayToEnum([
279
279
  "invalid_type",
280
280
  "invalid_literal",
@@ -392,7 +392,7 @@ ZodError.create = (issues) => {
392
392
  return error;
393
393
  };
394
394
 
395
- // node_modules/zod/v3/locales/en.js
395
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/locales/en.js
396
396
  var errorMap = (issue, _ctx) => {
397
397
  let message;
398
398
  switch (issue.code) {
@@ -495,7 +495,7 @@ var errorMap = (issue, _ctx) => {
495
495
  };
496
496
  var en_default = errorMap;
497
497
 
498
- // node_modules/zod/v3/errors.js
498
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/errors.js
499
499
  var overrideErrorMap = en_default;
500
500
  function setErrorMap(map) {
501
501
  overrideErrorMap = map;
@@ -504,7 +504,7 @@ function getErrorMap() {
504
504
  return overrideErrorMap;
505
505
  }
506
506
 
507
- // node_modules/zod/v3/helpers/parseUtil.js
507
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/helpers/parseUtil.js
508
508
  var makeIssue = (params) => {
509
509
  const { data, path, errorMaps, issueData } = params;
510
510
  const fullPath = [...path, ...issueData.path || []];
@@ -614,14 +614,14 @@ var isDirty = (x) => x.status === "dirty";
614
614
  var isValid = (x) => x.status === "valid";
615
615
  var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise;
616
616
 
617
- // node_modules/zod/v3/helpers/errorUtil.js
617
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/helpers/errorUtil.js
618
618
  var errorUtil;
619
619
  (function(errorUtil2) {
620
620
  errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {};
621
621
  errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message;
622
622
  })(errorUtil || (errorUtil = {}));
623
623
 
624
- // node_modules/zod/v3/types.js
624
+ // D:/dsharness/my-dsh/dsh-task-engine/node_modules/zod/v3/types.js
625
625
  var ParseInputLazyPath = class {
626
626
  constructor(parent, value, path, key) {
627
627
  this._cachedPath = [];
@@ -4831,7 +4831,7 @@ var STANDARD = {
4831
4831
  policy: "task",
4832
4832
  message_pattern: "^\u3010(\\S+)\u3011\u3010(?:TASK|T\\d+)\u3011.+",
4833
4833
  message_hint: "\u3010<task_id>\u3011\u3010TASK/T1\u3011\u8BF4\u660E \u2014\u2014 \u7B2C\u4E00\u6BB5\u586B\u672C\u4EFB\u52A1 id\uFF08\u5982 GREET-001\uFF09\uFF0C\u5199\u7ED3\u679C\u4E0D\u5199\u7A7A\u6CDB\u52A8\u4F5C",
4834
- checkpoints: ["\u4EA4\u4ED8"],
4834
+ checkpoints: ["\u4EE3\u7801\u5BA1\u6838"],
4835
4835
  file_scope: true
4836
4836
  },
4837
4837
  high_risk_requires_verification: true,
@@ -4839,8 +4839,8 @@ var STANDARD = {
4839
4839
  "\u9700\u6C42\u8BC4\u5BA1": { skills: ["requirement-analysis"], rules: ["security-redlines"] },
4840
4840
  "\u8BBE\u8BA1": { skills: ["solution-design"] },
4841
4841
  "\u5F00\u53D1": { skills: ["code-implement"], rules: ["coding-conventions"] },
4842
- "\u4EA4\u4ED8": { skills: ["code-verify", "code-commit"], rules: ["coding-conventions", "commit-conventions"] },
4843
- "\u4EE3\u7801\u5BA1\u6838": { skills: ["code-review"], rules: ["security-redlines"] }
4842
+ "\u4EA4\u4ED8": { skills: ["code-verify"], rules: ["coding-conventions"] },
4843
+ "\u4EE3\u7801\u5BA1\u6838": { skills: ["code-review", "code-commit"], rules: ["security-redlines", "commit-conventions"] }
4844
4844
  }
4845
4845
  };
4846
4846
  var AGILE = {
@@ -4902,7 +4902,7 @@ function preset(id, version, label2, description, config) {
4902
4902
  return { id, version, label: label2, description, capabilities: deriveCapabilities(config), config };
4903
4903
  }
4904
4904
  var FLOW_PRESETS = {
4905
- standard: preset("standard", 1, "\u6807\u51C6\u7814\u53D1", "\u9700\u6C42\u8BC4\u5BA1 \u2192 \u8BBE\u8BA1 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u4EE3\u7801\u5BA1\u6838\uFF0C\u542B\u4EA7\u7269\u95E8 + \u786E\u8BA4\u95E8", STANDARD),
4905
+ standard: preset("standard", 2, "\u6807\u51C6\u7814\u53D1", "\u9700\u6C42\u8BC4\u5BA1 \u2192 \u8BBE\u8BA1 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u4EE3\u7801\u5BA1\u6838\uFF0C\u5BA1\u6838\u540E\u63D0\u4EA4", STANDARD),
4906
4906
  agile: preset("agile", 1, "\u654F\u6377\u8F7B\u91CF", "\u9700\u6C42 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u5BA1\u67E5\uFF0C\u56DB\u9636\u6BB5\u3001\u5C11\u4EA7\u7269", AGILE),
4907
4907
  minimal: preset("minimal", 1, "\u7EAF\u4EE3\u7801", "\u5F00\u53D1 \u2192 \u4EA4\u4ED8\uFF0C\u4E24\u9636\u6BB5\uFF0C\u53EA\u7559\u63D0\u4EA4\u95E8\u7981", MINIMAL)
4908
4908
  };
@@ -5179,6 +5179,7 @@ function BindingEditor({ stages, stageBindings, setStageBindings, skills, rules
5179
5179
  const boundSkills = stageBindings[currentStage]?.skills ?? [];
5180
5180
  const boundRules = stageBindings[currentStage]?.rules ?? [];
5181
5181
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: styles.section, children: [
5182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: styles.hint, children: "\u7ED1\u5B9A\u6309\u540D\u79F0\u751F\u6548\uFF1B\u540C\u540D\u8D44\u6E90\u53EF\u5728\u8D44\u6E90\u7BA1\u7406\u4E2D\u6309\u9879\u76EE\uFF0F\u4E2A\u4EBA\u5206\u522B\u67E5\u770B\u3002\u5B8C\u6210\u8282\u70B9\u7684\u6280\u80FD\u5FC5\u987B\u5728\u8FDB\u5165\u5B8C\u6210\u524D\u6267\u884C\uFF0C\u6D4B\u8BD5\u6280\u80FD\u5EFA\u8BAE\u653E\u5728\u4EA4\u4ED8\u8282\u70B9\u3002" }),
5182
5183
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: styles.field, children: [
5183
5184
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.fieldLabel, children: "\u9009\u62E9\u8282\u70B9\uFF08\u6539\u54EA\u4E2A\u8282\u70B9\u7684\u6302\u8F7D\uFF09" }),
5184
5185
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.chips, children: stages.map((s) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.Pill, { active: s === currentStage, onClick: () => {
@@ -5188,7 +5189,7 @@ function BindingEditor({ stages, stageBindings, setStageBindings, skills, rules
5188
5189
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: cardV, children: [
5189
5190
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: styles.bindingStage, children: [
5190
5191
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.fieldLabel, children: "skill\uFF08\u8FD9\u4E2A\u8282\u70B9\u505A\u4EC0\u4E48\uFF09" }),
5191
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.chips, children: skills.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.sourceBadge, children: "\u6682\u65E0\u53EF\u7528 skill \u2014\u2014 \u5207\u5230\u4E0A\u65B9\u300C\u6280\u80FD\u300D\u6807\u7B7E\u9875\u65B0\u5EFA" }) : skills.map((sk) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dsh_client_ui_primitives.Pill, { active: boundSkills.includes(sk.name), onClick: () => {
5192
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.chips, children: skills.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.sourceBadge, children: "\u6682\u65E0\u53EF\u7528 skill \u2014\u2014 \u5207\u5230\u4E0A\u65B9\u300C\u6280\u80FD\u300D\u6807\u7B7E\u9875\u65B0\u5EFA" }) : skills.filter((sk, index, all) => all.findIndex((other) => other.name === sk.name) === index).map((sk) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dsh_client_ui_primitives.Pill, { active: boundSkills.includes(sk.name), onClick: () => {
5192
5193
  toggleSkill(sk.name);
5193
5194
  }, title: `${sk.description}\uFF08${sourceLabel(sk.source)}\uFF09`, children: [
5194
5195
  sk.name,
@@ -5201,7 +5202,7 @@ function BindingEditor({ stages, stageBindings, setStageBindings, skills, rules
5201
5202
  ] }),
5202
5203
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: styles.bindingStage, children: [
5203
5204
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.fieldLabel, children: "rule\uFF08\u8FD9\u4E2A\u8282\u70B9\u5B88\u4EC0\u4E48\uFF09" }),
5204
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.chips, children: rules.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.sourceBadge, children: "\u6682\u65E0\u53EF\u7528 rule \u2014\u2014 \u5207\u5230\u4E0A\u65B9\u300C\u89C4\u5219\u300D\u6807\u7B7E\u9875\u65B0\u5EFA" }) : rules.map((rule) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dsh_client_ui_primitives.Pill, { active: boundRules.includes(rule.name), onClick: () => {
5205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: styles.chips, children: rules.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: styles.sourceBadge, children: "\u6682\u65E0\u53EF\u7528 rule \u2014\u2014 \u5207\u5230\u4E0A\u65B9\u300C\u89C4\u5219\u300D\u6807\u7B7E\u9875\u65B0\u5EFA" }) : rules.filter((rule, index, all) => all.findIndex((other) => other.name === rule.name) === index).map((rule) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dsh_client_ui_primitives.Pill, { active: boundRules.includes(rule.name), onClick: () => {
5205
5206
  toggleRule(rule.name);
5206
5207
  }, title: `\u6765\u6E90\uFF1A${sourceLabel(rule.source)}`, children: [
5207
5208
  rule.name,