@zhouhao4221/devflow-skills 0.2.0 → 0.3.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/README.md +57 -235
- package/install.js +406 -116
- package/package.json +2 -1
- package/plugins/api/skills/api/SKILL.md +102 -0
- package/plugins/api/skills/api-field-mapper/SKILL.md +95 -0
- package/plugins/api/skills/config/SKILL.md +140 -0
- package/plugins/api/skills/gen/SKILL.md +345 -0
- package/plugins/api/skills/help/SKILL.md +121 -0
- package/plugins/api/skills/import/SKILL.md +95 -0
- package/plugins/api/skills/map/SKILL.md +152 -0
- package/plugins/api/skills/search/SKILL.md +95 -0
- package/plugins/diag/skills/audit/SKILL.md +103 -0
- package/plugins/diag/skills/diag/SKILL.md +41 -0
- package/plugins/diag/skills/diagnose/SKILL.md +167 -0
- package/plugins/diag/skills/init/SKILL.md +142 -0
- package/plugins/diag/skills/stack-analyzer/SKILL.md +150 -0
- package/plugins/pm/skills/ask/SKILL.md +89 -0
- package/plugins/pm/skills/brief/SKILL.md +95 -0
- package/plugins/pm/skills/export/SKILL.md +93 -0
- package/plugins/pm/skills/help/SKILL.md +257 -0
- package/plugins/pm/skills/milestone/SKILL.md +102 -0
- package/plugins/pm/skills/monthly/SKILL.md +111 -0
- package/plugins/pm/skills/plan/SKILL.md +96 -0
- package/plugins/pm/skills/pm/SKILL.md +174 -0
- package/plugins/pm/skills/progress/SKILL.md +113 -0
- package/plugins/pm/skills/report-generator/SKILL.md +104 -0
- package/plugins/pm/skills/risk/SKILL.md +223 -0
- package/plugins/pm/skills/standup/SKILL.md +96 -0
- package/plugins/pm/skills/stats/SKILL.md +158 -0
- package/plugins/pm/skills/weekly/SKILL.md +157 -0
- package/plugins/req/skills/branch/SKILL.md +447 -0
- package/plugins/req/skills/cache/SKILL.md +232 -0
- package/plugins/req/skills/changelog/SKILL.md +187 -0
- package/plugins/req/skills/changelog-generator/SKILL.md +106 -0
- package/plugins/req/skills/code-impact-analyzer/SKILL.md +48 -0
- package/plugins/req/skills/commit/SKILL.md +308 -0
- package/plugins/req/skills/dev/SKILL.md +229 -0
- package/plugins/req/skills/dev-guide/SKILL.md +530 -0
- package/plugins/req/skills/do/SKILL.md +191 -0
- package/plugins/req/skills/done/SKILL.md +95 -0
- package/plugins/req/skills/edit/SKILL.md +187 -0
- package/plugins/req/skills/fix/SKILL.md +300 -0
- package/plugins/req/skills/help/SKILL.md +136 -0
- package/plugins/req/skills/init/SKILL.md +505 -0
- package/plugins/req/skills/issue/SKILL.md +237 -0
- package/plugins/req/skills/issue-guide/SKILL.md +125 -0
- package/plugins/req/skills/migrate/SKILL.md +128 -0
- package/plugins/req/skills/modules/SKILL.md +195 -0
- package/plugins/req/skills/natural-language-dispatcher/SKILL.md +545 -0
- package/plugins/req/skills/new/SKILL.md +172 -0
- package/plugins/req/skills/new-quick/SKILL.md +246 -0
- package/plugins/req/skills/pr/SKILL.md +157 -0
- package/plugins/req/skills/prd/SKILL.md +187 -0
- package/plugins/req/skills/prd-analyzer/SKILL.md +131 -0
- package/plugins/req/skills/prd-edit/SKILL.md +201 -0
- package/plugins/req/skills/projects/SKILL.md +115 -0
- package/plugins/req/skills/quick-fix-guide/SKILL.md +51 -0
- package/plugins/req/skills/release/SKILL.md +300 -0
- package/plugins/req/skills/release-rationale/SKILL.md +213 -0
- package/plugins/req/skills/req/SKILL.md +173 -0
- package/plugins/req/skills/requirement-analyzer/SKILL.md +274 -0
- package/plugins/req/skills/review/SKILL.md +201 -0
- package/plugins/req/skills/review-pr/SKILL.md +699 -0
- package/plugins/req/skills/show/SKILL.md +302 -0
- package/plugins/req/skills/specs/SKILL.md +99 -0
- package/plugins/req/skills/split/SKILL.md +164 -0
- package/plugins/req/skills/status/SKILL.md +184 -0
- package/plugins/req/skills/test/SKILL.md +431 -0
- package/plugins/req/skills/test-guide/SKILL.md +304 -0
- package/plugins/req/skills/test_new/SKILL.md +417 -0
- package/plugins/req/skills/test_regression/SKILL.md +298 -0
- package/plugins/req/skills/update/SKILL.md +131 -0
- package/plugins/req/skills/update-template/SKILL.md +203 -0
- package/plugins/req/skills/upgrade/SKILL.md +178 -0
- package/plugins/req/skills/use/SKILL.md +158 -0
- package/plugins/req/skills/version-bumper/SKILL.md +113 -0
- package/plugins/uat/skills/bug/SKILL.md +153 -0
- package/plugins/uat/skills/init/SKILL.md +88 -0
- package/plugins/uat/skills/new/SKILL.md +131 -0
- package/plugins/uat/skills/report/SKILL.md +48 -0
- package/plugins/uat/skills/run/SKILL.md +78 -0
- package/plugins/uat/skills/uat/SKILL.md +64 -0
- package/plugins/uat/skills/uat-executor/SKILL.md +299 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: init
|
|
3
|
+
description: |
|
|
4
|
+
初始化 Diag 插件 - 创建 ~/.claude-diag/ 配置目录 + 服务清单模板 + 依赖检查
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /diag:init - 初始化 Diag 插件
|
|
8
|
+
|
|
9
|
+
首次使用 Diag 插件时执行,完成以下事项:
|
|
10
|
+
|
|
11
|
+
1. **依赖检查**:`python3`、`jq`、`ssh`、`yq` 或 `pyyaml`
|
|
12
|
+
2. **创建目录**:`~/.claude-diag/{config,audit}/`(700 权限)
|
|
13
|
+
3. **生成配置模板**:`~/.claude-diag/config/services.yaml`(600 权限)
|
|
14
|
+
4. **引导配置**:让用户将真实服务登记到 `services.yaml`
|
|
15
|
+
5. **配置校验**:确保必填字段齐全
|
|
16
|
+
6. **(可选)空跑测试**:SSH `echo ok` 验证 Hook 链路
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 执行流程
|
|
21
|
+
|
|
22
|
+
### 1. 运行初始化脚本
|
|
23
|
+
|
|
24
|
+
调用 `init-diag.sh`,该脚本会:
|
|
25
|
+
- 检查 `python3 / jq / ssh / yq(或 pyyaml)` 是否可用,缺失则终止
|
|
26
|
+
- 创建 `~/.claude-diag/config/` 和 `~/.claude-diag/audit/`
|
|
27
|
+
- 若 `services.yaml` 不存在,则从模板拷贝(已存在时不覆盖)
|
|
28
|
+
- 打印目录结构和下一步指引
|
|
29
|
+
|
|
30
|
+
### 2. 创建项目 Runbook 目录
|
|
31
|
+
|
|
32
|
+
在当前项目的 `docs/runbooks/` 创建事故处理文档骨架,仅当文件不存在时创建:
|
|
33
|
+
|
|
34
|
+
| 文件 | 用途 |
|
|
35
|
+
|------|------|
|
|
36
|
+
| `db-slow-query.md` | 数据库慢查询处理 |
|
|
37
|
+
| `oom.md` | 内存溢出处理 |
|
|
38
|
+
| `5xx-spike.md` | 接口报错飙升处理 |
|
|
39
|
+
| `deployment-rollback.md` | 部署回滚流程 |
|
|
40
|
+
|
|
41
|
+
每个文件使用统一的 5 节骨架,节内容留空,在 `/diag:diagnose` 诊断完事故后由 AI 协作补写:
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
# <事故类型>
|
|
45
|
+
|
|
46
|
+
> <一行用途说明>
|
|
47
|
+
|
|
48
|
+
## 什么时候用
|
|
49
|
+
|
|
50
|
+
<!-- 触发条件和典型症状 -->
|
|
51
|
+
|
|
52
|
+
## 必备输入
|
|
53
|
+
|
|
54
|
+
<!-- 开始诊断前需要收集的信息(日志、监控指标、错误码等) -->
|
|
55
|
+
|
|
56
|
+
## 触发方式
|
|
57
|
+
|
|
58
|
+
<!-- /diag:diagnose 命令模板 + 需要提供的上下文 -->
|
|
59
|
+
|
|
60
|
+
## 优质输出标准
|
|
61
|
+
|
|
62
|
+
<!-- 定位到根因、给出可执行的修复步骤 -->
|
|
63
|
+
|
|
64
|
+
## 常见失败模式
|
|
65
|
+
|
|
66
|
+
| 问题 | 原因 | 解决方案 |
|
|
67
|
+
|------|------|----------|
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
若不在 git 仓库目录下运行(`git rev-parse --is-inside-work-tree` 失败),跳过此步骤。
|
|
71
|
+
|
|
72
|
+
### 3. 引导用户编辑服务清单
|
|
73
|
+
|
|
74
|
+
脚本结束后向用户展示:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
✅ 已创建配置模板:~/.claude-diag/config/services.yaml
|
|
78
|
+
|
|
79
|
+
请现在告诉我你的服务信息,我帮你填写(或你自己编辑后回复"已填写"):
|
|
80
|
+
|
|
81
|
+
- 服务名(如 order-api):
|
|
82
|
+
- 主机(对应 ~/.ssh/config 里的 Host 名 或 user@ip):
|
|
83
|
+
- 日志路径(可以多条):
|
|
84
|
+
- 语言栈(可选,java/node/python/go/ruby/php):
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**用户配合方式**:
|
|
88
|
+
- **方式 A(对话录入)**:用户说"服务名 order-api,主机 prod-web-01,日志 /var/log/app/order.log",AI 用 `Edit` 工具改 `~/.claude-diag/config/services.yaml`
|
|
89
|
+
- **方式 B(自行编辑)**:用户说"我自己编辑",AI 等待用户说"已填写"后继续校验
|
|
90
|
+
|
|
91
|
+
### 4. 校验配置
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
bash "${CLAUDE_PLUGIN_ROOT}/scripts/services-config.sh" validate
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- 通过 → 展示服务数量
|
|
98
|
+
- 失败 → 展示具体错误(缺字段 / 重名 / language_hint 非法),让用户修复后重试
|
|
99
|
+
|
|
100
|
+
### 5. (可选)Hook 空跑测试
|
|
101
|
+
|
|
102
|
+
询问用户是否跑一次空测试:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
是否执行一次空测试?(SSH <host> 'echo ok' 验证 Hook 链路是否生效) [Y/n]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
若同意:
|
|
109
|
+
1. 从 `services.yaml` 取第一个服务的 host
|
|
110
|
+
2. 执行 `ssh <host> 'echo ok'`(应被 Hook 放行,因 echo 在白名单)
|
|
111
|
+
3. 展示退出码和 `~/.claude-diag/audit/` 下的 JSONL 条目,证明链路通
|
|
112
|
+
|
|
113
|
+
**注意**:本期不强制执行空测试,用户拒绝即跳过。
|
|
114
|
+
|
|
115
|
+
### 6. 输出总结
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
✅ Diag 插件初始化完成
|
|
119
|
+
|
|
120
|
+
配置:~/.claude-diag/config/services.yaml(2 个服务)
|
|
121
|
+
审计:~/.claude-diag/audit/
|
|
122
|
+
Runbook:docs/runbooks/(4 个骨架文件,诊断完事故后补写内容)
|
|
123
|
+
|
|
124
|
+
下一步:
|
|
125
|
+
- /diag:diagnose <报错描述> 开始诊断
|
|
126
|
+
- /diag:audit 查审计日志
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 边界
|
|
132
|
+
|
|
133
|
+
- 只在 **primary** 仓库意义上执行(插件无 primary/readonly 区分,但应在用户本机执行,不要在 CI/CD 环境)
|
|
134
|
+
- `~/.claude-diag/` 不纳入任何仓库;多机协作时,每台机器独立 init
|
|
135
|
+
|
|
136
|
+
## 故障排查
|
|
137
|
+
|
|
138
|
+
| 问题 | 诊断 |
|
|
139
|
+
|---|---|
|
|
140
|
+
| `yq/pyyaml 都没装` | 选一:`brew install yq` 或 `pip3 install pyyaml` |
|
|
141
|
+
| `services.yaml 已存在` | 脚本不覆盖,可手动 `rm ~/.claude-diag/config/services.yaml` 后重 init |
|
|
142
|
+
| `Hook 不生效` | 重启 Claude Code 让插件加载;检查 `.claude/settings.local.json` 的 `enabledPlugins.diag@devflow: true` |
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stack-analyzer
|
|
3
|
+
description: |
|
|
4
|
+
生产报错堆栈识别助手。仅在执行 /diag:diagnose 命令期间触发。
|
|
5
|
+
根据日志片段识别多语言栈的异常格式(Java / Node / Python / Go / Ruby / PHP 等),
|
|
6
|
+
抽取异常类型、错误消息、堆栈帧(文件/行号/方法),为下一步本地代码关联提供结构化输入。
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 生产报错堆栈识别助手
|
|
10
|
+
|
|
11
|
+
## 触发条件
|
|
12
|
+
|
|
13
|
+
仅在执行 `/diag:diagnose` 命令并获取到日志片段后触发。
|
|
14
|
+
|
|
15
|
+
## 输入
|
|
16
|
+
|
|
17
|
+
- `log_snippet`:SSH 拉回的日志文本(tail + grep 后)
|
|
18
|
+
- `language_hint`(可选):服务配置里的语言提示,值为 `java / node / python / go / ruby / php` 之一
|
|
19
|
+
|
|
20
|
+
## 输出(结构化)
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
error_type: "java.lang.NullPointerException" # 异常类 / 错误类型
|
|
24
|
+
message: "Cannot invoke ... because coupon is null" # 核心消息
|
|
25
|
+
frames:
|
|
26
|
+
- file: "OrderService.java"
|
|
27
|
+
line: 142
|
|
28
|
+
method: "com.example.order.OrderService.submit"
|
|
29
|
+
qualified: "com.example.order.OrderService"
|
|
30
|
+
- file: "OrderController.java"
|
|
31
|
+
line: 87
|
|
32
|
+
method: "com.example.order.OrderController.create"
|
|
33
|
+
qualified: "com.example.order.OrderController"
|
|
34
|
+
evidence: "2026-04-20 02:31:05 [http-nio-8080-exec-3] ERROR ..." # 原始行截取,便于对照
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
无法识别时输出:
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
error_type: "unknown"
|
|
41
|
+
message: "<摘要>"
|
|
42
|
+
frames: []
|
|
43
|
+
note: "未识别堆栈格式,原始片段见 evidence"
|
|
44
|
+
evidence: "<原始日志截取>"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 识别策略(按 language_hint 优先)
|
|
48
|
+
|
|
49
|
+
### Java (Spring / Tomcat 等)
|
|
50
|
+
|
|
51
|
+
格式特征:
|
|
52
|
+
```
|
|
53
|
+
java.lang.NullPointerException: Cannot invoke ...
|
|
54
|
+
at com.example.Foo.bar(Foo.java:42) ~[app.jar:?]
|
|
55
|
+
at com.example.Baz.qux(Baz.java:87) ~[app.jar:?]
|
|
56
|
+
Caused by: ...
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
抽取规则:
|
|
60
|
+
- 异常行:正则 `^\w+(?:\.\w+)*(?:Exception|Error)(?::.*)?$`
|
|
61
|
+
- 帧行:`at <qualified>.<method>\(<file>:<line>\)`
|
|
62
|
+
- 保留 `Caused by` 链
|
|
63
|
+
|
|
64
|
+
### Node.js (V8 trace)
|
|
65
|
+
|
|
66
|
+
格式特征:
|
|
67
|
+
```
|
|
68
|
+
TypeError: Cannot read property 'foo' of undefined
|
|
69
|
+
at OrderService.submit (/app/src/services/order.js:142:15)
|
|
70
|
+
at /app/src/routes/order.js:87:23
|
|
71
|
+
at processTicksAndRejections (node:internal/process/task_queues:96:5)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
抽取规则:
|
|
75
|
+
- 首行:`<ErrorType>: <message>`
|
|
76
|
+
- 帧:`at (?:<method> )?\((?<file>.+):(?<line>\d+):(?<col>\d+)\)` 或 `at (?<file>.+):(?<line>\d+):(?<col>\d+)`
|
|
77
|
+
- 内置模块(`node:internal/`)标注为"运行时内部"
|
|
78
|
+
|
|
79
|
+
### Python
|
|
80
|
+
|
|
81
|
+
格式特征:
|
|
82
|
+
```
|
|
83
|
+
Traceback (most recent call last):
|
|
84
|
+
File "/app/order/service.py", line 142, in submit
|
|
85
|
+
return self._calculate(coupon.discount)
|
|
86
|
+
AttributeError: 'NoneType' object has no attribute 'discount'
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
抽取规则:
|
|
90
|
+
- 帧:`File "<file>", line <line>, in <method>`
|
|
91
|
+
- 末行:`<ErrorType>: <message>`
|
|
92
|
+
|
|
93
|
+
### Go
|
|
94
|
+
|
|
95
|
+
格式特征:
|
|
96
|
+
```
|
|
97
|
+
panic: runtime error: invalid memory address or nil pointer dereference
|
|
98
|
+
[signal SIGSEGV: segmentation violation]
|
|
99
|
+
|
|
100
|
+
goroutine 42 [running]:
|
|
101
|
+
main.(*OrderService).Submit(0xc0001f0000, 0x0)
|
|
102
|
+
/app/order/service.go:142 +0x2a
|
|
103
|
+
main.orderHandler(...)
|
|
104
|
+
/app/order/handler.go:87
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
抽取规则:
|
|
108
|
+
- panic 首行 → error_type + message
|
|
109
|
+
- 帧:下一行是 `<file>:<line>`,上一行是 `<pkg>.<method>`
|
|
110
|
+
|
|
111
|
+
### Ruby
|
|
112
|
+
|
|
113
|
+
格式特征:
|
|
114
|
+
```
|
|
115
|
+
NoMethodError (undefined method `discount' for nil:NilClass):
|
|
116
|
+
app/services/order_service.rb:142:in `submit'
|
|
117
|
+
app/controllers/orders_controller.rb:87:in `create'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
抽取规则:
|
|
121
|
+
- 首行:`<ErrorType> (<message>)`
|
|
122
|
+
- 帧:`<file>:<line>:in '<method>'`
|
|
123
|
+
|
|
124
|
+
### PHP
|
|
125
|
+
|
|
126
|
+
格式特征:
|
|
127
|
+
```
|
|
128
|
+
PHP Fatal error: Uncaught TypeError: ... in /app/OrderService.php:142
|
|
129
|
+
Stack trace:
|
|
130
|
+
#0 /app/OrderController.php(87): OrderService->submit()
|
|
131
|
+
#1 {main}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
抽取规则:
|
|
135
|
+
- 首行:`TypeError: <message>`
|
|
136
|
+
- 帧:`#<n> <file>(<line>): <class>-><method>\(\)`
|
|
137
|
+
|
|
138
|
+
### 未知 / 混合
|
|
139
|
+
|
|
140
|
+
若 `language_hint` 为空且首行不匹配上述特征:
|
|
141
|
+
- 尝试全部模式,取命中数最多的
|
|
142
|
+
- 仍无命中 → 输出 `error_type: "unknown"`,把日志中 `ERROR`/`Exception` 附近 20 行作为 evidence 返回
|
|
143
|
+
|
|
144
|
+
## 使用建议
|
|
145
|
+
|
|
146
|
+
- **不要构造堆栈**:识别不出就说"未识别",不要猜测或编造帧。
|
|
147
|
+
- **保留原文**:`evidence` 字段必须是原始日志片段,便于人工核对。
|
|
148
|
+
- **优先 language_hint**:命中后不再尝试其他语言,减少误识别。
|
|
149
|
+
- **只抽取第一个异常链**:日志片段中可能有多个异常,只取最早/最完整的那个。
|
|
150
|
+
- **裁剪噪声**:框架内部帧(如 `org.springframework.web.*`、`node:internal/*`)放到 frames 末尾或标注,避免喧宾夺主。
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ask
|
|
3
|
+
description: |
|
|
4
|
+
自由提问 - 基于项目数据回答任何项目相关问题
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 自由提问
|
|
8
|
+
|
|
9
|
+
> **Audience:** Product Manager
|
|
10
|
+
|
|
11
|
+
基于项目的 PRD、需求文档、Git 记录等数据,回答任何项目相关问题。
|
|
12
|
+
|
|
13
|
+
## 命令格式
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/pm:ask <问题>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**示例:**
|
|
20
|
+
- `/pm:ask 还有几个需求没完成?`
|
|
21
|
+
- `/pm:ask 上周谁的提交最多?`
|
|
22
|
+
- `/pm:ask 哪个模块的需求最多?`
|
|
23
|
+
- `/pm:ask 最近一个版本包含了哪些功能?`
|
|
24
|
+
- `/pm:ask 项目的技术栈是什么?`
|
|
25
|
+
- `/pm:ask 帮我写一段给客户的进展邮件`
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 执行流程
|
|
30
|
+
|
|
31
|
+
### 1. 分析问题意图
|
|
32
|
+
|
|
33
|
+
根据问题关键词判断需要哪些数据:
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
question = args.question
|
|
37
|
+
|
|
38
|
+
# 关键词 → 数据源映射
|
|
39
|
+
if matches(question, ["需求", "进度", "完成", "待办", "状态"]):
|
|
40
|
+
data["reqs"] = collect_requirements()
|
|
41
|
+
|
|
42
|
+
if matches(question, ["提交", "代码", "贡献", "git", "变更"]):
|
|
43
|
+
data["git"] = collect_git_stats()
|
|
44
|
+
|
|
45
|
+
if matches(question, ["模块", "功能", "架构"]):
|
|
46
|
+
data["modules"] = collect_modules()
|
|
47
|
+
|
|
48
|
+
if matches(question, ["PRD", "产品", "愿景", "规划", "技术栈"]):
|
|
49
|
+
data["prd"] = collect_prd()
|
|
50
|
+
|
|
51
|
+
if matches(question, ["版本", "发布", "tag", "里程碑"]):
|
|
52
|
+
data["tags"] = git_tags()
|
|
53
|
+
|
|
54
|
+
# 无法判断时,采集全部数据
|
|
55
|
+
if not data:
|
|
56
|
+
data = collect_all()
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. AI 基于数据回答
|
|
60
|
+
|
|
61
|
+
**回答原则:**
|
|
62
|
+
- 必须基于实际项目数据,不编造
|
|
63
|
+
- 给出具体数字和引用
|
|
64
|
+
- 如果数据不足以回答,明确说明缺少什么
|
|
65
|
+
- 区分事实和推测
|
|
66
|
+
|
|
67
|
+
### 3. 输出格式
|
|
68
|
+
|
|
69
|
+
自由格式,根据问题类型调整:
|
|
70
|
+
- 数量类问题 → 简短数字回答 + 详细列表
|
|
71
|
+
- 分析类问题 → 结构化分析
|
|
72
|
+
- 生成类问题 → 直接生成内容
|
|
73
|
+
- 对比类问题 → 表格对比
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
/pm:ask
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
Q: <用户问题>
|
|
81
|
+
|
|
82
|
+
A: <基于项目数据的回答>
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 用户输入
|
|
88
|
+
|
|
89
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brief
|
|
3
|
+
description: |
|
|
4
|
+
项目简介 - 生成面向新人或客户的项目概述
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 项目简介
|
|
8
|
+
|
|
9
|
+
> **Audience:** Product Manager
|
|
10
|
+
|
|
11
|
+
生成项目概述文档,适合给新成员、客户或外部合作方了解项目全貌。
|
|
12
|
+
|
|
13
|
+
## 命令格式
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/pm:brief [--lang=zh|en] [--audience=新人|客户|外部] [--save]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**参数说明:**
|
|
20
|
+
- `--lang`:可选,语言,默认 zh(中文)
|
|
21
|
+
- `--audience`:可选,受众,影响语言风格和侧重点,默认「新人」
|
|
22
|
+
- `--save`:可选,直接保存不询问
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
### 1. 采集数据
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
prd = collect_prd() # 产品愿景、功能规划
|
|
32
|
+
reqs = collect_requirements()
|
|
33
|
+
modules = collect_modules()
|
|
34
|
+
git = collect_git_stats() # 代码规模
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. 按受众生成
|
|
38
|
+
|
|
39
|
+
| 受众 | 侧重点 |
|
|
40
|
+
|------|--------|
|
|
41
|
+
| 新人 | 技术栈、项目结构、模块职责、如何上手 |
|
|
42
|
+
| 客户 | 产品愿景、核心功能、交付进度、技术保障 |
|
|
43
|
+
| 外部 | 项目概况、规模、成熟度 |
|
|
44
|
+
|
|
45
|
+
### 3. 输出格式
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
项目简介
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
## 项目概述
|
|
53
|
+
|
|
54
|
+
(从 PRD 愿景提取,或 AI 根据项目数据总结)
|
|
55
|
+
|
|
56
|
+
## 核心功能
|
|
57
|
+
|
|
58
|
+
(从模块文档和已完成需求推导)
|
|
59
|
+
|
|
60
|
+
| 模块 | 核心功能 | 状态 |
|
|
61
|
+
|------|---------|------|
|
|
62
|
+
| 用户模块 | 注册、登录、积分、等级 | 运行中 |
|
|
63
|
+
| 订单模块 | 下单、支付、退款、导出 | 开发中 |
|
|
64
|
+
|
|
65
|
+
## 技术架构
|
|
66
|
+
|
|
67
|
+
(从 CLAUDE.md 和 PRD 技术选型提取)
|
|
68
|
+
|
|
69
|
+
## 项目规模
|
|
70
|
+
|
|
71
|
+
| 指标 | 数值 |
|
|
72
|
+
|------|------|
|
|
73
|
+
| 代码行数 | ~XX,XXX |
|
|
74
|
+
| 源文件数 | XX |
|
|
75
|
+
| 需求总数 | XX(已完成 XX) |
|
|
76
|
+
| 版本数量 | XX |
|
|
77
|
+
| 团队规模 | XX 人 |
|
|
78
|
+
|
|
79
|
+
## 当前进展
|
|
80
|
+
|
|
81
|
+
(从活跃需求推导当前重点工作)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
*由 /pm:brief 自动生成 · YYYY-MM-DD*
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 4. 提供保存选项
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
offer_save(content, "docs/reports/brief.md")
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 用户输入
|
|
94
|
+
|
|
95
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: export
|
|
3
|
+
description: |
|
|
4
|
+
导出内容 - 将 pm 生成的内容保存到 docs/reports/
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 导出内容
|
|
8
|
+
|
|
9
|
+
> **Audience:** Product Manager
|
|
10
|
+
|
|
11
|
+
将最近一次 pm 命令生成的内容保存到 `docs/reports/` 目录。
|
|
12
|
+
也可以直接指定要执行的命令并保存结果。
|
|
13
|
+
|
|
14
|
+
## 命令格式
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/pm:export [命令名] [--format=md] [--path=自定义路径]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**参数说明:**
|
|
21
|
+
- `命令名`:可选,指定要执行并导出的命令(如 `weekly`、`stats`)
|
|
22
|
+
- `--format`:可选,输出格式,默认 md
|
|
23
|
+
- `--path`:可选,自定义保存路径
|
|
24
|
+
|
|
25
|
+
**示例:**
|
|
26
|
+
- `/pm:export weekly` — 生成周报并直接保存
|
|
27
|
+
- `/pm:export stats --from=2026-03-01` — 生成统计并保存
|
|
28
|
+
- `/pm:export --path=给客户的报告.md` — 保存到自定义路径
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 执行流程
|
|
33
|
+
|
|
34
|
+
### 1. 确定内容来源
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
if args.command:
|
|
38
|
+
# 执行指定命令获取内容
|
|
39
|
+
content = execute_pm_command(args.command, args)
|
|
40
|
+
else:
|
|
41
|
+
# 提示用户指定命令
|
|
42
|
+
print("请指定要导出的命令:")
|
|
43
|
+
print(" /pm:export weekly")
|
|
44
|
+
print(" /pm:export stats")
|
|
45
|
+
print(" /pm:export progress")
|
|
46
|
+
exit()
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 2. 确定保存路径
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
if args.path:
|
|
53
|
+
save_path = args.path
|
|
54
|
+
else:
|
|
55
|
+
# 按命令类型自动生成路径
|
|
56
|
+
paths = {
|
|
57
|
+
"weekly": f"docs/reports/weekly/{to_date}.md",
|
|
58
|
+
"monthly": f"docs/reports/monthly/{month}.md",
|
|
59
|
+
"milestone": f"docs/reports/milestone/{version}.md",
|
|
60
|
+
"stats": f"docs/reports/stats/{today}.md",
|
|
61
|
+
"progress": f"docs/reports/progress/{today}.md",
|
|
62
|
+
"risk": f"docs/reports/risk/{today}.md",
|
|
63
|
+
"plan": f"docs/reports/plans/{topic_slug}.md",
|
|
64
|
+
"brief": "docs/reports/brief.md",
|
|
65
|
+
}
|
|
66
|
+
save_path = paths.get(args.command, f"docs/reports/custom/{today}.md")
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. 保存文件
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
mkdir_p(dirname(save_path))
|
|
73
|
+
write_file(save_path, content)
|
|
74
|
+
print(f"已保存到 {save_path}")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 4. 输出确认
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
导出成功
|
|
81
|
+
|
|
82
|
+
文件路径:docs/reports/weekly/2026-03-26.md
|
|
83
|
+
内容类型:周报
|
|
84
|
+
生成日期:2026-03-26
|
|
85
|
+
|
|
86
|
+
**后续操作:**
|
|
87
|
+
- git add docs/reports/ 提交到版本控制
|
|
88
|
+
- /pm:help 查看其他命令
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 用户输入
|
|
92
|
+
|
|
93
|
+
$ARGUMENTS
|