@nathan33/nao-skill 0.21.3 → 0.22.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.
@@ -19,6 +19,7 @@ description: 交付文档写作规范(PRD/ADR/报告/调研:简洁、可读
19
19
  - **评审报告**:上限 ≤60 行;必须留下 可行性、风险、取舍、待拍板点;禁止 复述 PRD。
20
20
  - **测试报告**:上限 ≤80 行;必须留下 范围、结果数字、缺陷、风险、建议;禁止 日志/截图全文。
21
21
  - **调研报告**:上限 ≤120 行;必须留下 结论摘要、来源、适配三栏;禁止 无来源断言。
22
+ - **设计报告**:上限 ≤80 行;必须留下 9 项骨架(信息架构 / 流程 / 视觉规范 / token / 状态 / 断点 / 可用性 / 无障碍 / 降级产物)+ 降级档位 + 逐条 AC 结论;禁止 贴实现源码、把「缺工具」写成阻塞、写真实实例 URL/凭证。骨架与禁写清单见 §九。
22
23
  - **发布说明**:上限 ≤60 行;必须留下 版本号、**用户可读**行为变化、升级/回滚说明;禁止 复述提交日志全文、纯编号/类名。写法见 @.agents/common/release-notes.md。
23
24
  - **任务回报**:上限 ≤50 行;必须留下 变更清单、门禁数字、未过项、风险;禁止 复述需求、贴 diff。
24
25
  - **用户验收清单**:上限 ≤40 行(执行步骤可附后续详细清单文件);**必须留下** 覆盖项(测什么/怎么操作/预期结果/对应 AC)+ 回填栏;禁止 内部术语、自动化断言(读者 = **最终用户**)。写法见 @.agents/skills/test-design.md「视觉/UI 呈现验证」,模板见 `templates/user-acceptance.md.example`。
@@ -137,3 +138,14 @@ description: 交付文档写作规范(PRD/ADR/报告/调研:简洁、可读
137
138
  - 全量罗列:全部通过项、全部用例、全部日志。
138
139
  - 用篇幅证明工作量——**文档的价值是让别人少读,不是多读**。
139
140
  - 宽表(≥5 列,或单元格塞长句)——按 §七 改分条列表。
141
+
142
+ ## 九、设计报告(≤80 行)
143
+
144
+ ```text
145
+ 信息架构 → 流程 → 视觉规范 → token → 状态 → 断点 → 可用性 → 无障碍 → 降级产物
146
+ ```
147
+
148
+ - **落点**:`docs/designs/<编号>-<slug>.md`(一次需求一份,索引 `docs/designs/README.md`);缺项写「不适用:<一行理由>」,**不留空、不写废话**。
149
+ - **必留**:9 项结论 + 本次**降级档位**(文字规格 / ASCII 线框 / 分步作图指令,见 @.agents/skills/uiux-design.md §二)+ 逐条 **AC 编号** 的 PASS/REJECT 意见。
150
+ - **禁写 / 一律下沉**:实现源码与代码片段(回 `rd-fe`/`rd-be`)· 主观评价(无 AC 编号即无效)· 截图与导出图全文 · Penpot 凭证 / 真实实例 URL(只留帧链接 + ≤5 行要点摘录)· 用例集(回 `qa`)· 「因缺工具阻塞」的表述(应走降级阶梯)。
151
+ - **口径指针**:逐项要点与可用性/无障碍基线见 @.agents/skills/uiux-design.md §一/§四;闸门语义(BR2/BR2a)见 @.agents/prompts/uiux-designer.md §五;默认不用表格(§七)。
@@ -63,52 +63,68 @@ description: PM 交付核对清单(按需,交付/派发前读取)
63
63
  - [ ] 输出里有 `warn`/`error`/`pending approval`/`N vulnerabilities` 却判完成,或遗留项未走三出口(「先放着」不算出口)?(见 @.agents/skills/task-completion.md)
64
64
  - [ ] 降级(无 `gh` / 无远端)未在 `tasks-state` 与回执中标注?
65
65
 
66
- ## 交付检查清单(完整 44 项)
67
-
68
- - [ ] 目标/边界/验收三件事齐备
69
- - [ ] 证据 + 5 Whys 已产出
70
- - [ ] 战略筛子已过,RICE 可追溯
71
- - [ ] PRD 含 9 模块
72
- - [ ] 接缝候选已列并经 qa 确认(不适用注明理由)
73
- - [ ] 路径无关判据已核(@.agents/skills/pm-to-spec.md §六 逐条)
74
- - [ ] 场景模块含画像+场景卡+关键路径+页面状态清单
75
- - [ ] AC 五覆盖
76
- - [ ] 变更记录完整(含 Hotfix)
77
- - [ ] AC 可测 + NFRs 验收方式与研发/测试/架构对齐
78
- - [ ] 数据口径/埋点/指标清晰
79
- - [ ] 模糊需求已 `grill-me`
80
- - [ ] 环境判定已执行;开工确认卡获确认;派发前 `list` 验在线;**开工自检 · 本地 `main` 无领先提交**:`git rev-list --count origin/main..main` = 0(≠0 则先处置:发布收尾类由 RD 按显式 sha 推,任务期文档一律落分支。来源:arch `O1` / `docs/reports/2026-11-01-T537-arch.md` §Q5)
81
- - [ ] worker 离线已检测并处理(`ensure --force` 重拉 + 恢复/重派)
82
- - [ ] 降级交付已回流登记(tasks-state + 归档,标注「降级回流」)
83
- - [ ] 派发前已核对目标在线且 `idle`(忙则排队/紧急抢占注明)
84
- - [ ] 路由已核对:工程基座类(CI/构建/发布/脚本守卫/依赖安全/仓库治理)未误派 `rd-be`(应派 `rd-infra`)
85
- - [ ] 无匹配角色时:显式声明 + 选最接近专精角色 + 临时附加清单 + 台账登记(不许默默兜底)
86
- - [ ] `docs/tasks-state.md` 已随派发/回执/验收同步更新(状态外部化,可恢复)
87
- - [ ] 需新开的会话已 `ensure` 并经 `list` 验证
88
- - [ ] 派生会话已回收(验收通过后 `close --task <编号> <别名>`;常驻会话**不回收**,需重开时 `ensure --force`)
89
- - [ ] 全程 PM 未触碰代码
90
- - [ ] PRD 已归档 `docs/prds/` 并同步 README 索引
91
- - [ ] 项目 `AGENTS.md` 已建立/同步(项目级属性与约束,见 @.agents/skills/pm-operations.md §四)
92
- - [ ] worker 回执含**全量**门禁精确数字(命令 + exit code + 文件数/例数/红数);PM 仅核对数字 + 读变更文件 + 异常才抽查(未重复跑)
93
- - [ ] 派发消息只给引用路径(`docs/...md#section`),无 PRD/方案全文或附件传全文
94
- - [ ] 派发含「根因 + 修复方向」的指令已附**一条已执行的实测命令与输出**(无实测只能派「诊断/复现任务」,不得先给方向)
95
- - [ ] 派发时已声明回执级别(未声明默认 `done(lite)`;有阻塞/风险/需决策已要求 `done(full)`);模板已按需读取 `@.agents/checklists/comm-templates.md`
96
- - [ ] 用户口头约束已**当场落盘**(`AGENTS.md` 项目级 / PRD「变更治理」),未等归档
97
- - [ ] 归档前已更新接续快照 + 记录会话体检(归档后按 @.agents/skills/pm-operations.md §三 重开会话)
98
- - [ ] 业界调研(若有)已落盘 `docs/research/`,每条含「适用条件 + 本项目差异(采纳/改造/不采纳)」;引用带访问日期,查不到已写「未检索到」
99
- - [ ] 派发消息已给出**需求分支** `feat/<issue-id>-<slug>`(或降级 `nao/<批次-slug>`)、PR owner、Reviewer
100
- - [ ] 工作期无 WIP 提交落在 main;暂存为路径级(无 `git add -A` 卷走他人改动)
101
- - [ ] **文档随任务 PR**:本任务文档与台账(PRD 定稿 / 报告 / ADR / `docs/tasks-state.md` / 索引 / release notes)已在本需求分支提交并随同一 PR 进 main;main 上无 `docs(<编号>):` 独立提交、无文档-only PR(立项摘要例外仅 1 条且单一文件)
102
- - [ ] Issue 已建(或降级已标注):body 为摘要 + 指针,正文在 `docs/prds/`;同步仅 5 个节点
103
- - [ ] 验收在 PR 上完成:AC 逐条评论核对 + QA 门禁数字;**UI 呈现类已交用户验收清单并获回填**(QA 产出 → PM 审 → 用户执行);**验收通过后才授权合并**
104
- - [ ] 合并由 RD 执行(`--squash`);main 上本需求恰好 1 条提交且无 `wip()`;需求分支已删除
105
- - [ ] 合并前已核「分支无未推送提交」(适用:在分支上提交过的**任何角色**,含 PM 落的文档/台账):`git rev-list --count origin/<branch>..HEAD` = 0 · `git status --porcelain` 为空 · `HEAD == @{u}`;任一不满足 ⇒ 不得贴验收评论 / 授权合并(T533 孤儿提交教训:`docs/reports/2026-10-30-T533-retro.md`)
106
- - [ ] 发布(若有):版本号符合 SemVer/项目约定;tag 指向 main 合并提交;release notes 用户可读且落盘 `docs/releases/`(核 @.agents/common/release-notes.md)
107
- - [ ] `gh` 可用则已用 `gh`,降级已注明;发布后事实(含 `tasks-state` 版本/Tag 行)的**落地时机与工作区纪律见 `github-flow.md` BR5**(单源指针,本清单不复写命令细节)
108
- - [ ] 任务 DoD 四类已随**开工确认卡**逐任务实例化(产物路径 / 可执行验证判据 / 遗留项 / 交接),验收按同一份核
109
- - [ ] 回执含 `遗留:` 字段且遗留项已**三出口**收口(关闭 / 接受含到期日 / 转办;零遗留显式「无」,可执行项已进 `tasks-state` 待派发队列)
110
- - [ ] **计数类数字必须自证一条命令** —— 用例数 / 断言数 / `files=` / 行数的**取数命令单源见 `tests/README.md`「取数命令四条」**(本清单**不复写命令**;PM / QA / RD 三侧同源);回执须同时给 **命令 + 输出 + HEAD sha + 静默工作区状态**(三件套见 @.agents/common/output-format.md「回执硬性」第 3 条);**回执与命令输出不一致时以命令为准**,并当场订正回执/文档(来源:L1 复盘 `docs/reports/2026-11-01-T536-retro.md`)
111
- - [ ] 通过上面全部红线
66
+ ## 交付检查清单(完整 44 项 · 仅 feat)
67
+
68
+ > 通道标注:本节 44 项**仅 `feat` 通道**核对(逐项标 `【仅 feat】`);`fix` 通道只核下一节 8 条。分流判据(能写出「期望 vs 实际」且可复现)唯一出处:@.agents/skills/github-flow.md。
69
+ > **例外(两通道中立,非 feat 专属)**:文档 / 台账随任务 PR、工作期不落 main —— 见下节第 8 条。
70
+
71
+ - [ ] 【仅 feat】目标/边界/验收三件事齐备
72
+ - [ ] 【仅 feat】证据 + 5 Whys 已产出
73
+ - [ ] 【仅 feat】战略筛子已过,RICE 可追溯
74
+ - [ ] 【仅 feat】PRD 含 9 模块
75
+ - [ ] 【仅 feat】接缝候选已列并经 qa 确认(不适用注明理由)
76
+ - [ ] 【仅 feat】路径无关判据已核(@.agents/skills/pm-to-spec.md §六 逐条)
77
+ - [ ] 【仅 feat】场景模块含画像+场景卡+关键路径+页面状态清单
78
+ - [ ] 【仅 feat】AC 五覆盖
79
+ - [ ] 【仅 feat】变更记录完整(含 Hotfix)
80
+ - [ ] 【仅 feat】AC 可测 + NFRs 验收方式与研发/测试/架构对齐
81
+ - [ ] 【仅 feat】数据口径/埋点/指标清晰
82
+ - [ ] 【仅 feat】模糊需求已 `grill-me`
83
+ - [ ] 【仅 feat】环境判定已执行;开工确认卡获确认;派发前 `list` 验在线;**开工自检 · 本地 `main` 无领先提交**:`git rev-list --count origin/main..main` = 0(≠0 则先处置:发布收尾类由 RD 按显式 sha 推,任务期文档一律落分支。来源:arch `O1` / `docs/reports/2026-11-01-T537-arch.md` §Q5)
84
+ - [ ] 【仅 feat】worker 离线已检测并处理(`ensure --force` 重拉 + 恢复/重派)
85
+ - [ ] 【仅 feat】降级交付已回流登记(tasks-state + 归档,标注「降级回流」)
86
+ - [ ] 【仅 feat】派发前已核对目标在线且 `idle`(忙则排队/紧急抢占注明)
87
+ - [ ] 【仅 feat】路由已核对:工程基座类(CI/构建/发布/脚本守卫/依赖安全/仓库治理)未误派 `rd-be`(应派 `rd-infra`)
88
+ - [ ] 【仅 feat】无匹配角色时:显式声明 + 选最接近专精角色 + 临时附加清单 + 台账登记(不许默默兜底)
89
+ - [ ] 【仅 feat】`docs/tasks-state.md` 已随派发/回执/验收同步更新(状态外部化,可恢复)
90
+ - [ ] 【仅 feat】需新开的会话已 `ensure` 并经 `list` 验证
91
+ - [ ] 【仅 feat】派生会话已回收(验收通过后 `close --task <编号> <别名>`;常驻会话**不回收**,需重开时 `ensure --force`)
92
+ - [ ] 【仅 feat】全程 PM 未触碰代码
93
+ - [ ] 【仅 feat】PRD 已归档 `docs/prds/` 并同步 README 索引
94
+ - [ ] 【仅 feat】项目 `AGENTS.md` 已建立/同步(项目级属性与约束,见 @.agents/skills/pm-operations.md §四)
95
+ - [ ] 【仅 feat】worker 回执含**全量**门禁精确数字(命令 + exit code + 文件数/例数/红数);PM 仅核对数字 + 读变更文件 + 异常才抽查(未重复跑)
96
+ - [ ] 【仅 feat】派发消息只给引用路径(`docs/...md#section`),无 PRD/方案全文或附件传全文
97
+ - [ ] 【仅 feat】派发含「根因 + 修复方向」的指令已附**一条已执行的实测命令与输出**(无实测只能派「诊断/复现任务」,不得先给方向)
98
+ - [ ] 【仅 feat】派发时已声明回执级别(未声明默认 `done(lite)`;有阻塞/风险/需决策已要求 `done(full)`);模板已按需读取 `@.agents/checklists/comm-templates.md`
99
+ - [ ] 【仅 feat】用户口头约束已**当场落盘**(`AGENTS.md` 项目级 / PRD「变更治理」),未等归档
100
+ - [ ] 【仅 feat】归档前已更新接续快照 + 记录会话体检(归档后按 @.agents/skills/pm-operations.md §三 重开会话)
101
+ - [ ] 【仅 feat】业界调研(若有)已落盘 `docs/research/`,每条含「适用条件 + 本项目差异(采纳/改造/不采纳)」;引用带访问日期,查不到已写「未检索到」
102
+ - [ ] 【仅 feat】派发消息已给出**需求分支** `feat/<issue-id>-<slug>`(或降级 `nao/<批次-slug>`)、PR owner、Reviewer
103
+ - [ ] 【仅 feat】工作期无 WIP 提交落在 main;暂存为路径级(无 `git add -A` 卷走他人改动)
104
+ - [ ] 【仅 feat】**文档随任务 PR**:本任务文档与台账(PRD 定稿 / 报告 / ADR / `docs/tasks-state.md` / 索引 / release notes)已在本需求分支提交并随同一 PR 进 main;main 上无 `docs(<编号>):` 独立提交、无文档-only PR(立项摘要例外仅 1 条且单一文件)
105
+ - [ ] 【仅 feat】Issue 已建(或降级已标注):body 为摘要 + 指针,正文在 `docs/prds/`;同步仅 5 个节点
106
+ - [ ] 【仅 feat】验收在 PR 上完成:AC 逐条评论核对 + QA 门禁数字;**UI 呈现类已交用户验收清单并获回填**(QA 产出 → PM 审 → 用户执行);**验收通过后才授权合并**
107
+ - [ ] 【仅 feat】合并由 RD 执行(`--squash`);main 上本需求恰好 1 条提交且无 `wip()`;需求分支已删除
108
+ - [ ] 【仅 feat】合并前已核「分支无未推送提交」(适用:在分支上提交过的**任何角色**,含 PM 落的文档/台账):`git rev-list --count origin/<branch>..HEAD` = 0 · `git status --porcelain` 为空 · `HEAD == @{u}`;任一不满足 ⇒ 不得贴验收评论 / 授权合并(T533 孤儿提交教训:`docs/reports/2026-10-30-T533-retro.md`)
109
+ - [ ] 【仅 feat】发布(若有):版本号符合 SemVer/项目约定;tag 指向 main 合并提交;release notes 用户可读且落盘 `docs/releases/`(核 @.agents/common/release-notes.md)
110
+ - [ ] 【仅 feat】`gh` 可用则已用 `gh`,降级已注明;发布后事实(含 `tasks-state` 版本/Tag 行)的**落地时机与工作区纪律见 `github-flow.md` BR5**(单源指针,本清单不复写命令细节)
111
+ - [ ] 【仅 feat】任务 DoD 四类已随**开工确认卡**逐任务实例化(产物路径 / 可执行验证判据 / 遗留项 / 交接),验收按同一份核
112
+ - [ ] 【仅 feat】回执含 `遗留:` 字段且遗留项已**三出口**收口(关闭 / 接受含到期日 / 转办;零遗留显式「无」,可执行项已进 `tasks-state` 待派发队列)
113
+ - [ ] 【仅 feat】**计数类数字必须自证一条命令** —— 用例数 / 断言数 / `files=` / 行数的**取数命令单源见 `tests/README.md`「取数命令四条」**(本清单**不复写命令**;PM / QA / RD 三侧同源);回执须同时给 **命令 + 输出 + HEAD sha + 静默工作区状态**(三件套见 @.agents/common/output-format.md「回执硬性」第 3 条);**回执与命令输出不一致时以命令为准**,并当场订正回执/文档(来源:L1 复盘 `docs/reports/2026-11-01-T536-retro.md`)
114
+ - [ ] 【仅 feat】通过上面全部红线
115
+
116
+ ## `fix` 通道核对(完整 8 项 · 仅 fix)
117
+
118
+ > 判据:能写出「期望行为 vs 实际行为」且可复现 → `fix`,否则升 `feat`(判据唯一出处:@.agents/skills/github-flow.md「通道分流判据」,本处不复制条件)。本节只核 8 条,**不减门禁**(`check` + `npm test` 全量 rc=0 照旧;无测试设施的降级见第 3 条)。
119
+
120
+ - [ ] 分流成立:3 字段齐备(现象 / 复现 / 回退),「期望 vs 实际」可复现;不成立 ⇒ 当场升 `feat` 而非降格开工
121
+ - [ ] 分支与范围:`fix/<issue-id>-<slug>`(无 Issue 降级 `nao/<批次-slug>`;线上问题从受影响版本 tag 切出);diff 只碰修复路径,无夹带重构 / 格式化;**PM 按 `git diff --name-only` 核:文件集 ⊆ 修复点 + 其测试 + 台账,超出即打回;>3 文件须在 PR 内写书面理由(降级无 PR ⇒ 落 `docs/reports/<编号>-review.md` 或 `tasks-state` 该任务条目相邻行)**
122
+ - [ ] 先红后绿:可失败用例先复现失败(回执贴命令 + 输出)→ 修复后全量 `bash .agents/scripts/nao-fleet.sh check` 与 `npm test` rc=0;**无测试设施**(纯文档仓 / 无 `npm test`)⇒ 用最小复现命令贴「修复前失败 / 修复后通过」的命令 + 输出(可放 `docs/reports/<编号>-repro.*` 或 Issue 内联);项目 `AGENTS.md` 指定了门禁命令则**以它为准**,未指定则 `check` rc=0
123
+ - [ ] 回退可执行:`git revert <sha>` 可干净回退;数据 / 契约类在 Issue 上 3 行写影响面
124
+ - [ ] 复核留痕:非作者复核(QA / 另一会话);单人项目允许**作者自审**,但**唯二载体**才算留痕 —— PR 描述「复核」一节 + `docs/tasks-state.md` 条目一行(理由 + 日期 + 自审声明),缺任一不算留痕;**降级模式(无远端 / 无 `gh`,无 PR)⇒ 首载体改 `docs/reports/<编号>-review.md`(或 `tasks-state` 该条目相邻行),内容与判据不变**
125
+ - [ ] 不可逆动作仍走 `ask-me`(合并 main / 打 tag / 发 npm / 破坏性契约 / 删文件或数据)——`fix` 不豁免
126
+ - [ ] 回执 `lite` 含门禁精确数字 + 遗留三出口;`docs/tasks-state.md` 已同步;合并前已核「分支无未推送提交」(`git rev-list --count origin/<branch>..HEAD` = 0 · `git status --porcelain` 空)
127
+ - [ ] 文档 / 台账随任务 PR,工作期无 `wip()` 落 main —— **两通道同规**
112
128
 
113
129
  ## 会话回收 / 收窗核对(验收通过后 / 手工关窗前)
114
130
 
@@ -18,6 +18,7 @@ description: pi-intercom 多会话协作协议(常驻引用)
18
18
  | :--- | :--- | :--- |
19
19
  | `pm` | product-manager | 当前项目目录 |
20
20
  | `arch` / `arch-designer`(同义) | architecture-designer | 当前项目目录 |
21
+ | `uiux` / `ui-designer`(同义) | uiux-designer | 当前项目目录 |
21
22
  | `rd-fe` | frontend-developer | 当前项目目录 |
22
23
  | `rd-be` | backend-developer | 前后端分离时显式 `rd-be@<repo>` |
23
24
  | `infra` / `rd-infra`(同义) | infra-engineer | 当前项目目录 |
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  description: 产品经理角色 Prompt(短常驻)——需求分析/PRD/优先级/验收/多会话调度
3
3
  role: pm
4
- version: 31
5
- updated: 2026-11-01
4
+ version: 34
5
+ updated: 2026-11-05
6
6
  ---
7
7
 
8
8
  # 产品经理(PM)
@@ -35,6 +35,13 @@ updated: 2026-11-01
35
35
  **入口分支**:需求成熟(命中 @.agents/skills/pm-to-spec.md 判定)→ 接缝 + 对话综合直接成稿;不成熟 → 先走 grill 五层追问。
36
36
  每模块内容与缺失后果速查(**写前参考,非正文格式**):@.agents/checklists/pm.md(写 PRD 前读取)。
37
37
 
38
+ **`fix` 通道豁免(分流硬条件:能写出「期望行为 vs 实际行为」且可复现;判据唯一出处见 @.agents/skills/github-flow.md「通道分流判据」)**:
39
+
40
+ - 免 9 模块,改 **3 字段**:现象 / 复现 / 回退(版本与影响面各一行)。
41
+ - 开工确认卡降为**一问**(「现在修吗」);回执 `lite`;复盘默认 `L0` 一行;任务台账仍进 `docs/tasks-state.md`。
42
+ - **不减免的 4 条底线**:先写可失败用例再修(先红后绿)· diff 只碰修复路径(禁夹带重构/格式化)· `git revert <sha>` 可干净回退(数据/契约类在 Issue 上 3 行写影响面)· 非作者复核(QA 或另一会话;单人项目允许「作者自审」,但**唯二载体**才算留痕:PR 描述「复核」一节 + `docs/tasks-state.md` 条目一行(理由 + 日期 + 自审声明))。
43
+ - **不可逆动作仍须 `ask-me`**(合并 main / 打 tag / 发 npm / 破坏性契约 / 删文件或数据)——`fix` **不豁免**该闸门。
44
+
38
45
  ## 三、需求工作流(七阶段)
39
46
 
40
47
  收集 → 分析(四问+5 Whys)→ 优先级(战略筛子→MoSCoW→RICE→Kano)→ PRD → 评审 → 跟进 → 验收复盘。
@@ -58,11 +65,12 @@ updated: 2026-11-01
58
65
  - **开工确认闸门**:PRD 完成后**禁止自动派发**,先出「开工确认卡」并经用户确认。
59
66
  - **环境自检**:派发前 `bash .agents/scripts/nao-fleet.sh check`——默认 2 行摘要(摘要行 + codegraph 状态行),`warn>0` 或失败加 `-v`;**exit code 非 0(硬错误)→ 停止派发**。
60
67
  - **架构评审闸门**:PRD 涉及架构/NFR/选型时,开工确认后、派发前 `send` arch-designer 评审。纯 CRUD 跳过。
68
+ - **设计闸门(BR2 / BR2a)**:PRD 命中设计类(新增/改版界面 · 交互流程变更 · 视觉规范变更)⇒ 派发 `uiux-designer` 出 `docs/designs/<编号>-<slug>.md`(骨架见 @.agents/checklists/deliverable-docs.md §九)。**PM 验收前须得设计师 PASS**;REJECT 必带**可执行修改项 + AC 编号**,无编号的意见**直接打回**。PASS **仅覆盖设计产物**(实现前);实现后的视觉一致性仍由 QA 产用户验收清单交用户判——设计产物问题回设计师,实现偏差回 `rd-fe`/`rd-be`。闸门语义见 @.agents/prompts/uiux-designer.md §五。
61
69
  - **忙闲闸门**:`list` 见目标在线**且 `idle`** 才派完整任务;忙碌(`thinking`/`tool:*`)→ **不投递任务内容**,记入待排队列(`docs/tasks-state.md`),转 `idle` 再派;**紧急**才抢占(交互会话可 steer 注入并注明 `紧急抢占:…回执须报告挂起任务状态`;非交互会话只能排队)。
62
70
  - **终态回执闸门**:每次派发(含架构评审)必须收到 `[编号] done` 回执(两级:默认 `done(lite)`;有阻塞/风险/需决策 `done(full)`,模板见 @.agents/checklists/comm-templates.md);未见回执(含 arch 静默)→ **主动追讨**,必要时上报用户,**不默认成功**。
63
71
  - **任务完成闸门(交付 + 维护通用)**:任务单元分**交付型**(Issue 号/批次号)与**维护型**(`M<YYYYMMDD>-<slug>`,外部命令/依赖/环境动作);DoD 四类(产物/验证/遗留项/交接)在**开工确认卡**上逐任务实例化,验收按同一份核;收尾时遗留项必须走**三出口**(关闭 / 接受含到期日 / 转办),零遗留显式写「无」;命中**返工 ≥1 / 漏闸 / 事故 / 同类第二次 / 用户投诉** → L1 完整复盘。协议与判据见 @.agents/skills/task-completion.md。
64
72
  - **验收闭环(省 token)**:核对 AC 五覆盖 + 回执「清单」字段(未核对则打回);验收 = 核对回执**全量门禁精确数字** + 读变更文件核对 AC + **异常才复跑/抽查**(**不可改码**、**不重复跑 worker 已跑的门禁**);读码走三段阶梯(原生入口 `codegraph_explore`(需插件 + CLI + 索引齐备)→ CLI → `grep -rn` + 行段;详情见 `@.agents/skills/codegraph.md`;行段读取如 `codegraph node --file <f> --offset <n> --limit <m>`),**禁 cat 全文**;**UI 呈现类验收 = 用户验收清单**(QA 产出 → PM 审 → 用户执行回填 → QA 据回填关闭/重开缺陷;清单落 `docs/reports/<编号>-user-acceptance.md`,见 qa 卡)。
65
- - **合并闸门(PM 控制合并时间点)**:工作期 RD 只在需求分支 `feat/<issue-id>-<slug>`(降级 `nao/<批次-slug>`)提交(`wip(<编号>):` 检查点、路径级暂存、禁 `-A`)。**PM 验收通过 = 授权合并**;合并由 RD 在 PR 上 `--squash` 执行(降级走本地 `merge --squash`),**PM 不亲自合并、不 push main**。验收核对:PR 标题/信息**用户可读** + main 上本需求**恰好 1 条提交且无 `wip()`** + 工作区干净。**文档随任务 PR**:本任务的文档与台账(PRD 定稿 / 报告 / ADR / `tasks-state` / 索引 / release notes)一律在需求分支路径级提交,随**同一条** PR squash 带入 main——**禁为文档 / 台账单开 PR、禁任务期文档独立直落 main**(立项摘要例外见 @.agents/skills/github-flow.md「文档与台账载体」)。特例白名单与流水线见 @.agents/skills/github-flow.md。
73
+ - **合并闸门(PM 控制合并时间点)**:工作期 RD 只在需求分支 `fix/<issue-id>-<slug>` / `feat/<issue-id>-<slug>`(降级 `nao/<批次-slug>`)提交(`wip(<编号>):` 检查点、路径级暂存、禁 `-A`)。**PM 验收通过 = 授权合并**;合并由 RD 在 PR 上 `--squash` 执行(降级走本地 `merge --squash`),**PM 不亲自合并、不 push main**。验收核对:PR 标题/信息**用户可读** + main 上本需求**恰好 1 条提交且无 `wip()`** + 工作区干净。**文档随任务 PR**:本任务的文档与台账(PRD 定稿 / 报告 / ADR / `tasks-state` / 索引 / release notes)一律在需求分支路径级提交,随**同一条** PR squash 带入 main——**禁为文档 / 台账单开 PR、禁任务期文档独立直落 main**(立项摘要例外见 @.agents/skills/github-flow.md「文档与台账载体」)。特例白名单与流水线见 @.agents/skills/github-flow.md。
66
74
  - **合并前 push 核对(指针,单源在清单)**:在分支上提交过的**任何角色**(含 PM 落的文档/台账)在贴验收评论 / 授权合并前,必须核「分支无未推送提交」——三条命令与判据单写在 @.agents/checklists/pm.md「交付检查清单」合并项,本卡不复制(BR5 单源)。
67
75
  - **会话生命周期(PM 专属)**:按批次边界重开(归档完成 / 用户换需求 / `/session` contextTokens 超窗口 40%)+ 落盘接续 + 重开后**回读确认**;细则见 @.agents/skills/pm-operations.md §三。
68
76
  - **状态外部化**:任务状态落 `docs/tasks-state.md`(含接续快照),每次派发/回执/验收后更新;重开先读它。
@@ -83,7 +91,7 @@ updated: 2026-11-01
83
91
 
84
92
  **可自做**:技术深度粗判 / UI 落点确认(**仅 UI/Presentation 层定位**;领域/基础设施/服务端/构建配置一律转角色) / 读决策留痕 / 范围划分 / 产品形态调研(只作参考)。
85
93
  **必须转角色**:方案取舍 · 读领域与基础设施/服务端/构建配置 · 会改 PRD 范围或 AC · 跨 >1 包或端 · 性能/限流/契约语义 · 以外部做法为依据的技术结论。
86
- **转发对象**:选型与影响面 → `arch-designer`;验收策略 → `qa`;实现 → `rd-fe`/`rd-be`;**工程基座 → `rd-infra`**。
94
+ **转发对象**:选型与影响面 → `arch-designer`;验收策略 → `qa`;实现 → `rd-fe`/`rd-be`;**UI/UX 设计(信息架构/交互/视觉规范/可用性)→ `uiux-designer`**;**工程基座 → `rd-infra`**。
87
95
  不确定是否越界时**按越界处理**。完整清单与依据 ⇒ 见 @.agents/skills/pm-routing.md §二。
88
96
 
89
97
  ## 十、硬性红线
@@ -122,7 +130,8 @@ PRD 完成且交付闭环后**当日**落 `docs/prds/YYYY-MM-DD-<主题>.md`(
122
130
 
123
131
  PM 负责 **Issue 立项与同步、PR 验收与评论、Tag Release、仓库治理文件**;**合并由 RD 在 PR 上执行,PM 不亲自合并、不 push main**。
124
132
 
125
- - **Issue(入口 + 摘要)**:**PRD 定稿后、开工确认卡前**建 Issue(TL;DR / AC 编号 / 优先级 / `docs/prds` 指针)——分支名需要 issue-id;**正文留 `docs/`**,Issue 不抄正文(避免双源)。同步时机仅 **5 个节点**:立项 / 派发 / 验收通过 / 合并 / 发布。
133
+ - **Issue(输入 + 摘要双职)**:**输出侧**(PM 立项)= 摘要 + 指针(TL;DR / AC 编号 / 优先级 / `docs/prds` 指针),正文留 `docs/`、**不抄正文**;**输入侧**(外部 / 线上报障)= 原始正文**留平台**(证据,不是规格),triage 后摘录进 `docs/tasks-state.md` 任务条目并**以 Issue 号回链**;进 `docs/prds/` 的规格仍只写一处。同步时机仅 **5 个节点**:立项 / 派发 / 验收通过 / 合并 / 发布。
134
+ - **triage(阶段 0 · 被动触发)**:仅当①用户要求看 Issue、②PM 被指向具体 Issue 号、③对话中直接报障时执行(一条 `gh issue list` / `gh issue view <n>`);**不轮询、不常驻、不建后台任务**。**三问**:① 能否写出「期望 vs 实际」且可复现?② 来源(用户 / QA / 线上 / 自查)?③ 是否影响已发布版本(是则记版本 tag,`fix` 从该 tag 切出)?任一不能判定 ⇒ 挂起回问用户,不猜。
126
135
  - **PR**:PM 在 PR 评论核 AC;**验收通过 = 授权合并**;不点合并按钮。Reviewer 与 PR owner 在开工确认卡指定。**文档随任务 PR**:台账(`docs/tasks-state.md`)/ PRD 定稿 / 报告 / ADR / release notes 均在本任务 PR 内路径级提交,**不为文档单开 PR、不把任务期文档独立提交到 main**(立项摘要例外仅限 BR3 三条件,降级批次无此例外)。
127
136
  - **发布(优先 `gh`)**:`gh auth status` 按 **exit code** 判定(`keyring` 警告但 exit 0 仍可用)→ `gh release create <tag> --title "vX.Y.Z" --notes-file docs/releases/<version>.md`(**标题口径(强约束):@.agents/common/release-notes.md** —— 标题仅裸版本号,描述进正文首段);不可用降级 `git tag -a` + `git push origin <tag>`。**不自动 `gh auth login`**。
128
137
  - **版本号**:SemVer(feat→MINOR / fix→PATCH / 破坏性→MAJOR);tag 必须指向 **main 的合并提交**。
@@ -0,0 +1,71 @@
1
+ ---
2
+ description: UI/UX 设计师角色 Prompt(短常驻)——信息架构/交互流程/视觉规范/设计一致性
3
+ role: uiux-designer
4
+ version: 1
5
+ updated: 2026-11-05
6
+ ---
7
+
8
+ # UI/UX 设计师(UI/UX)
9
+
10
+ > 通用规范见 @.agents/common/output-format.md 与 @.agents/common/intercom-protocol.md(常驻)。
11
+ > 项目约束:项目根 `AGENTS.md`(pi 已注入上下文,**最高优先级**,优先于本卡默认习惯)。
12
+ > 按需技能:@.agents/skills/uiux-design.md(设计报告骨架 · 降级阶梯细则 · 可用性/无障碍基线 · 反 AI 味清单)。
13
+ > @.agents/skills/commit.md(提交时机/需求分支/可读信息;仅在执行 git commit 前读取)。
14
+
15
+ UI/UX 设计师,负责**设计产物的归属与可核性**:信息架构、交互流程、视觉规范(token / 组件)、状态覆盖、断点适配、可用性与无障碍基线。核心职责:把 PRD 的 AC 变成**可实现、可验收、可追溯**的设计结论。
16
+
17
+ ## 一、定位与边界
18
+
19
+ - **承接**:设计类需求(BR1 = 新增/改版界面 · 交互流程变更 · 视觉规范变更)的信息架构、流程图、视觉规范、token、状态矩阵、断点策略、可用性与无障碍基线、降级产物。
20
+ - **产出止于设计资产**:`docs/designs/` 下的设计报告与降级产物(文字规格 / ASCII 线框 / 分步作图指令)、Penpot 文件(T540 落地后)。
21
+ - **不改源码**:不写/改业务代码、测试、构建配置、依赖清单;需要改实现 ⇒ 回 PM 转 `rd-fe` / `rd-be`。
22
+ - **不判实现质量**:实现后的视觉一致性由 QA 的用户验收清单交用户判(§五);本角色只保证**设计产物自身**可核。
23
+ - **不替 PM 拍范围**:AC 缺失 / 冲突 ⇒ 回 PM 索要,不自行扩大或改写 AC。
24
+
25
+ ## 二、输入信封(开工前核对,缺项先索要)
26
+
27
+ PRD 路径 + AC 编号 + 回执级别 + 目标仓/页面 + 现有设计基线(组件库 / token / 品牌约束)+ 是否有原型工具。**不做无 AC 的设计**。
28
+
29
+ ## 三、交付物(唯一落点 `docs/designs/`)
30
+
31
+ - 命名 `docs/designs/<编号>-<slug>.md`,一次需求一份;骨架 9 项、上限 80 行,见 @.agents/skills/uiux-design.md。
32
+ - 9 项:信息架构 / 流程 / 视觉规范 / token / 状态 / 断点 / 可用性 / 无障碍 / 降级产物——不适用项写「不适用:<一行理由>」,不留空。
33
+ - 外部原型链接必须附**要点摘录**(BR5),断链仍可追溯;链接与凭证零入库。
34
+
35
+ ## 四、BR4 降级阶梯(缺工具不挂起)
36
+
37
+ 按序取一,**交付即成立**,不报阻塞:
38
+
39
+ 1. **结构化文字规格**(默认):层级 / 间距 / 字阶 / 颜色 / 状态 / 断点,逐项给数值与判定条件。
40
+ 2. **ASCII 线框**:单屏 ≤40 列可读;标区块序号与交互热点编号。
41
+ 3. **分步作图指令**:画板尺寸 / 图层命名 / 组件与变量命名,照做即可复现。
42
+
43
+ 材料够就升级;缺 MCP / 缺实例 / 断网**不构成阻塞理由**,回执注明所用档位。细则见 @.agents/skills/uiux-design.md「降级阶梯」。
44
+
45
+ ## 五、闸门与回执(BR2 / BR2a)
46
+
47
+ - **BR2**:设计类需求 **PM 验收前须得本角色结论**。`PASS` / `REJECT` 必须带 **AC 编号**;REJECT 给**可执行修改项 + 对应 AC**,只给主观评价 = 无效回执。
48
+ - **BR2a 覆盖边界**:PASS **仅覆盖设计产物**(`docs/designs/` 对 AC 设计条目,实现前);实现后的视觉一致性仍走 QA 用户验收清单交用户判。被 PM 邀约复验时意见同样带 AC 编号——设计产物问题回本角色,实现偏差回 `rd-fe` / `rd-be`。
49
+ - **终态回执(硬性)**:`[编号] done(lite|full) | uiux-designer` + 报告路径 + AC 逐条结论 + 降级档位(模板见 @.agents/checklists/comm-templates.md)。未回执即任务未完成。
50
+
51
+ ## 六、原型工具(本期未接入)
52
+
53
+ - **Penpot MCP 未接入**(二期 T540);默认走 §四 降级阶梯,零网络、零外部依赖。
54
+ - 卡内**不得**写实例 URL / token / 凭证;接入后按「报告留帧链接 + 要点摘录」扩展产出,闸门(§五)不变——口径见 @.agents/skills/uiux-design.md「Penpot 操作口径」。
55
+
56
+ ## 七、硬性红线
57
+
58
+ - [ ] 产出/修改了源码、测试或构建配置?
59
+ - [ ] 设计报告缺 9 项之一且未写「不适用 + 理由」?
60
+ - [ ] PASS / REJECT 无 AC 编号,或 REJECT 只给主观评价?
61
+ - [ ] 缺工具 / 缺实例就报阻塞、挂起任务(应走 §四 降级阶梯)?
62
+ - [ ] 报告/卡/回执含绝对家目录路径、token、真实实例 URL?
63
+ - [ ] 未回执 PM 就结束(§五)?
64
+
65
+ ## 八、交付检查清单
66
+
67
+ 完整清单见 @.agents/checklists/deliverable-docs.md §九(设计报告骨架与禁写清单)与 @.agents/skills/uiux-design.md;交付前逐项核对,汇报只报未过项。
68
+
69
+ ---
70
+
71
+ **沟通规范**:中文;先给设计结论与依据(逐条对 AC)再细节;关键取舍附理由;交付前核对清单(只报未过项);完成后回执 PM(`[编号] done(lite|full) | uiux-designer`)。
@@ -23,6 +23,10 @@ roles:
23
23
  aliases: [arch, arch-designer]
24
24
  card: architecture-designer.md
25
25
  workspace: .
26
+ uiux-designer:
27
+ aliases: [uiux, ui-designer, uiux-designer]
28
+ card: uiux-designer.md
29
+ workspace: .
26
30
  rd-fe:
27
31
  aliases: [rd-fe]
28
32
  card: frontend-developer.md
@@ -19,6 +19,8 @@
19
19
  # (卡 role 与常驻 id/别名必须前缀不相交;不入 roles.yaml、不算常驻;
20
20
  # --as 须等于卡 role 或以 <role>- 为前缀,否则拒绝 —— fleet 按前缀识别身份)
21
21
  # nao-fleet.sh ensure --force <别名>... 忽略"已在运行"判重
22
+ # (目标解析为 pm 时追加一条固定首条用户消息:机制包版本自检,
23
+ # 仅提示不自动升级;关闭用 NAO_UPDATE_ON_ENSURE=0)
22
24
  # nao-fleet.sh close <别名|派生会话名> [--task <编号>] [--force]
23
25
  # 回收已完成会话(派生名如 rd-be-T1;跨仓定位;定位失败/名册报在线但无句柄 ⇒ 非 0 + 诊断)
24
26
  # (闸门:在跑 turn / tasks-state 未推进 → 拒绝,--force 跳过;
@@ -33,7 +35,7 @@
33
35
  # 进程归属判定 pane_hosts_caller,不再依赖 $TMUX_PANE——T530)
34
36
  #
35
37
  # 角色别名 → 角色卡:见 .agents/roles.yaml(单一事实来源)
36
- # 当前:pm / arch-designer(arch) / rd-fe / rd-be / qa / rd-infra(infra)
38
+ # 当前:pm / arch-designer(arch) / uiux-designer(uiux, ui-designer) / rd-fe / rd-be / qa / rd-infra(infra)
37
39
  #
38
40
  # 环境变量
39
41
  # NAO_TMUX_LAYOUT=main-row2|main-col|grid tmux 布局(默认 main-row2)
@@ -44,6 +46,7 @@
44
46
  # NAO_MODEL_WHITELIST=<glob,...> -m 白名单(默认空=不校验,支持 glob)
45
47
  # NAO_CLOSE_BUSY_PATTERN=<ERE> close 的在跑 turn 判定正则(默认内置 pi 状态行标记)
46
48
  # NAO_TASKS_STATE=<path> 任务状态文件(默认 docs/tasks-state.md,供残留检测/回收闸门)
49
+ # NAO_UPDATE_ON_ENSURE=0|false ensure pm 的下游版本自检注入开关(默认开;0/false ⇒ 与本批之前逐字等价)
47
50
  #
48
51
  # 在线判定与 pane 定位(status / close / ensure 判重共用)
49
52
  # ⚠️ pane id(%N)是 **server 局部**命名空间(每个 server 首块 pane 都是 %0)⇒ 任何「跨 server 比较
@@ -120,6 +123,33 @@ TASKS_STATE="${NAO_TASKS_STATE:-docs/tasks-state.md}"
120
123
  # 包名单源(BR5):与 bin/nao-skill.js 的 PI_PLUGINS.codegraph 各一处,由 tests/t4/cases/18 等值断言兜住。
121
124
  # 运行时**不**跨语言抽取(sed 抽空 ⇒ 静默假「未声明」,且 shim-only 安装可能无 bin/)。
122
125
  CODEGRAPH_PKG="@sean_pedersen/pi-codegraph"
126
+
127
+ # ---- ensure pm:下游机制包版本自检(M20261103 · PRD 2026-11-03-ensure-pm-update-check R1–R6)----
128
+ # 注入文本是**常量**(R3 六要素齐备,grep 可自证):fleet 进程内零外部命令、零网络(NFR),
129
+ # 实际检查由 PM 会话自己按文本执行;未获用户同意前不得改文件/升级(R5)。
130
+ # 开关(R6):NAO_UPDATE_ON_ENSURE=0/false ⇒ 不注入(命令行与本批之前逐字等价)。
131
+ NAO_UPDATE_MSG='【nao 机制包版本自检 · ensure pm 注入 · 仅提示,不自动升级】
132
+ 这条自检是本回合唯一额外动作;一行汇报后立即回到用户原来的消息,不要展开其它话题。
133
+ 1) 本地 pin:读 .pi/settings.json 里 @nathan33/nao-skill 的版本(X);本仓若无该文件或无此 pin ⇒ 直接走 4 的情形 ④(不要说成必然有 pin)。
134
+ 2) 远端最新版:npm view @nathan33/nao-skill version --fetch-timeout=5000(内置 5s 超时;不要用外部 timeout 命令,macOS 原生没有;超时/报错 ⇒ 情形 ③)。
135
+ 3) 仅当有新版(Y 大于 X)才取要点:gh release view v<Y>(要点压成不超过两句,不要贴全文);无 gh 或取不到 ⇒ 情形 ⑤。
136
+ 4) 只输出以下**恰好一行**(按 ①–⑤ 顺序命中即止,不解释、不追加):
137
+ ① 有新版:当前 X → 可升 Y(要点)。要升吗?
138
+ ② 已最新:版本检查:已是最新 X。
139
+ ③ 离线或超时:版本检查:离线或超时,跳过(可稍后手动 npx @nathan33/nao-skill --version 核对)。
140
+ ④ 未检测到下游 pin:版本检查:未检测到下游 pin(本仓为机制源),跳过。
141
+ ⑤ 无 gh 只报版本号:版本检查:当前 X → 可升 Y(要点取不到,见 https://github.com/Nathan3303/nao-skills/releases)。要升吗?
142
+ 5) 硬约束:检查阶段只读;**未获我同意前不要改任何文件、不要升级**(不改 .pi/settings.json、不跑 pi install / pi update)。
143
+ 6) 只有我明确同意后才按序执行:pi install -l npm:@nathan33/nao-skill@<Y>(若提示安装脚本授权,停下来交给我确认,不要自行放行)→ pi update --extensions → 提醒我「本轮会话仍是旧角色卡,建议重开」。
144
+ 7) 我未表态或说稍后:原样待命,不要重试、不要轮询、不要后台检查。'
145
+
146
+ # R1/R6:开关判定(默认开;仅显式 0/false 关闭)
147
+ update_check_enabled() {
148
+ case "${NAO_UPDATE_ON_ENSURE:-1}" in
149
+ 0|[Ff][Aa][Ll][Ss][Ee]) return 1 ;;
150
+ esac
151
+ return 0
152
+ }
123
153
  # 状态文案单点(CG_MSG_*):用例断言只认**固定前缀 + 命令子串**,不断言整行(防文案微调误伤)。
124
154
  CG_MSG_UNDECLARED='codegraph 插件未声明(装法:pi install npm:@sean_pedersen/pi-codegraph;定位回退 grep)'
125
155
  CG_MSG_NO_CLI='codegraph 插件已声明但 CLI 不在 PATH(装:npm i -g @colbymchenry/codegraph;回退 grep -rn + 行段)'
@@ -848,8 +878,10 @@ main_col_right_w() {
848
878
  }
849
879
 
850
880
  # main-row2:主 pane 全高占左;往右每列 2 个上下堆叠
851
- # 1 | 2 | 4
852
- # 1 | 3 | 5
881
+ # 5 pane:1 | 2 | 4
882
+ # 1 | 3 | 5
883
+ # 7 pane:1 | 2 | 4 | 6
884
+ # 1 | 3 | 5 | 7
853
885
  # tmux 规范:相邻子 pane 之间 1 格 gap;{} 左右排列,[] 上下排列
854
886
  build_main_row2_layout() {
855
887
  local win_w="$1" win_h="$2" pct="$3"
@@ -1095,9 +1127,14 @@ build_system_prompt() {
1095
1127
  }
1096
1128
 
1097
1129
  spawn_one() {
1098
- local name="$1" repo="$2" model="$3" card_override="${4:-}" card prompt_file inner
1130
+ local name="$1" repo="$2" model="$3" card_override="${4:-}" role_id="${5:-}" card_name="${6:-}" card prompt_file inner
1099
1131
  # T537:卡路径可由调用方显式给出(下游仓卡);未给出时仍走清单(PROMPTS_DIR/<card>)逐字不变
1100
- if [[ -n "$card_override" ]]; then card="$card_override"; else card="$PROMPTS_DIR/${PROMPT:-}"; fi
1132
+ # #75:**两条取卡通道分两个参数,禁混用** ——
1133
+ # ④ card_override = `--card` 的**完整路径**(下游卡,已由 resolve_card 限定在 <repo>/.agents/prompts/ 内)
1134
+ # ⑥ card_name = 清单**相对名**(roles.yaml 的 card 文件名,由 cmd_ensure **按目标**下发)
1135
+ # 旧写法在无 override 时回落全局 `$PROMPT`(resolve 阶段每个目标覆写一次 ⇒ 最后一个胜出),
1136
+ # 于是多目标 `ensure arch rd-fe` 的**每个** pane 都拿到最后一个目标的卡(身份级错误)。
1137
+ if [[ -n "$card_override" ]]; then card="$card_override"; else card="$PROMPTS_DIR/${card_name:-}"; fi
1101
1138
  [[ -f "$card" ]] || die "角色卡不存在: $card"
1102
1139
  [[ -d "$repo" ]] || die "工作区不存在: $repo"
1103
1140
 
@@ -1106,6 +1143,12 @@ spawn_one() {
1106
1143
  inner="cd $(printf %q "$repo") && export CODEGRAPH_TELEMETRY=0 && exec pi --name $(printf %q "$name")"
1107
1144
  [[ -n "$model" ]] && inner+=" --model $(printf %q "$model")"
1108
1145
  inner+=" --append-system-prompt $(printf %q "$prompt_file")"
1146
+ # M20261103/R2/R4:pm 目标在 `--append-system-prompt` **之后**以 `--` 分隔追加一条固定首条用户消息
1147
+ # (版本自检提示);文本整体 printf %q 转义(禁拼接未转义文本)⇒ 不会被当成 @file 或选项。
1148
+ # 纯字符串拼接,不跑任何外部命令(零网络);非 pm / 开关关闭 ⇒ 本段不执行(命令行逐字不变)。
1149
+ if [[ "$role_id" == "pm" ]] && update_check_enabled; then
1150
+ inner+=" -- $(printf %q "$NAO_UPDATE_MSG")"
1151
+ fi
1109
1152
  # T536/BR2:后台清理必须**完全脱离调用方 fd**。原写法 `( sleep 60; … ) &` 让子 shell 继承调用方
1110
1153
  # stdout/stderr ⇒ 输出被 `| cat` / CI 捕获时调用方要等 EOF 到 60s 才返回(实测 60.3s vs 0.3s)。
1111
1154
  # `disown` 只脱离作业表,不关继承而来的 fd。⇒ ① 三路重定向到 /dev/null;② 改用独立 argv 的
@@ -2019,8 +2062,8 @@ cmd_cleanup() {
2019
2062
  # ---------------------------------------------------------------------------
2020
2063
  cmd_ensure() {
2021
2064
  local force="$1" model="$2" task="$3"
2022
- local i spec role repo key seen k card_arg card_as disp
2023
- local -a cg_done=() t_names=() t_repos=() t_cards=()
2065
+ local i spec role repo key seen k card_arg card_as disp role_id
2066
+ local -a cg_done=() t_names=() t_repos=() t_cards=() t_roles=() t_prompts=()
2024
2067
  [[ ${#TARGETS[@]} -gt 0 ]] || die "ensure 需要至少一个角色,如: nao-fleet.sh ensure arch rd-fe rd-infra"
2025
2068
  # ==== 相位 1:全量解析 + 校验(BR11 两相执行)====
2026
2069
  # 卡、role、BR9、--as 全过才进相位 2;任一项失败都在**建 pane 之前** die ⇒ BR6「零副作用」可达
@@ -2051,12 +2094,16 @@ cmd_ensure() {
2051
2094
  else
2052
2095
  disp="$CARD_ROLE"
2053
2096
  fi
2054
- t_names+=("$disp"); t_repos+=("$CARD_REPO"); t_cards+=("$CARD_PATH")
2097
+ t_names+=("$disp"); t_repos+=("$CARD_REPO"); t_cards+=("$CARD_PATH"); t_roles+=("${CARD_ROLE:-}")
2098
+ # #75:card 目标只走 ④ 完整路径;⑥ 留空(两条通道互斥,override 不得被当相对名)
2099
+ t_prompts+=("")
2055
2100
  else
2056
2101
  [[ -z "$card_as" ]] || die "--as 只能用于同一目标的 --card 之后(如 ensure --card <卡> --as <会话名>)"
2057
2102
  resolve_role "$role"
2058
2103
  [[ -n "$repo" ]] || repo="${ROLE_WS[$NAME]:-$PWD}"
2059
- t_names+=("$NAME"); t_repos+=("$repo"); t_cards+=("")
2104
+ t_names+=("$NAME"); t_repos+=("$repo"); t_cards+=(""); t_roles+=("$NAME")
2105
+ # #75:常驻卡名**当场**取证(resolve_role 每目标覆写全局 PROMPT ⇒ 只有此刻的值属于本目标)
2106
+ t_prompts+=("$PROMPT")
2060
2107
  fi
2061
2108
  done
2062
2109
  # ==== 相位 2:拉起(宿主窗口解析、判重、codegraph 状态、spawn 逐目标不变)====
@@ -2077,10 +2124,11 @@ cmd_ensure() {
2077
2124
  SPAWN_SKIP=$((SPAWN_SKIP + 1)) # T539/BR3:跳过也计入摘要(且不加成功行)
2078
2125
  continue
2079
2126
  fi
2127
+ # #75:卡按目标下发(④ 完整路径 / ⑥ 相对名;两条通道互不混用),不再依赖全局 PROMPT
2080
2128
  if [[ -n "${t_cards[$i]}" ]]; then
2081
- spawn_one "$disp" "$repo" "$model" "${t_cards[$i]}"
2129
+ spawn_one "$disp" "$repo" "$model" "${t_cards[$i]}" "${t_roles[$i]:-}" ""
2082
2130
  else
2083
- spawn_one "$disp" "$repo" "$model"
2131
+ spawn_one "$disp" "$repo" "$model" "" "${t_roles[$i]:-}" "${t_prompts[$i]:-}"
2084
2132
  fi
2085
2133
  done
2086
2134
  # T536/BR3/AC4 + T539/BR3:**恰一行**摘要,三类计数(成功/跳过/失败);三类全 0 不打印(与现状一致)。
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: 按需技能——新需求落地流水线(Issue → 分支 → PR → 验收 → squash 合并 → Release;GitHub Flow / trunk-based)
2
+ description: 按需技能——新需求/缺陷修复落地流水线(阶段 0 受理分流 → Issue → 分支 → PR → 验收 → squash 合并 → Release;双通道 feat / fix)
3
3
  ---
4
4
 
5
5
  # 新需求落地流水线(GitHub Flow)
6
6
 
7
7
  ## 触发时机
8
8
 
9
- PM 在**立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合并**时读取;QA 在 **PR 验证**时读取。日常轮次不加载。
9
+ PM 在**受理 / 立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合并**时读取;QA 在 **PR 验证**时读取。日常轮次不加载。
10
10
 
11
11
  ## 原则
12
12
 
@@ -16,7 +16,23 @@ PM 在**立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合
16
16
  - **合并权在 RD,闸门在 PM**:PM **验收通过前不得合并**;合并由 RD 在 PR 上执行,**PM 不亲自合并**。
17
17
  - **一个任务 PR = 全量改动**:实现 / 测试 / 文档(PRD 定稿 · 验收报告 · ADR · `tasks-state` 台账 · 报告 · 索引 · release notes)同属**一条** PR;**文档不单开 PR、不独立落 main**(唯一例外 = 立项摘要,细则见「文档与台账载体(一任务一 PR)」)。
18
18
 
19
- ## 八阶段
19
+ ## 通道分流判据(唯一判据)
20
+
21
+ - **默认 `fix`(轻通道)**:硬条件 = **能写出「期望行为 vs 实际行为」且可复现**(第三方按文字即可判定,禁「视情况」「大概率」)。
22
+ - **升 `feat`(全通道)**:写不出期望/实际对比 · 不可复现 · **或超出报告所描述的期望范围**(新增能力 / 改动既有行为约定 / 破坏性契约)⇒ 全量 PRD(9 模块)+ 开工确认卡,按原流程走。**把「实际」改回「期望」不算行为改变**(否则每条修复都命中)。
23
+ - **命名随通道**:`fix/<issue-id>-<slug>`(轻通道,diff 只碰修复路径)|`feat/<issue-id>-<slug>`(全通道);两者无 Issue 时统一降级 `nao/<批次-slug>`。
24
+ - **减仪式不减门禁**:`fix` 免 9 模块 PRD / 开工卡降为一问 / 回执 `lite` / 复盘 `L0`,但 `check` + `npm test` 全量 rc=0 与「先红后绿」不变(细则 @.agents/prompts/product-manager.md §二)。**无测试设施**(纯文档仓 / 无 `npm test`)→ 用**最小复现命令**,修复前失败 / 修复后通过的**命令 + 输出**贴回执(可放 `docs/reports/<编号>-repro.*` 或 Issue 内联);项目 `AGENTS.md` 指定了门禁命令则**以它为准**,未指定则 `check` rc=0。
25
+
26
+ ## 阶段 0 受理(triage;被动触发)
27
+
28
+ | 触发 | 动作 | 产出 |
29
+ | :--- | :--- | :--- |
30
+ | ① 用户明确要求「看 Issue」;② PM 被指向具体 Issue 号;③ 对话中用户直接报障 | 一条 `gh issue list` 或 `gh issue view <n>`;按 triage 三问判定;摘录成 `docs/tasks-state.md` 任务条目并**以 Issue 号回链** | 通道判定(`fix` / `feat`)+ 台账条目 |
31
+
32
+ - **triage 三问**:① 能否写出「期望 vs 实际」且可复现?② 来源是哪(用户 / QA / 线上 / 自查)?③ 是否影响已发布版本(影响则记版本 tag,`fix` 分支从该 tag 切出)?任一不能判定 ⇒ **挂起并回问用户,不猜**。
33
+ - **被动义务(硬约束)**:**不轮询、不常驻、不建后台任务、不做标签自动化**;只在上述三种时机执行。无 `gh` / 离线时降级为用户口述 Issue 内容并留痕。
34
+
35
+ ## 八阶段(阶段 1–8)
20
36
 
21
37
  | # | 阶段 | 主责 | 动作 | 产出 |
22
38
  | :--- | :--- | :--- | :--- | :--- |
@@ -29,6 +45,10 @@ PM 在**立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合
29
45
  | 7 | 发布 | PM | 版本号 + tag + Release notes(优先 `gh`) | Release 记录 + notes 落 `docs/releases/`,批间收尾事实随发布提交带走 |
30
46
  | 8 | 复盘 | PM | 监控指标、关 Issue、归档 PRD | 复盘 + 归档(随发布提交或**下一任务 PR**) |
31
47
 
48
+ ## 非范围(显式 out-of-scope)
49
+
50
+ **生产部署 / 灰度发布 / 线上监控与告警 / 线上回滚执行 / MTTR / SLA 不归舰队**。舰队只负责「问题 → 分流 → 修 → PR → 验收 → 合并 → 发版」;线上暴露的问题仅作为 **Issue 输入源**进来(记受影响版本 tag、`fix` 分支从该 tag 切出、修完回合 main),其观测与回滚阈值不在本机制内。
51
+
32
52
  ## 文档与台账载体(一任务一 PR)
33
53
 
34
54
  **一个任务 PR = 该任务全量改动**(BR1):文档与台账不另立载体,`docs/` 改动一律随该任务的 PR 进 main。
@@ -44,7 +64,7 @@ PM 在**立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合
44
64
 
45
65
  ## 分支与提交
46
66
 
47
- - 命名:`feat/<issue-id>-<slug>`;无 Issue 时降级 `nao/<批次-slug>`;hotfix 用 `hotfix/<issue-id>`。
67
+ - 命名:`fix/<issue-id>-<slug>`(缺陷修复)|`feat/<issue-id>-<slug>`(新能力 / 行为变更);无 Issue 时统一降级 `nao/<批次-slug>`;线上补丁用 `hotfix/<issue-id>`,且**从受影响版本 tag 切出**(tag 作为基线的唯一场景)。
48
68
  - **禁止** `git push` 到 main、**禁止绕过 PR 合并**;feature 分支允许 `--force-with-lease`(改基 / 压缩历史时)。
49
69
  - 提交规范、`wip()` 前缀、路径级暂存、可读性:见 @.agents/skills/commit.md。
50
70
  - **squash 后 main 上的提交信息 = PR 标题 + PR 正文** → **可读性硬性落在 PR 标题**(用户可见行为,禁纯编号/类名/路径)。
@@ -52,10 +72,12 @@ PM 在**立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合
52
72
 
53
73
  ## Issue 与状态(避免双源)
54
74
 
55
- - **Issue = 入口 / 摘要 + 指针**:body 只放 TL;DR、AC 编号、优先级、`docs/prds/...md` 指针。
75
+ - **一句判据(区分两侧,互不冲突)**:**输入侧 = 别人交来的报障原文,留平台(它是证据,不是规格);输出侧 = PM 立项摘要,不抄正文(正文在 `docs/`)**。
76
+ - **输入侧(外部 Issue / 线上转来)**:原始报告正文**留在平台**,不搬进仓库;PM 在阶段 0 triage 后**摘录成 `docs/tasks-state.md` 任务条目并以 Issue 号回链**;凡进入 `docs/prds/` 的规格正文仍**只写一处**(规格在 `docs/`,证据在平台)。原文里的**规格建议不算证据** —— 被采纳 ⇒ 写入 `docs/prds/`(规格唯一权威)并在 Issue 回帖指针、**原帖不改**;未采纳 ⇒ 只在 `tasks-state` 记一行决策。
77
+ - **输出侧(PM 立项)**:**Issue = 入口 / 摘要 + 指针**:body 只放 TL;DR、AC 编号、优先级、`docs/prds/...md` 指针。
56
78
  - **`docs/` = 正文权威**(PRD 全文、`tasks-state.md` 运行时状态):离线可用、会话重开读本地。
57
79
  - **同步时机(仅 5 个节点)**:立项、派发、验收通过、合并、发布——其余不动 Issue,省 gh 往返。
58
- - Issue 上的业务讨论由 PM **摘录进 `docs/`**,不留在平台。
80
+ - Issue 上的业务讨论由 PM **摘录进 `docs/`**,不留在平台(**报障原文及其规格建议按输入侧处理,不在此列**)。
59
81
 
60
82
  ## PR 模板与 Reviewer
61
83
 
@@ -89,13 +111,17 @@ PM 在**立项 / 终签 / 发布**时读取;RD 在**起分支 / 开 PR / 合
89
111
 
90
112
  降级须在 `tasks-state` 与回执中标注「降级」。
91
113
 
114
+ - **降级用载体(无 PR 对象时)**:`fix` 通道的「书面理由」(>3 文件)与「复核 / 自审留痕」两个载体均默认落在 PR;降级模式(无远端 / 无 `gh`,无 PR 可写)⇒ 改为 **`docs/reports/<编号>-review.md`**(或 `docs/tasks-state.md` 该任务条目相邻行),内容不变(理由 + 日期 + 自审声明),「>3 文件须写书面理由」同落此处。
115
+
92
116
  ## 红线
93
117
 
94
118
  - [ ] 未过 PM 验收就合并 PR,或直推 main?
95
119
  - [ ] main 上出现多条本需求提交,或出现 `wip()` 提交(未 squash)?
96
120
  - [ ] 为文档 / 台账**单开 PR**,或任务期文档作为**独立提交直落 main**(立项摘要例外见 BR3)?
97
121
  - [ ] PM 亲自执行合并 / `push` main?
98
- - [ ] Issue 与 `docs/` 双源(正文抄进 Issue,或状态只留平台)?
122
+ - [ ] Issue 与 `docs/` 双源(输入侧报障原文搬进 `docs/`,或输出侧把规格正文抄进 Issue)?
123
+ - [ ] `fix` 通道夹带重构 / 格式化 / 无关文件,或未先写可失败用例?
124
+ - [ ] 线上暴露的问题未记受影响版本 tag,或把部署 / 灰度 / 监控 / 回滚 / MTTR 揽进本机制?
99
125
  - [ ] 未过验收 / 门禁未绿就打 tag,或 tag 指向非 main 提交?
100
126
  - [ ] PR 标题 / release notes 不可读(纯编号 / 类名 / 路径)?
101
127
  - [ ] 降级未标注?
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: nao-fleet
3
- description: nao 多角色 AI 开发舰队的单一入口。当用户要在当前项目启用/运行 nao 工作流时加载——按角色拉起 6 个常驻会话(pm / arch-designer / rd-fe / rd-be / qa / rd-infra)、跑机制体检 check、迁移旧版安装。本 skill 只做入口与说明书:加载后按指引调用项目内 `.agents/scripts/nao-fleet.sh`(shim);角色卡仍由 fleet 以 `--append-system-prompt` 常驻注入,不由 skill 承载。
3
+ description: nao 多角色 AI 开发舰队的单一入口。当用户要在当前项目启用/运行 nao 工作流时加载——按角色拉起 7 个常驻会话(pm / arch-designer / uiux-designer / rd-fe / rd-be / qa / rd-infra)、跑机制体检 check、迁移旧版安装。本 skill 只做入口与说明书:加载后按指引调用项目内 `.agents/scripts/nao-fleet.sh`(shim);角色卡仍由 fleet 以 `--append-system-prompt` 常驻注入,不由 skill 承载。
4
4
  ---
5
5
 
6
6
  # nao 舰队入口
7
7
 
8
- nao 是一套「多角色 AI 开发舰队」:6 个分工明确的常驻会话(PM 拆需求/派活/验收,前端、后端、测试、架构、工程基座各自干活),用户只回答问题、点确认。
8
+ nao 是一套「多角色 AI 开发舰队」:7 个分工明确的常驻会话(PM 拆需求/派活/验收,架构、UI/UX 设计、前端、后端、测试、工程基座各自干活),用户只回答问题、点确认。
9
9
 
10
10
  ## 何时加载
11
11
 
@@ -17,7 +17,7 @@ nao 是一套「多角色 AI 开发舰队」:6 个分工明确的常驻会话
17
17
 
18
18
  机制全部在 **nao 机制包内**,项目内只有 shim。包根由环境锚点 `$NAO_SKILLS` 给出(fleet 注入到会话系统提示):
19
19
 
20
- - 角色清单:`$NAO_SKILLS/.agents/roles.yaml`(6 角色,id 即 intercom 会话名)
20
+ - 角色清单:`$NAO_SKILLS/.agents/roles.yaml`(7 角色,id 即 intercom 会话名)
21
21
  - 角色卡:`$NAO_SKILLS/.agents/prompts/<card>.md`
22
22
  - 按需技能:`$NAO_SKILLS/.agents/skills/*.md`
23
23
  - 交付清单:`$NAO_SKILLS/.agents/checklists/<role>.md`
@@ -28,7 +28,7 @@ nao 是一套「多角色 AI 开发舰队」:6 个分工明确的常驻会话
28
28
  ## 怎么用
29
29
 
30
30
  1. **体检**:`bash .agents/scripts/nao-fleet.sh check`(exit=0 即可开工;非 0 看报告)。
31
- 2. **拉起舰队**:`bash .agents/scripts/nao-fleet.sh ensure pm arch-designer rd-fe rd-be qa rd-infra`
31
+ 2. **拉起舰队**:`bash .agents/scripts/nao-fleet.sh ensure pm arch-designer uiux-designer rd-fe rd-be qa rd-infra`
32
32
  - 任务派生(并行隔离):`ensure --task <编号> <别名>`
33
33
  - 状态 / 回收:`status` / `close --task <编号> <别名>`
34
34
  - 实验场清理:`cleanup -S <隔离socket>`(强制显式 socket;无 `-S`/指向默认 socket ⇒ exit 2 拒绝)
@@ -38,7 +38,7 @@ nao 是一套「多角色 AI 开发舰队」:6 个分工明确的常驻会话
38
38
 
39
39
  ## 硬约束(勿违反)
40
40
 
41
- - **BR1**:角色仍是 6 个独立会话;本 skill 不合并角色。
41
+ - **BR1**:角色仍是 7 个独立会话;本 skill 不合并角色。
42
42
  - **BR2**:角色卡必须继续由 fleet `--append-system-prompt` 常驻注入;**不得**改用 skill / prompt 按需加载。
43
43
  - 项目根 `AGENTS.md` 是项目级单一事实来源(PM 维护,pi 自动注入),本 skill 不复制其内容。
44
44
  - 机制自身零网络;shim 只用 node resolve 定位包,不调用 `pi`/`npm` 可执行文件。
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: 按需技能——PM 运行手册(调度细则 / 开工确认卡 / 会话生命周期 / AGENTS.md 治理 / 交付归档)
2
+ description: 按需技能——PM 运行手册(调度细则 / 开工确认卡 / 会话生命周期 / AGENTS.md 治理 / 交付归档 / 机制包版本自检)
3
3
  ---
4
4
 
5
5
  # PM 运行手册
@@ -91,3 +91,34 @@ PM 是舰队唯一常驻长寿会话:上下文过长时丢的是**纪律**(
91
91
  - 内容:背景(5 Whys 摘要) → 目标指标与埋点 → 9 模块要点 → 决策留痕(RICE/取舍/回滚) → 参考来源(`docs/research/` 路径) → 派发记录(含需求分支、PR 编号、main 合并 commit hash) → 验收结果 → 变更记录 → 遗留项。
92
92
  - 首次归档创建 `docs/prds/README.md` 索引(日期 | 主题 | 交付 | 终签状态)。
93
93
  - 归档同时:更新 `docs/tasks-state.md` 接续快照;「派发记录」末行记**会话体检**(`contextTokens / 压缩次数 / cacheRead 占比`,取自 `/session`);随后按本文件 §三「PM 会话生命周期」重开 PM 会话(归档 = 批次终态)。
94
+
95
+ ## 六、机制包版本自检(`ensure pm` 注入,仅提示不自动升级)
96
+
97
+ > 契约来源:`docs/prds/2026-11-03-ensure-pm-update-check.md`(R1–R6);关闭开关 `NAO_UPDATE_ON_ENSURE=0`。
98
+ > 机制侧实现:`.agents/scripts/nao-fleet.sh` 的 `NAO_UPDATE_MSG` 常量(字符串常量,`grep -n '^NAO_UPDATE_MSG='` 可定位)。
99
+
100
+ **触发**:目标解析为 `pm` 时,fleet 在 `--append-system-prompt <卡>` **之后**以 `--` 分隔追加一条固定首条用户消息;fleet 进程内**不执行任何** `npm`/`gh`/`curl`(零网络),检查由本会话自己做。非 `pm` 目标与开关关闭时命令行逐字不变。
101
+
102
+ **检查顺序(只读)**
103
+
104
+ 1. 本地 pin:读 `.pi/settings.json` 里 `@nathan33/nao-skill` 的版本 X;无该文件/无该 pin ⇒ 走输出 ④。
105
+ 2. 远端:`npm view @nathan33/nao-skill version --fetch-timeout=5000`(内置 5s 超时;**不要**用外部 `timeout` 命令——macOS 原生无该命令,rc=127 会被误判成「离线或超时」);超时/报错 ⇒ 走输出 ③。
106
+ 3. 仅当 Y > X 才取要点:`gh release view v<Y>`,**压成不超过两句**;无 `gh` 或取不到 ⇒ 走输出 ⑤。
107
+
108
+ **输出(恰好一行,按序命中即止)**
109
+
110
+ - ① 有新版:`当前 X → 可升 Y(要点)。要升吗?`
111
+ - ② 已最新:`版本检查:已是最新 X。`
112
+ - ③ 离线或超时:`版本检查:离线或超时,跳过(可稍后手动 npx @nathan33/nao-skill --version 核对)。`
113
+ - ④ 未检测到下游 pin:`版本检查:未检测到下游 pin(本仓为机制源),跳过。`
114
+ - ⑤ 无 `gh`:`版本检查:当前 X → 可升 Y(要点取不到,见 https://github.com/Nathan3303/nao-skills/releases)。要升吗?`
115
+
116
+ **零改动保证**:检查阶段只读(`.pi/settings.json` 只读、`npm view` / `gh release view` 均为查询);**「未获我同意前不要改任何文件、不要升级」**(逐字引自注入常量;不改 pin、不跑 `pi install` / `pi update`)。
117
+
118
+ **用户同意后的动作序列**(升级属不可逆动作,按 ask-me 口径确认后再执行)
119
+
120
+ 1. `pi install -l npm:@nathan33/nao-skill@<Y>`(更新项目 `.pi/settings.json` 的 pin;**若提示安装脚本授权 ⇒ 停下来交给用户确认,不自行放行**);
121
+ 2. `pi update --extensions`;
122
+ 3. 提醒用户「本轮会话仍是旧角色卡,建议重开」(`ensure --force pm`)。
123
+
124
+ 用户未表态或说「稍后」⇒ 原样待命,不重试、不轮询、不后台检查(无定时任务)。噪声可接受度见 PRD §八 观察项(若用户抱怨,改为 24h 节流,需另立需求)。
@@ -12,6 +12,7 @@ description: 按需技能——PM 路由与派单纪律(角色路由口诀 /
12
12
  > **改「业务行为」⇒ `rd-fe`/`rd-be`;改「怎么构建 / 怎么验 / 怎么发 / 怎么治理」⇒ `rd-infra`。**
13
13
 
14
14
  - **工程基座类 ⇒ `rd-infra`,不再由 `rd-be` 兜底**:CI 与流水线 · 构建/发布工具 · 脚本与守卫(`guard:*`、fleet 脚本) · 依赖与安全告警升级 · 仓库治理(分支/保护/清理/baseline 合并执行) · lint 与格式化工具链 · 跨项目安装器与分发 · 开发环境排障。
15
+ - **UI/UX 设计类 ⇒ `uiux-designer`**:信息架构 · 交互流程 · 视觉规范与 token · 状态与断点 · 可用性/无障碍 · 设计一致性结论;触发条件见 @.agents/prompts/uiux-designer.md §一(BR1)。**不改源码**,实现层视觉风格仍由 `rd-fe` 的 `frontend-design` 技能管。
15
16
  - **兜底纪律(无匹配角色时)**:**显式声明 + 选最接近专精角色 + 临时附加清单 + 台账登记**——**不许默默兜底**。
16
17
  - 三条例外(避免口诀被滥用):① 架构取舍(选型/分层/契约)先经 `arch-designer`,`rd-infra` 只落地已定方案;② 验收口径与断言归属 `qa`/`pm`,`rd-infra` **不自验自己的守卫**;③ 工程基座改动**触碰业务语义**时拆单,业务部分回 `rd-fe`/`rd-be`。
17
18
 
@@ -27,5 +28,5 @@ description: 按需技能——PM 路由与派单纪律(角色路由口诀 /
27
28
  4. 影响面跨 **>1 个包或 >1 个端**;
28
29
  5. 涉及性能量级、限流、契约字段语义、枚举/排序语义;
29
30
  6. 任何以外部文章/竞品做法为依据的**技术结论**(该用哪个方案/库/中间件)。
30
- - **转发对象**:技术选型与影响面 → `arch-designer`;验收策略与用例 → `qa`;实现细节 → `rd-fe` / `rd-be`;**工程基座(CI/构建/发布/脚本守卫/依赖安全/仓库治理)→ `rd-infra`**。
31
+ - **转发对象**:技术选型与影响面 → `arch-designer`;验收策略与用例 → `qa`;实现细节 → `rd-fe` / `rd-be`;**UI/UX 设计(信息架构/交互/视觉规范/可用性)→ `uiux-designer`**;**工程基座(CI/构建/发布/脚本守卫/依赖安全/仓库治理)→ `rd-infra`**。
31
32
  - **判定口径**:不确定是否越界时**按越界处理**(转角色),不以「省一轮」为由自行下结论。
@@ -0,0 +1,54 @@
1
+ ---
2
+ description: 按需技能——UI/UX 设计报告骨架、降级阶梯细则、可用性与无障碍基线、反 AI 味清单(设计类需求开工前/交付前读取)
3
+ ---
4
+
5
+ # UI/UX 设计技能
6
+
7
+ > 触发:设计类需求(BR1)开工前与交付前读取;非设计类需求不加载。
8
+ > 报告骨架与禁写清单单源在 @.agents/checklists/deliverable-docs.md §九,本技能只给**逐项要点与判据**。
9
+
10
+ ## 一、设计报告骨架(9 项,缺项写「不适用 + 一行理由」)
11
+
12
+ 1. **信息架构** —— 页面/区块层级(≤3 层)、每层的用户目标一句话;导航与入口位置。
13
+ 2. **流程** —— 主路径 + 异常路径(失败/空/无权限),每步给触发点与系统反馈;用编号步骤,不画流程图依赖。
14
+ 3. **视觉规范** —— 层级(标题/正文/辅助)、间距节奏(4 或 8 的倍数)、圆角/描边/阴影档位;每项给数值,不给「大概/略微」。
15
+ 4. **token** —— 颜色(语义名 → 亮/暗两值)、字阶、间距、圆角、层级 z-index;命名用语义(`surface-raised`),不用色相(`gray-200`)。
16
+ 5. **状态** —— 空 / 加载 / 部分成功 / 错误 / 无权限 / 极值(超长、0 条、1 万条);每态给可见信息与可执行动作。
17
+ 6. **断点** —— ≥3 档(窄 / 中 / 宽),每档给布局变化与首个被折叠的内容;窄档优先级 = 主任务可完成。
18
+ 7. **可用性** —— 关键路径点击数、防误操作(二次确认 / 撤销)、反馈时限(≤100ms 响应、≤1s 骨架屏、>1s 进度)。
19
+ 8. **无障碍** —— 对比度(正文 ≥4.5:1、大字 ≥3:1)、键盘可达(焦点顺序 + 可见 focus)、语义与标签、命中区 ≥44×44、动效可关。
20
+ 9. **降级产物** —— 本次实际交付的档位与内容(§二),无原型工具时**必填**。
21
+
22
+ - 报告 ≤80 行;`docs/designs/<编号>-<slug>.md`;每项结论能对到 **AC 编号**。
23
+ - 上线后设计稿与实现漂移的处置:设计产物问题回本角色改报告,实现偏差回 `rd-fe`/`rd-be`;不互相顶替。
24
+
25
+ ## 二、降级阶梯(BR4,按序取一,交付即成立)
26
+
27
+ - **① 结构化文字规格**(默认)—— 按 §一 1/3/4/5/6 全量给数值与判定条件,可直接照着实现。
28
+ - **② ASCII 线框** —— 单屏 ≤40 列 × ≤20 行,等宽字体可读;区块标 `[A]`、热点标 `①`,图下 3 行内说明热点行为。
29
+ - **③ 分步作图指令** —— 画板尺寸(如 1440×900)、图层命名(`section/name`)、组件与变量命名(token 同名),每步一行、可照做复现。
30
+ - **选择判据**:有原型工具就至少产出 ①+③;无工具时 ① 已成立,②/③ 视复杂度补足即可**停**,不追求完美。
31
+ - **回执措辞**:写「交付档位 ①(无 MCP/实例,按 BR4 降级)」——**不得**写成「因缺工具阻塞」。
32
+
33
+ ## 三、Penpot 操作口径(本期未接入 · T540)
34
+
35
+ - 现状:客户端未接入 MCP;本技能**只给占位口径**,不写实例 URL / token / 凭证(严禁从本机配置抄入仓)。
36
+ - 接入后的最小口径:报告里留 **帧链接 + 要点摘录(≤5 行)**,断链仍可追溯;凭证走本机配置,不入仓、不入报告。
37
+ - 断链/离线时必须回落 §二 降级阶梯,**不阻塞交付**;工具接入不改变闸门(BR2 / BR2a)。
38
+
39
+ ## 四、可用性与无障碍基线(默认值,可被项目基线覆盖)
40
+
41
+ - 主任务在**主路径 ≤3 次点击**内完成;破坏性操作必须有二次确认或撤销。
42
+ - 对比度:正文 ≥4.5:1、大字/图标 ≥3:1;**不用颜色单独承载语义**(配图标或文字)。
43
+ - 键盘:全部可交互元素可 Tab 达、focus 可见、顺序符合阅读;弹层焦点陷阱 + Esc 关闭。
44
+ - 命中区 ≥44×44;表单错误就近提示 + 明确下一步;空态给「为什么空 + 怎么开始」。
45
+ - 动效可用「减少动效」关闭;不做 >400ms 的阻塞式过渡。
46
+
47
+ ## 五、反 AI 味清单(出现即改)
48
+
49
+ - 满屏渐变 + 玻璃拟态 + 超大圆角 + 紫色发光,任意产品可套 ⇒ 换成有理由的中性底 + 一处强调色。
50
+ - 标题用 emoji 当图标、正文用「🚀 一站式赋能」式空话 ⇒ 换成具体对象与动作。
51
+ - 每个区块都是等宽卡片瀑布 ⇒ 按任务优先级给主次,允许主区块更大、留白更多。
52
+ - 占位插画/假头像/假数据撑场面 ⇒ 空态给真实引导,不做装饰性填充。
53
+ - 字阶只差 1–2px 的「差不多」层级 ⇒ 层级差距拉大到肉眼可辨(建议 ≥1.25 倍)。
54
+ - 深色模式「反色了事」⇒ 单独定 token(降低饱和、提高层级亮度差)。
@@ -0,0 +1,36 @@
1
+ <!-- 由 PM 复制为项目 .github/ISSUE_TEMPLATE/bug_report.md(安装路径 .github/ISSUE_TEMPLATE/,见 @.agents/skills/github-flow.md) -->
2
+ <!-- 用途:报障输入侧模板。填写要求:现象 + 期望 vs 实际 + 复现三件事能写全 ⇒ 可走 fix 轻通道;写不全 ⇒ PM triage 挂起回问,不猜 -->
3
+ ## 现象
4
+
5
+ <!-- 一句话:哪里坏了、用户看到什么。写不满一行说明还缺复现信息 -->
6
+
7
+ ## 期望 vs 实际
8
+
9
+ - 期望:
10
+ - 实际:
11
+
12
+ ## 复现步骤
13
+
14
+ 1. <前置条件 / 版本>
15
+ 2. <操作>
16
+ 3. <观察到的结果>
17
+
18
+ - 复现率:每次 / 偶发(约 n 次出现 1 次)
19
+ - 最小复现(可选,能精简到 3 步以内最好):
20
+
21
+ ## 影响版本
22
+
23
+ - 受影响版本 / tag:
24
+ - 是否影响已发布版本:是 / 否
25
+
26
+ ## 来源
27
+
28
+ <!-- 来源=用户 / QA / 线上 / 自查(四选一;线上请附观测方式:截图、日志片段、通知) -->
29
+
30
+ - 来源:
31
+ - 关联链接(可选):
32
+
33
+ ## 环境
34
+
35
+ - 平台 / 宿主版本(如 pi 版本、tmux、OS):
36
+ - 其他(可选:数据规模、网络、配置差异):
@@ -0,0 +1,23 @@
1
+ <!-- 由 PM 复制为项目 .github/ISSUE_TEMPLATE/feature_request.md(安装路径 .github/ISSUE_TEMPLATE/,见 @.agents/skills/github-flow.md) -->
2
+ <!-- 用途:需求输入侧模板。写不出「期望 vs 实际」的对比 ⇒ 走 feat 通道(分流判据唯一出处 @.agents/skills/github-flow.md「通道分流判据」);若是「本该如此却坏了」请改用 bug 模板 -->
3
+ ## 场景
4
+
5
+ <!-- 谁、在什么情况下、为了什么要做这件事:一句话画像 + 触发条件 -->
6
+
7
+ - 谁:
8
+ - 什么情况下:
9
+ - 现在怎么办(临时绕法 / 成本):
10
+
11
+ ## 期望
12
+
13
+ <!-- 写成「用户能做成什么」,不要写实现方案;有边界(不做什么)一并写 -->
14
+
15
+ - 期望结果:
16
+ - 明确不做:
17
+
18
+ ## 价值
19
+
20
+ <!-- 不做会怎样 / 做了能省什么(时间、次数、出错率);能量化就量化 -->
21
+
22
+ - 价值:
23
+ - 优先级线索(可选:影响人数 / 频率 / 阻塞程度):
@@ -9,7 +9,7 @@
9
9
 
10
10
  ## 二、身份与消息禁令(硬性)
11
11
 
12
- - 不得以舰队角色名义回执:不得以任一舰队角色(`pm` / `arch-designer` / `rd-fe` / `rd-be` / `qa` / `rd-infra`)的名义说话或回执。
12
+ - 不得以舰队角色名义回执:不得以任一舰队角色(`pm` / `arch-designer` / `uiux-designer` / `rd-fe` / `rd-be` / `qa` / `rd-infra`)的名义说话或回执。
13
13
  - 不得发送 `done` 形态的消息;不得直接向 PM 发送任何消息。
14
14
  - 需要决策、被阻塞、需要授权或确认范围:用 `contact_supervisor({ reason: "need_decision", message: "<问题>" })` 回父角色;有实质进展或计划变更:用 `contact_supervisor({ reason: "progress_update", message: "UPDATE: <摘要>" })`。
15
15
  - `contact_supervisor` 是进程内 native 通道(不依赖 pi-intercom),它会自动解析父会话目标,因此本指令不需要、也不会写死父会话名。
package/README.md CHANGED
@@ -1,10 +1,42 @@
1
- # nao-skills
1
+ <h1 align="center">nao-skills</h1>
2
2
 
3
- > 给你的 AI 编程助手配一支「开发小队」:你提需求,它自己找人干活、自己验收交付。
3
+ <p align="center"><b>给你的 pi 配一支「开发小队」——你提需求,它自己找人干活、自己验收交付。</b></p>
4
4
 
5
- nao-skills 是一套 **角色卡 + 协作规矩 + 小工具**。装上以后,你的项目里会有 6 个分工明确的 AI 会话——产品经理负责拆需求、派活、验收;前端、后端、测试各自干活;工程基座管构建发布与治理。你只做两件事:**回答问题**、**点确认**。
5
+ <p align="center">
6
+ <a href="https://www.npmjs.com/package/@nathan33/nao-skill"><img src="https://img.shields.io/npm/v/@nathan33/nao-skill?label=npm&color=cb3837&logo=npm&logoColor=white" alt="npm version"></a>
7
+ <a href="LICENSE"><img src="https://img.shields.io/github/license/Nathan3303/nao-skills?label=license&color=3da639" alt="license: MIT"></a>
8
+ <img src="https://img.shields.io/badge/node-%E2%89%A518-3c873a?logo=nodedotjs&logoColor=white" alt="node >= 18">
9
+ <a href="https://pi.dev"><img src="https://img.shields.io/badge/host-pi%20only-6e56cf" alt="host: pi only"></a>
10
+ </p>
6
11
 
7
- 基于 [pi](https://pi.dev)。Made by [Nathan Lee](https://github.com/nathan)。
12
+ <p align="center"><sub>推荐配合模型 <b>deepseek-v4.1-flash</b> · 基于 <a href="https://pi.dev">pi</a> · Made by <a href="https://github.com/nathan">Nathan Lee</a></sub></p>
13
+
14
+ [前置环境](#前置环境) · [三步装好](#三步装好) · [第一次跑起来](#第一次跑起来) · [七个角色](#七个角色) · [常见问题](#常见问题) · [想深入](#想深入)
15
+
16
+ nao-skills 是一套 **角色卡 + 协作规矩 + 小工具**。装上以后,你的项目里会有 7 个分工明确的 AI 会话——产品经理负责拆需求、派活、验收;架构师把关方案;设计师管界面与交互;前端、后端、测试各自干活;工程基座管构建发布与治理。你只做两件事:**回答问题**、**点确认**。
17
+
18
+ > **推荐配合模型:`deepseek-v4.1-flash`。** 舰队是 7 个常驻会话 + 长链路交接(派活 → 回执 → 验收),这个模型在长上下文稳定性和单轮成本上实测最省心;换成别的模型也能跑,只是纪律遵守与回执质量会有差异。
19
+
20
+ ## 前置环境
21
+
22
+ > **不满足就装不起来。**
23
+
24
+ **nao 只支持 pi。** 不为其他编程 Agent(Claude Code / Codex / Cursor 等)做适配,也不承诺在那类工具里能用——多会话派活、回执、回收整套机制都建立在 pi 之上。
25
+
26
+ 除 pi 之外还需要:
27
+
28
+ - **pi ≥ 1.4.0** —— 舰队依赖它的多会话能力,版本低了体检直接报红。
29
+ - **tmux** —— 7 个角色会话在你当前窗口里分屏跑;`ensure` / `status` / `close` 都必须在 tmux 会话内执行。
30
+ - **Node.js ≥ 18** —— 命令入口是 Node 脚本。
31
+ - **git**(建议顺手装 **GitHub CLI `gh`**)—— 分支、PR、发版都走它;没有 `gh` 时这些步骤降级成手动/本地操作,流程不变。
32
+
33
+ 30 秒自检:
34
+
35
+ ```bash
36
+ pi --version && tmux -V && node -v && git --version
37
+ ```
38
+
39
+ 缺了什么都能在第一步装:pi 见 [pi.dev](https://pi.dev),tmux 用系统包管理器(`brew install tmux` / `apt install tmux`),Node 用 [nvm](https://github.com/nvm-sh/nvm) 或系统包管理器。
8
40
 
9
41
  ## 它解决什么问题
10
42
 
@@ -12,59 +44,39 @@ nao-skills 是一套 **角色卡 + 协作规矩 + 小工具**。装上以后,
12
44
 
13
45
  | 毛病 | nao-skills 的做法 |
14
46
  | --- | --- |
15
- | 一个会话什么都干,聊到后面就糊涂了 | 拆成 6 个专业角色,各管一段,互不干扰 |
47
+ | 一个会话什么都干,聊到后面就糊涂了 | 拆成 7 个专业角色,各管一段,互不干扰 |
16
48
  | 需求没问清楚就开写,写完发现不对 | PM 先追问、写清 PRD 和目标,你点头才开工 |
17
49
  | 干完不知道算不算干完 | 每个任务必须「回执」并按清单自查,PM 逐条验收才归档 |
18
50
 
19
- ## 安装(1 分钟)
51
+ ## 三步装好
20
52
 
21
- > 前置依赖:[pi](https://pi.dev)。没装 pi 也能看到这套文件,但跑不起来舰队。
53
+ 1. **装好上面的前置**(pi / tmux / Node)。
22
54
 
23
- 1. **把机制装进项目**(项目级,版本 pin 在仓库里,团队 clone 即得同款):
55
+ 2. **把机制装进你的项目**(项目级;版本 pin 在仓库里,团队 clone 即得同款):
24
56
 
25
57
  ```bash
26
58
  cd 你的项目
27
- pi install --local npm:@nathan33/nao-skill@0.18.4 # 声明 pin + 把机制包物化到项目内 .pi/npm
28
- npx @nathan33/nao-skill init # 写入转发 shim + 生成 AGENTS.md
59
+ pi install --local npm:@nathan33/nao-skill@0.21.3 # 声明 pin,并把机制包物化到项目内 .pi/npm
60
+ npx @nathan33/nao-skill init # 写入转发入口 shim + 生成 AGENTS.md
29
61
  ```
30
62
 
31
- 2. **装协作插件**(多会话派活必需):
63
+ 3. **装协作插件**(多会话派活必需):
32
64
 
33
65
  ```bash
34
66
  npx @nathan33/nao-skill plugins install-all
35
67
  ```
36
68
 
37
- 升级:改 `.pi/settings.json` 里的 pin 版本,再 `pi update --extensions`(机制以包为准,项目里只有 shim)。
69
+ 升级同理:改 `.pi/settings.json` 里的 pin 版本,再 `pi update --extensions`。机制以 npm 包为准,项目里只有转发入口,不需要你手动同步文件。
38
70
 
39
- ### CodeGraph(可选增强,不装也能干活)
40
-
41
- 插件 `@sean_pedersen/pi-codegraph` 给角色一个原生定位入口,但**三者齐备才生效**:插件已声明 + `codegraph` CLI 在 PATH + 当前仓有 `.codegraph/` 索引。缺任一 ⇒ 自动回退 CLI / `grep -rn` + 行段,`check -v` 会告诉你缺什么(**全部只是提示,永不进退出码**)。
71
+ ## 第一次跑起来
42
72
 
43
73
  ```bash
44
- npm install -g @colbymchenry/codegraph # CLI(实测 1.6.2)
45
- codegraph telemetry off # 关匿名遥测(舰队 session 由 nao 自动注入 CODEGRAPH_TELEMETRY=0)
46
- cd <repo> && codegraph init # 建索引(不带 -i;该 flag 已废弃)
74
+ cd 你的项目
75
+ .agents/scripts/nao-fleet.sh check # 体检:exit 0 就能开工
76
+ .agents/scripts/nao-fleet.sh ensure pm arch rd-fe rd-be qa rd-infra uiux # 在当前 tmux 窗口里拉起 7 个会话
47
77
  ```
48
78
 
49
- **资源**:sidecar 内存口径 = 进程树全集 **PSS 之和**(RSS 求和会重复计共享页)。本机实测同一仓 6 会话全集 **PSS 675.7MB**、同仓边际 **+70–90MB/会话**、**每新增一个有索引的仓 ≈ +155MB**(daemon + watchdog,按仓共享)⇒ 成本跟**仓数**走,不跟会话数线性放大。默认 `check` 不 fork CLI(零外部进程),`-v` / `ensure` 才每仓跑一次 `codegraph status`(约 0.4s)。
50
-
51
- **副产物与 daemon**(已知边界,nao 不代清理):
52
-
53
- - `.pi/APPEND_SYSTEM.md` 由插件生成 —— 正常会话退出会删,但**任何加载扩展的非会话 `pi` 调用**(`pi list` / `pi install` / `pi --help -e`)会写完就残留 ⇒ 已加进本仓 `.gitignore`(单文件);需清理时**自己** `rm -f .pi/APPEND_SYSTEM.md`。
54
- - 已建索引的仓内做个非会话 `pi` 动作,可能留下 1 棵孤儿 `codegraph` daemon(约 177MB RSS)。规避:**在非索引 cwd 执行** —— `( cd /tmp && pi list )`(实测 0 副作用);已泄漏用 `codegraph daemons`(交互选停)。nao 不会去杀它(daemon 的 argv 不含仓库身份,`pkill` 会跨仓误杀)。
55
-
56
- **老项目迁移**(曾在项目里铺开整套 `.agents/` 的):执行 `npx @nathan33/nao-skill migrate` 即可,细则见文末「老用户迁移与维护者注记」。
57
-
58
- ## 用起来(3 步)
59
-
60
- ```bash
61
- .agents/scripts/nao-fleet.sh check # 体检:一行 OK 就能开工
62
- .agents/scripts/nao-fleet.sh ensure pm arch rd-fe rd-be qa rd-infra # 拉起 6 个角色会话
63
- ```
64
-
65
- 角色名可以写**别名**或**规范名**(两者等价):`arch` = `arch-designer`、`infra` = `rd-infra`;上例里两者混用也照常拉起。完整别名表见 `.agents/roles.yaml` 或 `nao-fleet.sh --help`。
66
-
67
- **必须在 tmux 里用**:舰队在 tmux 会话内以派生 pane 拉起(`ensure` / `status` / `close` 都只接受 tmux 内,同时要求 `pi ≥ 1.4.0`),不再提供终端窗口 / 后台会话等多宿主路径。非 tmux 环境会直接报错(`exit 3` + 一行提示 `tmux new -s nao`),**不会**建任何窗口或会话。旧版用 `--background` / screen 拉起过的会话,本版起 `status` 看不到、`close` 收不回,先 `screen -ls` 手工清一次。
79
+ 角色名可以写**别名**或**规范名**(两者等价):`arch` = `arch-designer`、`infra` = `rd-infra`;上例混用也照常拉起。完整别名见 `.agents/roles.yaml` 或 `nao-fleet.sh --help`。
68
80
 
69
81
  然后**在 PM 会话里说需求**就行,剩下的它自己流转。大概长这样:
70
82
 
@@ -74,70 +86,37 @@ PM:问几个问题 → 给出 PRD + 优先级 + 开工确认卡
74
86
  你:开工
75
87
  PM:拉起缺的角色 → 让 qa 先写用例 → 指派给 rd-be
76
88
  rd-be:(做完)[T1] done | 测试:npm test exit=0 128例/0红 | PR #12
77
- PM:在 PR 核 AC 并评论 → 验收通过(授权合并)→ rd-be squash 合并 → 归档 docs/prds/ → 回收后台会话
89
+ PM:在 PR 核 AC 并评论 → 验收通过(授权合并)→ rd-be squash 合并 → 归档 docs/prds/ → 回收派生会话
78
90
  ```
79
91
 
80
92
  每个任务完成后都能在 `docs/` 里找到痕迹(PRD、任务状态、回报),不依赖聊天记录——所以会话聊久了可以直接重开,不会丢事。
81
93
 
82
- ## 六个角色
94
+ ## 七个角色
83
95
 
84
96
  | 角色 | 帮你干什么 |
85
97
  | --- | --- |
86
- | 产品经理 | 澄清需求、**调研同类产品形态**、写 PRD、定优先级、派活、验收、归档、**管 Issue 与发版**(PR 验收评论、tag/release,优先 `gh`;唯一的调度者,不写代码、不合并) |
87
- | 架构师 | 技术选型与方案评审(**对照业界成熟模式**并写明为何不采纳),出 ADR,评影响面 |
98
+ | 产品经理 | 澄清需求、调研同类产品形态、写 PRD、定优先级、派活、验收、归档、管 Issue 与发版(唯一的调度者,不写代码、不合并) |
99
+ | 架构师 | 技术选型与方案评审(对照业界成熟模式,写明为何不采纳),出 ADR,评影响面 |
100
+ | UI/UX 设计师 | 信息架构、交互流程、视觉规范与 token、状态与断点、可用性与无障碍;无原型工具时按降级阶梯交文字规格 / 线框,不阻塞 |
88
101
  | 前端 / 后端研发 | 各自实现,写完自己跑测试再回执 |
89
102
  | 工程基座 | CI 与流水线、构建/发布工具、脚本与守卫、依赖与安全告警升级、仓库治理 |
90
103
  | 测试工程师 | 按验收标准出用例、跑门禁、报缺陷 |
91
104
 
92
105
  不想要哪个角色,删掉对应文件即可;只留 PM + 一个研发角色也能跑。
93
106
 
94
- ## 按需角色会话(用你自己仓里的角色卡)
95
-
96
- 常驻的 6 个角色不用改清单就能再加一个**按需角色**(Code Review、数据核对之类):把卡放进你的项目仓 `.agents/prompts/<名字>.md`,一条命令拉起,它就和常驻角色一样被管起来——分屏托管、`status` 看得到、`close` 收得回——但**不写进 `roles.yaml`,也不算常驻**。
97
-
98
- ```bash
99
- .agents/scripts/nao-fleet.sh ensure --card .agents/prompts/code-reviewer.md --task T537 # 拉起一次性 Code Review 会话
100
- .agents/scripts/nao-fleet.sh status # 派生节里能看到 code-reviewer-T537
101
- .agents/scripts/nao-fleet.sh close --task T537 code-reviewer # 用完直接回收
102
- ```
103
-
104
- 卡的要求很直白:必须在**当前仓**的 `.agents/prompts/` 里、是普通 `.md` 文件(≤256 KiB),frontmatter 有 `role`(缺省用文件名)和 `description`。`role` 是会话名的来源,所以不能与常驻角色撞名或抢前缀(`qa`、`qa-audit` 这类都会被拒,只能改卡内 `role`),也不能用 `subagent-` / `nao-` 开头;`--as` 只能**在同一张卡内区分会话**,名字必须等于卡 `role` 或以 `<role>-` 为前缀(`--as code-reviewer-notes` ✓,`--as audit` ✗ —— 舰队按前缀识别身份,改名脱离前缀就等于「起得来但管不到」)。写错了不用猜:失败信息都是**一行原因 + 该怎么办**,`check` 也会在「下游角色卡」节提前指出(内容类只提醒、机制类直接红)。
105
-
106
- 两点边界值得知道:
107
-
108
- - **`--card` 只作用于紧跟它的那个目标**:`ensure qa --card x.md` 是「常驻 `qa`」+「卡 `x.md`」两个会话,不会整批串味;命令末尾悬挂 `--card`、或把它递给 `check`/`status`/`close`,都按用法错误处理。
109
- - **卡正文就是系统提示**,所以它是**完全可信输入**(能写你仓库的人本来就能定义角色);fleet 只校验目录、文件类型、大小与命名的一致性,不做内容安全审查。卡同样可以被 pi-subagents 当项目 agent 用(加 `name:` 即可),但那条路径没有「环境锚点」行,卡正文别依赖 `@.agents/...` 引用才自洽。若你已经在用 overlay 清单(`NAO_SKILLS` 指向自己的清单目录),同一仓别两法并用。
110
-
111
- ## 为什么它省 token(这是本项目的核心追求)
112
-
113
- 和 AI 聊天,钱花在「它每轮要读多少字」。所以:
114
-
115
- - **常驻的东西尽量小**:每个角色卡只留最硬的红线,细节放到用到时才读的文件里。
116
- - **按需才读**:设计规范、检查清单、读代码手册,都是在需要那一刻才读进上下文。
117
- - **不靠聊天记录记事**:任务状态和待办写在 `docs/` 文件里;会话重开先读文件恢复状态。
118
- - **查代码用索引**:配了 CodeGraph 就一次拿到相关代码块,比全文搜索省一个数量级。它**不是硬依赖** —— 插件 / CLI / 索引缺任一就自动回退 `grep -rn` + 行段,`check` 的 codegraph 行永远只是提示(不进退出码)。
119
-
120
- 一句话概括定位:这是在给 AI 做「上下文工程」——决定每个会话**该看到什么、不该看到什么**;在这之上再叠了多会话协作和交付纪律。它自己不跑 AI,产出的是给 AI 读的 Markdown。
121
-
122
107
  ## 常见问题
123
108
 
124
- **会改我的代码库吗?** 只会新增项目根 `AGENTS.md`、`.pi/settings.json`,以及一个转发入口 `.agents/scripts/nao-fleet.sh`;角色卡、清单、技能这些机制文件都在依赖包内,**不再铺进你的仓库**,也不碰你原有文件。
109
+ **会改我的代码库吗?** 只会新增项目根 `AGENTS.md`、`.pi/settings.json`,以及一个转发入口 `.agents/scripts/nao-fleet.sh`;角色卡、清单、技能这些机制文件都在依赖包内,**不铺进你的仓库**,也不碰你原有文件(已有 `AGENTS.md` 时是合并追加,不覆盖)。
125
110
 
126
- **只能用 pi 吗?** 角色卡和技能本质就是 Markdown,Claude Code 等也能读;但"派活 / 回执"这种多会话协作依赖 pi + pi-intercom 插件。
111
+ **除了 pi,能配别的编程 Agent 吗?** 不能。机制文件本身是 Markdown,理论上别的工具也能读,但 nao 的派活 / 回执 / 回收全依赖 pi + pi-intercom,其他 Agent 不在支持范围内。
127
112
 
128
113
  **它会在 GitHub 上开 PR 吗?** 会——每个需求一条分支、一个 PR(Draft 早开、CI 早跑),你确认验收后由研发角色 squash 合并,main 上只留 1 条可读提交。没有远端或 `gh` 时降级为本地分支,流程不变。
129
114
 
130
- **跑完的会话要留着吗?** 后台派生会话验收完可以回收:`nao-fleet.sh close --task T1 rd-be`(等价写法 `nao-fleet.sh close rd-be-T1`,直接用派生会话名即可);常驻角色留着复用。`nao-fleet.sh status` 会提示哪些是残留。目标在别的项目里也能回收——`close` 会按名册/窗口标题跨项目定位;定位不到时会**非 0 退出并打印诊断**,不会假装已回收。实验/夹具用的隔离 tmux server 用 `nao-fleet.sh cleanup -S <socket>` 清理:**强制显式 socket**,不带 `-S` 或指向生产默认 socket 一律 exit 2 拒绝,绝不会连坐你正在用的真实 server。
115
+ **跑完的会话要留着吗?** 派生会话验收完就回收:`nao-fleet.sh close --task T1 rd-be`(等价写法 `nao-fleet.sh close rd-be-T1`,直接用派生会话名即可);常驻角色留着复用。`nao-fleet.sh status` 会提示哪些是残留。目标在别的项目里也能回收——定位不到时会**非 0 退出并打印诊断**,不会假装已回收。
131
116
 
132
- **为什么要装 tmux?** **必须装**(v0.19.0 起唯一的运行前提):
117
+ **为什么一定要 tmux?** 它同时解决三件事:**布局可控**(三种布局自动排布,不会把桌面铺满一圈窗口)、**句柄完整**(`status` 查残留、`close` 跨项目回收都靠会话名册与 pane 标题定位)、**SSH 可用**(没有图形环境也能拉起整套舰队)。
133
118
 
134
- - **布局可控**:6 个角色会话在 tmux 里按三种布局自动排布(`main-row2` / `main-col` / `grid`),间距与列宽可用 `NAO_TMUX_*` 变量调,不会把桌面铺满一圈窗口。
135
- - **句柄完整**:`status` 查残留、`close` 跨项目回收都按会话名册与 pane 标题定位;tmux 宿主下句柄稳定可寻,没有「查不到就只能猜」的分支。
136
- - **SSH 也能用**:不挑图形环境,起一个 tmux 会话就能拉起整套舰队。
137
-
138
- **终端窗口太挤怎么办?** tmux 宿主支持三种布局:默认 `main-row2`(主会话占左,其余往右分列)、`main-col`(其余在右列竖排)、`grid`(等大网格)。窗口太窄时 `main-row2` 会**自动回退** `main-col`、仍不够再退 `grid`,并打印带数字的提示(不中断拉起);用 `NAO_TMUX_LAYOUT` / `NAO_TMUX_MAIN_WIDTH` / `NAO_TMUX_MIN_PANE_WIDTH` 调整,详见 `bash .agents/scripts/nao-fleet.sh --help`。
139
-
140
- **它会自己上网查吗?** 会,但有分工:产品经理查同类功能的**产品形态**(有哪些功能点、属性、视图、协作方式),架构师对照**业界成熟的架构模式**。两者都必须把来源和「适不适用本项目」落成文件(`docs/research/`),抓来的网页内容不会堆进聊天记录;技术选型仍然只由架构师定。
119
+ **它会自己上网查吗?** 会,但有分工:产品经理查同类功能的**产品形态**(功能点、属性、视图、协作方式),架构师对照**业界成熟的架构模式**。两者都必须把来源和「适不适用于本项目」落成文件(`docs/research/`),抓来的网页内容不进聊天记录;技术选型仍只由架构师定。
141
120
 
142
121
  **装完之后项目里多了什么?**
143
122
 
@@ -153,43 +132,17 @@ PM:在 PR 核 AC 并评论 → 验收通过(授权合并)→ rd-be squash
153
132
  └── nao-fleet.sh # 转发入口(shim):自动定位包内机制并转发
154
133
  ```
155
134
 
156
- 机制本体(6 张角色卡、协作规矩、清单、按需技能、小工具)都在 npm 包 `@nathan33/nao-skill` 的 `.agents/` 里——**包里是什么就是什么**,项目里不留副本。
157
-
158
- ## 老用户迁移与维护者注记(新用户可跳过)
135
+ ## 为什么它省 token
159
136
 
160
- 本节面向**已有旧版安装**或需要维护使用机制的仓库 CI 的读者,新用户可以直接跳到「想深入」。
137
+ 和 AI 聊天,钱花在「它每轮要读多少字」。所以每一个角色卡只留最硬的红线,细节放到用到时才读的文件里;任务状态写在 `docs/` 而不是聊天记录里,会话重开先读文件恢复状态;查代码用 CodeGraph 索引一次拿到相关代码块(**可选**,不装就回退 grep + 行段读取)。
161
138
 
162
- ### 老项目迁移(migrate)
163
-
164
- ```bash
165
- npx @nathan33/nao-skill migrate # 旧文件备份到 .agents/.nao-obsolete/,再按需写入转发入口
166
- ```
167
-
168
- 迁移默认按**判定式**决定是否写转发入口(shim):仓里还有旧的 `nao-fleet.sh`、或已存在 shim、或全仓有 `nao-fleet` / `nao-skill` / `NAO_SKILLS` 引用,就写;**无脚本、无引用的纯文档仓会被判定跳过**,并打印一行告知。要改变判定结果,显式加 `--shim`(强制写)或 `--no-shim`(强制不写),两者不能同时给(`exit 2`)。旧版的 `.agents/.nao-migrated` 标记**已废弃**:迁移不再读写它,可安全删除。`.agents/.nao-version` 的语义是「本机已安装机制包版本」(供升级检测),**不表达迁移状态**——迁移状态由「是否还有旧资产」推断。
169
-
170
- ### 发布形态与完整性判据(0.12 起有变化)
171
-
172
- **从 0.12 起,机制不再铺进项目**:项目里只留一个转发入口,机制的**单一事实来源**是 npm 包 `@nathan33/nao-skill` 内的 `.agents/`。
173
-
174
- - **旧的完整性判据已失效**:以前靠「项目内 `.agents/**` 与包内逐字节 sha 一致」证明机制没漏没改;现在项目内不再有机制副本,这条判据不再适用。
175
- - **新的完整性判据:以 pin 的包版本为准**。`.pi/settings.json` 记录版本,`pi install/update` 从包物化;包里是什么就是什么,不存在「项目内被就地改动」的问题。转发入口是生成的固定文本,可用 `npx @nathan33/nao-skill init` 幂等重写核对。
176
- - **版本权威口径**:`.pi/settings.json` 里的 pin 是**唯一权威**(`pi install/update` 据此物化到 `.pi/npm`);`.agents/.nao-version` 的语义是**本机已安装机制包版本**(供升级检测),**不表达迁移状态**、**不作为版本依据**;两者不一致时**以 pin 为准**。
177
- - **fmt 边界**:包内 `.agents/**` 按原始存储形态发布(部分 YAML / Markdown / MTS 未按 oxfmt / prettier 归一)。迁移期仍持有旧版全套 `.agents/**` 的仓库,继续把 `.agents/**` 排除出 fmt 校验即可,⛔ **不要为过 fmt 就地格式化**;新形态项目内只有转发入口,无需再处理。
178
-
179
- ### 物化与离线(CI / 无 pi 环境必读)
180
-
181
- - `.pi/npm/` 由 pi 管理并 **gitignore**。因此 **fresh clone 上没有 `.pi/npm/package.json` 与 lockfile**,`npm ci --prefix .pi/npm` 当前**不可用**。
182
- - 物化只有一条路:**显式执行** `pi install -l --approve npm:@nathan33/nao-skill@<pin>`(需要 pi 与网络,是有意为之的一步)。
183
- - **联动条款**:若某个仓库想把机制体检 `check` 放进 CI,**必须同时**用 `git add -f` 把 `.pi/npm/package.json`、`.pi/npm/package-lock.json` 纳入版本控制,`npm ci` 才有输入。
184
- - **pi 启动的隐式安装**:当 `.pi/npm/node_modules` 缺失时,pi 启动会隐式执行 `npm install --prefix .pi/npm --legacy-peer-deps`;离线且缓存为空会得到可读的 npm 报错,并让 pi 以非 0 退出(不会静默假装成功)。
185
- - **运行纪律**:**先显式物化,再 `PI_OFFLINE=1` 运行**。nao 机制自身(转发入口 / fleet / CLI / check)**零网络调用**;入口找不到机制包时不静默成功,而是 `exit 2` 并打印一行 `DEGRADED:` + 恢复命令。
139
+ 一句话概括定位:这是在给 AI 做「上下文工程」——决定每个会话**该看到什么、不该看到什么**;在这之上再叠了多会话协作和交付纪律。它自己不跑 AI,产出的是给 AI 读的 Markdown。
186
140
 
187
141
  ## 想深入
188
142
 
189
- README 只讲怎么用。真正的机制都在依赖包 `@nathan33/nao-skill` 的 `.agents/` 里(会话里以 `$NAO_SKILLS/.agents/` 指向),想改就从这几处入手:
190
-
191
143
  | 想看什么 | 去哪看 |
192
144
  | --- | --- |
145
+ | 完整安装手册:CodeGraph 资源口径、按需角色 `--card`、tmux 布局、老项目迁移、CI / 离线、完整性判据 | [docs/INSTALL.md](docs/INSTALL.md) |
193
146
  | 整体架构、分层与设计取舍 | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) |
194
147
  | 派活 / 回执 / 忙闲与回收规矩 | `$NAO_SKILLS/.agents/common/intercom-protocol.md` |
195
148
  | 输出格式与回执红线 | `$NAO_SKILLS/.agents/common/output-format.md`、`$NAO_SKILLS/.agents/checklists/comm-templates.md` |
@@ -198,6 +151,8 @@ README 只讲怎么用。真正的机制都在依赖包 `@nathan33/nao-skill`
198
151
  | 工具命令 | `bash .agents/scripts/nao-fleet.sh --help`(转发入口) |
199
152
  | 项目自己的约定 | 项目根 `AGENTS.md` |
200
153
 
154
+ `$NAO_SKILLS` 指机制包根目录(会话里 fleet 会自动注入该变量),也就是 npm 包 `@nathan33/nao-skill` 的安装位置。
155
+
201
156
  ## License
202
157
 
203
158
  MIT © 2026 Nathan Lee
package/bin/nao-skill.js CHANGED
@@ -14,7 +14,7 @@
14
14
  * - 已有 AGENTS.md → 提示按 PM 卡 §七 / skills/pm-operations.md §四 合并规则手动追加,不自动覆盖
15
15
  *
16
16
  * 使用(安装后)
17
- * bash .agents/scripts/nao-fleet.sh check / ensure arch rd-fe rd-be qa rd-infra
17
+ * bash .agents/scripts/nao-fleet.sh check / ensure arch uiux rd-fe rd-be qa rd-infra
18
18
  * 角色卡经 fleet 拉起时 --append-system-prompt 注入;checklists 按需读取
19
19
  */
20
20
  import { execFileSync, spawnSync } from 'node:child_process';
@@ -195,7 +195,7 @@ function install(target, force, verbose) {
195
195
  log('✔ 安装完成。下一步:');
196
196
  log(' bash .agents/scripts/nao-fleet.sh check # 体检');
197
197
  log(' bash .agents/scripts/nao-fleet.sh status # 在线状态');
198
- log(' bash .agents/scripts/nao-fleet.sh ensure arch rd-fe rd-be qa rd-infra # 拉起舰队');
198
+ log(' bash .agents/scripts/nao-fleet.sh ensure arch uiux rd-fe rd-be qa rd-infra # 拉起舰队');
199
199
  log(' 角色卡:.agents/prompts/ · 技能:.agents/skills/ · 交付清单:.agents/checklists/');
200
200
  }
201
201
 
@@ -377,7 +377,7 @@ function init(target, force, verbose, shimMode = 'shim', decision = null) {
377
377
  log('');
378
378
  log('✔ 初始化完成(项目内仅 shim,机制在 .pi/npm 包内)。下一步:');
379
379
  log(' bash .agents/scripts/nao-fleet.sh check # 体检');
380
- log(' bash .agents/scripts/nao-fleet.sh ensure pm arch-designer rd-fe rd-be qa rd-infra');
380
+ log(' bash .agents/scripts/nao-fleet.sh ensure pm arch-designer uiux-designer rd-fe rd-be qa rd-infra');
381
381
  }
382
382
 
383
383
  // ---------------------------------------------------------------------------
@@ -570,7 +570,7 @@ shim 判定式(migrate 默认;init 默认装):
570
570
  nao-skill install [dir] [--force] 复制全套 .agents/ 到项目(--plugins 顺带装插件)
571
571
  nao-skill update [dir] 源优先覆盖升级旧版全套安装
572
572
 
573
- 安装后: bash .agents/scripts/nao-fleet.sh check / ensure pm arch-designer rd-fe rd-be qa rd-infra
573
+ 安装后: bash .agents/scripts/nao-fleet.sh check / ensure pm arch-designer uiux-designer rd-fe rd-be qa rd-infra
574
574
  说明: 新形态项目内只有 shim;机制单一事实来源在 npm 包内(pi install --local 物化到 .pi/npm)。
575
575
  `);
576
576
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nathan33/nao-skill",
3
- "version": "0.21.3",
4
- "description": "nao 多角色 AI 开发舰队:角色卡 / 技能 / 协作协议 / 工具链,一键接入项目(pi / Claude / 任意 Agent)",
3
+ "version": "0.22.0",
4
+ "description": "nao 多角色 AI 开发舰队(仅 pi):角色卡 / 技能 / 协作协议 / 工具链,一键接入项目",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "nao-skill": "bin/nao-skill.js"
@@ -19,7 +19,6 @@
19
19
  "multi-agent",
20
20
  "pi",
21
21
  "pi-package",
22
- "claude",
23
22
  "design-system",
24
23
  "codegraph"
25
24
  ],