| name | marchen-propose-preview |
| description | 预览 propose 生成的变更摘要。从 proposal/design/specs/tasks 浓缩为终端卡片,便于人快速 review,决定下一步是 apply 还是改 propose。 |
| disable-model-invocation | true |
| argument-hint | <change-name> |
预览一个变更的浓缩摘要 — 纯终端输出,不写文件。
适用于 propose 完成后人快速 review,避免来回翻 4~7 个 artifact 文件。
输入:用户的请求应包含变更名称,或可从上下文推断。
流程
-
选择变更
有名称就用,没有则:
- 从对话上下文推断
- 只有一个 open 变更时自动选择
- 多个变更时
marchen list --json + AskUserQuestion 让用户选
显示:"Preview 变更: <name>"
-
获取 artifact 内容
marchen instructions <name> apply --json
返回 JSON 包含:
schemaName:"full" / "lite"
state:"ready" / "blocked" / "all_done"
progress:{ total, completed, remaining }
context:所有 artifact 的内容数组(id / status / content)
如果 state 为 blocked:打印 "变更未填完,先用 /marchen:propose 补齐 artifact 再预览",结束。不要强行摘要半成品。
-
生成卡片并直接打印
根据 schemaName 选模板:
full → 四段:改了什么 / 关键决策 / 影响范围 / 风险
lite → 两段:改了什么 / 任务概览
严格按下面的"摘要规则"生成,输出为单个卡片,禁止加任何解释段落。
-
末尾追加一行下一步提示
/marchen:apply <name> 开始实现
/marchen:propose <name> 修改提案
摘要规则(必须严格遵守)
通用约束:
- 卡片框宽 70 字符(含
│ 边框),便于主流终端整齐显示
- 每行内容(去掉边框后)≤ 60 字符;超出必须截断/合并/重写,不许折行
- 禁止粘贴 artifact 原文片段,所有内容必须重新组织、压缩
- 中文为主,技术名词保留英文(如
SearchManager、SDK)
- 宁可少写,不要堆。摘不下就合并或截断,在框底加
更多详情见 marchen/changes/<name>/
full schema 段落上限:
| 段落 | 上限 | 来源 |
|---|
| 改了什么 | 6 条 bullet | proposal 的"能力"小节 |
| 关键决策 | 5 条 bullet | design 的"决策"小节 |
| 影响范围 | 8 节点 ASCII 图 | proposal 的"影响范围" + design |
| 风险 | 3 条 bullet | design 的"风险与权衡" |
lite schema 段落上限:
| 段落 | 上限 | 来源 |
|---|
| 改了什么 | 6 条 bullet | tasks.md 任务组标题 + 推断 |
| 任务概览 | 1 行/任务组 | tasks.md 一级标题 + 完成进度 |
影响范围图退化策略:
如果节点数超 8 个 / 关系不清晰 / 没有明显依赖结构 → 改用 bullet 列模块名,不要硬画歪斜的 ASCII。
任务进度条规则(lite):
进度条固定 10 格宽,按 completed/total 比例画。例如 8/8 → ██████████,3/5 → ██████░░░░。
输出样例
full schema:
╭─ <name> ────────────────────────────── full · <N> 任务 ─╮
│ │
│ <一句话动机,从 proposal "动机" 段提炼,≤ 55 字> │
│ │
│ ━━ 改了什么 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ ✚ <capability-name> <一句话能力描述> │
│ ... │
│ │
│ ━━ 关键决策 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 1. <决策内容> │
│ ... │
│ │
│ ━━ 影响范围 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ <ASCII 图 或 bullet 模块列表> │
│ │
│ ━━ 风险 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ • <风险> │
│ │
╰──────────────────────────────────────────────────────────╯
lite schema:
╭─ <name> ──────────────────────────── lite · <N> 任务 ─╮
│ │
│ <一句话动机,从 tasks.md "背景" 段提炼> │
│ │
│ ━━ 改了什么 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ • <推断的核心变更> │
│ │
│ ━━ 任务概览 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 1. <任务组标题> ██████████ N/M ✓ │
│ │
╰───────────────────────────────────────────────────────╯
护栏
- 不写文件,纯 stdout 输出
- 不调用 AskUserQuestion 询问"要打印什么",遵守摘要规则即可
- 不展开补全 artifact 信息——artifact 里没有的,摘要里就不该有
- state 为
blocked 时拒绝生成,不强行摘要半成品
- 不要在卡片外加解释段落,只打印卡片 + 下一步提示
instruction 字段(apply JSON 里有)是给 apply 用的,不是给 preview 的,忽略它