prd-workflow-cli 1.1.28 → 1.1.30
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/.antigravity/rules.md +14 -19
- package/.cursorrules +13 -18
- package/commands/init.js +30 -17
- package/package.json +1 -1
package/.antigravity/rules.md
CHANGED
|
@@ -4,29 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## 🚨
|
|
7
|
+
## 🚨 绝对红线
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
1. ❌ 禁止未经对话就填充文档
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
4. ❌ 禁止修改已冻结的文档
|
|
20
|
-
→ B3 冻结后不能改 B1/B2/B3
|
|
21
|
-
→ C3 冻结后不能改 C0/C1/C3
|
|
10
|
+
1. ❌ 禁止未经对话就填充文档 → 必须通过提问引导 PM
|
|
11
|
+
2. ❌ 禁止替 PM 做决策 → 优先级、范围、目标由 PM 决定
|
|
12
|
+
3. ❌ 禁止"快速完成"跳过流程 → 每个阶段都要充分对话和审视
|
|
13
|
+
4. ❌ 禁止修改已冻结的文档 → B3/C3 冻结后不能改
|
|
14
|
+
5. ❌ 禁止在 C1 阶段加入新需求 → 新需求只能暂存到 A2
|
|
15
|
+
6. ❌ 禁止跳过审视 → B2 后必须 R1,C1 后必须 R2
|
|
16
|
+
7. ❌ 禁止 R1 直接输出"通过" → 必须有分析和评估矩阵
|
|
17
|
+
8. ❌ 禁止创建迭代后直接创建 B1 → 必须先填写 R1 启动检查
|
|
18
|
+
```
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
**R1 有两个阶段**:
|
|
21
|
+
- **R1 启动检查**(创建迭代后)→ 3 条启动条件 → 通过后才能 B1
|
|
22
|
+
- **R1 规划审视**(B1/B2 后)→ 5 维度分析 → 通过后才能 B3
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
→ B2 完成后必须执行 R1
|
|
28
|
-
→ C1 完成后必须执行 R2
|
|
29
|
-
```
|
|
24
|
+
详见 `.agent/workflows/prd-r1-review.md`
|
|
30
25
|
|
|
31
26
|
---
|
|
32
27
|
|
package/.cursorrules
CHANGED
|
@@ -5,26 +5,21 @@
|
|
|
5
5
|
## 🚨 绝对红线(违反任何一条都是严重错误)
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
1. ❌ 禁止未经对话就填充文档
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
4. ❌ 禁止修改已冻结的文档
|
|
18
|
-
→ B3 冻结后不能改 B1/B2/B3
|
|
19
|
-
→ C3 冻结后不能改 C0/C1/C3
|
|
8
|
+
1. ❌ 禁止未经对话就填充文档 → 必须通过提问引导 PM 填写
|
|
9
|
+
2. ❌ 禁止替 PM 做决策 → 优先级、范围、目标都由 PM 决定
|
|
10
|
+
3. ❌ 禁止"快速完成"跳过流程 → 每个阶段都要充分对话和审视
|
|
11
|
+
4. ❌ 禁止修改已冻结的文档 → B3/C3 冻结后不能改
|
|
12
|
+
5. ❌ 禁止在 C1 阶段加入新需求 → 新需求只能暂存到 A2
|
|
13
|
+
6. ❌ 禁止跳过审视 → B2 后必须 R1,C1 后必须 R2
|
|
14
|
+
7. ❌ 禁止 R1 直接输出"通过" → 必须有 5 维度分析和评估矩阵
|
|
15
|
+
8. ❌ 禁止创建迭代后直接创建 B1 → 必须先引导 PM 填写 R1 启动检查
|
|
16
|
+
```
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
**R1 有两个阶段**:
|
|
19
|
+
- **R1 启动检查**(创建迭代后)→ 检查 3 条启动条件 → 通过后才能 B1
|
|
20
|
+
- **R1 规划审视**(B1/B2 后)→ 5 维度深度分析 → 通过后才能 B3
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
→ B2 完成后必须执行 R1
|
|
26
|
-
→ C1 完成后必须执行 R2
|
|
27
|
-
```
|
|
22
|
+
详见 `.agent/workflows/prd-r1-review.md`
|
|
28
23
|
|
|
29
24
|
---
|
|
30
25
|
|
package/commands/init.js
CHANGED
|
@@ -3,16 +3,25 @@ const path = require('path');
|
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
|
|
5
5
|
module.exports = async function (projectName) {
|
|
6
|
-
|
|
6
|
+
// 支持 "." 表示在当前目录初始化
|
|
7
|
+
const isCurrentDir = projectName === '.';
|
|
8
|
+
const projectPath = isCurrentDir ? process.cwd() : path.join(process.cwd(), projectName);
|
|
9
|
+
const displayName = isCurrentDir ? path.basename(process.cwd()) : projectName;
|
|
7
10
|
|
|
8
11
|
try {
|
|
9
|
-
//
|
|
10
|
-
if (await fs.pathExists(projectPath)) {
|
|
12
|
+
// 检查目录是否已存在(仅当创建新目录时)
|
|
13
|
+
if (!isCurrentDir && await fs.pathExists(projectPath)) {
|
|
11
14
|
console.log(chalk.red(`✗ 目录 ${projectName} 已存在`));
|
|
12
15
|
return;
|
|
13
16
|
}
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
// 检查当前目录是否已经是 PRD 项目
|
|
19
|
+
if (isCurrentDir && await fs.pathExists(path.join(projectPath, '.prd-config.json'))) {
|
|
20
|
+
console.log(chalk.red('✗ 当前目录已经是 PRD 项目'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
console.log(chalk.blue(`正在${isCurrentDir ? '在当前目录' : '创建项目: ' + projectName}初始化...`));
|
|
16
25
|
|
|
17
26
|
// 创建项目目录结构
|
|
18
27
|
const directories = [
|
|
@@ -30,7 +39,7 @@ module.exports = async function (projectName) {
|
|
|
30
39
|
|
|
31
40
|
// 创建项目配置文件
|
|
32
41
|
const config = {
|
|
33
|
-
projectName,
|
|
42
|
+
projectName: displayName,
|
|
34
43
|
createdAt: new Date().toISOString(),
|
|
35
44
|
currentIteration: 0,
|
|
36
45
|
workflow: 'A → R → B → C',
|
|
@@ -49,9 +58,9 @@ module.exports = async function (projectName) {
|
|
|
49
58
|
|
|
50
59
|
// 创建 package.json(让其他用户可以通过 npm install 安装 CLI)
|
|
51
60
|
const packageJson = {
|
|
52
|
-
name:
|
|
61
|
+
name: displayName.toLowerCase().replace(/[^a-z0-9]/g, '-'),
|
|
53
62
|
version: '1.0.0',
|
|
54
|
-
description: `${
|
|
63
|
+
description: `${displayName} - PRD 需求管理项目`,
|
|
55
64
|
private: true,
|
|
56
65
|
scripts: {
|
|
57
66
|
prd: 'prd',
|
|
@@ -59,7 +68,7 @@ module.exports = async function (projectName) {
|
|
|
59
68
|
help: 'prd --help'
|
|
60
69
|
},
|
|
61
70
|
dependencies: {
|
|
62
|
-
'prd-workflow-cli': '^1.1.
|
|
71
|
+
'prd-workflow-cli': '^1.1.29'
|
|
63
72
|
}
|
|
64
73
|
};
|
|
65
74
|
|
|
@@ -73,7 +82,7 @@ module.exports = async function (projectName) {
|
|
|
73
82
|
const p0Template = `# P0_项目基本信息
|
|
74
83
|
|
|
75
84
|
**创建时间**: ${new Date().toLocaleString('zh-CN')}
|
|
76
|
-
**项目名称**: ${
|
|
85
|
+
**项目名称**: ${displayName}
|
|
77
86
|
**文档状态**: 草案
|
|
78
87
|
|
|
79
88
|
---
|
|
@@ -96,7 +105,7 @@ module.exports = async function (projectName) {
|
|
|
96
105
|
|
|
97
106
|
### 1.1 项目定位
|
|
98
107
|
|
|
99
|
-
**项目全称**: ${
|
|
108
|
+
**项目全称**: ${displayName}
|
|
100
109
|
|
|
101
110
|
**项目简述**:
|
|
102
111
|
<!-- 一句话说明这个项目是什么 -->
|
|
@@ -259,14 +268,14 @@ module.exports = async function (projectName) {
|
|
|
259
268
|
}
|
|
260
269
|
|
|
261
270
|
// 创建 README
|
|
262
|
-
const readme = `# ${
|
|
271
|
+
const readme = `# ${displayName}
|
|
263
272
|
|
|
264
273
|
本项目采用规范化的产品需求管理流程
|
|
265
274
|
|
|
266
275
|
## 📁 目录结构
|
|
267
276
|
|
|
268
277
|
\`\`\`
|
|
269
|
-
${
|
|
278
|
+
${displayName}/
|
|
270
279
|
├── 00_项目总览/ # 项目基本信息
|
|
271
280
|
├── 01_产品基线/ # A 类文档:现状基线
|
|
272
281
|
├── 02_迭代记录/ # 各轮迭代的 B、C 类文档
|
|
@@ -339,15 +348,19 @@ prd plan freeze
|
|
|
339
348
|
console.log('');
|
|
340
349
|
console.log(chalk.bold('📋 下一步操作(请按顺序执行):'));
|
|
341
350
|
console.log('');
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
351
|
+
if (!isCurrentDir) {
|
|
352
|
+
console.log(chalk.cyan('第 1 步: 进入项目目录'));
|
|
353
|
+
console.log(` cd ${displayName}`);
|
|
354
|
+
console.log('');
|
|
355
|
+
console.log(chalk.cyan('第 2 步: 完善 P0_项目基本信息.md'));
|
|
356
|
+
} else {
|
|
357
|
+
console.log(chalk.cyan('第 1 步: 完善 P0_项目基本信息.md'));
|
|
358
|
+
}
|
|
346
359
|
console.log(chalk.gray(' 文件位置: 00_项目总览/P0_项目基本信息.md'));
|
|
347
360
|
console.log(chalk.gray(' 填写内容: 项目目标、干系人、约束条件等'));
|
|
348
361
|
console.log(chalk.yellow(' ⚠️ 必须完成 P0 填写后才能开始创建 A 类基线文档'));
|
|
349
362
|
console.log('');
|
|
350
|
-
console.log(chalk.cyan('
|
|
363
|
+
console.log(chalk.cyan(`第 ${isCurrentDir ? '2' : '3'} 步: 创建 A0 基线文档`));
|
|
351
364
|
console.log(' prd baseline create A0 # P0 填写完成后执行');
|
|
352
365
|
console.log('');
|
|
353
366
|
|