@ifrankwang/openspec-agents 0.136.0 → 0.138.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mcp-server/cli.mjs +296 -79
- package/README.md +3 -2
- package/assets/workflows/task-simple.yaml +23 -3
- package/assets/workflows/task.yaml +1 -1
- package/package.json +1 -1
- package/src/adapters/mcp-common/server.ts +2 -2
- package/src/core/git.ts +29 -4
- package/src/core/tools/lifecycle.ts +377 -80
- package/src/core/tools/schemas.ts +4 -4
- package/src/core/types.ts +2 -1
- package/src/core/views.ts +1 -1
- package/src/core/workflow/engine.ts +8 -0
- package/src/core/workflow/status.ts +17 -9
|
@@ -6,7 +6,7 @@ import type { ExemptionRecord } from "../exemptions.ts"
|
|
|
6
6
|
import type { LoadedWorkflow } from "./loader.ts"
|
|
7
7
|
import type { EngineRecommendation } from "./engine.ts"
|
|
8
8
|
import type { DetectChangesResult } from "../git.ts"
|
|
9
|
-
import { getStepVerdict, isTerminalPhase, isBlockingSeverity, isTaskGroupSettled, phaseStepMismatch, REVIEW_STEP_TO_LAYER, blockingStepChildren } from "./engine.ts"
|
|
9
|
+
import { getStepVerdict, isTerminalPhase, isBlockingSeverity, isTaskGroupSettled, isFinalTaskGroup, phaseStepMismatch, REVIEW_STEP_TO_LAYER, blockingStepChildren } from "./engine.ts"
|
|
10
10
|
import { agentToReviewDimension, agentToReviewLayer, readIssueSource } from "../constants.ts"
|
|
11
11
|
import { resolveChildIssueFields } from "./reset.ts"
|
|
12
12
|
import { taskListOf, issueChildrenOf } from "../task-children.ts"
|
|
@@ -162,7 +162,9 @@ function renderSuspended(item: WorkItem): string {
|
|
|
162
162
|
* 只审模式的交付物)——fix=none 下 issue 停留 todo 态、step tag=failed、item=done 为合法组合,
|
|
163
163
|
* 报告视图不渲染豁免/复核操作提示(该通道在只审模式下是死路,无修复者消费裁定结论)。
|
|
164
164
|
* change 会话两形态在编排视角下追加「部署注意事项」区块(见 renderDeploymentNotesSection),
|
|
165
|
-
* 子代理视角维持既有文案。
|
|
165
|
+
* 子代理视角维持既有文案。done 文案按「是否最后一个收口任务组」(isFinalTaskGroup,与 complete
|
|
166
|
+
* 收口判定单一事实源)分流:非最后组仅本组完成(代码尚未落基准,不得误导为已收尾);
|
|
167
|
+
* 最后组已完成即 change 收口已合并。 */
|
|
166
168
|
function renderTerminalPhase(item: WorkItem, state?: OrchestrateState, caller?: StatusViewCaller): string {
|
|
167
169
|
if (item.phase === "cancelled") {
|
|
168
170
|
return [
|
|
@@ -193,13 +195,16 @@ function renderTerminalPhase(item: WorkItem, state?: OrchestrateState, caller?:
|
|
|
193
195
|
]
|
|
194
196
|
return lines.join("\n")
|
|
195
197
|
}
|
|
198
|
+
const finalGroup = state ? isFinalTaskGroup(state, item) : true
|
|
196
199
|
if (item.metadata["completed_at"] !== undefined) {
|
|
197
200
|
return [
|
|
198
201
|
"# ✅ 任务组已完成",
|
|
199
202
|
"",
|
|
200
203
|
`- **完成时间**: ${item.metadata["completed_at"]}`,
|
|
201
204
|
"",
|
|
202
|
-
|
|
205
|
+
finalGroup
|
|
206
|
+
? "本任务组为最后一个收口任务组,change 收口已完成:变更分支已合并回基准分支,编排已完成并收尾。"
|
|
207
|
+
: "本任务组已完成,变更保留在 change 分支上,待全部任务组完成后统一收口合并。",
|
|
203
208
|
"",
|
|
204
209
|
...renderDeploymentNotesSection(state, caller),
|
|
205
210
|
].join("\n")
|
|
@@ -207,7 +212,10 @@ function renderTerminalPhase(item: WorkItem, state?: OrchestrateState, caller?:
|
|
|
207
212
|
return [
|
|
208
213
|
"# 🏁 任务组已完成,待收尾",
|
|
209
214
|
"",
|
|
210
|
-
"
|
|
215
|
+
"全部审核层已通过。",
|
|
216
|
+
finalGroup
|
|
217
|
+
? "调用 `opx_orch_complete_task_group` 完成 change 收口(把变更分支合并回基准分支并清理)。"
|
|
218
|
+
: "调用 `opx_orch_complete_task_group` 完成任务组收尾(变更保留在 change 分支,统一收口时合并)。",
|
|
211
219
|
"",
|
|
212
220
|
...renderDeploymentNotesSection(state, caller),
|
|
213
221
|
].join("\n")
|
|
@@ -226,7 +234,7 @@ function renderDeploymentNotesSection(state: OrchestrateState | undefined, calle
|
|
|
226
234
|
"",
|
|
227
235
|
"向用户汇报本次变更的部署注意事项:",
|
|
228
236
|
"",
|
|
229
|
-
`- 阅读主仓库 \`openspec/changes/${state.changeId}/\` 下规划文档(design.md、tasks.md、proposal.md、specs
|
|
237
|
+
`- 阅读主仓库 \`openspec/changes/${state.changeId}/\` 下规划文档(design.md、tasks.md、proposal.md、specs/)提取部署要点:数据/结构变更脚本执行、消息队列/缓存等中间件配置调整、新增配置项或功能开关、外部接口契约变化、依赖清单/构建配置变更(合并后需在主仓库重装依赖、重新构建)`,
|
|
230
238
|
"- 无规划文档时跳过文档提取,仅转述下方实施补充点",
|
|
231
239
|
"",
|
|
232
240
|
]
|
|
@@ -646,7 +654,7 @@ function renderAgentWorking(
|
|
|
646
654
|
lines.push(...renderStepSemantics(step, common, stepCtx))
|
|
647
655
|
lines.push(...renderWorktreeSection(state, tg, { showNamespace: true, showPort: true }))
|
|
648
656
|
// 证据区块注入:展示检查点增量口径的本次变更证据(文件清单 + 区间 diff 命令),与 Worktree 区块
|
|
649
|
-
// 「变更范围」(baseRef..HEAD
|
|
657
|
+
// 「变更范围」(baseRef..HEAD 本任务组累计口径)区分,供审查者审查变更内容后按操作指引裁量是否可免
|
|
650
658
|
// 全量工具检查(裁量语义由 workflow 配置单源承载,此处仅渲染事实证据)。
|
|
651
659
|
// - verify_tool(full 分支③有变更 → 全量路径):仅 reviewer-tool + 已预计算变更检测结果
|
|
652
660
|
// (hasNonDocChange=true)时渲染;分支①②提前返回、toolChanges 缺省路径不经过此处,不误伤其他 agent/step。
|
|
@@ -677,7 +685,7 @@ function renderAgentWorking(
|
|
|
677
685
|
lines.push(...eff.lines)
|
|
678
686
|
n = eff.nextNum
|
|
679
687
|
if (tg.worktreePath && tg.baseRef) {
|
|
680
|
-
|
|
688
|
+
lines.push(`${n++}. 用上方「变更范围」命令获取本任务组的已提交变更文件清单,作为本次实施/修改范围;审查/报告范围以当前 step 指令为准`)
|
|
681
689
|
}
|
|
682
690
|
lines.push(`${n++}. 执行当前 step(\`${rec.stepId}\`)职责范围内的全部工作——遵循所有已加载 skill 的全部规范与约束`)
|
|
683
691
|
lines.push(`${n++}. 逐项检视所有已加载 skill 的 MUST 规范,确认全部满足(不满足则补做,不得跳过)`)
|
|
@@ -928,7 +936,7 @@ const EVIDENCE_KIND_LABELS: Record<ChangesEvidenceKind, { title: string; lastChe
|
|
|
928
936
|
/** 证据区块:检查点增量口径的本次变更证据(文件清单 + 区间 diff 命令)。verify_tool 分支③(全量路径)
|
|
929
937
|
* 与 quality_review(simple 合并审查)共用,经 kind 区分口径措辞(「自上次工具检查」/「自上次合并审查」)。
|
|
930
938
|
* 有检查点时标注「本次为自上次审查(checkpoint..HEAD)增量区间」,与 Worktree 区块「变更范围」
|
|
931
|
-
* (baseRef..HEAD
|
|
939
|
+
* (baseRef..HEAD 本任务组累计口径)区分;无检查点(首次进入)时标注基线兜底口径,与变更范围一致;
|
|
932
940
|
* 无检查点亦无基线基准时不渲染 diff 命令(无法界定区间)。仅渲染事实证据,不做变更性质判定——
|
|
933
941
|
* 裁量语义由 workflow 配置操作指引单源承载。 */
|
|
934
942
|
function renderToolChangesEvidence(
|
|
@@ -954,7 +962,7 @@ function renderToolChangesEvidence(
|
|
|
954
962
|
if (checkpoint) {
|
|
955
963
|
lines.push(
|
|
956
964
|
`- **口径**: 本次为「${label.title}(${checkpoint}..HEAD)」的增量区间(含已提交与未提交的非 openspec 变更);` +
|
|
957
|
-
`与上方「变更范围」(${baseRef ?? "(无)"}..HEAD
|
|
965
|
+
`与上方「变更范围」(${baseRef ?? "(无)"}..HEAD 本任务组累计口径)不同`,
|
|
958
966
|
"",
|
|
959
967
|
)
|
|
960
968
|
} else if (baseRef) {
|