pm-workflow-studio 0.1.1 → 0.1.3

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.
Files changed (27) hide show
  1. package/.claude/agents/product-manager.md +3 -1
  2. package/.claude/agents/quality-reviewer.md +2 -2
  3. package/.claude/skills/pm-workflow/SKILL.md +17 -16
  4. package/.claude/skills/pm-workflow/references/commands/init.md +4 -4
  5. package/.claude/skills/pm-workflow/scripts/review_stage.js +9 -5
  6. package/.claude/skills/quality-review/SKILL.md +1 -1
  7. package/.claude/skills/ui-prototype-design/SKILL.md +56 -14
  8. package/.claude/skills/ui-prototype-design/references/b-end-ui-design-spec.md +2339 -0
  9. package/.claude/skills/ui-prototype-design/templates/prototype-review.md +19 -4
  10. package/.claude/skills/ui-prototype-design/templates/ui-design.md +24 -2
  11. package/.codex/SKILL.md +17 -16
  12. package/.codex/agents/product-manager.toml +14 -13
  13. package/.codex/agents/quality-reviewer.toml +1 -1
  14. package/.codex/references/commands/init.md +4 -4
  15. package/.codex/role-skills/quality-review/SKILL.md +1 -1
  16. package/.codex/role-skills/ui-prototype-design/SKILL.md +56 -14
  17. package/.codex/role-skills/ui-prototype-design/references/b-end-ui-design-spec.md +2339 -0
  18. package/.codex/role-skills/ui-prototype-design/templates/prototype-review.md +19 -4
  19. package/.codex/role-skills/ui-prototype-design/templates/ui-design.md +24 -2
  20. package/.codex/scripts/review_stage.js +9 -5
  21. package/.codex/templates/framework-AGENTS.md +2 -1
  22. package/.codex/templates/framework-README.md +1 -1
  23. package/.codex/templates/project-config.md +29 -9
  24. package/.codex/templates/workflow-state.json +5 -1
  25. package/README.md +31 -0
  26. package/bin/pmflow.js +147 -4
  27. package/package.json +1 -1
@@ -18,10 +18,10 @@
18
18
 
19
19
  ## Playwright 截图证据
20
20
 
21
- | 页面 | 桌面 1440x900 | 平板 834x1112 | 移动 390x844 | 控制台错误 |
22
- |---|---|---|---|---|
23
- | prototype/directions/index.html | 待补充 | 待补充 | 待补充 | 待补充 |
24
- | prototype/index.html | 待补充 | 待补充 | 待补充 | 待补充 |
21
+ | 页面 | B 端最小 1280x800 | 默认桌面 1440x900 | 宽屏 1920x1080 | 平板/移动补充 | 控制台错误 |
22
+ |---|---|---|---|---|---|
23
+ | prototype/directions/index.html | 待补充 | 待补充 | 适用时补充 | 非 B 端或响应式需要时补充 | 待补充 |
24
+ | prototype/index.html | 待补充 | 待补充 | 适用时补充 | 非 B 端或响应式需要时补充 | 待补充 |
25
25
 
26
26
  截图目录:`prototype/review/screenshots/`
27
27
 
@@ -39,6 +39,21 @@
39
39
  | harden | 长文本、空数据、错误、加载、异常路径 | 待补充 | 待补充 |
40
40
  | polish | 最终综合打磨 | 待补充 | 待补充 |
41
41
 
42
+ ## B 端规范抽检记录
43
+
44
+ 仅在项目被识别为 B 端网页时填写;只记录本次自审实际用到的规范章节和验收标准,不粘贴整份参考文档。
45
+
46
+ | 检查阶段 | 规范章节 | 验收标准/禁止事项 | 截图或页面证据 | 处理结果 |
47
+ |---|---|---|---|---|
48
+ | 识别和边界 | `使用原则` | 待补充 | docs/ui-design.md | 待补充 |
49
+ | 风格和配色 | `配色流程与色彩系统规则` | 待补充 | 方向 demo 截图 | 待补充 |
50
+ | 画布和密度 | `画布与适配`、`B 端适配与响应式规则` | 待补充 | 1280/1440 截图 | 待补充 |
51
+ | 信息架构和动线 | `格式塔设计原则`、`视觉动线与页面布局模型规则` | 待补充 | 页面截图或访问路径 | 待补充 |
52
+ | 页面模式和数据页面 | `基础组件体系与布局参数规则`、`后台数据页面补充规则` | 待补充 | 表格/筛选/详情页面截图 | 待补充 |
53
+ | 组件和视觉表现 | `视觉层级与组件表现规则`、`后台界面质感细节规则` | 待补充 | 组件、表单、弹窗截图 | 待补充 |
54
+ | 交互流程和状态 | `交互效率与认知负荷规则`、`尼尔森可用性原则补充规则`、`包容性与可理解性补充规则` | 待补充 | 操作路径、错误、空、加载截图 | 待补充 |
55
+ | 问题反查修正 | 对应章节的 `禁止事项` 和 `验收标准` | 待补充 | 修正前后截图 | 待补充 |
56
+
42
57
  ## 已修正问题
43
58
 
44
59
  | 问题 | 来源 | 修正位置 | 复查结果 |
@@ -18,8 +18,28 @@
18
18
 
19
19
  - 页面可见文案、按钮、导航、空状态和提示语禁止使用 emoji。
20
20
  - 图标必须使用图标库、SVG 或图片资源,不用 emoji 代替。
21
- - 正文、表单、按钮、列表文本默认不小于 16px。
22
- - 辅助说明可小于 16px,但不得低于 14px;移动端优先保持 16px 起。
21
+ - 通用 Web 和移动端正文、表单、按钮、列表文本默认不小于 16px。
22
+ - B 端网页、后台、运营台、管理系统和 SaaS 产品优先遵循 B 端设计规范的文字、间距和控件参数,不强行套用移动端 16px 起规则。
23
+
24
+ ## B 端规范引用记录
25
+
26
+ - 是否识别为 B 端网页:
27
+ - 判断依据:
28
+ - 章节索引检查:`rg -n "^##|^###" references/b-end-ui-design-spec.md`
29
+ - 本阶段已按需读取的规范章节:
30
+ - 已落入原型的规则:
31
+ - 未采用或偏离规范的原因:
32
+
33
+ | 阶段门禁 | 已引用章节 | 采用规则 | 对应设计动作 | 状态 |
34
+ |---|---|---|---|---|
35
+ | 识别和边界 | `使用原则` | 待补充 | 判断是否默认应用 B 端规范,记录偏离原因 | 待确认 |
36
+ | 风格和配色 | `配色流程与色彩系统规则` | 待补充 | 先明确品牌调性和产品风格,再做灰度和色彩 token | 待确认 |
37
+ | 画布和密度 | `画布与适配`、`页面基础参数`、`栅格与间距`、`B 端适配与响应式规则` | 待补充 | 按 `1440x900` 设计并校验 `1280x800` 核心内容 | 待确认 |
38
+ | 页面清单和信息架构 | `格式塔设计原则`、`视觉动线与页面布局模型规则` | 待补充 | 按页面类型选择动线,组织分组、对齐和重复结构 | 待确认 |
39
+ | 页面模式和布局骨架 | `基础组件体系与布局参数规则`、`后台数据页面补充规则` | 待补充 | 确定页面模式、固定区、自适应区、表格和筛选骨架 | 待确认 |
40
+ | 组件和视觉表现 | `文本参数`、`图标参数`、`按钮参数`、`输入框参数`、`视觉层级与组件表现规则`、`后台界面质感细节规则` | 待补充 | 收敛字号、间距、控件高度、层级和质感细节 | 待确认 |
41
+ | 交互流程和状态 | `交互效率与认知负荷规则`、`尼尔森可用性原则补充规则`、`包容性与可理解性补充规则` | 待补充 | 补齐反馈、防错、错误修正、权限异常、加载超时和帮助入口 | 待确认 |
42
+ | 原型自审和修正 | 问题对应章节的 `禁止事项` 和 `验收标准` | 待补充 | 根据截图问题反查规范并修正 | 待确认 |
23
43
 
24
44
  ## 设计方向候选
25
45
 
@@ -136,6 +156,8 @@ prototype/
136
156
  | 审查项 | 要求 | 状态 |
137
157
  |---|---|---|
138
158
  | Playwright 截图 | 候选 demo 和完整原型页面覆盖 desktop/tablet/mobile | 待确认 |
159
+ | B 端适配截图 | B 端项目至少覆盖 `1280x800` 和 `1440x900` 核心路径 | 待确认 |
160
+ | B 端规则落地 | 已采用规则必须体现为真实布局、字号、间距、控件高度、状态和响应式实现 | 待确认 |
139
161
  | Impeccable critique | 审美、视觉层级、信息架构、AI 味、认知负荷 | 待确认 |
140
162
  | Impeccable audit | 可访问性、性能、响应式、语义结构、反模式 | 待确认 |
141
163
  | Impeccable adapt | 桌面、平板、移动适配 | 待确认 |
@@ -57,10 +57,10 @@ const REQUIRED_CLARIFICATION_CRITERIA = {
57
57
  target_user: "产品给谁用",
58
58
  high_frequency_need: "用户真正的高频需求",
59
59
  scenario_problem: "解决什么场景问题",
60
- desired_outcome: "用户想达成什么结果",
61
- core_usage_flow: "用户从开始到结束的真实使用流程",
60
+ desired_outcome: "用户想达成什么结果以及结果落点",
61
+ core_usage_flow: "用户从开始到结束的真实使用流程,以及最值得先做的一段",
62
62
  first_platform: "首版平台与使用设备",
63
- mvp_boundary: "MVP 必做和暂不做边界,包括功能整合和页面/模块减负原则",
63
+ mvp_boundary: "最小可用 demo 必做和暂不做边界,包括能力合并、页面/模块减负和人工兜底原则",
64
64
  no_blocking_questions: "无阻塞开放问题,包括关键术语和概念没有歧义",
65
65
  };
66
66
 
@@ -74,9 +74,13 @@ function defaultClarification() {
74
74
  "核心场景",
75
75
  "用户想达成的结果",
76
76
  "真实使用流程",
77
+ "最值得先做的一段流程",
78
+ "Agent 需要具备的关键能力",
79
+ "结果落点",
77
80
  "首版平台与使用设备",
78
- "MVP 必做和暂不做边界",
81
+ "最小可用 demo 必做和暂不做边界",
79
82
  "页面/模块减负边界",
83
+ "人工兜底边界",
80
84
  "阻塞开放问题",
81
85
  "关键术语和概念歧义",
82
86
  ],
@@ -518,7 +522,7 @@ function buildIssues(scores, roundNo) {
518
522
  function buildRework(stage, result, scores, roundNo) {
519
523
  if (result === "通过") return "本阶段已通过,无需返工。可根据用户偏好做非阻塞微调。";
520
524
  const suggestions = {
521
- init: "补齐 8 项澄清完成标准、六个核心问题、高频真实需求、真实使用流程、参考产品、功能整合边界和工作量粗估。",
525
+ init: "补齐 8 个澄清判断锚点、六个核心问题、高频真实需求、最值得先做的一段流程、Agent 能力、结果落点、最小 demo 边界和工作量粗估。",
522
526
  analyze: "先让用户回答 PRD 草稿中的待确认问题,再补齐 P0/P1/P2、Mx-Fx 功能编号、业务规则、不做清单和验收标准,并把文档状态改为 final。",
523
527
  architect: "补齐需求到数据库、字段、接口、部署配置和技术风险的映射。",
524
528
  design: "补齐 2-3 个设计方向、每个方向的首页 demo、prototype/directions/index.html 预览索引、docs/prototype-review.md、Playwright 截图证据、Impeccable 审查记录、页面清单、需求到界面映射和完整原型路径。",
@@ -38,7 +38,8 @@
38
38
 
39
39
  - 阶段 00 的需求澄清由主 agent 直接完成:欢迎、复述、追问、整理缺口和请用户确认都不能外包给子 agent。
40
40
  - 禁止把用户刚输入的需求先总结成二手摘要,再交给 `product_manager` 或其他子 agent 继续澄清;主 agent 持有完整对话上下文,必须亲自判断真实需求。
41
- - 阶段 00 必须摸清谁高频使用、用户真正的高频需求、打开产品的触发点、从开始到结束的真实使用流程,以及页面/模块减负边界;这些信息是需求分析识别真需求和 UI 设计制定页面访问逻辑的依据。
41
+ - 阶段 00 必须做顾问式澄清:不要直接给完整方案或平台清单,每轮最多问 3 个问题,优先判断解决什么问题、哪一段最值得先做、需要什么 Agent 能力、结果落到哪里,以及如何收束成最小可用 demo。
42
+ - 阶段 00 还必须摸清谁高频使用、用户真正的高频需求、打开产品的触发点、从开始到结束的真实使用流程,以及页面/模块减负边界;这些信息是需求分析识别真需求和 UI 设计制定页面访问逻辑的依据。
42
43
  - 除阶段 00 的需求澄清外,每个阶段命令都必须先启动当前 CLI 结构下对应的项目子 agent:Codex 使用 `.codex/agents/*.toml`,Claude Code 使用 `.claude/agents/*.md`。
43
44
  - 阶段到 agent 的固定映射:`help/status/deliver -> product_manager/product-manager`,`analyze -> demand_analyst/demand-analyst`,`architect -> tech_architect/tech-architect`,`design -> ui_designer/ui-designer`,`plan -> dev_planner/dev-planner`,`review -> quality_reviewer/quality-reviewer`。`init` 在用户确认前不启动子 agent,确认后可调用产品经理子 agent 做文档沉淀和状态维护。
44
45
  - 每个阶段开始都先输出阶段开场卡:当前用户情况、推荐方案、为什么这样选、接下来产出什么。
@@ -34,7 +34,7 @@ outputs/dev-package/
34
34
 
35
35
  1. 在本目录启动开发会话。
36
36
  2. 直接输入你的产品想法,例如:`我想做一个每天记录习惯的 App`,或先说 `澄清需求`。
37
- 3. 产品经理会先用普通聊天方式帮你澄清真实需求,重点摸清谁高频使用、用户真正的高频需求、打开产品的触发点和真实使用流程;等你确认理解无误后,再进入需求、架构、界面、任务规划、审核和打包。
37
+ 3. 产品经理会先用普通聊天方式帮你澄清真实需求,每轮最多问 3 个问题,重点判断解决什么问题、哪一段最值得先做、需要什么 Agent 能力、结果落到哪里,以及如何收束成最小可用 demo;等你确认理解无误后,再进入需求、架构、界面、任务规划、审核和打包。
38
38
 
39
39
  常用自然语言:
40
40
 
@@ -9,7 +9,11 @@
9
9
  - 高频真实需求:
10
10
  - 使用触发点:
11
11
  - 真实使用流程:
12
+ - 最值得先做的一段流程:
13
+ - Agent 需要具备的关键能力:
12
14
  - 用户想达成的结果:
15
+ - 结果落点:
16
+ - 最小可用 demo 闭环:
13
17
  - 页面访问逻辑约束:
14
18
  - 功能整合原则:
15
19
  - 当前澄清状态:not_started
@@ -28,10 +32,10 @@
28
32
  | 产品给谁用 | 未完成 | 待补充 |
29
33
  | 用户真正的高频需求是什么 | 未完成 | 待补充 |
30
34
  | 解决什么场景问题 | 未完成 | 待补充 |
31
- | 用户想达成什么结果 | 未完成 | 待补充 |
32
- | 用户从开始到结束的真实使用流程是什么 | 未完成 | 待补充 |
35
+ | 用户想达成什么结果,结果最终落到哪里 | 未完成 | 待补充 |
36
+ | 用户从开始到结束的真实使用流程是什么,哪一段最值得先做 | 未完成 | 待补充 |
33
37
  | 首版平台与使用设备 | 未完成 | 待补充 |
34
- | MVP 必须做和暂不做边界,包括功能整合和页面/模块减负原则 | 未完成 | 待补充 |
38
+ | 最小可用 demo 必须做和暂不做边界,包括能力合并、页面/模块减负和人工兜底原则 | 未完成 | 待补充 |
35
39
  | 无阻塞开放问题,包括关键术语和概念没有歧义 | 未完成 | 待补充 |
36
40
 
37
41
  ## 待补材料
@@ -41,7 +45,8 @@
41
45
  | 类似产品或截图 | 帮助判断功能边界和体验预期 | 待补充 |
42
46
  | 当前工作方式或替代方案 | 帮助确认真实痛点 | 待补充 |
43
47
  | 目标用户示例 | 帮助区分自己用还是多人使用 | 待补充 |
44
- | 高频使用流程或操作步骤 | 帮助后续减少页面跳转和模块堆叠 | 待补充 |
48
+ | 高频使用流程或操作步骤 | 帮助判断最值得先做的一段流程 | 待补充 |
49
+ | 样例输入和期望输出 | 帮助判断 Agent 能力、结果落点和 demo 闭环 | 待补充 |
45
50
 
46
51
  ## 产品定位
47
52
 
@@ -52,6 +57,10 @@
52
57
  - 使用场景:
53
58
  - 高频触发:
54
59
  - 核心使用流程:
60
+ - 首段验证流程:
61
+ - Agent 能力边界:
62
+ - 结果落点:
63
+ - 最小 demo 闭环:
55
64
  - 页面与功能减负原则:
56
65
 
57
66
  ## 六个核心问题
@@ -59,11 +68,11 @@
59
68
  | 问题 | 当前答案 | 待确认点 |
60
69
  |---|---|---|
61
70
  | 产品是什么 | 待补充 | 待补充 |
62
- | 平台类型 | 待补充 | 待补充 |
63
- | 核心场景和高频需求 | 待补充 | 待补充 |
64
- | 真实使用流程 | 待补充 | 待补充 |
65
- | 参考产品 | 待补充 | 待补充 |
66
- | 特殊要求 | 待补充 | 待补充 |
71
+ | 当前最值得先做的一段流程 | 待补充 | 待补充 |
72
+ | Agent 必须具备的能力 | 待补充 | 待补充 |
73
+ | 结果落点与确认方式 | 待补充 | 待补充 |
74
+ | 首版运行载体 | 待补充 | 待补充 |
75
+ | Demo 边界和不做项 | 待补充 | 待补充 |
67
76
 
68
77
  ## 关键场景
69
78
 
@@ -82,8 +91,19 @@
82
91
  - 必须合并的同类能力:
83
92
  - 必须避免的页面/模块堆叠:
84
93
  - 允许后置的低频能力:
94
+ - 需要人工确认或人工兜底的能力:
85
95
  - 后续需求分析和 UI 设计必须优先服务的高频路径:
86
96
 
97
+ ## 最小可用 Demo
98
+
99
+ - Demo 要证明的判断:
100
+ - 输入:
101
+ - Agent 处理:
102
+ - 输出或动作:
103
+ - 结果落点:
104
+ - 用户确认方式:
105
+ - 暂不覆盖:
106
+
87
107
  ## 核心场景
88
108
 
89
109
  1. 待补充
@@ -11,9 +11,13 @@
11
11
  "核心场景",
12
12
  "用户想达成的结果",
13
13
  "真实使用流程",
14
+ "最值得先做的一段流程",
15
+ "Agent 需要具备的关键能力",
16
+ "结果落点",
14
17
  "首版平台与使用设备",
15
- "MVP 必做和暂不做边界",
18
+ "最小可用 demo 必做和暂不做边界",
16
19
  "页面/模块减负边界",
20
+ "人工兜底边界",
17
21
  "阻塞开放问题",
18
22
  "关键术语和概念歧义"
19
23
  ],
package/README.md CHANGED
@@ -17,6 +17,20 @@ pm-workflow --help
17
17
 
18
18
  ## 快速开始
19
19
 
20
+ 交互式:
21
+
22
+ ```bash
23
+ pmflow
24
+ ```
25
+
26
+ 或:
27
+
28
+ ```bash
29
+ pmflow init
30
+ ```
31
+
32
+ CLI 会逐步询问产品名称、项目目录和 AI 工作区结构。适合不想记参数的日常使用。
33
+
20
34
  Codex:
21
35
 
22
36
  ```bash
@@ -49,6 +63,7 @@ claude
49
63
 
50
64
  ```bash
51
65
  pmflow init --ai auto --name "习惯打卡"
66
+ pmflow init --interactive
52
67
  pmflow init --ai codex --root ./pm-workflow-demo --name "习惯打卡"
53
68
  pmflow init --ai claude --root ./pm-workflow-claude-demo --name "习惯打卡"
54
69
  ```
@@ -56,6 +71,7 @@ pmflow init --ai claude --root ./pm-workflow-claude-demo --name "习惯打卡"
56
71
  - `--ai auto|codex|claude`:选择生成结构。默认 `auto`;空目录默认 Codex;目录已有 `.claude/` 时选择 Claude Code。
57
72
  - `--root <dir>`:目标项目目录,默认当前目录。
58
73
  - `--name <product name>`:产品名称,默认 `My Product`。
74
+ - `--interactive` / `-i`:进入交互式创建向导。
59
75
  - `--cli` 是 `--ai` 的别名。
60
76
 
61
77
  当前支持 Codex 和 Claude Code;`kiro` 暂未支持。
@@ -87,6 +103,21 @@ outputs/dev-package/
87
103
 
88
104
  `pmflow init` 只依赖 Node.js,不依赖 Python。包内维护 `.codex/` 和 `.claude/` 两套结构镜像,审核与打包脚本也使用 Node。
89
105
 
106
+ ## UI 原型设计能力
107
+
108
+ 内置 `ui-prototype-design` 角色技能,支持从 PRD 和技术架构推进到界面设计文档、高保真 HTML 原型和原型自审报告。
109
+
110
+ 针对 B 端网页、后台、运营台、管理系统和 SaaS 产品,包内提供一份 B 端 UI 设计规范参考,并在 Codex / Claude Code 两套结构中保持镜像一致。UI 阶段不会一次性读取整份规范,而是按阶段渐进引用:
111
+
112
+ - 识别和边界:判断是否默认应用 B 端规范。
113
+ - 风格和配色:先明确品牌调性和产品风格,再定义灰度和色彩 token。
114
+ - 画布和密度:默认按 `1440x900` 设计,并检查 `1280x800` 核心路径。
115
+ - 信息架构和动线:用格式塔原则和 F 型、古腾堡、Z 型动线组织页面。
116
+ - 布局骨架和组件表现:约束导航、表格、筛选、表单、按钮、输入框、弹窗和状态反馈。
117
+ - 原型自审:按截图问题反查规范中的禁止事项和验收标准,修正后记录证据。
118
+
119
+ 这样可以让 B 端原型持续遵守文字、间距、控件高度、信息密度、响应式适配和可用性规则,同时避免把大参考文档全部塞进上下文。
120
+
90
121
  ## 本地开发
91
122
 
92
123
  在本仓库调试包:
package/bin/pmflow.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  const fs = require("node:fs");
4
4
  const path = require("node:path");
5
+ const readline = require("node:readline");
5
6
 
6
7
  const PACKAGE_ROOT = path.resolve(__dirname, "..");
7
8
  const CODEX_MIRROR = path.join(PACKAGE_ROOT, ".codex");
@@ -26,6 +27,8 @@ function printHelp() {
26
27
  console.log(`PM Workflow Studio
27
28
 
28
29
  Usage:
30
+ pmflow
31
+ pmflow init
29
32
  pmflow init [--ai auto|codex|claude] [--root <dir>] [--name <product name>]
30
33
  pm-workflow init [--ai auto|codex|claude] [--root <dir>] [--name <product name>]
31
34
 
@@ -36,9 +39,13 @@ Options:
36
39
  claude: generate .claude structure for Claude Code.
37
40
  --root Target workspace directory. Defaults to current directory.
38
41
  --name Product name for generated templates. Defaults to "My Product".
42
+ -i, --interactive
43
+ Start the interactive setup wizard.
39
44
  -h, --help Show help.
40
45
 
41
46
  Examples:
47
+ pmflow
48
+ pmflow init
42
49
  pmflow init --ai codex --root ./pm-workflow-demo --name "习惯打卡"
43
50
  pmflow init --ai claude --root ./pm-workflow-claude-demo --name "习惯打卡"
44
51
  pmflow init --ai auto --name "习惯打卡"
@@ -54,6 +61,14 @@ function fail(message) {
54
61
  process.exit(1);
55
62
  }
56
63
 
64
+ const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
65
+ const color = {
66
+ cyan: (value) => (useColor ? `\u001b[36m${value}\u001b[0m` : value),
67
+ dim: (value) => (useColor ? `\u001b[2m${value}\u001b[0m` : value),
68
+ green: (value) => (useColor ? `\u001b[32m${value}\u001b[0m` : value),
69
+ bold: (value) => (useColor ? `\u001b[1m${value}\u001b[0m` : value),
70
+ };
71
+
57
72
  function exists(target) {
58
73
  return fs.existsSync(target);
59
74
  }
@@ -89,6 +104,7 @@ function parseInitArgs(argv) {
89
104
  ai: "auto",
90
105
  root: ".",
91
106
  name: "My Product",
107
+ interactive: false,
92
108
  };
93
109
 
94
110
  for (let index = 0; index < argv.length; index += 1) {
@@ -97,6 +113,10 @@ function parseInitArgs(argv) {
97
113
  printHelp();
98
114
  process.exit(0);
99
115
  }
116
+ if (arg === "-i" || arg === "--interactive") {
117
+ options.interactive = true;
118
+ continue;
119
+ }
100
120
  if (arg === "--ai" || arg === "--cli") {
101
121
  const value = argv[index + 1];
102
122
  if (!value) fail(`${arg} requires a value.`);
@@ -140,6 +160,110 @@ function parseInitArgs(argv) {
140
160
  return options;
141
161
  }
142
162
 
163
+ function createPrompt() {
164
+ const rl = readline.createInterface({
165
+ input: process.stdin,
166
+ output: process.stdout,
167
+ });
168
+ return {
169
+ ask(question) {
170
+ return new Promise((resolve) => {
171
+ rl.question(question, (answer) => resolve(answer.trim()));
172
+ });
173
+ },
174
+ close() {
175
+ rl.close();
176
+ },
177
+ };
178
+ }
179
+
180
+ function printInteractiveHeader() {
181
+ console.log("");
182
+ console.log(color.cyan("┌────────────────────────────────────────────┐"));
183
+ console.log(color.cyan("│") + ` ${color.bold("PM Workflow Studio")} ` + color.cyan("│"));
184
+ console.log(color.cyan("│") + " 交互式创建产品工作室,命令参数仍然可用 " + color.cyan("│"));
185
+ console.log(color.cyan("└────────────────────────────────────────────┘"));
186
+ console.log("");
187
+ }
188
+
189
+ function printStep(index, title) {
190
+ console.log(color.dim(`\nStep ${index}`));
191
+ console.log(color.bold(title));
192
+ }
193
+
194
+ function formatDefault(value) {
195
+ return color.dim(`(${value})`);
196
+ }
197
+
198
+ async function askText(prompt, label, defaultValue) {
199
+ const answer = await prompt.ask(`${label} ${formatDefault(defaultValue)}: `);
200
+ return answer || defaultValue;
201
+ }
202
+
203
+ async function askAi(prompt, defaultValue) {
204
+ const choices = [
205
+ ["1", "auto", "自动判断,空目录默认 Codex"],
206
+ ["2", "codex", "生成 .codex + .agents 结构"],
207
+ ["3", "claude", "生成 .claude 结构"],
208
+ ];
209
+
210
+ while (true) {
211
+ for (const [key, value, description] of choices) {
212
+ const marker = value === defaultValue ? color.green(" *") : " ";
213
+ console.log(` ${key}. ${value.padEnd(6)} ${color.dim(description)}${marker}`);
214
+ }
215
+ const answer = await prompt.ask(`选择 AI CLI ${formatDefault(defaultValue)}: `);
216
+ const normalized = answer ? answer.toLowerCase() : defaultValue;
217
+ const matched = choices.find(([key, value]) => normalized === key || normalized === value);
218
+ if (matched) return matched[1];
219
+ console.log("请输入 1/2/3,或 auto/codex/claude。");
220
+ }
221
+ }
222
+
223
+ async function askConfirm(prompt, label, defaultValue = true) {
224
+ const suffix = defaultValue ? "Y/n" : "y/N";
225
+ while (true) {
226
+ const answer = (await prompt.ask(`${label} ${formatDefault(suffix)}: `)).toLowerCase();
227
+ if (!answer) return defaultValue;
228
+ if (["y", "yes", "是", "确认"].includes(answer)) return true;
229
+ if (["n", "no", "否", "取消"].includes(answer)) return false;
230
+ console.log("请输入 y 或 n。");
231
+ }
232
+ }
233
+
234
+ async function runInteractiveInit(seedOptions = {}) {
235
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
236
+ fail("interactive mode requires a TTY. Use `pmflow init --ai auto --root . --name \"My Product\"` in non-interactive environments.");
237
+ }
238
+
239
+ const prompt = createPrompt();
240
+ try {
241
+ printInteractiveHeader();
242
+
243
+ printStep(1, "产品信息");
244
+ const name = await askText(prompt, "产品名称", seedOptions.name || "My Product");
245
+ const root = await askText(prompt, "项目目录", seedOptions.root || ".");
246
+
247
+ printStep(2, "AI 工作区结构");
248
+ const ai = await askAi(prompt, seedOptions.ai || "auto");
249
+
250
+ printStep(3, "确认创建");
251
+ console.log(` 产品名称: ${color.green(name)}`);
252
+ console.log(` 项目目录: ${color.green(path.resolve(root))}`);
253
+ console.log(` AI 结构: ${color.green(ai)}`);
254
+ const confirmed = await askConfirm(prompt, "开始创建?", true);
255
+ if (!confirmed) {
256
+ console.log("已取消。");
257
+ return;
258
+ }
259
+
260
+ console.log("");
261
+ createStructure(root, name, normalizeAi(ai));
262
+ } finally {
263
+ prompt.close();
264
+ }
265
+ }
266
+
143
267
  function templatePath(name) {
144
268
  const centralPath = path.join(CODEX_TEMPLATES, name);
145
269
  if (exists(centralPath)) return centralPath;
@@ -442,22 +566,41 @@ function createStructure(rootInput, productName, cli) {
442
566
  console.log(nextStep);
443
567
  }
444
568
 
445
- function runInit(argv) {
569
+ async function runInit(argv) {
446
570
  const options = parseInitArgs(argv);
571
+ if (options.interactive || (argv.length === 0 && process.stdin.isTTY && process.stdout.isTTY)) {
572
+ await runInteractiveInit(options);
573
+ return;
574
+ }
447
575
  createStructure(options.root, options.name, options.ai);
448
576
  }
449
577
 
450
- function main() {
578
+ async function main() {
451
579
  const [command, ...rest] = process.argv.slice(2);
452
580
  if (!command || command === "-h" || command === "--help") {
581
+ if (!command) {
582
+ if (process.stdin.isTTY && process.stdout.isTTY) {
583
+ await runInteractiveInit();
584
+ } else {
585
+ printHelp();
586
+ }
587
+ return;
588
+ }
453
589
  printHelp();
454
590
  return;
455
591
  }
456
592
  if (command === "init") {
457
- runInit(rest);
593
+ await runInit(rest);
458
594
  return;
459
595
  }
460
596
  fail(`unknown command "${command}".`);
461
597
  }
462
598
 
463
- main();
599
+ main().catch((error) => {
600
+ if (error && error.message) {
601
+ console.error(`pmflow: ${error.message}`);
602
+ } else {
603
+ console.error(error);
604
+ }
605
+ process.exit(1);
606
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-workflow-studio",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "AI product development studio CLI for Codex and Claude Code.",
5
5
  "type": "commonjs",
6
6
  "bin": {