@godv61/dsh-task-engine 0.29.3 → 0.30.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.
Files changed (85) hide show
  1. package/.adaptive-test.mjs +380 -185
  2. package/.codex-project-test.mjs +18 -18
  3. package/.evidence-test.mjs +14 -1
  4. package/.hook-test.mjs +19 -19
  5. package/.resource-test.mjs +17 -0
  6. package/.roundtrip-test.mjs +8 -3
  7. package/.sonar-credential-test.mjs +38 -0
  8. package/.sonarlint-local-test.mjs +71 -0
  9. package/.workflow-test.mjs +56 -9
  10. package/README.md +35 -112
  11. package/docs/development.md +45 -53
  12. package/docs/manual.html +140 -84
  13. package/hooks/commit-msg +19 -1
  14. package/lib/adaptive.js +1 -1
  15. package/lib/adaptive.js.map +1 -1
  16. package/lib/client.js +297 -9
  17. package/lib/client.js.map +1 -1
  18. package/lib/controller.d.ts +44 -0
  19. package/lib/controller.js +73 -0
  20. package/lib/controller.js.map +1 -1
  21. package/lib/dev-task.d.ts +2 -0
  22. package/lib/dev-task.js +342 -42
  23. package/lib/dev-task.js.map +1 -1
  24. package/lib/engine.d.ts +5 -1
  25. package/lib/engine.js +6 -0
  26. package/lib/engine.js.map +1 -1
  27. package/lib/hook.js +3 -3
  28. package/lib/hook.js.map +1 -1
  29. package/lib/project-init.d.ts +4 -0
  30. package/lib/project-init.js +21 -2
  31. package/lib/project-init.js.map +1 -1
  32. package/lib/skill-audit.js +9 -1
  33. package/lib/skill-audit.js.map +1 -1
  34. package/lib/sonar-credential.d.ts +17 -0
  35. package/lib/sonar-credential.js +17 -0
  36. package/lib/sonar-credential.js.map +1 -0
  37. package/lib/sonar-report.d.ts +4 -0
  38. package/lib/sonar-report.js +53 -0
  39. package/lib/sonar-report.js.map +1 -0
  40. package/lib/sonar.d.ts +35 -2
  41. package/lib/sonar.js +63 -4
  42. package/lib/sonar.js.map +1 -1
  43. package/lib/sonarlint-local.d.ts +17 -0
  44. package/lib/sonarlint-local.js +317 -0
  45. package/lib/sonarlint-local.js.map +1 -0
  46. package/lib/verification-tests.d.ts +10 -0
  47. package/lib/verification-tests.js +15 -0
  48. package/lib/verification-tests.js.map +1 -0
  49. package/package.json +6 -4
  50. package/preset/enable.mjs +2 -2
  51. package/preset/persona.md +4 -4
  52. package/scripts/verify-dsh-compat.mjs +14 -14
  53. package/scripts/verify-package.mjs +10 -8
  54. package/skills/architecture-design/SKILL.md +11 -11
  55. package/skills/code-development/SKILL.md +11 -11
  56. package/skills/code-review/SKILL.md +12 -10
  57. package/skills/eng-delivery/SKILL.md +10 -7
  58. package/skills/requirements-analysis/SKILL.md +11 -11
  59. package/skills/task-orchestration/SKILL.md +11 -11
  60. package/skills/test-validation/SKILL.md +11 -9
  61. package/docs/BRIEF-FOR-REVIEW.md +0 -163
  62. package/docs/CHANGELOG.md +0 -407
  63. package/docs/README.md +0 -42
  64. package/docs/adaptive-workflows.md +0 -76
  65. package/docs/assets/workflow-banner.svg +0 -29
  66. package/docs/configuration.md +0 -80
  67. package/docs/faq.md +0 -59
  68. package/docs/getting-started.md +0 -55
  69. package/docs/listing/godv61__dsh-task-engine.yml +0 -6
  70. package/docs/listing/submission.md +0 -84
  71. package/docs/manual-legacy.html +0 -380
  72. package/docs/releases/0.23.0.md +0 -32
  73. package/docs/releases/0.23.1.md +0 -58
  74. package/docs/releases/0.23.2.md +0 -21
  75. package/docs/resource-install.md +0 -64
  76. package/docs/roadmap.md +0 -33
  77. 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 +0 -189
  78. package/docs/testing/0.23.0//346/265/213/350/257/225/346/212/245/345/221/212.md +0 -42
  79. package/docs/testing/0.23.1//346/265/213/350/257/225/346/212/245/345/221/212.md +0 -34
  80. 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 +0 -41
  81. package/docs/testing/0.23.2/R02/344/270/232/345/212/241/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -56
  82. package/docs/testing/0.23.2/R03/344/270/232/345/212/241/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -38
  83. package/docs/testing/0.23.2//346/265/213/350/257/225/346/212/245/345/221/212.md +0 -65
  84. package/docs/testing/0.23.2//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/230/216/347/273/206.md +0 -43
  85. package/docs/workflow-regression.md +0 -36
@@ -1,53 +1,45 @@
1
- # 开发指南
2
-
3
- [← 文档导航](README.md)
4
-
5
- 插件包含 host 控制器、agent 工具和浏览器工作台。代码为 TypeScript,发布到 npm 的包包含预构建入口与资源文件。
6
-
7
- ## 本地验证
8
-
9
- 在插件源码目录执行:
10
-
11
- ```sh
12
- npm install
13
- npm run build
14
- npm run typecheck
15
- npm test
16
- npm run verify:package
17
- ```
18
-
19
- `build` 生成 host、浏览器客户端与提交钩子;`typecheck` 检查 host 和 client 两个编译面。`verify:package` 将 tarball 安装到干净临时项目,检查包入口、客户端注册、包内测试和 CLI 语法。
20
-
21
- CI 在 Windows 的 Node 22/24 上运行。每次功能修改选择相关验证;文档排版调整只需要文档、链接和渲染检查。测试数量随版本变化,当前值以本地 `npm test` 与 `npm run verify:package` 的输出为准,不在此处固定。
22
-
23
- ## 代码导航
24
-
25
- | 位置 | 职责 |
26
- | :--- | :--- |
27
- | [src/engine.ts](../src/engine.ts) | 状态机、阶段条件和提交规则检查。 |
28
- | [src/workflows.ts](../src/workflows.ts) | 三套流程骨架及可选的推荐配置。 |
29
- | [src/dev-task.ts](../src/dev-task.ts) | 模型使用的 dev_task 工具与任务文件操作。 |
30
- | [src/controller.ts](../src/controller.ts) | 工作台读取配置、任务和资源的 Remote 控制器。 |
31
- | [src/resource-import.ts](../src/resource-import.ts) | 导入校验、安装预览、独占写入与失败清理。 |
32
- | [src/client](../src/client/) | 工作台界面与客户端 Remote 定义。 |
33
- | [src/hook.ts](../src/hook.ts) | 提交钩子的源码,构建后输出到 hooks/commit-msg。 |
34
- | [cordis.patch.yml](../cordis.patch.yml) | Bundle 的 host 挂载声明。 |
35
-
36
- ## 启用方式
37
-
38
- Host 入口挂载工作台控制器,并在 eng 预设不存在时生成“工程化开发引擎”。Agent 入口只在引用它的会话预设中注册工具和技能。
39
-
40
- 需要将插件接入自己的会话预设时,在该预设的 agent.cordis.yml 加入:
41
-
42
- ```yaml
43
- - id: task-engine-agent
44
- name: '@godv61/dsh-task-engine/agent'
45
- ```
46
-
47
- eng 预设由插件在每次启动时**从当前 Harness 的 `standard` 预设重新派生**,因此 Harness 升级后预设会跟着更新。判断依据是文件里是否带有本插件写入的 agent 行:**插件自己生成的会被更新,手工编辑过的原样保留**。配套的 `enable` 脚本行为更保守——目标已存在时直接拒绝,不覆盖。
48
-
49
- ## 可选 host 接入
50
-
51
- Host 入口优先使用 Harness 的 `workspaceRegistry.resolveByPath` 获取已登记工作区。旧 host 可以通过插件导出的 `registerWorkspace` 和 `enableStrictWorkspaces` 配置注册目录及严格模式,接口定义见 [src/controller.ts](../src/controller.ts)。注册范围不等于会话身份鉴权;个人本机使用不要求为此改造 Harness。
52
-
53
- 发布前保持 README、使用手册和实际代码一致;不要将规划中的功能描述为已经可用。
1
+ # 开发与发布
2
+
3
+ [返回项目首页](../README.md) · [使用手册](manual.html)
4
+
5
+ 插件分为 host 控制器、agent 工具和浏览器工作台。源码在 `src/`,构建结果在 `lib/`,npm 包包含预构建入口、内置 Skill、预设和提交钩子。
6
+
7
+ ## 代码位置
8
+
9
+ | 路径 | 主要职责 |
10
+ | --- | --- |
11
+ | `src/adaptive.ts`、`src/workflows.ts`、`src/engine.ts` | 四档流程、兼容流程与任务状态机。 |
12
+ | `src/dev-task.ts` | `dev_task` 操作、阶段门禁和任务留痕。 |
13
+ | `src/sonarlint-local.ts`、`src/sonar.ts`、`src/sonar-report.ts` | 本地规则分析、服务端结果与 Markdown 报告。 |
14
+ | `src/verification-tests.ts` | Maven 测试摘要门禁。 |
15
+ | `src/project-init.ts` | 项目扫描与初始化覆盖检查。 |
16
+ | `src/controller.ts`、`src/client/` | 工作台读写接口与界面。 |
17
+ | `skills/`、`preset/` | 会话编排与元技能正文。 |
18
+
19
+ ## 本地验证
20
+
21
+ 在插件源码根目录执行:
22
+
23
+ ```sh
24
+ npm install
25
+ npm run typecheck
26
+ npm run build
27
+ npm test
28
+ npm run verify:package
29
+ ```
30
+
31
+ `verify:package` 将当前 tarball 安装到隔离临时目录,检查可发布入口、客户端注册、包内测试和 CLI 语法。CI 在 Windows 的 Node 22、24 上运行。提交前检查 `git status`,确认没有本机凭据、临时审核文件或生成包进入版本控制。
32
+
33
+ ## 当前质量约束
34
+
35
+ - 本地 Sonar 审核必须先对照参考分支的 Git 差异、项目 `include_paths` 与任务 `files`;漏登文件不得产生“完整审核通过”。
36
+ - `ide-local` 的逐项误报处置只能在当前审核、当前代码指纹上由宿主人工批准;原始告警和结果保留。CI 或上传式服务端 Gate 不接受本地处置。
37
+ - Maven 测试目标在进程成功之外,还需解析到非零 Surefire/Failsafe 测试数。未输出摘要时失败关闭,其他命令按自身回执判断。
38
+ - `items` 默认按 ID 合并;显式 `items_mode=replace` 才允许移除未实施的项目。已完成或有审查记录的项仍保留。
39
+ - 文档只维护项目首页、本 HTML 使用手册和本开发指南,三处描述均以当前功能为准。
40
+
41
+ ## 发布与部署检查
42
+
43
+ 1. 更新 `package.json` 版本,运行上述验证,再检查 `npm pack --dry-run --json` 的文件清单只有当前文档。
44
+ 2. 推送提交后发布 npm 包;需要 npm 登录或 WebAuthn 时,保持发布命令等待,由账号持有人完成验证。
45
+ 3. 在实际 DSH Web profile 安装刚发布的精确版本并重启,确认侧边栏入口、会话预设和 `dev_task` 能加载。项目 Token 保存在本机凭据中,升级不应把它写进仓库。
package/docs/manual.html CHANGED
@@ -3,118 +3,174 @@
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>DSH Task Engine 使用手册</title>
6
+ <title>DSH Task Engine · 使用手册</title>
7
7
  <style>
8
- :root{--ink:#172535;--muted:#526477;--line:#d8e1eb;--blue:#2155b4;--pale:#edf4ff;--paper:#f5f7fa;--white:#fff}
8
+ :root{--ink:#172535;--muted:#526477;--line:#d8e1eb;--blue:#2155b4;--pale:#edf4ff;--paper:#f5f7fa;--white:#fff;--warn:#fff2dc}
9
9
  *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font:16px/1.75 "Microsoft YaHei","PingFang SC",system-ui,sans-serif}
10
- a{color:var(--blue)}code,pre{font-family:Consolas,"Cascadia Code",monospace}code{background:#eef2f6;padding:.1em .35em;border-radius:.25em}pre{overflow:auto;padding:1rem;background:#14243c;color:#fff;border-radius:.6rem}pre code{padding:0;background:none}
10
+ a{color:var(--blue)}code,pre{font-family:Consolas,"Cascadia Code",monospace}code{background:#eef2f6;padding:.1em .35em;border-radius:.25em}pre{overflow:auto;padding:1rem;background:#14243c;color:#fff;border-radius:.6rem}pre code{padding:0;background:none;color:inherit}
11
11
  header{padding:2.5rem max(1rem,calc((100vw - 1120px)/2));background:linear-gradient(120deg,#143775,#2760bc);color:#fff}header h1{margin:.1rem 0;font-size:2.3rem}header p{max-width:850px;margin:.4rem 0}
12
- .layout{width:min(1120px,calc(100% - 2rem));margin:2rem auto;display:grid;grid-template-columns:230px minmax(0,1fr);gap:1.5rem}nav{position:sticky;top:1rem;align-self:start;background:var(--white);border:1px solid var(--line);border-radius:.7rem;padding:1rem}nav a{display:block;padding:.25rem 0}
13
- main{min-width:0}section{background:var(--white);border:1px solid var(--line);border-radius:.8rem;padding:1.4rem;margin-bottom:1rem}h2{margin:0 0 .8rem}h3{margin:1.35rem 0 .35rem}p{margin:.5rem 0 1rem}.note{background:var(--pale);border-left:4px solid var(--blue);padding:.75rem 1rem;border-radius:.3rem}.warn{background:#fff2dc;border-left-color:#bc7821}
12
+ .layout{width:min(1120px,calc(100% - 2rem));margin:2rem auto;display:grid;grid-template-columns:235px minmax(0,1fr);gap:1.5rem}nav{position:sticky;top:1rem;align-self:start;background:var(--white);border:1px solid var(--line);border-radius:.7rem;padding:1rem}nav a{display:block;padding:.24rem 0}
13
+ main{min-width:0}section{background:var(--white);border:1px solid var(--line);border-radius:.8rem;padding:1.4rem;margin-bottom:1rem}h2{margin:0 0 .8rem}h3{margin:1.35rem 0 .35rem}p{margin:.5rem 0 1rem}.note{background:var(--pale);border-left:4px solid var(--blue);padding:.75rem 1rem;border-radius:.3rem}.warn{background:var(--warn);border-left-color:#bc7821}
14
14
  table{border-collapse:collapse;width:100%;font-size:.94rem}th,td{border:1px solid var(--line);padding:.55rem;text-align:left;vertical-align:top}th{background:#edf4ff}ul,ol{padding-left:1.45rem}li+li{margin-top:.3rem}.scroll{overflow-x:auto}
15
15
  @media(max-width:760px){.layout{display:block}nav{position:static;margin-bottom:1rem}nav a{display:inline-block;margin-right:.8rem}header{padding:1.5rem 1rem}}@media print{nav{display:none}.layout{display:block;width:100%}section{break-inside:avoid}}
16
16
  </style>
17
17
  </head>
18
18
  <body>
19
19
  <header>
20
- <p>DeepSeek Harness · 0.29.3</p>
21
- <h1>DSH Task Engine 使用手册</h1>
22
- <p>按每个需求选择工程路径,用项目 Skill 和 Rule 复用团队规范;SonarQube 审核由项目自行选择。</p>
20
+ <p>DeepSeek Harness · 当前使用手册</p>
21
+ <h1>DSH Task Engine</h1>
22
+ <p>按每次需求选择流程,使用项目 Skill 与 Rule 复用团队规范;需要时再启用 SonarQube 审核。</p>
23
23
  </header>
24
24
  <div class="layout">
25
25
  <nav aria-label="目录">
26
26
  <strong>目录</strong>
27
- <a href="#status">版本状态</a>
28
- <a href="#start">开始使用</a>
29
- <a href="#flows">四档任务流程</a>
30
- <a href="#skills">元技能与规则</a>
31
- <a href="#init">项目初始化</a>
32
- <a href="#sonar">可选 SonarQube</a>
33
- <a href="#commit">为什么当前要提交</a>
34
- <a href="#limits">验证边界</a>
27
+ <a href="#overview">先理解工作方式</a>
28
+ <a href="#install">安装与检查</a>
29
+ <a href="#first-project">首次初始化项目</a>
30
+ <a href="#skills">Skill 与 Rule</a>
31
+ <a href="#flows">四档流程与交接</a>
32
+ <a href="#task">执行一个任务</a>
33
+ <a href="#tests">测试和证据</a>
34
+ <a href="#sonar">配置 SonarQube</a>
35
+ <a href="#findings">审核结果与误报</a>
36
+ <a href="#ledger">任务台账与文件</a>
37
+ <a href="#help">常见问题</a>
35
38
  </nav>
36
39
  <main>
37
- <section id="status">
38
- <h2>版本状态</h2>
39
- <div class="note">本手册描述 <code>0.29.3</code> 的自适应流程、项目 Skill/Rule 初始化与可选 SonarQube CI 接入。Sonar 审核当前需要先提交并完成 CI 扫描,尚不支持未提交代码的本地 Sonar 审核。</div>
40
- <p>本手册替换了旧版 HTML 说明。旧任务快照仍可读,工作台已移除旧版流程页。历史操作保存在<a href="manual-legacy.html">历史手册</a>,现行技术细节见<a href="adaptive-workflows.md">自适应流程说明</a>。</p>
40
+ <section id="overview">
41
+ <h2>先理解工作方式</h2>
42
+ <p>一个项目可以有很多会话和任务。项目配置保存团队通用的 Skill、Rule 与可选 SonarQube 连接;每个<strong>新任务</strong>由模型根据需求复杂度选择一条流程,创建时冻结阶段顺序。项目配置不会把普通会话或该项目的所有任务强制放进同一流程。</p>
43
+ <p>元技能负责本阶段要做什么、交给下一阶段什么;项目 Skill 说明如何在该项目做;Rule 给出具体约束。任务台账保存实施项、验证回执与审核记录。模型可以执行工作,但阶段和质量门禁由 <code>dev_task</code> 检查。</p>
44
+ <div class="note">首次使用的最短路径:安装并重启 → 在工作台选择项目 → 初始化项目 Skill/Rule → 进入“工程化开发引擎”会话描述需求 → 查看任务台账。</div>
41
45
  </section>
42
- <section id="start">
43
- <h2>开始使用</h2>
46
+
47
+ <section id="install">
48
+ <h2>安装与检查</h2>
49
+ <p>插件必须安装到你实际启动的 DSH Web profile。以下以 <code>web</code> 为例:</p>
50
+ <pre><code>dsh plugin --profile web add @godv61/dsh-task-engine</code></pre>
51
+ <p>如果通过 DSH 源码运行,在 DSH 根目录可使用:</p>
52
+ <pre><code>pnpm dsh plugin --profile web add @godv61/dsh-task-engine
53
+ pnpm dsh web --no-open</code></pre>
44
54
  <ol>
45
- <li>在使用的 Web profile 中启用插件,重启 Harness Web。</li>
46
- <li>进入「工程任务」工作台并选择项目工作区。「自适应流程」用于查看四档路径、给元技能挂载项目 Skill,以及设置可选 SonarQube。</li>
47
- <li>新建「工程化开发引擎」会话并描述需求。模型先分析复杂度,用 <code>dev_task assess</code> 预览,再在创建任务时给出 <code>complexity</code> 和理由。</li>
48
- <li>在「任务台账」查看阶段、验证、审核及 Sonar 记录。每个任务独立选择流程;同一项目里的其他会话不会被统一推入同一流程。</li>
55
+ <li>关闭已有的 DSH Web 进程,再用相同 profile 启动,避免旧进程继续加载旧包。</li>
56
+ <li>侧边栏找到<strong>工程任务</strong>;新建会话能选<strong>工程化开发引擎</strong>。</li>
57
+ <li>在工作台顶部选择项目工作区。项目路径应是代码库根目录;先确认当前 Git 分支。</li>
49
58
  </ol>
50
- <p>工作台「项目初始化」页分开显示项目 Skill/Rule 初始化与 <code>AGENTS.md</code> 生成。前者可复制请求到工程化开发引擎会话,再由 <code>dev_task init_project</code> 执行;页面本身不会直接生成项目 Skill/Rule。</p>
59
+ <p>只在某个目录执行 <code>npm install</code> 不会把插件挂进 DSH profile。没有入口时先核对安装和启动的 profile,再查看 Web 启动日志。</p>
51
60
  </section>
52
- <section id="flows">
53
- <h2>四档任务流程</h2>
54
- <div class="scroll"><table>
55
- <thead><tr><th>档次</th><th>适用情况</th><th>阶段顺序</th></tr></thead>
56
- <tbody>
57
- <tr><td>低</td><td>边界明确的局部修改</td><td>代码开发 → 测试 → 代码审核 → 完成</td></tr>
58
- <tr><td>中</td><td>常规功能或缺陷修复</td><td>需求分析 → 代码开发 → 测试 → 代码审核 → 完成</td></tr>
59
- <tr><td>高</td><td>跨模块且存在实现先后依赖</td><td>需求分析 → 任务编排 → 代码开发 → 测试 → 代码审核 → 完成</td></tr>
60
- <tr><td>超高</td><td>完整新模块或大范围重构</td><td>需求分析 → 架构设计 → 任务编排 → 代码开发 → 测试 → 代码审核 → 完成</td></tr>
61
- </tbody>
62
- </table></div>
63
- <p>高档的任务编排按实现先后拆解,记录依赖和交接产物,不按人员分工。风险级别与复杂度分开判断。阶段顺序和门禁在任务创建时冻结,Skill/Rule 正文更新后会在下一次读取时生效并提示漂移。</p>
61
+
62
+ <section id="first-project">
63
+ <h2>首次初始化项目</h2>
64
+ <p>打开“工程任务 → 项目初始化”,在“项目 Skill / Rule 初始化”复制请求,把它发送到以该项目为工作区的“工程化开发引擎”会话。页面提供入口;实际扫描和写入由会话中的 <code>dev_task init_project</code> 完成。</p>
65
+ <div class="scroll"><table><thead><tr><th>阶段</th><th>会发生什么</th><th>你要检查什么</th></tr></thead><tbody>
66
+ <tr><td><code>inspect</code></td><td>只读扫描目录、构建清单与可证明的版本。</td><td>是否看到了主要后端、前端、脚本模块。</td></tr>
67
+ <tr><td><code>propose</code></td><td>预览拟生成的 Skill、Rule、挂载关系与项目地图覆盖检查。</td><td>技术栈是否来自实际清单;项目地图是否总结整个仓库,而非当前需求。</td></tr>
68
+ <tr><td><code>apply</code></td><td>按同一提案哈希写入项目文件;已有同名文件不会被静默覆盖。</td><td>查看生成的内容与绑定,再决定哪些文件提交给团队。</td></tr>
69
+ </tbody></table></div>
70
+ <p>常见产物是 <code>.dsh/skills/&lt;项目名&gt;-project-map/SKILL.md</code>、技术栈和后端/前端开发 Skill,以及 <code>.dsh/rules/</code> 下的项目规则。项目地图写模块职责、依赖、通用入口与版本证据;某个需求的页面、接口和验收条件放进任务产物。工作台同页的 <code>AGENTS.md</code> 生成功能是另一项操作。</p>
71
+ <p>团队共享时,审阅后将 <code>.dsh/skills/</code>、<code>.dsh/rules/</code>、<code>.dsh/meta.json</code> 纳入 Git。Token 和本地审核报告不应随代码提交。</p>
64
72
  </section>
73
+
65
74
  <section id="skills">
66
- <h2>元技能、Skill 与 Rule</h2>
67
- <p>内置六个通用元技能:需求分析、架构设计、任务编排、代码开发、测试、代码审核。每个阶段加载同名核心 Skill;使用者可为阶段增加项目 Skill。每个 Skill 的 <code>profile.json</code> 保存它引用的 Rule 和证据要求。</p>
68
- <p>同名 Skill 的选择顺序是 <code>.dsh/skills</code> → <code>.agents/skills</code> → 用户目录 → 插件内置。项目同名 Skill 采用自己的 Rule,不混合用户级同名 Skill 的规则。点击“配置核心 Skill 的 Rule”即可编辑;若当前是内置或用户级 Skill,保存时先复制为同名项目 Skill,再写入规则档案。</p>
69
- <pre><code>{
70
- "meta_bindings": {
71
- "requirements-analysis": ["my-project-map"],
72
- "code-development": ["my-project-map", "my-code-backend"]
73
- }
74
- }</code></pre>
75
- <p>这个配置位于项目根目录 <code>.dsh/meta.json</code>,只增加技能挂载;四档流程由每个任务自己的复杂度决定。</p>
75
+ <h2>Skill 与 Rule 如何生效</h2>
76
+ <p>内置核心 Skill 对应需求分析、架构设计、任务编排、代码开发、测试和代码审核。你可以给这些元技能挂载项目 Skill,并在 Skill 的 <code>profile.json</code> 配置 Rule。项目 Skill 可来自 <code>.dsh/skills/</code>,工作台也能发现 <code>.agents/skills/</code> 中的 Codex 项目技能;用户级资源可跨项目复用。</p>
77
+ <p><strong>同名 Skill 的优先级:</strong>项目级优先于用户级,用户级优先于插件内置。项目同名版本使用自己的 Rule 列表,不把低优先级版本的 Rule 自动混进来。Rule 挂在 Skill 下,不是给某个阶段随意叠加;同一个 Skill 被不同元技能使用时遵守同一组 Rule。</p>
78
+ <p>项目挂载保存在 <code>.dsh/meta.json</code>;工作台“自适应流程”可完成配置。编辑正文后,下一次加载读取最新文件,但已创建任务仍按创建时的阶段图和资源引用运行。删除正在引用的 Skill/Rule 会阻止流转。</p>
79
+ <p>初始化生成的 Rule 应有明确触发条件、适用边界和正确示例。Sonar 审核失败后,只有<strong>真实、已修复、可复用</strong>的案例才适合用 <code>learn_rule propose → apply</code> 写入项目 Rule;误报不应被教给下一次开发。</p>
80
+ </section>
81
+
82
+ <section id="flows">
83
+ <h2>四档流程与阶段交接</h2>
84
+ <div class="scroll"><table><thead><tr><th>复杂度</th><th>典型范围</th><th>阶段顺序</th></tr></thead><tbody>
85
+ <tr><td>低</td><td>边界明确的局部修改</td><td>代码开发 → 测试 → 代码审核 → 完成</td></tr>
86
+ <tr><td>中</td><td>常规功能或缺陷修复</td><td>需求分析 → 代码开发 → 测试 → 代码审核 → 完成</td></tr>
87
+ <tr><td>高</td><td>跨模块且存在实现先后依赖</td><td>需求分析 → 任务编排 → 代码开发 → 测试 → 代码审核 → 完成</td></tr>
88
+ <tr><td>超高</td><td>完整新模块或大范围重构</td><td>需求分析 → 架构设计 → 任务编排 → 代码开发 → 测试 → 代码审核 → 完成</td></tr>
89
+ </tbody></table></div>
90
+ <p>需求分析交付目标、范围、非目标和可验证的验收条件;架构设计交付边界、影响与取舍;任务编排交付按实现先后排列的实施项 ID、依赖和交接产物;代码开发交付变更文件及逐项规格/质量审查;测试交付真实命令与覆盖说明;代码审核交付结论及可选 Sonar 报告。<strong>实施项是推进顺序,不是给团队成员派活。</strong>风险等级与复杂度独立判断。</p>
76
91
  </section>
77
- <section id="init">
78
- <h2>项目初始化</h2>
79
- <p>从「自适应流程」页顶部点击「初始化项目 Skill / Rule」,或直接进入「项目初始化」页。点击「复制初始化请求」,在项目根工作区的新「工程化开发引擎」会话中粘贴发送。此页下方的 <code>AGENTS.md</code> 生成是另一项独立功能。</p>
80
- <p>在项目工作区用 <code>dev_task init_project phase=inspect</code> 扫描目录和常见构建清单,取得项目结构、技术栈及可证实版本。模型再检查代表性源码,拟定项目地图、技术栈、后端或前端开发等 Skill 与 Rule。</p>
92
+
93
+ <section id="task">
94
+ <h2>执行一个任务</h2>
81
95
  <ol>
82
- <li><code>phase=inspect</code>:只读扫描并返回建议。</li>
83
- <li><code>phase=propose</code>:预览拟写入的资源及挂载关系。</li>
84
- <li><code>phase=apply</code>:使用相同草稿与哈希写入项目目录;已有同名文件不会被覆盖。</li>
96
+ <li>新会话使用“工程化开发引擎”预设并描述需求。先调用 <code>dev_task status</code> 查当前工作区和分支是否已有任务;新需求用 <code>assess</code> 预览复杂度和技能,再用 <code>create</code> 创建任务。</li>
97
+ <li>每阶段读取 <code>status</code> 给出的当前 Skill、Rule、必填产物和阻塞原因;用 <code>record</code> 填写当前阶段允许的字段。阶段流转使用 <code>advance</code>,不能手改任务 JSON 跳门禁。</li>
98
+ <li>高、超高任务在任务计划中逐行列稳定实施项 ID,再用 <code>items</code> 登记。缺少计划项会被拒绝。<code>items</code> 默认按 ID 合并:只补 I5 不会删掉已有 I1–I4。明确要重排或删除未开始项目时才传 <code>items_mode=replace</code> 和完整目标列表;已完成或有审查记录的项仍受保护。</li>
99
+ <li>实现每项时记录 <code>dispatch</code>、<code>review_item</code>;开发者可在当前会话直接实施,不要求分派给别人。变更文件登记在任务 <code>files</code> 范围内。修改代码后旧测试和审核回执会失效。</li>
100
+ <li>测试阶段调用 <code>verify</code> 执行真实命令;代码审核阶段运行 <code>sonar_check</code>(若启用 Sonar),处理问题后记录 <code>review</code>。通过门禁后按 <code>status.commit</code> 的提示提交并完成任务。</li>
85
101
  </ol>
102
+ <h3>给会话的第一条需求示例</h3>
103
+ <pre><code>请在当前项目实现“设备授权范围”需求。先读取现有项目 Skill/Rule,
104
+ 评估这次需求的复杂度,说明验收条件。需要任务编排时按实现先后列
105
+ 实施项和依赖;开发、真实测试、代码审核都按任务台账推进。
106
+ 只在当前分支工作,不要推送。</code></pre>
107
+ <p>会话应先展示复杂度依据和任务状态。若发现已有任务,先核对任务 ID 与分支,避免把这条需求写进其他任务。你可以随时在“任务台账”查看它记录的实施项和下一门禁。</p>
108
+ <p>一个任务只负责其记录的分支、文件范围和流程。多会话并行时应给不同任务使用独立分支或工作区,避免另一任务的未提交代码混进本次审核。</p>
86
109
  </section>
110
+
111
+ <section id="tests">
112
+ <h2>测试和证据</h2>
113
+ <p><code>dev_task verify</code> 保存命令、退出码、标准输出、标准错误和文件范围指纹。退出码 0 只是必要条件;对于 Maven <code>test</code>、<code>verify</code>、<code>package</code> 或 <code>install</code> 命令,输出还必须显示 Surefire/Failsafe 至少运行一个测试。输出显示 0 个或没有测试摘要时,任务验证不通过。请使用能输出测试摘要的命令,并核对实际测试报告;不要用只编译、跳过测试的命令冒充功能验证。</p>
114
+ <p>构建、单元测试、接口、数据库、页面和消息验证覆盖不同风险。缺测试账号或独立数据库时,应在交接中写清未覆盖场景,不能把编译或静态检查当成业务验收。真实命令在 DSH 会话沙箱中执行;权限被拒绝时按宿主审批提示处理,不要反复换命令绕过。</p>
115
+ </section>
116
+
87
117
  <section id="sonar">
88
- <h2>可选 SonarQube 审核</h2>
89
- <p><strong>不使用:</strong>「自适应流程」中的 SonarQube 开关保持关闭,或不在 <code>.dsh/meta.json</code> 写 <code>sonar</code>。不需要 Sonar 服务、Token 或扫描任务;代码审核仍按审核元技能及项目 Rule 进行。</p>
90
- <p><strong>使用当前 CI 接入:</strong>打开开关,填写 SonarQube 地址、项目 Key、分析对象(分支或合并请求)和 Token 环境变量名,保存配置。把 Token 只放在运行插件的服务进程环境变量中。新建任务会冻结该选项,已建任务不会被自动修改。</p>
91
- <pre><code>{
92
- "sonar": {
93
- "enabled": true,
94
- "host_url": "https://sonarqube.example.com",
95
- "project_key": "my-project",
96
- "mode": "branch",
97
- "token_env": "SONAR_TOKEN"
98
- }
99
- }</code></pre>
100
- <p>功能验证通过后,当前实现要求在「测试」阶段提交并推送,再等待现有 CI 的 Sonar 扫描完成。从该次扫描的 <code>report-task.txt</code> 取得 <code>ceTaskId</code>;到「代码审核」阶段调用 <code>dev_task sonar_check</code>。合并请求模式还需提供请求编号。插件查询该次分析的 Quality Gate 与目标分支或请求的新代码问题;Gate 不通过或存在中高等级问题时阻止审核通过。修复后重新测试、扫描和审核。</p>
101
- <p>失败问题可用 <code>dev_task learn_rule phase=propose</code> 生成项目 Rule 草稿,人工核对可复用原因后再用 <code>phase=apply</code> 挂到项目代码 Skill。一次问题不会自动变成永久团队规范。</p>
118
+ <h2>按项目配置 SonarQube</h2>
119
+ <p><strong>不需要 Sonar:</strong>保持“自适应流程”中的 Sonar 开关关闭;不必填写地址、Key 或 Token。代码审核元技能和项目 Rule 仍会运行。</p>
120
+ <p><strong>需要 Sonar:</strong>先在工作台顶部选对项目,再开启 Sonar,填写服务地址、项目 Key、分析对象与扫描来源。项目 Key 在 Sonar 项目设置中查;Token 在 Sonar 个人安全设置生成,并需具备所选方式需要的分析或读取权限。Token 在同页单独保存到本机 DSH 凭据存储,按项目工作区隔离,只显示“已配置”,不会写入 <code>.dsh/meta.json</code> 或审核报告。换项目应分别配置。环境变量名可作为后备设置。</p>
121
+ <div class="scroll"><table><thead><tr><th>页面字段</th><th>怎样填写</th></tr></thead><tbody>
122
+ <tr><td>服务地址</td><td>填 SonarQube 根地址,例如 <code>https://sonar.example.com</code>,不带项目页面路径。</td></tr>
123
+ <tr><td>项目 Key</td><td>填当前代码库在 SonarQube 中的项目标识;每个项目可不同。</td></tr>
124
+ <tr><td>扫描来源</td><td>提交前检查选 <code>ide-local</code>;已有 CI 分析选 <code>ci</code>;本机上传选 <code>local</code>。</td></tr>
125
+ <tr><td>分析对象</td><td>分支或合并请求,与实际扫描目标一致。本地规则审核使用分支模式。</td></tr>
126
+ <tr><td>参考分支、审核路径</td><td>本地规则审核填写新代码基线和项目实际扫描的相对目录;不必把其他项目的配置复制过来。</td></tr>
127
+ <tr><td>Token</td><td>当前项目单独保存;保存后只显示是否已配置,不会回显原值。</td></tr>
128
+ </tbody></table></div>
129
+ <div class="scroll"><table><thead><tr><th>扫描来源</th><th>何时适用</th><th>提交/推送</th><th>结果边界</th></tr></thead><tbody>
130
+ <tr><td><code>ide-local</code> 本地规则审核</td><td>希望在提交前检查未提交的新代码;本机有 SonarLint 后台组件。</td><td>无需提交、无需推送。</td><td>同步项目 Quality Profile 中可本地执行的规则;不产生服务端 CE task,也不等同完整服务端 Quality Gate。</td></tr>
131
+ <tr><td><code>ci</code> CI 结果</td><td>已有 CI 扫描,能取得该次分析的 CE task ID。</td><td>按 CI 触发条件提交并推送。</td><td>读取本次服务端分析的新代码问题及 Quality Gate 条件。</td></tr>
132
+ <tr><td><code>local</code> 上传式本机扫描</td><td>本机能运行扫描器,SonarQube 支持保存任务分支分析。</td><td>先提交;不要求推送。</td><td>扫描上传到 Sonar 服务端,Community Build 的分支扫描会被预先拒绝。</td></tr>
133
+ </tbody></table></div>
134
+ <h3>本地规则审核的额外设置</h3>
135
+ <p>选择 Git 参考分支或提交作为“新代码”基线;<code>include_paths</code> 填项目实际扫描的目录,例如仅后端 Maven 模块。代码审核会先用 Git 差异核对这些目录中的变更是否全部登记到任务 <code>files</code>;漏登时直接报出文件名并要求补齐,避免“只扫一部分却显示全部覆盖”。项目范围之外的前端或 SQL 不能被误称为已通过本次后端审核。</p>
136
+ <p>DSH 服务进程需配置 <code>DSH_SONARLINT_JAVA</code>、<code>DSH_SONARLINT_LIB</code>、<code>DSH_SONARLINT_PLUGINS</code>,分别指向 Java、SonarLint 后台 JAR 目录和分析器 JAR;Windows 多个插件路径用分号分隔。JS/TS/Vue/CSS 分析还需要 Node.js。若项目为某种语言启用了规则而本地无法分析,报告列“未覆盖”并阻断。部分服务端规则本身无法在本地执行;需要完全相同的服务端结论时使用 CI 扫描。</p>
137
+ <div class="note warn">Sonar 配置是每项目独立的;启用规则不保证规则本身适用于所有代码。碰到疑似自定义规则误报,应核对语义和证据,不应为了让计数归零而破坏业务实现。</div>
138
+ </section>
139
+
140
+ <section id="findings">
141
+ <h2>查看问题、处理误报与沉淀规则</h2>
142
+ <p>测试通过后,在“代码审核”阶段运行 <code>dev_task sonar_check</code>。任务台账可展开最近一次审核,查看来源、原始结果、问题规则、严重程度、文件位置、人工复核状态与未解决数量。每次扫描在项目 <code>.dsh/reviews/&lt;任务 ID&gt;/</code> 生成一份 Markdown 报告;项目可将该报告目录加入 <code>.gitignore</code>。结构化结果保存在 <code>.dsh/task-&lt;任务 ID&gt;.json</code>。</p>
143
+ <p>真实问题:修复代码,重新验证并复扫。<strong>仅本地规则审核的误报:</strong>使用 <code>dev_task sonar_disposition</code> 指定当前报告中的 <code>issue_key</code>,说明具体误报原因并提供证据;DSH 请求人工逐条批准。批准记录写回本次任务与报告,原始规则结果仍显示原来的 <code>ERROR</code>,任务门禁另显示复核后的未解决数量。未批准、证据不足、代码变化或重新扫描后都不能沿用该处置。CI 和上传式扫描的服务端 Quality Gate 不能通过该操作绕过,应在 SonarQube 中按组织流程处理。</p>
144
+ <p>你可以直接对会话说:“请打开任务台账中这条 Sonar 告警,核对代码语义并给出理由和源码证据。确认是误报后发起逐项人工复核;未经我批准不要放行,也不要修改代码来藏掉告警。”审批请求会列出规则、文件、问题编号、理由和证据。多条告警需要分别审查;一条被批准不会自动豁免同规则的其他位置。</p>
145
+ <p>真实且具有通用性的修复案例,可以先用 <code>learn_rule phase=propose</code> 预览项目 Rule,再用 <code>phase=apply</code> 挂到对应开发 Skill;会影响之后创建的任务。已确认误报不列为学习候选,不自动转成团队规范。发现服务器自定义规则本身过宽时,应把例子反馈给规则维护者修正其实现或适用范围。</p>
102
146
  </section>
103
- <section id="commit">
104
- <h2>为什么当前实现与分支、提交有关?</h2>
105
- <p>SonarQube 服务端按项目以及分支或合并请求保存分析结果,所以插件需要用分析对象查询正确的结果。<strong>分支是服务端结果的定位信息,并不意味着审核本身必须先提交。</strong></p>
106
- <p>当前插件采用「复用 CI 扫描」的实现:CI 通常扫描已推送的提交,所以当前流程先提交后读取结果。这是本版接入方式的限制。SonarQube for IDE 的 Connected Mode 可以在本地未提交代码上应用服务端 Quality Profile 的部分规则,但它的本地分析不等于完整服务端 Quality Gate;本插件当前没有接入这种本地分析。</p>
107
- <div class="note warn">如果团队要求「功能通过 → 未提交代码审核 → 修复 → 审核通过 → 再提交」,当前 Sonar 接入还不满足这一顺序。不要把本版 CI 检查描述为提交前 Sonar 审核。</div>
108
- <p>参考:<a href="https://docs.sonarsource.com/sonarqube-for-intellij/using/rules">SonarQube for IntelliJ 规则与 Connected Mode</a>、<a href="https://docs.sonarsource.com/sonarqube-server/2025.4/user-guide/connected-mode">SonarQube Server 的本地分析说明</a>。</p>
147
+
148
+ <section id="ledger">
149
+ <h2>任务台账与项目文件</h2>
150
+ <p>“待开始”表示实施项还没执行;“实施中”表示已记录开始;“待审查”表示缺逐项规格或质量审查;“代码审核”是整个任务的后续阶段。它们是不同层级的状态,不代表已经把任务分派给团队成员。任务台账会显示当前阶段、实施项、验证回执、审核结果和可选 Sonar 明细。</p>
151
+ <div class="scroll"><table><thead><tr><th>位置</th><th>用途</th><th>团队共享建议</th></tr></thead><tbody>
152
+ <tr><td><code>.dsh/meta.json</code></td><td>项目元技能挂载与可选 Sonar 非秘密配置。</td><td>审阅后提交。</td></tr>
153
+ <tr><td><code>.dsh/skills/</code>、<code>.dsh/rules/</code></td><td>项目 Skill、Rule 与各 Skill 的 <code>profile.json</code>。</td><td>审阅后提交。</td></tr>
154
+ <tr><td><code>.dsh/task-&lt;id&gt;.json</code></td><td>该任务的阶段、实施项、回执和审核状态。</td><td>按团队任务留痕政策决定。</td></tr>
155
+ <tr><td><code>.dsh/reviews/</code></td><td>逐次 Sonar Markdown 报告及误报处置。</td><td>可忽略,保留本机;不含 Token。</td></tr>
156
+ <tr><td>本机 DSH 项目凭据</td><td>Sonar Token。</td><td>不提交、不回显。</td></tr>
157
+ </tbody></table></div>
109
158
  </section>
110
- <section id="limits">
111
- <h2>验证边界</h2>
112
- <ul>
113
- <li>本版已通过构建、自动化测试和安装包黑盒验证;尚未在真实 SonarQube 实例上完成端到端联调。</li>
114
- <li>服务端扫描的新代码问题列表取自查询时的目标分支或请求;同一目标并发扫描时,应使用当前扫描的 <code>ceTaskId</code> 重新核对。</li>
115
- <li>本地钩子与任务门禁只约束受控操作;远程合并、发布以及组织级 CI 策略由项目自行管理。</li>
116
- </ul>
117
- <p>详细的字段、交接契约和状态说明见<a href="adaptive-workflows.md">自适应工程任务</a>。最后更新:2026-09-30。</p>
159
+
160
+ <section id="help">
161
+ <h2>常见问题</h2>
162
+ <h3>装好后看不到入口?</h3>
163
+ <p>检查插件是否装在正在运行的 Web profile,关闭旧 Web 进程并重启,查看启动日志。普通预设与“工程化开发引擎”预设的工具不同。</p>
164
+ <h3>为什么初始化没有直接生成文件?</h3>
165
+ <p>工作台提供复制请求;在项目根目录的工程化会话中执行 <code>init_project inspect → propose → apply</code>,应用前需审阅提案。</p>
166
+ <h3>为什么 Maven 显示构建成功,任务仍不能前进?</h3>
167
+ <p>如果验证命令是 Maven 测试目标,插件还要求输出中有至少一个实际测试。检查 Surefire 版本、是否跳过测试、JUnit 引擎和测试摘要;重新运行可见摘要的命令。</p>
168
+ <h3>为什么 Sonar 报了业务上必须创建的对象?</h3>
169
+ <p>自定义规则可能过宽。保留告警,核查每行对象是否必须独立;本地分析可逐条提交证据由人批准,服务端规则仍应由维护者修正。不要复用同一个实体或挪代码隐藏告警。</p>
170
+ <h3>为什么审核提示补文件范围?</h3>
171
+ <p>本次项目扫描范围内有 Git 新增/修改文件未登记到任务 <code>files</code>。核对提示的文件是否属于本任务;属于则补进 <code>scope</code> 并重新验证,不属于则使用独立分支或工作区隔离任务。</p>
172
+ <h3>已有任务会随着项目配置改变吗?</h3>
173
+ <p>不会更换创建时冻结的阶段图和资源引用;所引用 Skill/Rule 的正文下一次读取会更新。代码、范围或规则变化后,应重新检查证据、测试和审核。</p>
118
174
  </section>
119
175
  </main>
120
176
  </div>
package/hooks/commit-msg CHANGED
@@ -29,6 +29,20 @@ var import_node_child_process = require("node:child_process");
29
29
  var import_node_fs = __toESM(require("node:fs"), 1);
30
30
  var import_node_path = __toESM(require("node:path"), 1);
31
31
 
32
+ // src/verification-tests.ts
33
+ function mavenTestEvidence(command, output) {
34
+ const maven = /(?:^|[\s;&|])(?:[^\s]*[\\/])?(?:mvn|mvn\.cmd|mvnw|mvnw\.cmd)(?=\s|$)/iu.test(command);
35
+ const testGoal = /(?:^|\s)(?:test|verify|package|install)(?=\s|$)/iu.test(command);
36
+ if (!maven || !testGoal) return null;
37
+ const counts = [...output.matchAll(/Tests run:\s*(\d+)\s*,\s*Failures:/giu)].map((match) => Number(match[1]));
38
+ return { count: counts.length ? Math.max(...counts) : null };
39
+ }
40
+ function receiptHasRequiredTests(receipt) {
41
+ const evidence = mavenTestEvidence(receipt.command, `${receipt.stdout}
42
+ ${receipt.stderr}`);
43
+ return evidence === null || (evidence.count ?? 0) > 0;
44
+ }
45
+
32
46
  // src/engine.ts
33
47
  function formatResourceRef(ref) {
34
48
  return `${ref.source}:${ref.name}`;
@@ -66,6 +80,7 @@ function guardSatisfied(guard, state2, config2) {
66
80
  return todosBlockers(state2, config2).length === 0;
67
81
  case "verified": {
68
82
  if (!state2.verification.passed) return false;
83
+ if (state2.verification.receipt && !receiptHasRequiredTests(state2.verification.receipt)) return false;
69
84
  if (config2.high_risk_requires_verification && state2.risk_level === "high_risk") {
70
85
  const receipt = state2.verification.receipt;
71
86
  return receipt !== void 0 && receipt.exit_code === 0 && !receipt.timed_out && !receipt.aborted;
@@ -113,6 +128,9 @@ function verificationBlockers(state2, config2) {
113
128
  if (!state2.verification.passed) {
114
129
  blockers.push("this flow requires a passing verification at this stage, and the current verification is not passing");
115
130
  }
131
+ if (state2.verification.receipt && !receiptHasRequiredTests(state2.verification.receipt)) {
132
+ blockers.push("Maven verification has no nonzero Surefire/Failsafe test summary; rerun tests with visible results");
133
+ }
116
134
  if (config2.high_risk_requires_verification && state2.risk_level === "high_risk") {
117
135
  const receipt = state2.verification.receipt;
118
136
  if (receipt === void 0) {
@@ -603,7 +621,7 @@ if (state.sonar_policy?.enabled && ["\u4EE3\u7801\u5BA1\u6838", "\u5B8C\u6210"].
603
621
  const audit = state.sonar_audit;
604
622
  const lastCommit = state.commits.findLast((entry) => entry.hash !== void 0)?.hash;
605
623
  if (!audit || audit.gate !== "OK" || audit.blocking.length > 0 || audit.scope_hash !== scopeHash(state, cwd) || !lastCommit || audit.commit_hash !== lastCommit) {
606
- refuse("SonarQube \u5BA1\u6838\u672A\u901A\u8FC7\u6216\u5DF2\u8FC7\u671F\u2014\u2014\u5728\u4EE3\u7801\u5BA1\u6838\u9636\u6BB5\u5B8C\u6210\u65B0\u4E00\u6B21 CI \u626B\u63CF\u5E76\u8C03\u7528 dev_task operation=sonar_check");
624
+ refuse("SonarQube \u5BA1\u6838\u672A\u901A\u8FC7\u6216\u5DF2\u8FC7\u671F\u2014\u2014\u5728\u4EE3\u7801\u5BA1\u6838\u9636\u6BB5\u91CD\u65B0\u626B\u63CF\u5E76\u8C03\u7528 dev_task operation=sonar_check");
607
625
  }
608
626
  }
609
627
  var entries = stagedEntries();
package/lib/adaptive.js CHANGED
@@ -39,7 +39,7 @@ export function adaptiveWorkflow(grade) {
39
39
  start_stage: stages[0],
40
40
  transitions,
41
41
  artifacts: COMMON_ARTIFACTS.filter(artifact => stages.includes(artifact.stage)),
42
- // The branch must be committed/pushed before its CI Sonar scan can run.
42
+ // CI and scanner review need a tested commit; local IDE-style review overrides this per task.
43
43
  commit: { policy: 'task', message_pattern: '', message_hint: '无格式要求', checkpoints: ['测试'], file_scope: true },
44
44
  high_risk_requires_verification: true,
45
45
  review_depth: grade === 'low' ? 'single' : 'two-stage',
@@ -1 +1 @@
1
- {"version":3,"file":"adaptive.js","sourceRoot":"","sources":["../src/adaptive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adaptive.js","sourceRoot":"","sources":["../src/adaptive.ts"],"names":[],"mappings":"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"}