@unifan/pi-unifan-zh 1.0.33 → 1.0.35
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/AGENTS.md +18 -7
- package/README.md +82 -4
- package/README_zh.md +82 -4
- package/extensions/commit/index.ts +23 -7
- package/extensions/commit/package.json +1 -1
- package/extensions/commit/tests/commit.test.mjs +79 -3
- package/extensions/review/index.ts +12 -85
- package/extensions/review/package.json +1 -1
- package/extensions/review/src/orchestration.ts +90 -0
- package/extensions/review/tests/orchestration.test.mjs +52 -0
- package/extensions/workflow/README.md +50 -0
- package/extensions/workflow/index.ts +275 -0
- package/extensions/workflow/package.json +47 -0
- package/extensions/workflow/skills/00-next/SKILL.md +41 -0
- package/extensions/workflow/skills/01-brainstorm/SKILL.md +50 -0
- package/extensions/workflow/skills/02-plan/SKILL.md +47 -0
- package/extensions/workflow/skills/03-work/SKILL.md +60 -0
- package/extensions/workflow/skills/04-review/SKILL.md +41 -0
- package/extensions/workflow/skills/05-learn/SKILL.md +52 -0
- package/extensions/workflow/src/driver/work-loop-driver.ts +401 -0
- package/extensions/workflow/src/filters/bash-output-filter.ts +60 -0
- package/extensions/workflow/src/filters/read-output-filter.ts +87 -0
- package/extensions/workflow/src/tools/artifact-helper.ts +77 -0
- package/extensions/workflow/src/tools/session-checkpoint.ts +191 -0
- package/extensions/workflow/src/tools/workflow-state.ts +168 -0
- package/extensions/workflow/tests/workflow.test.mjs +454 -0
- package/package.json +19 -3
package/AGENTS.md
CHANGED
|
@@ -30,13 +30,19 @@ pi-unifan-zh/
|
|
|
30
30
|
│ │ │ ├── history-context.md # 历史上下文专家
|
|
31
31
|
│ │ │ └── code-comments.md # 注释检查专家
|
|
32
32
|
│ │ └── package.json # 独立子包: @unifan/pi-review-zh
|
|
33
|
-
│
|
|
34
|
-
│
|
|
33
|
+
│ ├── commit/ # ③ 智能 Git 提交助手 (/commit, /commit-push)
|
|
34
|
+
│ │ ├── index.ts # 一键提交与推流命令
|
|
35
|
+
│ │ ├── src/
|
|
36
|
+
│ │ │ ├── git.ts # Git 执行引擎 (含自动变基 pull --rebase)
|
|
37
|
+
│ │ │ └── prompt.ts # Conventional Commits 中文提示词
|
|
38
|
+
│ │ └── package.json # 独立子包: @unifan/pi-commit-zh
|
|
39
|
+
│ └── workflow/ # ④ 复合工程工作流引擎 (/workflow)
|
|
40
|
+
│ ├── index.ts # 工具与输出过滤器注册
|
|
35
41
|
│ ├── src/
|
|
36
|
-
│ │ ├──
|
|
37
|
-
│ │ └──
|
|
38
|
-
│ └── package.json # 独立子包: @unifan/pi-
|
|
39
|
-
└── skills/ # 内置专业技能集
|
|
42
|
+
│ │ ├── tools/ # workflow_state, artifact_helper, session_checkpoint
|
|
43
|
+
│ │ └── filters/ # bash_output_filter, read_output_filter
|
|
44
|
+
│ └── package.json # 独立子包: @unifan/pi-workflow-zh
|
|
45
|
+
└── skills/ # 内置专业技能集 (00-next ~ 05-learn)
|
|
40
46
|
```
|
|
41
47
|
|
|
42
48
|
---
|
|
@@ -128,7 +134,12 @@ cd D:\program\my\pi-unifan-zh\extensions\commit
|
|
|
128
134
|
npm version patch
|
|
129
135
|
npm publish --access public
|
|
130
136
|
|
|
131
|
-
# 4.
|
|
137
|
+
# 4. 升级并发布 workflow 子包 (@unifan/pi-workflow-zh)(如有修改)
|
|
138
|
+
cd D:\program\my\pi-unifan-zh\extensions\workflow
|
|
139
|
+
npm version patch
|
|
140
|
+
npm publish --access public
|
|
141
|
+
|
|
142
|
+
# 5. 提交版本号变更到 Git 远端
|
|
132
143
|
cd D:\program\my\pi-unifan-zh
|
|
133
144
|
git add .
|
|
134
145
|
git commit -m "chore(release): 升级版本号至 vX.Y.Z"
|
package/README.md
CHANGED
|
@@ -17,11 +17,18 @@ pi-unifan-zh/
|
|
|
17
17
|
├── AGENTS.md # Developer and AI agent guidelines
|
|
18
18
|
├── README.md # English Documentation
|
|
19
19
|
├── README_zh.md # Chinese Documentation
|
|
20
|
-
├── extensions/ # 📦
|
|
20
|
+
├── extensions/ # 📦 Extension Packages
|
|
21
21
|
│ ├── sessions/ # 📜 ① Dual-pane session manager with live preview (Chinese)
|
|
22
22
|
│ ├── review/ # 🔍 ② AI multi-agent code review suite (Daily/Lite/Perf/Full)
|
|
23
|
-
│
|
|
24
|
-
└──
|
|
23
|
+
│ ├── commit/ # 📦 ③ Intelligent Conventional Commits assistant (Chinese)
|
|
24
|
+
│ └── workflow/ # 🔄 ④ Compound Engineering Workflow engine (State/Checkpoints/Filters)
|
|
25
|
+
└── skills/ # 🎯 Compound Engineering Skills (00-next ~ 05-learn)
|
|
26
|
+
├── 00-next/ # 🚦 Router & orchestrator (inspects repo state, recommends next step)
|
|
27
|
+
├── 01-brainstorm/ # 💡 Discovery & flexible interactions (single/multi-select/custom text)
|
|
28
|
+
├── 02-plan/ # 📐 TDD architecture planning & Implementation Units
|
|
29
|
+
├── 03-work/ # 🛠️ Strict TDD coding execution & checkpoint resume
|
|
30
|
+
├── 04-review/ # 🧐 Code review, spec verification & regression testing
|
|
31
|
+
└── 05-learn/ # 📝 Lightweight solution cards & knowledge compounding
|
|
25
32
|
```
|
|
26
33
|
|
|
27
34
|
---
|
|
@@ -49,19 +56,44 @@ pi install D:/program/my/pi-unifan-zh
|
|
|
49
56
|
|
|
50
57
|
### Option B: Install Individual Extensions
|
|
51
58
|
|
|
59
|
+
Each extension is published as a standalone npm package and can be installed individually:
|
|
60
|
+
|
|
61
|
+
> 💡 **Note**: Pi CLI's `git:` source only supports cloning the entire repository root. For **installing individual extensions**, use the recommended `npm:` method or local paths.
|
|
62
|
+
|
|
52
63
|
#### 1. Install `sessions` (Session Manager with TUI Preview):
|
|
53
64
|
```bash
|
|
65
|
+
# Via npm
|
|
54
66
|
pi install npm:@unifan/pi-sessions-zh
|
|
67
|
+
# Or via local path
|
|
68
|
+
pi install D:/program/my/pi-unifan-zh/extensions/sessions
|
|
55
69
|
```
|
|
56
70
|
|
|
57
71
|
#### 2. Install `review` (AI Parallel Code Review Suite):
|
|
58
72
|
```bash
|
|
73
|
+
# Via npm
|
|
59
74
|
pi install npm:@unifan/pi-review-zh
|
|
75
|
+
# Or via local path
|
|
76
|
+
pi install D:/program/my/pi-unifan-zh/extensions/review
|
|
60
77
|
```
|
|
61
78
|
|
|
62
79
|
#### 3. Install `commit` (Intelligent Git Commit Assistant):
|
|
63
80
|
```bash
|
|
81
|
+
# Via npm
|
|
64
82
|
pi install npm:@unifan/pi-commit-zh
|
|
83
|
+
# Or via local path
|
|
84
|
+
pi install D:/program/my/pi-unifan-zh/extensions/commit
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### 4. Install `workflow` (Compound Engineering Engine & Skills):
|
|
88
|
+
> Includes `/workflow` command, checkpoint persistence, token filters, and all 6 workflow skills (`00-next` ~ `05-learn`).
|
|
89
|
+
```bash
|
|
90
|
+
# Via npm
|
|
91
|
+
pi install npm:@unifan/pi-workflow-zh
|
|
92
|
+
# Or via local path
|
|
93
|
+
pi install D:/program/my/pi-unifan-zh/extensions/workflow
|
|
94
|
+
|
|
95
|
+
# Recommended peer question UI extension:
|
|
96
|
+
pi install npm:@juicesharp/rpiv-ask-user-question
|
|
65
97
|
```
|
|
66
98
|
|
|
67
99
|
---
|
|
@@ -91,6 +123,7 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
91
123
|
- **Dual Execution Engine**:
|
|
92
124
|
- ① **Single-Model Native Review (Default & Recommended)**: 0 subagent dependencies, 0 network dropouts, ultra-fast & 100% reliable.
|
|
93
125
|
- ② **Multi-Subagent Concurrent Review**: Freely configure **2, 3, 4, 5, or 6** concurrent expert subagents (Bugbot, Security, Perf, Compliance, Comments, History).
|
|
126
|
+
- **Session Model & Thinking Level Inheritance**: Single-model review and final synthesis run directly in the current session. Multi-expert review launches through one asynchronous workflow and explicitly passes the current session's `provider/model:thinking-level` to every expert, preventing subagent defaults from overriding the session settings.
|
|
94
127
|
- **Commands**:
|
|
95
128
|
- **`/review`** 🔍: Launches interactive Chinese TUI menu with 6 review modes + settings:
|
|
96
129
|
- ① `Review uncommitted changes` (staged + unstaged working tree, smart default)
|
|
@@ -117,7 +150,7 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
117
150
|
|
|
118
151
|
### 3. 📦 `commit` (Intelligent Conventional Commits Assistant)
|
|
119
152
|
- **Commands**:
|
|
120
|
-
- **`/commit`**: Analyzes `git diff
|
|
153
|
+
- **`/commit`**: Analyzes staged and working-tree changes (`git diff`), uses the current session's model and thinking level through the provider's unified parameter handling, and generates a Chinese Conventional Commit message from the actual staged changes before committing. Authentication, request, empty-response, or output-validation failures display the reason and stop the commit and push, preserving staged changes without substituting a generic fallback message.
|
|
121
154
|
- **`/commit-push`** 🚀: Generates Chinese commit and automatically executes `git push` to remote.
|
|
122
155
|
- **Usage & Flags**:
|
|
123
156
|
- `/commit`: Smart commit (commits staged changes if staged, or auto-stages all if unstaged).
|
|
@@ -133,6 +166,51 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
133
166
|
|
|
134
167
|
---
|
|
135
168
|
|
|
169
|
+
### 4. 🔄 `workflow` & Compound Engineering Workflow Suite
|
|
170
|
+
Turn your AI coding agent into a disciplined software engineer through an iterative stage-gated pipeline:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
00-next ──> 01-brainstorm ──> 02-plan ──> 03-work ──> 04-review ──> 05-learn
|
|
174
|
+
(Router) (Discovery) (TDD Plan) (Execution) (Review) (Compounding)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
- **Commands & Tools**:
|
|
178
|
+
- **`/workflow`**: Inspect current project stage, artifact counts, active autonomous driving loop progress, and recommended next skill.
|
|
179
|
+
- **`workflow_state` tool**: Automatically scans `docs/` and `.context/checkpoints/` state.
|
|
180
|
+
- **`artifact_helper` tool**: Resolves standardized artifact paths for requirements, plans, and solutions.
|
|
181
|
+
- **`session_checkpoint` tool**: Saves and restores execution breakpoints at the Implementation Unit level — resume right from where you left off.
|
|
182
|
+
- **6 Built-in Pipeline Skills**:
|
|
183
|
+
- **`00-next` (Router & Orchestrator)**: Say `continue` or type `/skill:00-next`, and it automatically guides you to the right next step.
|
|
184
|
+
- **`01-brainstorm` (Requirements Discovery)**: Clarifies scope and architecture decisions. **Pairs with `@juicesharp/rpiv-ask-user-question`** for flexible interactions: single-select (1-9 hotkeys) for mutually exclusive choices, multi-select checkboxes for feature lists, and custom text inputs.
|
|
185
|
+
- **`02-plan` (Architecture Planning)**: Decomposes requirements into TDD Implementation Units following The Ladder minimalism principles.
|
|
186
|
+
- **`03-work` (Autonomous Loop TDD Coding)** 🚀: **Built-in autonomous continuation engine similar to `goal`**. Directly invoking `/skill:03-work` starts a background cross-turn driver that sequentially executes Implementation Units with red-green-refactor, **never stopping until all planned units are 100% completed**! Supports checkpoint resumption and strict Stop-The-Line policy. Type `pause`, `stop`, or press `Esc` to pause anytime.
|
|
187
|
+
- **`04-review` (Quality & Spec Review)**: Verifies git diff, checks Spec contract compliance, and ensures clean regression tests.
|
|
188
|
+
- **`05-learn` (Knowledge Compounding)**: Lightweight, pragmatic pitfall compounding into `docs/solutions/` — zero noise, only non-trivial insights.
|
|
189
|
+
- **Context Optimizers (Token Savers)**:
|
|
190
|
+
- **`bash` smart filter**: Automatically summarizes verbose command outputs (`npm install`, verbose logs), saving 80%+ context tokens.
|
|
191
|
+
- **`read` smart filter**: Compresses oversized lockfiles (e.g. `package-lock.json`) and long logs into compact structural summaries.
|
|
192
|
+
|
|
193
|
+
### 🔄 How 03-work Autonomous Loop Works
|
|
194
|
+
|
|
195
|
+
Traditional AI coding tools stop after each turn, asking for user confirmation before doing the next step. `03-work` natively integrates the `WorkLoopDriver` engine:
|
|
196
|
+
1. **Lifecycle Event Hook**: Binds to Pi's `agent_settled` event to verify execution state immediately after each turn finishes.
|
|
197
|
+
2. **Bi-directional Checkpoint Sync**: Re-reads `.context/checkpoints/` and the active plan to ensure in-memory and disk states match.
|
|
198
|
+
3. **Autonomous Continuation**: If units remain, dispatches a follow-up turn (`deliverAs: "followUp"`), driving red-green-refactor cycles autonomously across turns until all units pass.
|
|
199
|
+
4. **Safety Valves**:
|
|
200
|
+
- **Stop-The-Line**: Automatically pauses upon 3 consecutive failures on the same unit, preserving exact error context.
|
|
201
|
+
- **50-Turn Safety Threshold**: Prevents runaway looping.
|
|
202
|
+
- **Interactive Pause**: Hit `Esc` or type `pause` / `stop` anytime to safely suspend.
|
|
203
|
+
5. **Auto-Handover**: Automatically cascades into `/skill:04-review` once all units are verified green.
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 💡 Acknowledgments & References
|
|
208
|
+
|
|
209
|
+
The Compound Engineering workflow pipeline in this repository draws deep architectural inspiration and reference from:
|
|
210
|
+
- **[`@leing2021/super-pi`](https://github.com/leing2021/super-pi)**: Special thanks to `super-pi` for its pioneering design of Pi-native Compound Engineering pipelines, checkpoint resumes, and artifact management patterns. In this project, we re-architected the terminal interaction to unlock multi-select capabilities, introduced the **`00-next` router**, streamlined **`05-learn`**, and fully integrated **`@juicesharp/rpiv-ask-user-question`** for rich terminal UI dialogs.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
136
214
|
## 📄 License
|
|
137
215
|
|
|
138
216
|
MIT License.
|
package/README_zh.md
CHANGED
|
@@ -15,11 +15,18 @@ pi-unifan-zh/
|
|
|
15
15
|
├── AGENTS.md # 开发者与智能体规范指南
|
|
16
16
|
├── README.md # English Documentation
|
|
17
17
|
├── README_zh.md # 中文说明文档
|
|
18
|
-
├── extensions/ # 📦
|
|
18
|
+
├── extensions/ # 📦 扩展插件集
|
|
19
19
|
│ ├── sessions/ # 📜 ① 历史会话管理器(双栏实时预览与恢复·中文增强版)
|
|
20
20
|
│ ├── review/ # 🔍 ② AI 代码审查套件(日常3专家 / 极速单兵 / 性能探针 / 全量会诊)
|
|
21
|
-
│
|
|
22
|
-
└──
|
|
21
|
+
│ ├── commit/ # 📦 ③ 智能 Git 提交助手(Conventional Commits 纯中文规范版)
|
|
22
|
+
│ └── workflow/ # 🔄 ④ 复合工程工作流引擎(状态感知 / 断点续跑 / 输出压缩)
|
|
23
|
+
└── skills/ # 🎯 复合工程流程技能库 (00-next ~ 05-learn)
|
|
24
|
+
├── 00-next/ # 🚦 流程导航调度器(自动分析仓库产物并推荐下一步)
|
|
25
|
+
├── 01-brainstorm/ # 💡 需求发现与交互对齐(单选/多选复选框/开放问答)
|
|
26
|
+
├── 02-plan/ # 📐 TDD 架构规划与 Implementation Units 拆解
|
|
27
|
+
├── 03-work/ # 🛠️ 严格 TDD 编码执行与断点持久化
|
|
28
|
+
├── 04-review/ # 🧐 代码审查与回归测试闭环
|
|
29
|
+
└── 05-learn/ # 📝 极简避坑指南与经验复利沉淀
|
|
23
30
|
```
|
|
24
31
|
|
|
25
32
|
---
|
|
@@ -47,19 +54,44 @@ pi install D:/program/my/pi-unifan-zh
|
|
|
47
54
|
|
|
48
55
|
### 模式 B:按需单独安装单个插件
|
|
49
56
|
|
|
57
|
+
每个插件均已独立打包并发布至 npm,可根据需要挑选单独安装(互不依赖,开箱即用):
|
|
58
|
+
|
|
59
|
+
> 💡 **提示**:Pi CLI 的 `git:` 方式仅支持安装整个仓库根目录;若需**按模块单独安装**,请使用推荐的 `npm:` 方式或本地绝对路径。
|
|
60
|
+
|
|
50
61
|
#### 1. 仅安装 `sessions`(历史会话管理器·中文版):
|
|
51
62
|
```bash
|
|
63
|
+
# npm 在线单独安装
|
|
52
64
|
pi install npm:@unifan/pi-sessions-zh
|
|
65
|
+
# 或本地路径安装
|
|
66
|
+
pi install D:/program/my/pi-unifan-zh/extensions/sessions
|
|
53
67
|
```
|
|
54
68
|
|
|
55
69
|
#### 2. 仅安装 `review`(AI 代码审查系统·中文版):
|
|
56
70
|
```bash
|
|
71
|
+
# npm 在线单独安装
|
|
57
72
|
pi install npm:@unifan/pi-review-zh
|
|
73
|
+
# 或本地路径安装
|
|
74
|
+
pi install D:/program/my/pi-unifan-zh/extensions/review
|
|
58
75
|
```
|
|
59
76
|
|
|
60
77
|
#### 3. 仅安装 `commit`(智能 Git 提交助手·中文版):
|
|
61
78
|
```bash
|
|
79
|
+
# npm 在线单独安装
|
|
62
80
|
pi install npm:@unifan/pi-commit-zh
|
|
81
|
+
# 或本地路径安装
|
|
82
|
+
pi install D:/program/my/pi-unifan-zh/extensions/commit
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### 4. 仅安装 `workflow`(复合工程工作流引擎与全套技能·中文版):
|
|
86
|
+
> 包含 `/workflow` 命令、断点续跑、Token压缩器以及完整的 6 大流程技能 (`00-next` ~ `05-learn`)。
|
|
87
|
+
```bash
|
|
88
|
+
# npm 在线单独安装
|
|
89
|
+
pi install npm:@unifan/pi-workflow-zh
|
|
90
|
+
# 或本地路径安装
|
|
91
|
+
pi install D:/program/my/pi-unifan-zh/extensions/workflow
|
|
92
|
+
|
|
93
|
+
# 推荐搭配安装交互提问工具(支持现代终端多选复选框与单选):
|
|
94
|
+
pi install npm:@juicesharp/rpiv-ask-user-question
|
|
63
95
|
```
|
|
64
96
|
|
|
65
97
|
---
|
|
@@ -90,6 +122,7 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
90
122
|
- **双执行引擎自由切换**:
|
|
91
123
|
- ① **单模型深度审查(默认推荐)**:0 子代理依赖,0 网络断流,极速且 100% 稳定。
|
|
92
124
|
- ② **多 Subagent 并发审查**:支持自由配置并发启动 **2、3、4、5、6** 个专家子代理协同会诊(Bug猎手、安全专家、性能探针、规范合规、注释质量、历史脉络)。
|
|
125
|
+
- **会话模型与思考档位继承**:单模型审查和主审汇总直接使用当前会话;多专家审查通过一个异步工作流启动,在每个专家请求中显式传入当前会话的 `提供方/模型:思考档位`,避免被子代理默认配置覆盖。
|
|
93
126
|
- **核心审查命令**:
|
|
94
127
|
- **`/review`** 🔍 **(交互式全功能审查)**:唤起全中文 TUI 选择弹窗,支持 6 种审查模式与配置中心:
|
|
95
128
|
- ① `审查未提交改动` (工作区已暂存 + 未暂存代码,智能默认推荐)
|
|
@@ -122,7 +155,7 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
122
155
|
|
|
123
156
|
### 3. 📦 `commit`(智能 Git 提交助手·中文版)
|
|
124
157
|
- **命令**:
|
|
125
|
-
- **`/commit`**:自动分析暂存区/工作区代码变动(`git diff
|
|
158
|
+
- **`/commit`**:自动分析暂存区/工作区代码变动(`git diff`),使用当前会话模型与思考档位,由提供方统一转换模型参数,根据实际暂存内容生成标准的 Conventional Commits 纯中文提交信息后提交。模型认证、请求、空结果或输出校验失败时会显示原因并停止提交与推送,保留暂存内容,不再使用固定兜底文案。
|
|
126
159
|
- **`/commit-push`** 🚀:自动生成中文 Commit 提交,并**自动执行 `git push` 推送**到远端分支。
|
|
127
160
|
- **常用参数与用法**:
|
|
128
161
|
- `/commit`:智能提交(有暂存只提暂存,无暂存自动暂存全量)。
|
|
@@ -138,6 +171,51 @@ pi install npm:@unifan/pi-commit-zh
|
|
|
138
171
|
|
|
139
172
|
---
|
|
140
173
|
|
|
174
|
+
### 4. 🔄 `workflow` 与复合工程流 (Compound Engineering)
|
|
175
|
+
本套件内嵌完整的 **Pi 原生复合工程流体系**,将 AI 辅助编程从“随性写代码”升级为“严格的工程流水线”:
|
|
176
|
+
|
|
177
|
+
```text
|
|
178
|
+
00-next ──> 01-brainstorm ──> 02-plan ──> 03-work ──> 04-review ──> 05-learn
|
|
179
|
+
(智能调度) (需求澄清) (TDD计划) (断点编码) (质量审查) (极简复盘)
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- **核心命令与工具**:
|
|
183
|
+
- **`/workflow`**:快速在终端查看当前项目工作流阶段、各产物数量、当前自主循环进度与下一步推荐技能。
|
|
184
|
+
- **`workflow_state`** 工具:自动扫描 `docs/` 与 `.context/checkpoints/` 状态。
|
|
185
|
+
- **`artifact_helper`** 工具:规范化解析和建立需求、计划与避坑文档。
|
|
186
|
+
- **`session_checkpoint`** 工具:以 Implementation Unit 为粒度记录执行断点,**写一半中断后再次启动自动从断点续跑,绝不重头重来**。
|
|
187
|
+
- **6 大内置流程技能**:
|
|
188
|
+
- **`00-next`(智能路标)**:用户随口说 `continue`、`下一步` 或输入 `/skill:00-next`,自动探查当前进度并无缝引导至下一个环节。
|
|
189
|
+
- **`01-brainstorm`(需求发现)**:引导需求澄清,**灵活调用 `@juicesharp/rpiv-ask-user-question`**:互斥方案用单选(1-9直选)、模块清单用多选复选框、开放问题自由输入,自然对齐技术方案。
|
|
190
|
+
- **`02-plan`(计划拆解)**:将需求拆解为包含验证命令与改动清单的 Implementation Units,坚持极简阶梯(The Ladder)原则。
|
|
191
|
+
- **`03-work`(跨回合自主循环驱动编码)** 🚀:**原生内置类似 `goal` 的连续自动驱动引擎**。直接使用 `/skill:03-work`(或要求执行计划)启动后,后台引擎按计划中的 Implementation Units 逐单元跨回合自主推进“红-绿-重构”,**不做完规划任务绝不停机**!支持断点续跑与遇错即停(Stop-the-line)硬门禁;如需暂停,输入 `暂停`、`pause` 或按 `Esc` 即可。
|
|
192
|
+
- **`04-review`(审查闭环)**:全量代码审查、Spec 需求符合度核验、回归测试绿灯检查。
|
|
193
|
+
- **`05-learn`(极简知识复盘)**:价值门禁驱动,仅沉淀非平凡的疑难避坑卡片至 `docs/solutions/`,坚决不制造文档噪音。
|
|
194
|
+
- **内置上下文优化黑科技 (Token Saver)**:
|
|
195
|
+
- **`bash` 输出智能过滤器**:自动压缩长终端命令输出(如 `npm install`、长日志),保留首尾关键行,节省 80%+ 上下文 Token!
|
|
196
|
+
- **`read` 输出智能过滤器**:智能压缩 `package-lock.json` 等超大文件,只保留版本和依赖概览。
|
|
197
|
+
|
|
198
|
+
### 🔄 03-work 跨回合自主循环工作原理
|
|
199
|
+
|
|
200
|
+
传统 AI 编程助手往往在单个回合输出后便停下等待用户确认,导致长流程编码被频繁打断。`03-work` 原生集成了 `WorkLoopDriver` 跨回合自主驱动引擎:
|
|
201
|
+
1. **事件级生命周期监听**:挂载 Pi 的 `agent_settled` 事件,在每回合执行完毕且环境就绪时自动触发状态核验。
|
|
202
|
+
2. **磁盘断点双向校验**:实时扫描 `.context/checkpoints/` 与规划文件中的 Implementation Units,确保内存与磁盘状态强一致。
|
|
203
|
+
3. **自主连续推进**:若存在剩余未完成单元,驱动器防抖调度后续消息(`deliverAs: "followUp"`),实现跨回合无人值守自主编码与单测验证,**不做完计划绝不停机**。
|
|
204
|
+
4. **多重安全防护阀**:
|
|
205
|
+
- **Stop-The-Line 遇错即停**:同一单元若连续 3 次排查修复失败,强制停机并完整记录错误现场,杜绝无效死循环与 Token 浪费。
|
|
206
|
+
- **50 轮安全轮次上限**:防止异常任务无休止推进。
|
|
207
|
+
- **随时安全打断**:按下 `Esc` 或输入 `暂停` / `pause`,随时安全挂起循环。
|
|
208
|
+
5. **闭环自动流转**:全量单元绿灯通过后,自动交接调度 `/skill:04-review` 进行代码审查与回归验证。
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 💡 致谢与参考 (Acknowledgments)
|
|
213
|
+
|
|
214
|
+
本扩展库中的复合工程工作流(Compound Engineering)模块深度参考并借鉴了以下优秀开源项目的架构思想:
|
|
215
|
+
- **[`@leing2021/super-pi`](https://github.com/leing2021/super-pi)**:特别致谢 `super-pi` 项目对复合工程流流水线、断点续传(Checkpoints)与产物治理模式的探索与启发。本项目在汲取其精髓的基础上,全面重构了终端交互体验,解除了只能单选的限制,引入了 **`00-next` 智能调度导航**、**极简避坑复盘 `05-learn`**,并深度打通了 **`@juicesharp/rpiv-ask-user-question`** 的现代多选复选框终端交互体系。
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
141
219
|
## 📄 开源许可证
|
|
142
220
|
|
|
143
221
|
本项目基于 [MIT License](./LICENSE) 协议开源。
|
|
@@ -40,6 +40,7 @@ export async function generateCommitMessage(
|
|
|
40
40
|
diff: string,
|
|
41
41
|
changedFiles: string[],
|
|
42
42
|
userHint?: string,
|
|
43
|
+
thinkingLevel = ctx.thinkingLevel,
|
|
43
44
|
): Promise<string> {
|
|
44
45
|
const truncatedDiff = diff.length > 30000 ? diff.slice(0, 30000) + "\n\n... (diff已截断)" : diff;
|
|
45
46
|
const userPrompt = [
|
|
@@ -56,16 +57,29 @@ export async function generateCommitMessage(
|
|
|
56
57
|
.join("\n");
|
|
57
58
|
|
|
58
59
|
if (!ctx.model) throw new Error("当前未选择模型,请先使用 /model 选择模型。");
|
|
59
|
-
if (typeof ctx.modelRegistry?.
|
|
60
|
+
if (typeof ctx.modelRegistry?.getProvider !== "function" || typeof ctx.modelRegistry?.getProviderAuth !== "function")
|
|
60
61
|
throw new Error("当前 Pi 不支持统一模型调用接口,请更新 Pi 后重试。");
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
const modelLabel = `${ctx.model.provider}/${ctx.model.id}`;
|
|
63
|
+
const provider = ctx.modelRegistry.getProvider(ctx.model.provider);
|
|
64
|
+
if (!provider) throw new Error(`模型 ${modelLabel} 的提供方不可用,请重新选择模型。`);
|
|
65
|
+
const resolved = await ctx.modelRegistry.getProviderAuth(ctx.model.provider);
|
|
66
|
+
if (!resolved) throw new Error(`模型 ${modelLabel} 的认证未配置,请先完成登录或配置认证。`);
|
|
67
|
+
|
|
68
|
+
// 宿主解析认证、代理地址和环境;统一接口按模型能力转换会话思考档位,避免底层调用默认发送 none。
|
|
69
|
+
const model = resolved.auth.baseUrl ? { ...ctx.model, baseUrl: resolved.auth.baseUrl } : ctx.model;
|
|
70
|
+
const response = await provider.streamSimple(model, {
|
|
64
71
|
systemPrompt: COMMIT_SYSTEM_PROMPT,
|
|
65
72
|
messages: [{ role: "user", content: [{ type: "text", text: userPrompt }], timestamp: Date.now() }],
|
|
66
|
-
}, {
|
|
73
|
+
}, {
|
|
74
|
+
maxTokens: 4096,
|
|
75
|
+
signal: ctx.signal,
|
|
76
|
+
reasoning: thinkingLevel === "off" ? undefined : thinkingLevel,
|
|
77
|
+
apiKey: resolved.auth.apiKey,
|
|
78
|
+
headers: resolved.auth.headers,
|
|
79
|
+
env: resolved.env,
|
|
80
|
+
}).result();
|
|
67
81
|
if (response.stopReason !== "stop")
|
|
68
|
-
throw new Error(
|
|
82
|
+
throw new Error(`模型 ${modelLabel} 未正常完成生成(${response.stopReason}):${response.errorMessage || "请检查模型状态后重试。"}`);
|
|
69
83
|
|
|
70
84
|
const text = response.content.map((c) => c.type === "text" ? c.text : "").join("").trim()
|
|
71
85
|
.replace(/^```[a-zA-Z]*\r?\n?/, "").replace(/\r?\n?```$/, "").trim();
|
|
@@ -143,7 +157,9 @@ export default function (pi: ExtensionAPI) {
|
|
|
143
157
|
try {
|
|
144
158
|
if (!stagedDiff.trim()) throw new Error("暂存区没有可用于生成提交信息的差异。");
|
|
145
159
|
const changedFiles = await getStagedFiles(ctx.cwd);
|
|
146
|
-
commitMessage = await generateCommitMessage(
|
|
160
|
+
commitMessage = await generateCommitMessage(
|
|
161
|
+
ctx, stagedDiff, changedFiles, parsed.hint, ctx.thinkingLevel ?? pi.getThinkingLevel(),
|
|
162
|
+
);
|
|
147
163
|
} catch (error) {
|
|
148
164
|
// 生成失败必须停止,禁止用固定文案继续提交或推送。
|
|
149
165
|
const reason = error instanceof Error ? error.message : String(error);
|
|
@@ -6,6 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { pathToFileURL } from 'node:url';
|
|
7
7
|
import { execFileSync } from 'node:child_process';
|
|
8
8
|
import ts from 'typescript';
|
|
9
|
+
import { stream, streamSimple } from '@earendil-works/pi-ai/api/openai-responses';
|
|
9
10
|
|
|
10
11
|
// 在临时目录编译并运行真实命令,不访问开发仓库的提交记录。
|
|
11
12
|
const root = await mkdtemp(join(tmpdir(), 'pi-commit-test-'));
|
|
@@ -20,7 +21,17 @@ for (const name of ['index', 'src/git', 'src/prompt']) {
|
|
|
20
21
|
const { default: register, generateCommitMessage } = await import(pathToFileURL(join(root, 'index.js')));
|
|
21
22
|
const { getStagedFiles } = await import(pathToFileURL(join(root, 'src/git.js')));
|
|
22
23
|
const model = { id: '当前模型', provider: '当前提供方' };
|
|
23
|
-
function context(complete) {
|
|
24
|
+
function context(complete) {
|
|
25
|
+
const provider = { streamSimple: (...args) => ({ result: () => complete(...args) }) };
|
|
26
|
+
return {
|
|
27
|
+
model,
|
|
28
|
+
thinkingLevel: 'high',
|
|
29
|
+
modelRegistry: {
|
|
30
|
+
getProvider: () => provider,
|
|
31
|
+
getProviderAuth: async () => ({ auth: { apiKey: '测试凭据' } }),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
24
35
|
function response(text, stopReason = 'stop') { return { content: [{ type: 'text', text }], stopReason }; }
|
|
25
36
|
|
|
26
37
|
test('通过宿主统一接口继承当前模型并返回业务日志', async () => {
|
|
@@ -28,11 +39,67 @@ test('通过宿主统一接口继承当前模型并返回业务日志', async ()
|
|
|
28
39
|
assert.equal(actualModel, model);
|
|
29
40
|
assert.match(prompt.messages[0].content[0].text, /修复冲线残留/);
|
|
30
41
|
assert.equal(options.maxTokens, 4096);
|
|
42
|
+
assert.equal(options.reasoning, 'high');
|
|
31
43
|
return response('```text\nfix(racing): 清理冲线特效残留\n```');
|
|
32
44
|
});
|
|
33
45
|
assert.equal(await generateCommitMessage(ctx, '+ 清理特效', ['角色.cs'], '修复冲线残留'), 'fix(racing): 清理冲线特效残留');
|
|
34
46
|
});
|
|
35
47
|
|
|
48
|
+
test('继承全部会话思考档位及宿主认证、代理与环境,不修改原模型', async () => {
|
|
49
|
+
for (const level of ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max']) {
|
|
50
|
+
const signal = new AbortController().signal;
|
|
51
|
+
const auth = { apiKey: '测试凭据', baseUrl: 'https://proxy.example.invalid/v1', headers: { 'x-test': '测试头' } };
|
|
52
|
+
const env = { TEST_PROVIDER_REGION: '测试区域' };
|
|
53
|
+
const ctx = context(async (actualModel, _prompt, options) => {
|
|
54
|
+
assert.equal(actualModel.id, model.id);
|
|
55
|
+
assert.equal(actualModel.baseUrl, auth.baseUrl);
|
|
56
|
+
assert.equal(model.baseUrl, undefined);
|
|
57
|
+
assert.equal(options.reasoning, level === 'off' ? undefined : level);
|
|
58
|
+
assert.equal(options.apiKey, auth.apiKey);
|
|
59
|
+
assert.equal(options.headers, auth.headers);
|
|
60
|
+
assert.equal(options.env, env);
|
|
61
|
+
assert.equal(options.signal, signal);
|
|
62
|
+
return response('fix: 修复思考档位继承');
|
|
63
|
+
});
|
|
64
|
+
ctx.thinkingLevel = level;
|
|
65
|
+
ctx.signal = signal;
|
|
66
|
+
ctx.modelRegistry.getProviderAuth = async () => ({ auth, env });
|
|
67
|
+
await generateCommitMessage(ctx, 'diff', ['index.ts']);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test('真实 OpenAI 适配器复现默认 none,并验证会话档位写入请求体', async () => {
|
|
72
|
+
const actualModel = {
|
|
73
|
+
...model, id: 'gpt-6-astra', api: 'openai-responses', baseUrl: 'https://example.invalid/v1',
|
|
74
|
+
reasoning: true, input: ['text'], contextWindow: 128000, maxTokens: 16384,
|
|
75
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
76
|
+
thinkingLevelMap: { xhigh: 'xhigh', max: 'max' },
|
|
77
|
+
};
|
|
78
|
+
let payload;
|
|
79
|
+
const onPayload = value => { payload = value; throw new Error('已捕获请求,禁止联网'); };
|
|
80
|
+
const oldResponse = await stream(actualModel, { messages: [] }, { apiKey: '测试凭据', onPayload }).result();
|
|
81
|
+
assert.match(oldResponse.errorMessage, /已捕获请求/);
|
|
82
|
+
assert.equal(payload.reasoning.effort, 'none');
|
|
83
|
+
for (const thinking of ['low', 'medium', 'high', 'xhigh', 'max']) {
|
|
84
|
+
const ctx = context();
|
|
85
|
+
ctx.model = actualModel;
|
|
86
|
+
ctx.thinkingLevel = thinking;
|
|
87
|
+
ctx.modelRegistry.getProvider = () => ({
|
|
88
|
+
streamSimple: (requestModel, prompt, options) => streamSimple(requestModel, prompt, { ...options, onPayload }),
|
|
89
|
+
});
|
|
90
|
+
await assert.rejects(generateCommitMessage(ctx, 'diff', ['index.ts']), /已捕获请求/);
|
|
91
|
+
assert.equal(payload.reasoning.effort, thinking);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('提供方或认证缺失时停止生成', async () => {
|
|
96
|
+
const ctx = context(() => { assert.fail('不应请求模型'); });
|
|
97
|
+
ctx.modelRegistry.getProviderAuth = async () => undefined;
|
|
98
|
+
await assert.rejects(generateCommitMessage(ctx, 'diff', []), /认证未配置/);
|
|
99
|
+
ctx.modelRegistry.getProvider = () => undefined;
|
|
100
|
+
await assert.rejects(generateCommitMessage(ctx, 'diff', []), /提供方不可用/);
|
|
101
|
+
});
|
|
102
|
+
|
|
36
103
|
test('拒绝空结果、异常完成、截断、非法格式和通用文案', async () => {
|
|
37
104
|
for (const result of [response(''), response('fix: 修复残留', 'error'), response('fix: 修复残留', 'length'), response('说明文字'), response('chore(GameClient): 更新代码与相关配置')]) {
|
|
38
105
|
await assert.rejects(generateCommitMessage(context(async () => result), 'diff', ['角色.cs']));
|
|
@@ -59,14 +126,23 @@ test('生成失败不提交或推送,文件清单仅包含暂存区', async ()
|
|
|
59
126
|
assert.deepEqual(await getStagedFiles(repo), ['角色 文件.cs']);
|
|
60
127
|
const commands = new Map();
|
|
61
128
|
const messages = [];
|
|
62
|
-
register({
|
|
129
|
+
register({
|
|
130
|
+
registerCommand: (name, command) => commands.set(name, command),
|
|
131
|
+
sendMessage: message => messages.push(message),
|
|
132
|
+
getThinkingLevel: () => 'max',
|
|
133
|
+
});
|
|
63
134
|
const ctx = { ...context(async () => { throw new Error('认证失败'); }), cwd: repo, hasUI: true, ui: { notify() {} } };
|
|
64
135
|
await commands.get('commit-push').handler('', ctx);
|
|
65
136
|
assert.equal(git('rev-parse', 'HEAD'), head);
|
|
66
137
|
assert.match(messages.at(-1).content, /未执行提交或推送/);
|
|
67
138
|
assert.match(messages.at(-1).content, /认证失败/);
|
|
68
139
|
assert.deepEqual(await getStagedFiles(repo), ['角色 文件.cs']);
|
|
69
|
-
ctx.
|
|
140
|
+
// 兼容尚未提供 ctx.thinkingLevel 的宿主,从公开会话接口获取实际档位。
|
|
141
|
+
delete ctx.thinkingLevel;
|
|
142
|
+
ctx.modelRegistry = context(async (_model, _prompt, options) => {
|
|
143
|
+
assert.equal(options.reasoning, 'max');
|
|
144
|
+
return response('fix: 修复角色表现');
|
|
145
|
+
}).modelRegistry;
|
|
70
146
|
await commands.get('commit').handler('', ctx);
|
|
71
147
|
assert.equal(git('log', '-1', '--format=%B'), 'fix: 修复角色表现');
|
|
72
148
|
assert.notEqual(git('rev-parse', 'HEAD'), head);
|
|
@@ -26,6 +26,7 @@ import { Container, type SelectItem, SelectList, Text } from "@earendil-works/pi
|
|
|
26
26
|
import path from "node:path";
|
|
27
27
|
import os from "node:os";
|
|
28
28
|
import { promises as fs } from "node:fs";
|
|
29
|
+
import { buildSubagentOrchestrationPrompt } from "./src/orchestration.js";
|
|
29
30
|
|
|
30
31
|
// 跟踪审查会话来源分支节点(保证单次仅一个活跃审查会话)
|
|
31
32
|
let reviewOriginId: string | undefined = undefined;
|
|
@@ -77,89 +78,6 @@ async function saveSettings(settings: ReviewSettings): Promise<void> {
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
interface ReviewExpert {
|
|
81
|
-
id: string;
|
|
82
|
-
label: string;
|
|
83
|
-
desc: string;
|
|
84
|
-
task: string;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const ALL_EXPERTS: ReviewExpert[] = [
|
|
88
|
-
{
|
|
89
|
-
id: "pi-review.bugbot",
|
|
90
|
-
label: "Bug 猎手 (Bugbot)",
|
|
91
|
-
desc: "逻辑缺陷、空指针、边界溢出、死锁与运行时崩溃",
|
|
92
|
-
task: "深入排查本次代码改动中的业务逻辑缺陷、空指针、边界异常、并发竞态与未捕获的运行时异常",
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
id: "pi-review.security-review",
|
|
96
|
-
label: "安全专家 (Security)",
|
|
97
|
-
desc: "输入参数合法性校验、跨目录边界防护与权限隔离",
|
|
98
|
-
task: "深入排查本次代码改动中的防御性编码缺陷、外部输入未做类型/范围校验、边界防护不足等健壮性隐患",
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
id: "pi-review.perf-review",
|
|
102
|
-
label: "性能探针 (Perf)",
|
|
103
|
-
desc: "循环内GC内存分配、CPU热点消耗、算法复杂度与资源泄露",
|
|
104
|
-
task: "深入排查本次代码改动中的性能退化、高频循环内无谓内存分配 (GC压力) 与算法复杂度",
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
id: "pi-review.claude-md-compliance",
|
|
108
|
-
label: "契约合规 (Compliance)",
|
|
109
|
-
desc: "架构契约、设计模式、模块边界与规范遵循",
|
|
110
|
-
task: "排查本次代码改动是否违反项目既有架构契约、模块封装规范与规范指南",
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
id: "pi-review.code-comments",
|
|
114
|
-
label: "注释与可读性 (Comments)",
|
|
115
|
-
desc: "注释与代码逻辑倒挂、误导性命名与维护性隐患",
|
|
116
|
-
task: "排查本次代码改动中的可读性隐患、注释与逻辑不符、误导性命名与维护风险",
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
id: "pi-review.history-context",
|
|
120
|
-
label: "历史脉络 (History)",
|
|
121
|
-
desc: "结合 Git 历史演进判断意图,防止历史问题回归",
|
|
122
|
-
task: "结合代码演变历史,排查本次改动是否破坏既有历史契约或重现已知缺陷",
|
|
123
|
-
},
|
|
124
|
-
];
|
|
125
|
-
|
|
126
|
-
function buildSubagentOrchestrationPrompt(
|
|
127
|
-
concurrency: number,
|
|
128
|
-
gateEnabled: boolean,
|
|
129
|
-
targetInstruction: string,
|
|
130
|
-
): string {
|
|
131
|
-
const count = Math.min(6, Math.max(2, concurrency));
|
|
132
|
-
const selected = ALL_EXPERTS.slice(0, count);
|
|
133
|
-
|
|
134
|
-
const listText = selected.map((exp, idx) => `${idx + 1}. **${exp.label}** (\`${exp.id}\`):${exp.desc}`).join("\n");
|
|
135
|
-
const callsExample = selected
|
|
136
|
-
.map((exp) => {
|
|
137
|
-
const fullTask = `${targetInstruction}\n\n【专项排查分工】:${exp.task}`;
|
|
138
|
-
return `subagent({ agent: ${JSON.stringify(exp.id)}, task: ${JSON.stringify(fullTask)} });`;
|
|
139
|
-
})
|
|
140
|
-
.join("\n");
|
|
141
|
-
|
|
142
|
-
const maxBackticks = (callsExample.match(/`+/g) || []).reduce((max, m) => Math.max(max, m.length), 2);
|
|
143
|
-
const fence = "`".repeat(maxBackticks + 1);
|
|
144
|
-
|
|
145
|
-
return `## 🚀 执行方式:多 Subagent 并发专家审查 (当前配置并发数: ${count} 个专家)
|
|
146
|
-
|
|
147
|
-
当前已配置并行启动以下 ${count} 个专家子代理进行分工审查:
|
|
148
|
-
|
|
149
|
-
${listText}
|
|
150
|
-
|
|
151
|
-
### 协作审查执行规范:
|
|
152
|
-
1. **并发调用子代理**:请在当前回合使用 \`subagent\` 工具**同时并行唤起**上述 ${count} 个专家子代理(单回合发起 ${count} 个并发 tool_call,严禁串行逐个调用):
|
|
153
|
-
${fence}js
|
|
154
|
-
${callsExample}
|
|
155
|
-
${fence}
|
|
156
|
-
2. **主审裁判长汇总整理**:当所有专家子代理执行完毕返回发现后,请你作为主审裁判长${gateEnabled ? "(门禁裁决)" : ""}:
|
|
157
|
-
- 全面综合各专家的审查意见,对相同问题进行去重,剔除误报和低置信度内容(注意:项目中合法的内部 GM / Debug 调试工具在确保与正式生产环境隔离的前提下免检)。
|
|
158
|
-
- 严格按照《核心代码审查准则》的 **[P0~P3]** 等级标准排布审查清单。
|
|
159
|
-
- 给出最终综合裁决与一句话中文总评。
|
|
160
|
-
3. **语言强制要求**:所有任务入参、思考分析过程、综合汇报与最终报告必须 100% 为纯正中文,严禁出现任何英文段落或未翻译小标题!`;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
81
|
function setReviewWidget(ctx: ExtensionContext, active: boolean) {
|
|
164
82
|
if (!ctx.hasUI) return;
|
|
165
83
|
if (!active) {
|
|
@@ -1062,6 +980,13 @@ export default function reviewExtension(pi: ExtensionAPI) {
|
|
|
1062
980
|
...runtimeSettings,
|
|
1063
981
|
};
|
|
1064
982
|
|
|
983
|
+
const sessionModel = ctx.model;
|
|
984
|
+
const thinkingLevel = ctx.thinkingLevel ?? pi.getThinkingLevel();
|
|
985
|
+
if (settings.mode === "subagents" && !sessionModel) {
|
|
986
|
+
ctx.ui.notify("当前未选择模型,请先使用 /model 选择模型。", "error");
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
989
|
+
|
|
1065
990
|
let effectiveFreshSession = useFreshSession;
|
|
1066
991
|
|
|
1067
992
|
if (effectiveFreshSession) {
|
|
@@ -1110,8 +1035,10 @@ export default function reviewExtension(pi: ExtensionAPI) {
|
|
|
1110
1035
|
|
|
1111
1036
|
let fullPrompt = REVIEW_RUBRIC;
|
|
1112
1037
|
|
|
1113
|
-
if (settings.mode === "subagents") {
|
|
1114
|
-
fullPrompt += `\n\n---\n\n${buildSubagentOrchestrationPrompt(
|
|
1038
|
+
if (settings.mode === "subagents" && sessionModel) {
|
|
1039
|
+
fullPrompt += `\n\n---\n\n${buildSubagentOrchestrationPrompt(
|
|
1040
|
+
settings.concurrency, settings.gateEnabled, prompt, sessionModel, thinkingLevel,
|
|
1041
|
+
)}`;
|
|
1115
1042
|
}
|
|
1116
1043
|
|
|
1117
1044
|
fullPrompt += `\n\n---\n\n## 本次审查任务指示\n\n${prompt}`;
|