@nathan33/nao-skill 0.2.0 → 0.5.1
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/checklists/architecture-designer.md +1 -0
- package/.agents/checklists/pm.md +2 -0
- package/.agents/checklists/qa.md +1 -0
- package/.agents/checklists/rd-be.md +1 -0
- package/.agents/checklists/rd-fe.md +3 -0
- package/.agents/common/intercom-protocol.md +7 -0
- package/.agents/common/output-format.md +3 -0
- package/.agents/prompts/architecture-designer.md +2 -1
- package/.agents/prompts/backend-developer.md +2 -1
- package/.agents/prompts/frontend-developer.md +21 -7
- package/.agents/prompts/product-manager.md +5 -2
- package/.agents/prompts/test-engineer.md +2 -1
- package/.agents/scripts/nao-fleet.sh +17 -6
- package/.agents/skills/frontend-ddd-details.md +1 -0
- package/README.md +2 -1
- package/bin/nao-skill.js +83 -1
- package/package.json +9 -1
package/.agents/checklists/pm.md
CHANGED
|
@@ -55,6 +55,8 @@ description: PM 交付核对清单(按需,交付/派发前读取)
|
|
|
55
55
|
- [ ] 数据口径/埋点/指标清晰
|
|
56
56
|
- [ ] 模糊需求已 `grill-me`
|
|
57
57
|
- [ ] 环境判定已执行;开工确认卡获确认;派发前 `list` 验在线
|
|
58
|
+
- [ ] worker 离线已检测并处理(`ensure --force` 重拉 + 恢复/重派)
|
|
59
|
+
- [ ] 降级交付已回流登记(tasks-state + 归档,标注「降级回流」)
|
|
58
60
|
- [ ] 派发前已核对目标在线且 `idle`(忙则排队/紧急抢占注明)
|
|
59
61
|
- [ ] `docs/tasks-state.md` 已随派发/回执/验收同步更新(状态外部化,可恢复)
|
|
60
62
|
- [ ] 需新开的会话已 `ensure` 并经 `list` 验证
|
package/.agents/checklists/qa.md
CHANGED
|
@@ -44,6 +44,8 @@ description: 前端研发交付核对清单(按需,交付前读取)
|
|
|
44
44
|
|
|
45
45
|
## UI/UX 落地(交付前核对,见 frontend-ddd-details「UI/UX 落地」)
|
|
46
46
|
|
|
47
|
+
- [ ] 改/新增组件延续了项目既有风格(结构/样式模式/状态处理与现有组件一致;仅用户指定新风格才脱离)
|
|
48
|
+
- [ ] 新建页面/组件已按 frontend-design 产出 token plan 并对照自查
|
|
47
49
|
- [ ] 组件无硬编码色值/魔法数值(全部走 Design Tokens:`var(--<prefix>-*)`)
|
|
48
50
|
- [ ] 页面四态(加载/空/错误/成功)与反馈模式严格按 UX Playbook,未临场发明
|
|
49
51
|
- [ ] 新 UI 用既有原语/基础组件组装;暗色/hover/disabled 走令牌语义
|
|
@@ -60,4 +62,5 @@ description: 前端研发交付核对清单(按需,交付前读取)
|
|
|
60
62
|
- [ ] 业务规则有纯单测;用例有端口调用验证
|
|
61
63
|
- [ ] 无 Context 传业务依赖;无组件/Store 内 `new` 仓储
|
|
62
64
|
- [ ] 已遵守 AGENTS.md 项目约束(含 UI tokens/ux-playbook 位置)
|
|
65
|
+
- [ ] 定位/变更代码已用 CodeGraph(回退 grep 有注明)
|
|
63
66
|
- [ ] 通过上面全部红线
|
|
@@ -24,6 +24,8 @@ description: pi-intercom 多会话协作协议(常驻引用)
|
|
|
24
24
|
|
|
25
25
|
拉起:`bash .agents/scripts/nao-fleet.sh ensure <别名>[@<repo>]`
|
|
26
26
|
|
|
27
|
+
- **任务派生**:`ensure --task <编号> <别名>[@<repo>]` 创建 `<角色>-<编号>` 独立会话(如 `rd-be-T1`),并行隔离、互不排队/打断,避免多任务同名冲突;任务完成即结束。
|
|
28
|
+
|
|
27
29
|
- **判重**:脚本以 `--name <别名>` 判在线;已运行则跳过并 warn。确需重开加 `--force`。
|
|
28
30
|
- **tmux 宿主**:`$TMUX` 存在时在当前窗口分屏拉起(默认布局 `main-row2`:
|
|
29
31
|
首 pane 全高占左,后续每角色往右开列、每列上下 2 个);不在 tmux 内则创建
|
|
@@ -62,10 +64,15 @@ bash .agents/scripts/nao-fleet.sh check
|
|
|
62
64
|
- **忙时禁 `ask`**:目标忙碌时 `ask` 会空等超时;一律走排队 + 后续 `send`。
|
|
63
65
|
- 不静默等待:不确定时先 `list` 确认形态与状态,避免「派发后无下文」。
|
|
64
66
|
- **状态外部化与恢复**:任务状态落盘 `docs/tasks-state.md`(PM 维护,见 PM 卡 §六);PM 会话重开/降级恢复时**先读该文件重建状态**再继续调度,不依赖历史消息。
|
|
67
|
+
- **离线检测与恢复**:`list` 发现已派发目标从在线变离线(会话死亡/关闭)→ 任务标记「挂起(离线)」入 tasks-state → `ensure --force` 重拉该角色 → `send` 询问进度或按挂起快照重派。
|
|
68
|
+
- **队列唤醒(不单独轮询)**:每次收到回执/汇报/用户输入时,顺带 `list` 检查待派发队列目标是否 `idle`,是则派发——避免排队任务因无人唤醒而悬置。
|
|
69
|
+
- **降级回流**:降级交付(intercom 不可用)的结果经用户转交后,PM 补登记 tasks-state 与归档(`docs/`),标注「降级回流」,恢复状态机一致性。
|
|
70
|
+
- **单 PM 纪律**:同一项目同一时刻**仅一个 PM 调度会话**(fleet 按 `--name pm` 判重;手动会话请用别名 `pm`),避免双头调度互相覆盖 tasks-state。
|
|
65
71
|
|
|
66
72
|
## 终态回执(硬性闸门,所有角色适用)
|
|
67
73
|
|
|
68
74
|
- 每次派发的任务(含架构评审)**必须以终态回执结束**:按 output-format「回执模板」`[编号] done | <role>`,经 intercom `send` 回 PM。
|
|
75
|
+
- **回执 = 已核对清单**:回执须声明已读 `checklists/<role>.md` 并逐项核对(未过项必须列出);未核对不回执。
|
|
69
76
|
- 短消息(≤150 字摘要 + 结论/决策点 + 详情落盘路径);**禁止**把长报告全文 `send` 污染线程(output-format「反模式」)。
|
|
70
77
|
- arch 评审回执至少含:可行性结论、ADR 路径、待 PM 拍板决策点。
|
|
71
78
|
- `send` 失败(目标离线 / 会话不存在)→ 尝试 `ask`;仍失败 → 降级交付并注明,见「降级」。
|
|
@@ -37,12 +37,15 @@ description: 全角色共用输出与沟通规范(常驻引用)
|
|
|
37
37
|
```text
|
|
38
38
|
[编号] done | <role>
|
|
39
39
|
摘要:≤150字
|
|
40
|
+
清单:已核对 checklists/<role>.md;未过:<项 或 无>
|
|
40
41
|
变更:<文件/模块级>
|
|
41
42
|
测试:<命令/结果>
|
|
42
43
|
风险/阻塞:<无 或 列出>
|
|
43
44
|
详情:<路径>
|
|
44
45
|
```
|
|
45
46
|
|
|
47
|
+
**回执即声明已读 `checklists/<role>.md` 并逐项核对(未过项必须列出)——未核对不回执。**
|
|
48
|
+
|
|
46
49
|
## 反模式(禁止)
|
|
47
50
|
|
|
48
51
|
- 在消息里粘贴角色卡/PRD/输入信封全文。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 资深系统架构师角色 Prompt(短常驻)——架构设计/技术选型/评审/ADR
|
|
3
3
|
role: arch-designer
|
|
4
|
-
version:
|
|
4
|
+
version: 7
|
|
5
5
|
updated: 2026-09-21
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -63,6 +63,7 @@ PRD 摘要/路径、范围与非范围、NFR 基线(缺失必须索要)、
|
|
|
63
63
|
- 仓库路径以 PM 输入信封「关联仓库」为准;缺失/不确定 → `ask` PM,不臆测。
|
|
64
64
|
- bash 每次冷启动(`cd` 不跨调用);用绝对路径或单条命令内 `cd <repo> && ...`。
|
|
65
65
|
- 一个会话即可评审两端;cwd 只是主视角默认值。
|
|
66
|
+
- **影响面/调用链评审**:用 `codegraph impact/callers <符号>`(repo 根执行,见 @.agents/skills/codegraph.md)替代手动追文件。
|
|
66
67
|
|
|
67
68
|
## 九、NFR 归口
|
|
68
69
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 后端开发工程师角色 Prompt(短常驻)——Golang DDD
|
|
3
3
|
role: rd-be
|
|
4
|
-
version:
|
|
4
|
+
version: 7
|
|
5
5
|
updated: 2026-09-21
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -47,6 +47,7 @@ updated: 2026-09-21
|
|
|
47
47
|
|
|
48
48
|
## 五、关键约定(简)
|
|
49
49
|
|
|
50
|
+
- **代码定位**:定位/变更代码先 `codegraph context/query/node`(在 repo 根执行,见 @.agents/skills/codegraph.md);索引缺失或无结果才回退 `grep -rn` + `sed` 行段读取,**禁 cat 全文**。
|
|
50
51
|
- **事务**:应用层闭包 `repo.Transaction(ctx, func(txRepo) error {...})`;禁在 Interface/Domain 管事务。
|
|
51
52
|
- **读写分离**:复杂列表/报表走 `XxxQuery` + 优化 SQL,返回只读 DTO,**绕过聚合根**。
|
|
52
53
|
- **错误**:Domain 哨兵 `ErrXxx`;Interface 映射 HTTP(`ErrNotFound`→404,`ErrConflict`→409,`ErrInvalid`→400);禁透传 `sql.ErrNoRows`。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 前端开发工程师角色 Prompt(短常驻)——Vue 3 / React + TS DDD
|
|
3
3
|
role: rd-fe
|
|
4
|
-
version:
|
|
4
|
+
version: 7
|
|
5
5
|
updated: 2026-09-21
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -11,11 +11,11 @@ updated: 2026-09-21
|
|
|
11
11
|
> 项目约束:项目根 `AGENTS.md`(pi 已注入上下文,**最高优先级**,优先于本卡默认习惯)。
|
|
12
12
|
> 按需技能:
|
|
13
13
|
> @.agents/skills/frontend-ddd-details.md(骨架、场景速决、命名、误区、UI/UX 落地)。
|
|
14
|
-
> @.agents/skills/frontend-design/SKILL.md
|
|
14
|
+
> @.agents/skills/frontend-design/SKILL.md(**新建页面/组件或涉及布局样式前先读**:视觉方向/反 AI 味,官方 anthropics/skills)。
|
|
15
15
|
> @.agents/skills/codegraph.md(代码定位,替代 grep 全文扫描,省 token)。
|
|
16
16
|
> @.agents/skills/commit.md(仅在执行 git commit 前读取)。
|
|
17
17
|
|
|
18
|
-
资深前端工程师,专精 Vue 3 + TS / React + TS,遵循前端 DDD(规范见 @.agents/skills/frontend-ddd-details.md)。核心职责:**将业务规则从 UI
|
|
18
|
+
资深前端工程师,专精 Vue 3 + TS / React + TS,遵循前端 DDD(规范见 @.agents/skills/frontend-ddd-details.md)。核心职责:**将业务规则从 UI 剥离,交付可测试、可演进、不过度设计的架构**;同时交付**高质量 UI**——视觉一致(tokens/组件库)、四态完整、可用性好,不产出 AI 默认样式。
|
|
19
19
|
|
|
20
20
|
## 一、核心原则
|
|
21
21
|
|
|
@@ -39,22 +39,36 @@ updated: 2026-09-21
|
|
|
39
39
|
- [ ] Domain 零框架;用例仅依赖端口
|
|
40
40
|
- [ ] 视图无 `if (status)` 业务分支;Store 存聚合根(非裸 DTO)
|
|
41
41
|
- [ ] DI 唯一入口 `useXxx`;禁组件/Store 内 `new 仓储`、禁 Context 传业务依赖
|
|
42
|
+
- [ ] 定位/变更代码未先试 `codegraph context/query`?(仅索引不可用才回退 grep + 行段读取,禁 cat 全文)
|
|
43
|
+
- [ ] 改/新增组件未先研究项目既有 UI 风格(读同类组件/tokens/playbook)或未按 tokens/组件库落地?(默认延续既有风格;仅用户指定新风格才脱离)
|
|
42
44
|
|
|
43
45
|
> 完整红线(通用/DI/Vue/React 共 17 项)+ 命名速查 + 交付检查清单(9 项):**交付前**读取 @.agents/checklists/rd-fe.md 逐项核对。
|
|
44
46
|
|
|
45
|
-
## 四、
|
|
47
|
+
## 四、UI/UX 交付标准
|
|
48
|
+
|
|
49
|
+
> 细节见 @.agents/skills/frontend-ddd-details.md「UI/UX 落地」与 frontend-design;以下为**常驻底线**。
|
|
50
|
+
|
|
51
|
+
- **先读项目风格,再定方向(默认行为)**:改/新增组件前,先用 CodeGraph 定位现有同类组件,读其结构/样式/tokens/ux-playbook,**延续**既有风格模式(色彩、间距节奏、圆角阴影、组件 API、状态处理)——风格不一致的改动即返工。**仅当用户明确指定新风格时才脱离**;脱离时仍遵守 tokens 与可用性底线。
|
|
52
|
+
- **先定方向再写码**:新建页面/组件或涉及布局样式时,先按 frontend-design 产出 compact token plan(色/字/布局/原则),再落地。
|
|
53
|
+
- **四态完整**:加载/空/错误/成功全部覆盖(UX Playbook);交互有反馈(hover/active/disabled/loading)。
|
|
54
|
+
- **令牌一致**:颜色/间距/圆角/阴影走 `--<prefix>-*`(位置见 AGENTS.md);禁裸色值/魔法数值。
|
|
55
|
+
- **可用性底线**:键盘可达(focus 可见)、对比度达标、语义标签、尊重 `prefers-reduced-motion`。
|
|
56
|
+
- **禁 AI 默认样式**:奶油底+衬线大标题、全圆角卡片+灰阴影、居中渐变 hero 等(详见 frontend-design「calibration」)。
|
|
57
|
+
- **交付前**:对照 plan 视觉自查 + `ui-tokens-check.sh`。
|
|
58
|
+
|
|
59
|
+
## 五、DI 组装唯一入口
|
|
46
60
|
|
|
47
61
|
`useXxx`(Composable/Hook),内部构造 UseCase 与仓储。骨架见技能包。
|
|
48
62
|
|
|
49
|
-
##
|
|
63
|
+
## 六、分层测试
|
|
50
64
|
|
|
51
65
|
Domain:Vitest 纯单测;Application:Mock 端口;Infra:MSW;Pres:VTU/Testing-Library。
|
|
52
66
|
|
|
53
|
-
##
|
|
67
|
+
## 七、命名(速查)
|
|
54
68
|
|
|
55
69
|
速查表见 @.agents/checklists/rd-fe.md。
|
|
56
70
|
|
|
57
|
-
##
|
|
71
|
+
## 八、交付检查清单
|
|
58
72
|
|
|
59
73
|
完整清单见 @.agents/checklists/rd-fe.md(交付前逐项核对,汇报只报未过项)。
|
|
60
74
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 产品经理角色 Prompt(短常驻)——需求分析/PRD/优先级/验收/多会话调度
|
|
3
3
|
role: pm
|
|
4
|
-
version:
|
|
4
|
+
version: 9
|
|
5
5
|
updated: 2026-09-21
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -10,6 +10,7 @@ updated: 2026-09-21
|
|
|
10
10
|
> 通用规范见 @.agents/common/output-format.md 与 @.agents/common/intercom-protocol.md(常驻)。
|
|
11
11
|
> 项目上下文:项目根 `AGENTS.md`(项目级属性/约束,PM 维护,pi 自动加载,见 §七)。
|
|
12
12
|
> 按需技能:@.agents/skills/pm-rice.md(优先级)、@.agents/skills/pm-grill.md(澄清)。
|
|
13
|
+
> @.agents/skills/codegraph.md(验收读码:node --file/--limit 行段读取,禁 cat 全文)。
|
|
13
14
|
|
|
14
15
|
资深 PM,负责需求全生命周期:收集 → 分析 → 优先级 → PRD → 评审 → 跟进 → 验收 → 复盘。核心职责:把模糊想法转成**目标明确、边界清晰、可验收**的规格。
|
|
15
16
|
|
|
@@ -68,12 +69,14 @@ updated: 2026-09-21
|
|
|
68
69
|
- **架构评审闸门**:PRD 涉及架构/NFR/选型时,开工确认后、派发前 `send` arch-designer 评审。纯 CRUD 跳过。
|
|
69
70
|
- **派发协议**:`send` 含任务编号/范围/AC/NFRs/文件路径;PRD 详情用 `attachments(snippet)`。worker `ask` → PM `reply`。
|
|
70
71
|
- **忙闲闸门(派发前)**:`list` 核对目标在线**且 `idle`** 才派完整任务;忙碌(`thinking`/`tool:*`)→ **不 send 任务内容**,直接记入待派发队列(`docs/tasks-state.md`),`list` 显示 `idle` 后再派(非交互 worker 忙时消息会被拒收,交互会话忙时 send 会 steer 打断);**紧急**才立即下发(交互会话可 steer 注入,注明 `紧急抢占:暂停当前任务,回执须报告挂起任务状态`;非交互会话只能排队)。
|
|
72
|
+
- **任务派生会话**:需要并行/隔离的任务用 `ensure <role>@<repo> --task <编号>` 派生独立会话(`--name <角色>-<编号>`,如 `rd-be-T1`),避免多任务共用常驻会话排队/打断、消除同名冲突;派生会话任务完成即结束,回执 role 写派生名(`[T1] done | rd-be-T1`)。
|
|
71
73
|
- **任务状态外部化(可恢复)**:运行时任务状态落盘 `docs/tasks-state.md`(待派发/进行中/已回执待验收/挂起/已归档五栏,骨架见 @.agents/templates/tasks-state.md.example),每次派发、回执、验收、抢占后更新;PM 会话重开(`ensure --force`)后**先读该文件重建状态**再继续调度,不依赖历史消息。
|
|
72
74
|
- **终态回执闸门**:每次派发(含架构评审)必须收到 worker 回 `[编号] done`(见 intercom-protocol「终态回执」);未见回执(含 arch 静默)→ 主动 `ask`/`send` 追讨,必要时上报用户,**不默认成功**。
|
|
73
75
|
- **角色提示词加载**:fleet.sh 拉起的会话已由 `--append-system-prompt` 启动期注入,
|
|
74
76
|
派发消息**不再**要求加载角色卡,仅要求回执 `已按 <role> 角色执行`;
|
|
75
77
|
**仅**对用户手工开、未注入的会话,才指示加载 `@.agents/prompts/<role>.md`。
|
|
76
|
-
- **验收闭环**:核对 AC
|
|
78
|
+
- **验收闭环**:核对 AC 五覆盖 + 回执「清单」字段(未核对则打回);验收 = 读变更文件核对 AC + 跑关键测试命令(PM 可读可跑,**不可改码**);依赖 QA 先行用例。
|
|
79
|
+
- **验收读码(省 token)**:用 `codegraph node --file <f> --offset <n> --limit <m>` 读变更文件关键行段,**禁 cat 全文**;只看变更点 + 对应 AC 的路径(技能见 codegraph.md)。
|
|
77
80
|
|
|
78
81
|
### 开工确认卡(强制闸门)
|
|
79
82
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 测试工程师角色 Prompt(短常驻)——策略/用例/缺陷/质量保障
|
|
3
3
|
role: qa
|
|
4
|
-
version:
|
|
4
|
+
version: 7
|
|
5
5
|
updated: 2026-09-21
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -67,6 +67,7 @@ DDD 分层对齐(简):
|
|
|
67
67
|
- [ ] 私自修改现有功能代码?
|
|
68
68
|
- [ ] 未经用户确认就执行测试?
|
|
69
69
|
- [ ] 未 Verify 就关闭缺陷?
|
|
70
|
+
- [ ] 定位被测代码/受影响测试未用 `codegraph node/affected`?(回退 grep 需注明原因)
|
|
70
71
|
|
|
71
72
|
> 完整红线(10 项)与交付检查清单(10 项):**交付前**读取 @.agents/checklists/qa.md 逐项核对。
|
|
72
73
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
# nao-fleet.sh status 角色会话在线状态(权威名单见 intercom list)
|
|
8
8
|
# nao-fleet.sh ensure <别名>[@<repo>] [更多...] 拉起角色窗口(默认工作区=roles.yaml workspace)
|
|
9
9
|
# nao-fleet.sh ensure -m <model> <别名>... 显式指定模型(须命中白名单)
|
|
10
|
+
# nao-fleet.sh ensure --task <编号> <别名>[@<repo>] 任务派生会话:--name <别名>-<编号>(并行隔离,避免同名冲突)
|
|
10
11
|
# nao-fleet.sh ensure --force <别名>... 忽略"已在运行"判重
|
|
11
12
|
#
|
|
12
13
|
# 角色别名 → 角色卡:见 .agents/roles.yaml(单一事实来源)
|
|
@@ -369,7 +370,7 @@ cmd_check() {
|
|
|
369
370
|
local wl_problems=0
|
|
370
371
|
|
|
371
372
|
echo "== 目录 =="
|
|
372
|
-
for d in "$PROMPTS_DIR" "$COMMON_DIR" "$SKILLS_SUB"; do
|
|
373
|
+
for d in "$PROMPTS_DIR" "$COMMON_DIR" "$SKILLS_SUB" "$SKILLS_DIR"/.agents/checklists; do
|
|
373
374
|
if [[ -d "$d" ]]; then printf ' ✓ %s\n' "$d"
|
|
374
375
|
else printf ' ✗ 缺失: %s\n' "$d"; rc=1; fi
|
|
375
376
|
done
|
|
@@ -520,11 +521,17 @@ cmd_status() {
|
|
|
520
521
|
printf ' · %-14s 未运行(ensure 拉起)\n' "$a"
|
|
521
522
|
fi
|
|
522
523
|
done
|
|
524
|
+
echo "== 任务派生会话(--task 拉起,如 rd-be-T1)=="
|
|
525
|
+
local found=0 line
|
|
526
|
+
while IFS= read -r line; do
|
|
527
|
+
[[ -n "$line" ]] && { printf ' · %s\n' "$line"; found=1; }
|
|
528
|
+
done < <(pgrep -af "pi[[:space:]].*--name (pm|arch-designer|rd-fe|rd-be|qa)-[A-Za-z0-9_-]+" 2>/dev/null | head -10)
|
|
529
|
+
(( found )) || echo ' (无)'
|
|
523
530
|
}
|
|
524
531
|
|
|
525
532
|
# ---------------------------------------------------------------------------
|
|
526
533
|
cmd_ensure() {
|
|
527
|
-
local force="$1" model="$2"; shift
|
|
534
|
+
local force="$1" model="$2" task="$3"; shift 3
|
|
528
535
|
local spec role repo key seen k
|
|
529
536
|
local -a cg_done=()
|
|
530
537
|
[[ $# -eq 0 ]] && die "ensure 需要至少一个角色,如: nao-fleet.sh ensure arch rd-fe"
|
|
@@ -536,15 +543,18 @@ cmd_ensure() {
|
|
|
536
543
|
fi
|
|
537
544
|
resolve_role "$role"
|
|
538
545
|
[[ -n "$repo" ]] || repo="${ROLE_WS[$NAME]:-$PWD}"
|
|
546
|
+
# 任务派生:会话名 = <角色>-<任务编号>,独立 intercom 身份(并行隔离,避免同名冲突)
|
|
547
|
+
local disp="$NAME"
|
|
548
|
+
[[ -n "$task" ]] && disp="${NAME}-${task}"
|
|
539
549
|
# CodeGraph 索引健康(同 repo 只查一次,不阻塞拉起)
|
|
540
550
|
key="$repo"; seen=0
|
|
541
551
|
for k in "${cg_done[@]:-}"; do [[ "$k" == "$key" ]] && seen=1; done
|
|
542
552
|
if (( ! seen )); then check_codegraph "$repo"; cg_done+=("$key"); fi
|
|
543
|
-
if [[ "$force" != "true" ]] && running "$
|
|
544
|
-
warn "$
|
|
553
|
+
if [[ "$force" != "true" ]] && running "$disp"; then
|
|
554
|
+
warn "$disp 已在运行(--name 识别),跳过;确需重开请加 --force"
|
|
545
555
|
continue
|
|
546
556
|
fi
|
|
547
|
-
spawn_one "$
|
|
557
|
+
spawn_one "$disp" "$repo" "$model"
|
|
548
558
|
done
|
|
549
559
|
}
|
|
550
560
|
|
|
@@ -570,6 +580,7 @@ while [[ $# -gt 0 ]]; do
|
|
|
570
580
|
check_model "$MODEL" || die "模型 '$MODEL' 不在白名单内。允许: $MODEL_WHITELIST(可通过 NAO_MODEL_WHITELIST 覆盖)"
|
|
571
581
|
shift 2 ;;
|
|
572
582
|
--force) FORCE=true; shift ;;
|
|
583
|
+
--task) TASK="${2:-}"; [[ -n "$TASK" ]] || die "--task 需要任务编号(如 T1)"; [[ "$TASK" =~ ^[A-Za-z0-9_-]+$ ]] || die "--task 非法: $TASK(仅字母/数字/-/_)"; shift 2 ;;
|
|
573
584
|
--strict) STRICT=true; shift ;;
|
|
574
585
|
-h|--help) usage ;;
|
|
575
586
|
*) TARGETS+=("$1"); shift ;;
|
|
@@ -583,6 +594,6 @@ esac
|
|
|
583
594
|
case "$CMD" in
|
|
584
595
|
check) cmd_check "$STRICT" ;;
|
|
585
596
|
status) cmd_status ;;
|
|
586
|
-
ensure) cmd_ensure "$FORCE" "$MODEL" "${TARGETS[@]}" ;;
|
|
597
|
+
ensure) cmd_ensure "$FORCE" "$MODEL" "$TASK" "${TARGETS[@]}" ;;
|
|
587
598
|
*) usage ;;
|
|
588
599
|
esac
|
|
@@ -76,6 +76,7 @@ class Mapper {
|
|
|
76
76
|
|
|
77
77
|
- 组件/样式禁裸色值(`#fff`/`rgba(...)`)、禁无令牌的魔法尺寸/圆角/阴影——一律 `var(--<prefix>-*)`;仅 tokens.css 允许定义令牌。
|
|
78
78
|
- 新 UI 用既有原语/基础组件组装;页面不另起风格。
|
|
79
|
+
- **改/新增组件默认延续项目既有风格**(先读同类组件/tokens/playbook,再提取风格模式);仅用户明确指定新风格才脱离,脱离时仍守 tokens 与可用性底线。
|
|
79
80
|
- 四态与反馈模式严格按 UX Playbook;交互变更须 PM/用户确认。
|
|
80
81
|
- 交付前:`bash "$NAO_SKILLS/.agents/scripts/ui-tokens-check.sh" <repo>`(进 CI 则自动拦截)。
|
|
81
82
|
|
package/README.md
CHANGED
|
@@ -109,7 +109,7 @@ PM 是任务状态权威,以状态机驱动执行:
|
|
|
109
109
|
| --- | --- | --- |
|
|
110
110
|
| `product-manager.md` | 产品经理(调度者) | 需求全生命周期、9 模块 PRD、RICE、多会话调度、终态回执闸门、**§七 AGENTS.md 项目上下文治理**、§十一 docs/prds 归档 |
|
|
111
111
|
| `architecture-designer.md` | 系统架构师(评审/咨询) | 技术选型四步法、评审签字 + ADR、终态回执 PM、降级规则 |
|
|
112
|
-
| `frontend-developer.md` | 前端研发 | 前端 DDD 五层、UI/UX
|
|
112
|
+
| `frontend-developer.md` | 前端研发 | 前端 DDD 五层、UI/UX 三层落地(先读项目既有风格→定方向→tokens/组件库,引用 frontend-design) |
|
|
113
113
|
| `backend-developer.md` | 后端研发 | Go DDD 四层、依赖倒置、事务/事件/错误约定 |
|
|
114
114
|
| `test-engineer.md` | 测试工程师 | 测试金字塔、AC=用例、缺陷闭环、视觉验收 |
|
|
115
115
|
|
|
@@ -136,6 +136,7 @@ PM 是任务状态权威,以状态机驱动执行:
|
|
|
136
136
|
.agents/scripts/nao-fleet.sh status # 角色在线状态(权威名单见 intercom list)
|
|
137
137
|
.agents/scripts/nao-fleet.sh ensure arch rd-fe # 拉起缺失角色
|
|
138
138
|
.agents/scripts/nao-fleet.sh ensure rd-be@/path/repo # 指定后端 repo(含 CodeGraph 索引提醒)
|
|
139
|
+
.agents/scripts/nao-fleet.sh ensure --task T1 rd-be@/path/repo # 任务派生会话:--name rd-be-T1(并行隔离,避免同名冲突)
|
|
139
140
|
.agents/scripts/ui-tokens-check.sh <repo> # 扫 UI 硬编码色值(绕过 Design Tokens)
|
|
140
141
|
```
|
|
141
142
|
|
package/bin/nao-skill.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* bash .agents/scripts/nao-fleet.sh check / ensure arch rd-fe ...
|
|
18
18
|
* 角色卡经 fleet 拉起时 --append-system-prompt 注入;checklists 按需读取
|
|
19
19
|
*/
|
|
20
|
+
import { execFileSync } from 'node:child_process';
|
|
20
21
|
import {
|
|
21
22
|
cpSync,
|
|
22
23
|
existsSync,
|
|
@@ -64,6 +65,67 @@ function copyDir(src, dst, force) {
|
|
|
64
65
|
return { copied, skipped, overwritten };
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
// 已知 pi 插件(nao 舰队生态),name → npm 包
|
|
69
|
+
const PI_PLUGINS = {
|
|
70
|
+
intercom: { pkg: 'pi-intercom', desc: '多会话协作(舰队机制核心依赖)' },
|
|
71
|
+
'ask-me': { pkg: 'pi-ask-me', desc: '提问/访谈工具' },
|
|
72
|
+
subagents: { pkg: 'pi-subagents', desc: '子代理委派' },
|
|
73
|
+
'web-access': { pkg: 'pi-web-access', desc: '网页访问' },
|
|
74
|
+
codegraph: { pkg: '@sean_pedersen/pi-codegraph', desc: 'CodeGraph 代码定位(pi 集成)' },
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
function piSettingsPath() {
|
|
78
|
+
return join(process.env.HOME || process.env.USERPROFILE || '', '.pi', 'agent', 'settings.json');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function readPackages() {
|
|
82
|
+
try {
|
|
83
|
+
const d = JSON.parse(readFileSync(piSettingsPath(), 'utf8'));
|
|
84
|
+
return Array.isArray(d.packages) ? d.packages : [];
|
|
85
|
+
} catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function installedPlugins() {
|
|
91
|
+
const pkgs = readPackages();
|
|
92
|
+
const out = {};
|
|
93
|
+
for (const [name, { pkg }] of Object.entries(PI_PLUGINS)) {
|
|
94
|
+
out[name] = pkgs.includes(`npm:${pkg}`) || pkgs.includes(pkg);
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function pluginsList() {
|
|
100
|
+
const installed = installedPlugins();
|
|
101
|
+
log(`pi 插件状态(settings: ${piSettingsPath()})`);
|
|
102
|
+
for (const [name, { pkg, desc }] of Object.entries(PI_PLUGINS)) {
|
|
103
|
+
console.log(` ${installed[name] ? '✓' : '·'} ${name.padEnd(11)} ${pkg.padEnd(26)} ${desc}${installed[name] ? '' : '(缺失)'}`);
|
|
104
|
+
}
|
|
105
|
+
console.log('\n安装: nao-skill plugins install <name...> | plugins install-all');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function pluginsInstall(names, all = false) {
|
|
109
|
+
const targets = all ? Object.keys(PI_PLUGINS) : names;
|
|
110
|
+
const todo = [];
|
|
111
|
+
for (const n of targets) {
|
|
112
|
+
const p = PI_PLUGINS[n];
|
|
113
|
+
if (!p) { warn(`未知插件: ${n}(可用: ${Object.keys(PI_PLUGINS).join(', ')})`); continue; }
|
|
114
|
+
if (installedPlugins()[n]) { log(`已安装: ${n}`); continue; }
|
|
115
|
+
todo.push([n, p]);
|
|
116
|
+
}
|
|
117
|
+
if (!todo.length) { log('全部插件已就绪。'); return; }
|
|
118
|
+
for (const [n, p] of todo) {
|
|
119
|
+
log(`安装 ${n} → pi install npm:${p.pkg} ...`);
|
|
120
|
+
try {
|
|
121
|
+
execFileSync('pi', ['install', `npm:${p.pkg}`], { stdio: 'inherit' });
|
|
122
|
+
log(`✓ ${n} 安装完成(重启 pi 会话后生效)`);
|
|
123
|
+
} catch (e) {
|
|
124
|
+
warn(`✗ ${n} 安装失败: ${e.message}(确认 pi 已安装且在 PATH)`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
67
129
|
function install(target, force) {
|
|
68
130
|
if (!existsSync(SRC)) {
|
|
69
131
|
warn(`包内 .agents 缺失:${SRC}(发布物损坏?)`);
|
|
@@ -154,7 +216,11 @@ function help() {
|
|
|
154
216
|
|
|
155
217
|
用法:
|
|
156
218
|
nao-skill install [dir] [--force] 安装/合并 .agents/ 到目标项目(默认当前目录)
|
|
219
|
+
nao-skill install --plugins 项目接入时顺带安装 pi 舰队插件
|
|
157
220
|
nao-skill update [dir] 升级已有安装:源优先覆盖 + 清理废弃路径 + 保留项目自定义
|
|
221
|
+
nao-skill plugins list 列出已知 pi 插件与安装状态
|
|
222
|
+
nao-skill plugins install <名...> 安装指定插件(intercom/ask-me/subagents/web-access/codegraph)
|
|
223
|
+
nao-skill plugins install-all 安装全部舰队插件
|
|
158
224
|
nao-skill --version 显示版本
|
|
159
225
|
nao-skill --help 显示本帮助
|
|
160
226
|
|
|
@@ -179,9 +245,11 @@ if (cmd === '--version' || cmd === '-v' || cmd === 'version') {
|
|
|
179
245
|
} else if (cmd === 'install' || cmd === 'i') {
|
|
180
246
|
let target = process.cwd();
|
|
181
247
|
let force = false;
|
|
248
|
+
let withPlugins = false;
|
|
182
249
|
const rest = args.slice(1);
|
|
183
250
|
for (let i = 0; i < rest.length; i++) {
|
|
184
251
|
if (rest[i] === '--force' || rest[i] === '-f') force = true;
|
|
252
|
+
else if (rest[i] === '--plugins') withPlugins = true;
|
|
185
253
|
else if (rest[i] === '--target') target = resolve(rest[++i]);
|
|
186
254
|
else if (!rest[i].startsWith('-')) target = resolve(rest[i]);
|
|
187
255
|
else { warn(`未知参数: ${rest[i]}`); process.exit(2); }
|
|
@@ -191,6 +259,20 @@ if (cmd === '--version' || cmd === '-v' || cmd === 'version') {
|
|
|
191
259
|
process.exit(2);
|
|
192
260
|
}
|
|
193
261
|
install(target, force);
|
|
262
|
+
if (withPlugins) pluginsInstall([], true);
|
|
263
|
+
} else if (cmd === 'plugins' || cmd === 'plugin') {
|
|
264
|
+
const sub = args[1];
|
|
265
|
+
const rest = args.slice(2);
|
|
266
|
+
if (sub === 'list' || sub === 'ls' || !sub) {
|
|
267
|
+
pluginsList();
|
|
268
|
+
} else if (sub === 'install' || sub === 'add') {
|
|
269
|
+
pluginsInstall(rest);
|
|
270
|
+
} else if (sub === 'install-all' || sub === 'installAll') {
|
|
271
|
+
pluginsInstall([], true);
|
|
272
|
+
} else {
|
|
273
|
+
warn(`未知插件命令: ${sub}(可用: list / install / install-all)`);
|
|
274
|
+
process.exit(2);
|
|
275
|
+
}
|
|
194
276
|
} else if (cmd === 'update' || cmd === 'u') {
|
|
195
277
|
let target = process.cwd();
|
|
196
278
|
const rest = args.slice(1);
|
|
@@ -205,6 +287,6 @@ if (cmd === '--version' || cmd === '-v' || cmd === 'version') {
|
|
|
205
287
|
}
|
|
206
288
|
update(target);
|
|
207
289
|
} else {
|
|
208
|
-
warn(`未知命令: ${cmd}(可用: install)`);
|
|
290
|
+
warn(`未知命令: ${cmd}(可用: install, update, plugins)`);
|
|
209
291
|
process.exit(2);
|
|
210
292
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nathan33/nao-skill",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "nao 多角色 AI 开发舰队:角色卡 / 技能 / 协作协议 / 工具链,一键接入项目(pi / Claude / 任意 Agent)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -30,5 +30,13 @@
|
|
|
30
30
|
"scripts": {
|
|
31
31
|
"test": "bash .agents/scripts/nao-fleet.sh check",
|
|
32
32
|
"prepack": "bash .agents/scripts/nao-fleet.sh check"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/Nathan3303/nao-skills.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/Nathan3303/nao-skills",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/Nathan3303/nao-skills/issues"
|
|
33
41
|
}
|
|
34
42
|
}
|