@deepstorm/cli 0.1.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.
- package/README.md +72 -0
- package/dist/agents/reef-inspect-figma.md +77 -0
- package/dist/agents/reef-review-backend.md.tmpl +112 -0
- package/dist/agents/reef-review-frontend.md.tmpl +78 -0
- package/dist/agents/reef-review-infra.md +47 -0
- package/dist/agents/reef-review-security.md.tmpl +80 -0
- package/dist/agents/reef-scope-analysis.md +64 -0
- package/dist/build-registry.js +375 -0
- package/dist/cli.js +8581 -0
- package/dist/config-schema.json +133 -0
- package/dist/env-examples/context7.env-example +19 -0
- package/dist/env-examples/feishu-wiki.env-example +16 -0
- package/dist/env-examples/figma.env-example +16 -0
- package/dist/env-examples/github.env-example +20 -0
- package/dist/env-examples/jira.env-example +20 -0
- package/dist/hooks/mcp-hook.sh +77 -0
- package/dist/hooks/reef-auto-format.sh.tmpl +72 -0
- package/dist/hooks/reef-block-dangerous.sh +70 -0
- package/dist/hooks/reef-hooks.json +72 -0
- package/dist/hooks/reef-intent-detect.sh +129 -0
- package/dist/hooks/reef-protect-files.sh +55 -0
- package/dist/hooks/reef-run-tests.sh +84 -0
- package/dist/hooks/reef-scope-check.sh +386 -0
- package/dist/hooks/reef-scope-ci.sh +28 -0
- package/dist/hooks/reef-scope-gate.sh +115 -0
- package/dist/hooks/reef-scope-pre-commit.sh.tmpl +28 -0
- package/dist/hooks/reef-scope-setup.sh +204 -0
- package/dist/hooks/reef-scope-split.sh +203 -0
- package/dist/hooks/sweep-hooks.json +14 -0
- package/dist/hooks/sweep-mcp-hook.sh +77 -0
- package/dist/hooks/tide-hooks.json +14 -0
- package/dist/hooks/tide-session-preload.sh +17 -0
- package/dist/mcp/code-hosting/github.json +20 -0
- package/dist/mcp/design-tools/figma.json +19 -0
- package/dist/mcp/docs-reference/context7.json +28 -0
- package/dist/mcp/e2e-testing/playwright.json +13 -0
- package/dist/mcp/knowledge-base/feishu-wiki.json +19 -0
- package/dist/mcp/project-management/jira.json +27 -0
- package/dist/mcp-skills/deepflow-mcp-feishu-wiki-read/SKILL.md +65 -0
- package/dist/mcp-skills/deepflow-mcp-feishu-wiki-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepflow-mcp-figma-read/SKILL.md +98 -0
- package/dist/mcp-skills/deepflow-mcp-github-read/SKILL.md +62 -0
- package/dist/mcp-skills/deepflow-mcp-github-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepflow-mcp-jira-read/SKILL.md +80 -0
- package/dist/mcp-skills/deepflow-mcp-jira-write/SKILL.md +74 -0
- package/dist/mcp-skills/deepflow-mcp-playwright-read/SKILL.md +79 -0
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-read/SKILL.md +65 -0
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepstorm-mcp-figma-read/SKILL.md +98 -0
- package/dist/mcp-skills/deepstorm-mcp-github-read/SKILL.md +62 -0
- package/dist/mcp-skills/deepstorm-mcp-github-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepstorm-mcp-jira-read/SKILL.md +80 -0
- package/dist/mcp-skills/deepstorm-mcp-jira-write/SKILL.md +74 -0
- package/dist/mcp-skills/deepstorm-mcp-playwright-read/SKILL.md +79 -0
- package/dist/registry.json +818 -0
- package/dist/skills/atoll-ops/SKILL.md +46 -0
- package/dist/skills/reef-commit/SKILL.md +127 -0
- package/dist/skills/reef-gen-backend/SKILL.md.tmpl +87 -0
- package/dist/skills/reef-gen-backend/variants/java/steps.md +28 -0
- package/dist/skills/reef-gen-backend/variants/python/steps.md +70 -0
- package/dist/skills/reef-gen-frontend/SKILL.md.tmpl +83 -0
- package/dist/skills/reef-gen-frontend/variants/angular/steps.md +30 -0
- package/dist/skills/reef-harden/EXAMPLES.md +89 -0
- package/dist/skills/reef-harden/SKILL.md +136 -0
- package/dist/skills/reef-pr/SKILL.md +97 -0
- package/dist/skills/reef-review/SKILL.md.tmpl +107 -0
- package/dist/skills/reef-scope/SKILL.md +134 -0
- package/dist/skills/reef-start/SKILL.md.tmpl +562 -0
- package/dist/skills/reef-start/references/jira-start-subagent.md +60 -0
- package/dist/skills/reef-style-backend/SKILL.md.tmpl +134 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/chat-client.md +96 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/rag.md +94 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/structured-output.md +62 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/tool-calling.md +68 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/quick-reference.md +220 -0
- package/dist/skills/reef-style-backend/fragments/java/api-spec/quick-reference.md +148 -0
- package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/examples/database-migration.md +131 -0
- package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/quick-reference.md +103 -0
- package/dist/skills/reef-style-backend/fragments/java/dependency-management/quick-reference.md +119 -0
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/examples/error-code-enum.md +101 -0
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/quick-reference.md +181 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/controller.md +95 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/dto-mapper.md +121 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/infrastructure.md +179 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/service-entity.md +202 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/testing.md +107 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/quick-reference.md +83 -0
- package/dist/skills/reef-style-backend/fragments/java/orm/hibernate/quick-reference.md +150 -0
- package/dist/skills/reef-style-backend/fragments/java/security-redlines/quick-reference.md +197 -0
- package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/examples/user-repository-test.md +69 -0
- package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/quick-reference.md +101 -0
- package/dist/skills/reef-style-backend/fragments/java/test/junit5/examples/user-service-test.md +61 -0
- package/dist/skills/reef-style-backend/fragments/java/test/junit5/quick-reference.md +100 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/examples/user-controller-test.md +61 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/quick-reference.md +85 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/examples/user-service-integration-test.md +56 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/quick-reference.md +83 -0
- package/dist/skills/reef-style-backend/fragments/python/alembic-migration/quick-reference.md +77 -0
- package/dist/skills/reef-style-backend/fragments/python/api-spec/quick-reference.md +164 -0
- package/dist/skills/reef-style-backend/fragments/python/dependency-management/quick-reference.md +139 -0
- package/dist/skills/reef-style-backend/fragments/python/exception-handling/quick-reference.md +177 -0
- package/dist/skills/reef-style-backend/fragments/python/fastapi-quick-reference/quick-reference.md +101 -0
- package/dist/skills/reef-style-backend/fragments/python/langchain/quick-reference.md +135 -0
- package/dist/skills/reef-style-backend/fragments/python/pytest-testing/quick-reference.md +111 -0
- package/dist/skills/reef-style-backend/fragments/python/ruff-mypy-toolchain/quick-reference.md +83 -0
- package/dist/skills/reef-style-backend/fragments/python/security-redlines/quick-reference.md +207 -0
- package/dist/skills/reef-style-backend/fragments/python/sqlalchemy-orm/quick-reference.md +91 -0
- package/dist/skills/reef-style-backend/variants/java/examples/code-wrapping.md +227 -0
- package/dist/skills/reef-style-backend/variants/java/examples/contributor-pattern.md +97 -0
- package/dist/skills/reef-style-backend/variants/java/quick-reference.md +117 -0
- package/dist/skills/reef-style-backend/variants/python/examples/crud-router.md +71 -0
- package/dist/skills/reef-style-backend/variants/python/examples/pydantic-schema.md +45 -0
- package/dist/skills/reef-style-backend/variants/python/examples/pytest-fixture.md +60 -0
- package/dist/skills/reef-style-backend/variants/python/examples/sqlalchemy-model.md +31 -0
- package/dist/skills/reef-style-backend/variants/python/quick-reference.md +111 -0
- package/dist/skills/reef-style-frontend/SKILL.md.tmpl +70 -0
- package/dist/skills/reef-style-frontend/fragments/css/tailwind/quick-reference.md +79 -0
- package/dist/skills/reef-style-frontend/fragments/test/vitest/examples/testing.md +150 -0
- package/dist/skills/reef-style-frontend/fragments/test/vitest/quick-reference.md +141 -0
- package/dist/skills/reef-style-frontend/fragments/ts-config/strict/quick-reference.md +112 -0
- package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/examples/ui-components.md +134 -0
- package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/quick-reference.md +66 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/code-wrapping.md +252 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/component-types-pipes.md +56 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/entity-types.md +100 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/forms-layer.md +119 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/service-routing.md +95 -0
- package/dist/skills/reef-style-frontend/variants/angular/quick-reference.md +100 -0
- package/dist/skills/reef-testcase/SKILL.md +138 -0
- package/dist/skills/reef-testcase/references/coverage-dimensions.md +99 -0
- package/dist/skills/reef-testcase/references/test-case-template.md +63 -0
- package/dist/skills/sweep-init/SKILL.md +286 -0
- package/dist/skills/sweep-init/scripts/flow-selector.mjs +305 -0
- package/dist/skills/sweep-plan/SKILL.md.tmpl +312 -0
- package/dist/skills/sweep-plan/references/test-flow-template.md +46 -0
- package/dist/skills/sweep-run/SKILL.md +437 -0
- package/dist/skills/sweep-run/scripts/env-manager.mjs +208 -0
- package/dist/skills/sweep-run/scripts/flow-parser.mjs +329 -0
- package/dist/skills/sweep-run/scripts/flow-selector.mjs +483 -0
- package/dist/skills/sweep-run/scripts/mcp-manager.mjs +208 -0
- package/dist/skills/sweep-run/scripts/spec-compiler.mjs +303 -0
- package/dist/skills/tide-discuss/SKILL.md.tmpl +449 -0
- package/dist/skills/tide-discuss/references/checklists.md +88 -0
- package/dist/skills/tide-discuss/references/data-format.md +237 -0
- package/dist/skills/tide-discuss/references/prd-template.md +134 -0
- package/dist/skills/tide-discuss/references/publish-flow.md +167 -0
- package/dist/skills/tide-discuss/references/role-prompts.md +105 -0
- package/package.json +38 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# 数据格式参考
|
|
2
|
+
|
|
3
|
+
## 会话 ID 格式
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
tide-YYYYMMDD-NNN
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
- YYYYMMDD = 当前日期
|
|
10
|
+
- NNN = 当日递增序列号(从 001 开始)
|
|
11
|
+
- 例:`tide-20260611-001`
|
|
12
|
+
|
|
13
|
+
**序列号维护:** `tide-data/sessions/.sequence` 文件记录上次序列号,格式为 `20260611 005`。首日没有此文件时从 001 开始。
|
|
14
|
+
|
|
15
|
+
**跨天处理:** 读取 `.sequence` 文件时,检查日期部分是否等于今天。如果日期不等于今天(跨天了),将 NNN 重置为 `001` 并从 `001` 开始。
|
|
16
|
+
|
|
17
|
+
**异常处理:** 如果 `.sequence` 文件内容损坏(格式错误、日期乱码等),**忽略该文件,重新生成**。基于当前 `sessions/` 目录中最大的 sessionId 序列号 + 1 计算新序列号。如果 `sessions/` 为空,从 001 开始。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Feature ID 格式
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
MODULE-FUNCTION-SUBFUNCTION
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
全大写 + 连字符,例:`AUTH-LOGIN-WECOM`、`PAYMENT-ORDER-REFUND`。
|
|
28
|
+
|
|
29
|
+
**自动生成规则(当用户未指定时):**
|
|
30
|
+
1. 先将需求描述**翻译成英文**,准确表达原意
|
|
31
|
+
2. 从英文翻译中提取 2-4 个核心关键词,按逻辑层级排列:`模块-功能-子功能`
|
|
32
|
+
3. 如果需求跨多个领域,取最核心的意图
|
|
33
|
+
|
|
34
|
+
> 例如:用户说"添加企业微信扫码登录" → 翻译为 "Add WeChat Work QR code login" → 提取 `AUTH-LOGIN-WECOM`
|
|
35
|
+
> 用户说"优化商品列表的加载速度" → 翻译为 "Optimize product list loading speed" → 提取 `PRODUCT-LOAD-OPTIMIZE`
|
|
36
|
+
|
|
37
|
+
**长度限制:** featureId 不超过 **5 个英文单词**(`AUTH-LOGIN-WECOM` 计为 3 个,`PAYMENT-ORDER-REFUND-V2` 计为 4 个)。
|
|
38
|
+
|
|
39
|
+
**备选机制:** 如果 AI 对提取哪 2-4 个词拿不准,提供 **2-3 个备选方案**让用户选择,不要自己做主。
|
|
40
|
+
|
|
41
|
+
**原则:** 生成的 featureId 要能让人一眼看出需求意图,不要用无意义的 hash 或过短的缩写。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Session JSON 格式
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"sessionId": "tide-20260611-001",
|
|
50
|
+
"featureId": "AUTH-LOGIN-WECOM",
|
|
51
|
+
"brief": "企业微信扫码登录",
|
|
52
|
+
"createdAt": "2026-06-11T10:00:00.000Z",
|
|
53
|
+
"status": "completed",
|
|
54
|
+
"parent": null,
|
|
55
|
+
"supersededBy": null,
|
|
56
|
+
"services": {
|
|
57
|
+
"knowledgeBase": {
|
|
58
|
+
"provider": "feishu-wiki",
|
|
59
|
+
"url": "https://feishu.cn/wiki/xxx"
|
|
60
|
+
},
|
|
61
|
+
"issueTracker": {
|
|
62
|
+
"provider": "jira",
|
|
63
|
+
"urls": [
|
|
64
|
+
"https://jira.example.com/browse/PROJ-123",
|
|
65
|
+
"https://jira.example.com/browse/PROJ-124"
|
|
66
|
+
],
|
|
67
|
+
"taskBreakdown": [
|
|
68
|
+
{"title": "支持企业微信扫码登录", "fr": "FR-1", "priority": "P0",
|
|
69
|
+
"acceptance": ["用户可通过企业微信扫码完成登录"],
|
|
70
|
+
"description": "实现企业微信 OAuth 扫码登录流程"},
|
|
71
|
+
{"title": "扫码授权页 UI", "fr": "FR-2", "priority": "P1",
|
|
72
|
+
"acceptance": ["页面在移动端和 PC 端均正常显示"],
|
|
73
|
+
"description": "设计扫码授权页面,包含二维码展示和状态提示"}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"dingtalkUrl": "https://feishu.cn/wiki/xxx", // 向后兼容旧字段,新 session 使用 services.knowledgeBase
|
|
78
|
+
"jiraUrls": [
|
|
79
|
+
"https://jira.example.com/browse/PROJ-123",
|
|
80
|
+
"https://jira.example.com/browse/PROJ-124"
|
|
81
|
+
],
|
|
82
|
+
"jiraTaskBreakdown": [
|
|
83
|
+
{"title": "支持企业微信扫码登录", "fr": "FR-1", "priority": "P0",
|
|
84
|
+
"acceptance": ["用户可通过企业微信扫码完成登录"],
|
|
85
|
+
"description": "实现企业微信 OAuth 扫码登录流程"}
|
|
86
|
+
],
|
|
87
|
+
"publishChecklist": [
|
|
88
|
+
{"step": "knowledge_base_push", "done": true, "note": "已推送到知识库"},
|
|
89
|
+
{"step": "issue_task_split", "done": true, "note": "用户已确认 2 个任务"},
|
|
90
|
+
{"step": "create_issues", "done": true, "total": 2, "created": 2}
|
|
91
|
+
],
|
|
92
|
+
"steps": [
|
|
93
|
+
{
|
|
94
|
+
"role": "analyst",
|
|
95
|
+
"summary": "讨论了企业微信在企业通讯录...",
|
|
96
|
+
"decisions": ["使用扫码而非手动输入"],
|
|
97
|
+
"requirements": ["支持企业微信扫码"],
|
|
98
|
+
"skipped": false,
|
|
99
|
+
"checklist": [
|
|
100
|
+
{"item": "需求背景和业务目标", "done": true},
|
|
101
|
+
{"item": "目标用户画像", "done": true},
|
|
102
|
+
{"item": "核心痛点分析", "done": true},
|
|
103
|
+
{"item": "竞品和市场调研", "done": true},
|
|
104
|
+
{"item": "关键成功指标", "done": true}
|
|
105
|
+
],
|
|
106
|
+
"completedAt": "2026-06-11T10:15:00.000Z"
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 字段说明 — services 命名空间(新字段)
|
|
113
|
+
|
|
114
|
+
|字段|类型|说明|
|
|
115
|
+
|---|---|---|
|
|
116
|
+
|`services.knowledgeBase`|object \| null|知识库服务信息。4a 成功后写入,含 `provider`(MCP 服务 ID)和 `url`(文档链接)|
|
|
117
|
+
|`services.issueTracker`|object \| null|工单系统信息。4b+4c 过程中写入,含 `provider`、`urls` 数组(自动去重)、`taskBreakdown`(任务清单)|
|
|
118
|
+
|
|
119
|
+
### 字段说明 — 通用字段
|
|
120
|
+
|
|
121
|
+
|字段|类型|说明|
|
|
122
|
+
|---|---|---|
|
|
123
|
+
|`sessionId`|string|会话唯一 ID,格式 `tide-YYYYMMDD-NNN`|
|
|
124
|
+
|`featureId`|string|功能标识,格式 `MODULE-FUNCTION-SUBFUNCTION`|
|
|
125
|
+
|`brief`|string|需求中文概要,AI 从用户输入提炼,**不超过 50 字**。用于列表展示和关键词搜索匹配|
|
|
126
|
+
|`createdAt`|string (ISO 8601)|会话创建时间|
|
|
127
|
+
|`status`|string|会话状态,见下方状态说明|
|
|
128
|
+
|`parent`|string \| null|需求变更/重来时关联的旧会话 sessionId;`null` 表示原始会话|
|
|
129
|
+
|`supersededBy`|string \| null|取代此会话的新会话 sessionId;`null` 表示未被取代|
|
|
130
|
+
|`steps`|array|角色讨论记录数组,每个 step 包含:`role`, `summary`, `decisions`, `requirements`, `skipped`, `checklist`, `completedAt`|
|
|
131
|
+
|`publishChecklist`|array|发布流程 checklist,每项含 `{step, done, note?, skipped?, total?, created?, failedItems?}`。`failedItems` 记录失败的具体条目明细,标准格式见下方。步骤名:`knowledge_base_push` / `issue_task_split` / `create_issues`|
|
|
132
|
+
|
|
133
|
+
### 向后兼容旧字段
|
|
134
|
+
|
|
135
|
+
以下旧字段保留为向后兼容别名。新代码优先使用 `services` 命名空间,读取时降级:
|
|
136
|
+
|
|
137
|
+
|旧字段|新字段|降级规则|
|
|
138
|
+
|---|---|---|
|
|
139
|
+
|`dingtalkUrl`|`services.knowledgeBase.url`|`services.knowledgeBase` 不存在时读取 `dingtalkUrl`|
|
|
140
|
+
|`jiraUrls`|`services.issueTracker.urls`|`services.issueTracker` 不存在时读取 `jiraUrls`|
|
|
141
|
+
|`jiraTaskBreakdown`|`services.issueTracker.taskBreakdown`|`services.issueTracker.taskBreakdown` 不存在时读取 `jiraTaskBreakdown`|
|
|
142
|
+
|
|
143
|
+
**读写规则:**
|
|
144
|
+
- **写操作:** 统一写入 `services` 命名空间,不再写入旧字段
|
|
145
|
+
- **读操作:** 优先读取 `services` 命名空间,不存在时降级到旧字段
|
|
146
|
+
- **AI 展示:** 优先展示 `services` 中的值;展示给用户时使用通用名称("知识库"、"工单"),而非特定服务名
|
|
147
|
+
|
|
148
|
+
> **PRD JSON 快照说明:** `prds/{sessionId}-prd.json` 是 Step 3 生成 PRD 时的结构化快照。session JSON 后续会更新(如 `services`、`publishChecklist`),PRD JSON 不会再同步更新;如需最新状态,以 session JSON 为准。格式定义详见 `references/prd-template.md`。
|
|
149
|
+
|
|
150
|
+
### Steps 子字段
|
|
151
|
+
|
|
152
|
+
|字段|类型|说明|
|
|
153
|
+
|---|---|---|
|
|
154
|
+
|`role`|string|角色 ID:`analyst` / `pm` / `architect` / `designer` / `po`|
|
|
155
|
+
|`summary`|string|本角色讨论总结|
|
|
156
|
+
|`decisions`|string[]|关键决策列表|
|
|
157
|
+
|`requirements`|string[]|功能需求/要求列表|
|
|
158
|
+
|`skipped`|boolean|是否为用户跳过的可选角色,缺省 `false`|
|
|
159
|
+
|`checklist`|array|讨论进度清单,每项含 `{item: string, done: boolean}`|
|
|
160
|
+
|`completedAt`|string \| null|完成时间。有值 = 该角色已处理完毕(已完成**或**已跳过,配合 `skipped` 区分);`null` = 尚未处理|
|
|
161
|
+
|
|
162
|
+
### 状态说明
|
|
163
|
+
|
|
164
|
+
|状态|含义|何时设置|后续操作|
|
|
165
|
+
|---|---|---|---|
|
|
166
|
+
|`active`|讨论进行中。还有角色未完成或可选角色待询问。|Step 1 新建时设为此值|继续角色讨论|
|
|
167
|
+
|`prd_ready`|PRD 已生成。所有必需角色讨论完成,PRD 文件已写入磁盘。|Step 3 PRD 生成后设为此值|查看 PRD、推送到知识库(4a)、变更需求|
|
|
168
|
+
|`published`|已发布到知识库。4a 执行成功或已跳过,等待 4b 任务拆分。|Step 4a 成功后(或跳过时)设为此值|查看 PRD、拆分为任务(4b)、变更需求|
|
|
169
|
+
|`publish_error`|发布过程中出错。知识库推送或工单创建失败。|Step 4a 或 4c 执行失败时设为此值|查看 PRD、重试发布、放弃发布(→ superseded)|
|
|
170
|
+
|`completed`|工单已创建(或全部跳过)。所有发布步骤完成,整个需求工作流完结。**自动归档到 `archive/` 目录。**|Step 4c 成功(或全部跳过)后设为此值|查看 PRD 和工单(只读归档)|
|
|
171
|
+
|`superseded`|已废弃(变更需求/放弃/重来)。此需求已被取代、放弃或重来。**自动归档到 `archive/` 目录。**|用户选择「变更需求」「放弃」或「重来」时设为此值|查看历史和替代会话(只读归档)|
|
|
172
|
+
|
|
173
|
+
### 状态流转图
|
|
174
|
+
|
|
175
|
+
```mermaid
|
|
176
|
+
flowchart TD
|
|
177
|
+
ACTIVE["active"] -->|"Step 3 自动触发"| PRD_READY["prd_ready"]
|
|
178
|
+
ACTIVE -->|"放弃 / 变更需求"| SUPERSEDED["superseded(已废弃)"]
|
|
179
|
+
|
|
180
|
+
PRD_READY -->|"变更需求/重来"| SUPERSEDED
|
|
181
|
+
|
|
182
|
+
PRD_READY --- PUB_WAIT["(发布阶段)"]
|
|
183
|
+
PUB_WAIT -->|"4a 推送到知识库"| PUBLISHED["published"]
|
|
184
|
+
PUB_WAIT -->|"4a 失败"| PUB_ERR["publish_error"]
|
|
185
|
+
|
|
186
|
+
PUBLISHED -->|"4b+4c 完成"| COMPLETED["completed(终态)"]
|
|
187
|
+
PUBLISHED -->|"变更需求"| SUPERSEDED
|
|
188
|
+
PUBLISHED -.->|"4c 部分失败"| PUB_ERR
|
|
189
|
+
|
|
190
|
+
PUB_ERR -->|"重试"| PUB_WAIT
|
|
191
|
+
PUB_ERR -->|"放弃发布"| SUPERSEDED
|
|
192
|
+
|
|
193
|
+
SUPERSEDED -->|"重来(相同 featureId)<br/>设置 parent/supersededBy"| ACTIVE
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### publishChecklist failedItems 格式
|
|
198
|
+
|
|
199
|
+
`failedItems` 数组中的每个条目遵循以下标准结构:
|
|
200
|
+
|
|
201
|
+
|字段|类型|说明|
|
|
202
|
+
|---|---|---|
|
|
203
|
+
|`title`|string|**必填**。失败 Issue 的标题,与 4b 任务清单中的 Story 标题一致|
|
|
204
|
+
|`fr`|string|关联的功能需求编号(如 `FR-3`),用于追溯 PRD 原文|
|
|
205
|
+
|`priority`|string|优先级(`P0`/`P1`/`P2`),从 4b 任务清单继承|
|
|
206
|
+
|`acceptance`|string[]|验收标准列表,从 PRD 验收标准章节提取|
|
|
207
|
+
|`description`|string|Issue 详细描述,包含背景和预期行为|
|
|
208
|
+
|
|
209
|
+
> 重试时 AI 依据 `title` 匹配任务清单中的条目,使用 `acceptance` 和 `description` 重建 Issue 内容。
|
|
210
|
+
|
|
211
|
+
### 关联信息展示
|
|
212
|
+
|
|
213
|
+
查看 `superseded` 状态的会话时,自动加载关联会话的信息一并展示:
|
|
214
|
+
|
|
215
|
+
> 此会话(AUTH-LOGIN-TOKEN v1,tide-20260611-001)已被
|
|
216
|
+
> 🔄 **AUTH-LOGIN-TOKEN v2**(tide-20260612-001)取代
|
|
217
|
+
> 📄 PRD: tide-data/prds/tide-20260611-001-prd.md
|
|
218
|
+
> 📎 知识库: {services.knowledgeBase.url / dingtalkUrl}
|
|
219
|
+
> 🎯 工单: {services.issueTracker.urls / jiraUrls 列表}
|
|
220
|
+
> 最新需求: 增加微信扫码登录(原: 仅密码登录)
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 角色定义
|
|
225
|
+
|
|
226
|
+
5 个 BMAD 角色,按固定顺序进行:
|
|
227
|
+
|
|
228
|
+
|顺序|ID|名称|必需?|说明|
|
|
229
|
+
|---|---|---|---|---|
|
|
230
|
+
|1|`analyst`|📊 业务分析师 Mary|✅ 必需|了解背景、痛点、竞品、目标用户|
|
|
231
|
+
|2|`pm`|📋 产品经理 John|✅ 必需|功能范围、用户故事、优先级、验收标准|
|
|
232
|
+
|3|`architect`|🏗️ 架构师 Winston|⬜ 可选|技术可行性、风险、系统影响|
|
|
233
|
+
|4|`designer`|🎨 UX 设计师 Sally|⬜ 可选|交互方案、设计约束|
|
|
234
|
+
|5|`po`|👑 产品负责人 Chris|⬜ 可选|业务价值、发布策略|
|
|
235
|
+
|
|
236
|
+
**必需角色(2 个):** `analyst`、`pm` — 必须完成才能生成 PRD
|
|
237
|
+
**可选角色(3 个):** `architect`、`designer`、`po` — 用户可以选择跳过
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# PRD 模板
|
|
2
|
+
|
|
3
|
+
Step 3 生成 PRD 时使用的 Markdown 模板。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
---
|
|
9
|
+
title: {featureId} — PRD
|
|
10
|
+
status: 讨论完成
|
|
11
|
+
created: {日期}
|
|
12
|
+
updated: {日期}
|
|
13
|
+
featureId: {featureId}
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# {featureId} — {brief}
|
|
17
|
+
|
|
18
|
+
> 通过 Tide BMAD 工作流自动生成 | 会话 ID: {sessionId}
|
|
19
|
+
|
|
20
|
+
## 1. 概述
|
|
21
|
+
|
|
22
|
+
**需求描述:** {brief}
|
|
23
|
+
**Feature ID:** `{featureId}`
|
|
24
|
+
**参与角色:**
|
|
25
|
+
- 📊 analyst — {summary 第一行}
|
|
26
|
+
- 📋 pm — {summary 第一行}
|
|
27
|
+
(如 architect / designer / po 已参与,在此列出)
|
|
28
|
+
|
|
29
|
+
## 2. 背景与目标
|
|
30
|
+
|
|
31
|
+
{analyst 的 summary}
|
|
32
|
+
|
|
33
|
+
**关键决策:**
|
|
34
|
+
- {analyst 的 decisions,包含背景分析和约束假设}
|
|
35
|
+
|
|
36
|
+
**分析师需求(AR — Analyst Requirements):**
|
|
37
|
+
- AR-1: {analyst requirements,按背景/约束/假设分类}
|
|
38
|
+
- AR-2: {analyst requirements}
|
|
39
|
+
|
|
40
|
+
## 3. 用户故事
|
|
41
|
+
|
|
42
|
+
{pm 的 requirements 中以"作为/我想/希望/用户"开头的条目}
|
|
43
|
+
|
|
44
|
+
## 4. 功能需求
|
|
45
|
+
|
|
46
|
+
{pm 的 requirements 中非用户故事的条目,编号 FR-1, FR-2...}
|
|
47
|
+
|
|
48
|
+
## 5. 非功能需求
|
|
49
|
+
|
|
50
|
+
- 可用性: 需满足基本可用标准
|
|
51
|
+
- 性能: 响应时间在可接受范围内
|
|
52
|
+
- 安全: 遵循数据安全和隐私保护规范
|
|
53
|
+
|
|
54
|
+
## 6. 验收标准
|
|
55
|
+
|
|
56
|
+
{pm 的 decisions 中属于验收标准的条目,编号 AC-1, AC-2...}
|
|
57
|
+
|
|
58
|
+
## 7. 技术方案
|
|
59
|
+
|
|
60
|
+
{如 architect 角色已讨论完成,写入总结和决策;如未讨论则写"(未讨论)"}
|
|
61
|
+
|
|
62
|
+
## 8. UX 设计建议
|
|
63
|
+
|
|
64
|
+
{如 designer 角色已讨论完成,写入总结和决策;如未讨论则写"(未讨论)"}
|
|
65
|
+
|
|
66
|
+
## 9. 发布策略
|
|
67
|
+
|
|
68
|
+
{如 po 角色已讨论完成,写入总结和决策;如未讨论则写"(未讨论)"}
|
|
69
|
+
|
|
70
|
+
## 10. 讨论记录
|
|
71
|
+
|
|
72
|
+
| 角色 | 完成时间 | 总结 |
|
|
73
|
+
|------|----------|------|
|
|
74
|
+
| {列出有 completedAt 的角色,跳过 skipped 的} | {时间} | {summary,前 50 字,不足则全量显示} |
|
|
75
|
+
|
|
76
|
+
## 11. 开放问题
|
|
77
|
+
|
|
78
|
+
- [ ] 需求范围是否有需要进一步明确的地方?
|
|
79
|
+
- [ ] 所有关键决策是否已记录?
|
|
80
|
+
- [ ] 验收标准是否覆盖了所有场景?
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
同时保存 JSON 快照到 `tide-data/prds/{sessionId}-prd.json`,格式如下:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"sessionId": "tide-20260611-001",
|
|
88
|
+
"featureId": "AUTH-LOGIN-WECOM",
|
|
89
|
+
"brief": "企业微信扫码登录",
|
|
90
|
+
"generatedAt": "2026-06-11T10:30:00.000Z",
|
|
91
|
+
"participants": [
|
|
92
|
+
{"role": "analyst", "completedAt": "2026-06-11T10:15:00.000Z", "skipped": false},
|
|
93
|
+
{"role": "pm", "completedAt": "2026-06-11T10:25:00.000Z", "skipped": false}
|
|
94
|
+
],
|
|
95
|
+
"sections": {
|
|
96
|
+
"background": {
|
|
97
|
+
"summary": "企业微信在内部通讯中使用广泛,目前缺乏与企业微信集成的登录方式...",
|
|
98
|
+
"decisions": ["使用扫码而非手动输入", "优先对接飞书而非企业微信"],
|
|
99
|
+
"analystRequirements": ["AR-1: 支持企业微信扫码登录", "AR-2: 登录页面适配移动端"]
|
|
100
|
+
},
|
|
101
|
+
"userStories": [
|
|
102
|
+
"作为企业微信用户,我想通过扫码快速登录,以便无需输入账号密码",
|
|
103
|
+
"作为 IT 管理员,我想配置企业微信登录参数,以便控制接入权限"
|
|
104
|
+
],
|
|
105
|
+
"functionalRequirements": [
|
|
106
|
+
{"id": "FR-1", "title": "支持企业微信扫码登录", "priority": "P0"},
|
|
107
|
+
{"id": "FR-2", "title": "扫码授权页 UI", "priority": "P1"}
|
|
108
|
+
],
|
|
109
|
+
"nonFunctionalRequirements": [
|
|
110
|
+
"可用性: 需满足基本可用标准",
|
|
111
|
+
"性能: 响应时间在可接受范围内"
|
|
112
|
+
],
|
|
113
|
+
"acceptanceCriteria": [
|
|
114
|
+
{"id": "AC-1", "description": "用户可通过企业微信扫码完成登录"},
|
|
115
|
+
{"id": "AC-2", "description": "同一账号最多 3 台设备同时在线"}
|
|
116
|
+
],
|
|
117
|
+
"technicalPlan": "(未讨论)",
|
|
118
|
+
"uxSuggestions": "(未讨论)",
|
|
119
|
+
"releaseStrategy": "(未讨论)"
|
|
120
|
+
},
|
|
121
|
+
"discussionRecords": [
|
|
122
|
+
{"role": "analyst", "completedAt": "2026-06-11T10:15:00.000Z", "summary": "讨论了企业微信在企业通讯录中的使用情况..."}
|
|
123
|
+
],
|
|
124
|
+
"openQuestions": [
|
|
125
|
+
"需求范围是否有需要进一步明确的地方?",
|
|
126
|
+
"所有关键决策是否已记录?"
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**说明:**
|
|
132
|
+
- `sections` 中可选角色对应的字段(`technicalPlan` / `uxSuggestions` / `releaseStrategy`)如果角色未参与,值为 `"(未讨论)"`,与 Markdown 模板一致
|
|
133
|
+
- `participants` 包含所有已参与的角色(包括 `skipped: true` 的),不含未触及的角色
|
|
134
|
+
- 该 JSON 用于 4b 任务拆分的结构化读取,字段名固定不可随意修改
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# 发布流程(Step 4)
|
|
2
|
+
|
|
3
|
+
PRD 生成后(`status: prd_ready`),分三步完成发布流程。每步根据运行时 MCP 能力映射动态决定是否执行或跳过。
|
|
4
|
+
|
|
5
|
+
## MCP 能力发现
|
|
6
|
+
|
|
7
|
+
进入 Step 4 时,AI 先读取 `.claude/settings.json` → `deepstorm.mcpCapabilities` 确定可用的 provider。
|
|
8
|
+
|
|
9
|
+
能力映射结构示例(安装时渲染):
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"knowledge_base": {
|
|
13
|
+
"available": true,
|
|
14
|
+
"providers": [{ "id": "feishu-wiki", "label": "飞书知识库" }]
|
|
15
|
+
},
|
|
16
|
+
"issue_tracker": {
|
|
17
|
+
"available": false,
|
|
18
|
+
"providers": []
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 可用性判定规则
|
|
24
|
+
|
|
25
|
+
- `knowledge_base.available = true` → 4a 可执行
|
|
26
|
+
- `issue_tracker.available = true` → 4b+4c 可执行
|
|
27
|
+
- providers 数组长度 > 1 → 在该步骤入口询问用户选择
|
|
28
|
+
|
|
29
|
+
### 引用 MCP skill 指南
|
|
30
|
+
|
|
31
|
+
调用某 provider 的 MCP 工具前,AI 必须读取对应的 skill 指南了解工具调用方式。skill 路径规则为 `.claude/skills/deepstorm-mcp-{provider-id}-write/SKILL.md`(如 `feishu-wiki` → `deepstorm-mcp-feishu-wiki-write`、`jira` → `deepstorm-mcp-jira-write`),按指南执行操作。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 发布进度跟踪
|
|
36
|
+
|
|
37
|
+
每一步的完成状态记录在 session JSON 的 `publishChecklist` 字段中,支持断点续传:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"publishChecklist": [
|
|
42
|
+
{"step": "knowledge_base_push", "done": true, "note": "已推送到知识库"},
|
|
43
|
+
{"step": "issue_task_split", "done": true, "note": "用户已确认 5 个任务"},
|
|
44
|
+
{"step": "create_issues", "done": false, "total": 5, "created": 3,
|
|
45
|
+
"failedItems": [
|
|
46
|
+
{"title": "Story 4: Token 刷新优化", "fr": "FR-4", "priority": "P1",
|
|
47
|
+
"acceptance": ["Token 过期后自动刷新", "刷新过程用户无感知"],
|
|
48
|
+
"description": "用户登录后获取 Token,Token 过期前自动调用刷新接口"},
|
|
49
|
+
{"title": "Story 5: 多设备登录管理", "fr": "FR-5", "priority": "P2",
|
|
50
|
+
"acceptance": ["同一账号最多 3 台设备同时在线", "超出时提示用户"],
|
|
51
|
+
"description": "用户可在多台设备上登录同一账号,系统管理设备会话数"}
|
|
52
|
+
]}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**规则:**
|
|
58
|
+
- `done: true` + 无 `skipped` → 该步已完成,下次恢复时直接跳过
|
|
59
|
+
- `done: true` + `skipped: true` → 该步被跳过(无可用 MCP 服务)。恢复时**跳过该步**,不重新检查 MCP 可用性
|
|
60
|
+
- `done: false` + 无 `failedItems` → 该步从未执行过,从头开始
|
|
61
|
+
- `done: false` + 有 `failedItems` → 部分失败,仅重试 `failedItems` 中的条目
|
|
62
|
+
- 每次恢复时 AI 查看 `publishChecklist`,跳过已完成步骤,只处理失败项或未执行项
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 4a. 知识库推送
|
|
67
|
+
|
|
68
|
+
按能力映射可用性和 provider 数量动态执行:
|
|
69
|
+
|
|
70
|
+
### 场景 A:单知识库可用(自动推送)
|
|
71
|
+
|
|
72
|
+
1. **检查 PRD 文件存在性:** 读取 `tide-data/prds/{sessionId}-prd.md`。如果文件不存在,按优先级恢复:JSON 快照 → session steps 记录 → 重新生成 Markdown(详见 SKILL.md Step 3「异常处理」)
|
|
73
|
+
2. 根据 `services.knowledgeBase.provider`(或 `deepstorm.mcpCapabilities.knowledge_base.providers[0].id`)确定 provider,读取 `.claude/skills/deepstorm-mcp-{provider-id}-write/SKILL.md` 了解工具调用方式
|
|
74
|
+
3. 使用该 MCP 推送 PRD Markdown 到知识库
|
|
75
|
+
4. 成功后:
|
|
76
|
+
- 保存 `services.knowledgeBase` → `{provider: "{provider-id}", url: "..."}`
|
|
77
|
+
- `publishChecklist[0]` → `{step:"knowledge_base_push", done:true}`
|
|
78
|
+
- `status` → `published`
|
|
79
|
+
5. 告知用户 PRD 已发布到知识库
|
|
80
|
+
|
|
81
|
+
### 场景 B:多知识库可用(用户选择)
|
|
82
|
+
|
|
83
|
+
在 4a 入口展示可用列表让用户选择:
|
|
84
|
+
```
|
|
85
|
+
检测到多个知识库服务:
|
|
86
|
+
1. {provider1.label} ({provider1.id})
|
|
87
|
+
2. {provider2.label} ({provider2.id})
|
|
88
|
+
请选择本次推送使用的知识库:
|
|
89
|
+
```
|
|
90
|
+
用户选择后,按所选 provider 的 skill 指南执行推送。选择结果持久化到 `services.knowledgeBase.provider`。
|
|
91
|
+
|
|
92
|
+
### 场景 C:无可用知识库(跳过)
|
|
93
|
+
|
|
94
|
+
1. `publishChecklist[0]` → `{step:"knowledge_base_push", done:true, skipped:true, note:"无可用知识库服务"}`
|
|
95
|
+
2. `status` → `published`
|
|
96
|
+
3. 告知用户"未检测到知识库服务,跳过 PRD 推送"
|
|
97
|
+
|
|
98
|
+
### 场景 D:推送失败
|
|
99
|
+
|
|
100
|
+
`publishChecklist[0].done = false`,`status` 改为 `publish_error`,提示用户错误信息,提供重试或放弃发布选项。
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 4b. 任务拆分
|
|
105
|
+
|
|
106
|
+
### 有可用工单系统时
|
|
107
|
+
|
|
108
|
+
1. 读取当前 PRD 的 Markdown / JSON 快照
|
|
109
|
+
2. 将 PRD 内容拆解为可落地的工作项:
|
|
110
|
+
- **Epic:** `{featureId} — {brief}`(父级,包含完整背景和目标)
|
|
111
|
+
- **Story:** 每个 FR / 用户故事对应一个 Story,含验收标准
|
|
112
|
+
- **Task:** 较大的 Story 可拆成子 Task
|
|
113
|
+
- **优先级:** 根据 PRD 中的优先级排序标注
|
|
114
|
+
3. 展示完整任务清单给用户确认,格式示例:
|
|
115
|
+
```
|
|
116
|
+
📋 任务清单 — {featureId}
|
|
117
|
+
|
|
118
|
+
Epic: {featureId} — {brief}
|
|
119
|
+
├─ Story 1: {title1}(FR-1)
|
|
120
|
+
│ ├ 验收标准: {ac}
|
|
121
|
+
│ └ 优先级: P0
|
|
122
|
+
└─ Story 2: {title2}(FR-2)
|
|
123
|
+
├ 验收标准: {ac}
|
|
124
|
+
└ 优先级: P1
|
|
125
|
+
```
|
|
126
|
+
4. **让用户确认或调整**任务清单(增删合并、调整优先级)
|
|
127
|
+
5. **用户确认后:** 将确认后的完整任务清单保存到 session JSON 的 `services.issueTracker.taskBreakdown` 字段(向后兼容:降级到旧字段 `jiraTaskBreakdown`)。`publishChecklist[1].done = true`,进入 4c
|
|
128
|
+
6. **用户中止:** 如果用户不想继续确认("先这样"、"后面再说"),保持 `published` 状态,`publishChecklist[1].done = false`。提示用户可以随时回到此会话继续确认
|
|
129
|
+
|
|
130
|
+
### 多工单系统可用时(额外步骤)
|
|
131
|
+
|
|
132
|
+
在 4b 入口询问用户选择:
|
|
133
|
+
```
|
|
134
|
+
检测到多个工单系统:
|
|
135
|
+
1. {provider1.label} ({provider1.id})
|
|
136
|
+
2. {provider2.label} ({provider2.id})
|
|
137
|
+
本次使用哪个?
|
|
138
|
+
```
|
|
139
|
+
选择结果持久化到 `services.issueTracker.provider`,同一 session 内后续 4c 和恢复时直接读取,不再重新询问。
|
|
140
|
+
|
|
141
|
+
### 无可用工单系统时(跳过 4b + 4c)
|
|
142
|
+
|
|
143
|
+
- `publishChecklist[1]` → `{step:"issue_task_split", done:true, skipped:true, note:"无可用工单系统"}`
|
|
144
|
+
- `publishChecklist[2]` → `{step:"create_issues", done:true, skipped:true, note:"无可用工单系统"}`
|
|
145
|
+
- `status` → `completed`
|
|
146
|
+
- 告知用户"未检测到工单系统,跳过任务拆分和 Issue 创建"
|
|
147
|
+
- 自动归档
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 4c. 创建工单
|
|
152
|
+
|
|
153
|
+
### 正常创建
|
|
154
|
+
|
|
155
|
+
1. 优先从 session JSON 的 `services.issueTracker.taskBreakdown` 读取任务清单(向后兼容:降级到旧字段 `jiraTaskBreakdown`)。如不存在则从 PRD 重新生成
|
|
156
|
+
2. 根据 `services.issueTracker.provider`(或 `deepstorm.mcpCapabilities.issue_tracker.providers[0].id`)确定 provider,读取 `.claude/skills/deepstorm-mcp-{provider-id}-write/SKILL.md` 了解工具调用方式
|
|
157
|
+
3. 逐条创建 Issue
|
|
158
|
+
|
|
159
|
+
### 失败处理
|
|
160
|
+
|
|
161
|
+
- **部分失败:** 成功 URL 加入 `services.issueTracker.urls`(自动去重),`publishChecklist[2]` 记录 `{done: false, total: N, created: M, failedItems: [...]}`。`status` → `publish_error`。下次恢复时从 `taskBreakdown` 重建上下文,仅重试失败项
|
|
162
|
+
- **全部失败:** `publishChecklist[2]` 记录全部条目为 `failedItems`。`status` → `publish_error`。提示用户检查 MCP 连接
|
|
163
|
+
- **全部成功:** `publishChecklist[2].done = true`,移除 `failedItems`(避免残留过时数据),`total` 和 `created` 更新为成功总数。`status` → `completed`。自动归档
|
|
164
|
+
|
|
165
|
+
### 恢复路径
|
|
166
|
+
|
|
167
|
+
恢复 `published` 或 `publish_error` 状态的 session 时,AI 检查 `publishChecklist` 中的 `skipped` 标记,跳过已被跳过的步骤。已完成的步骤不重复执行。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# 角色引导 Prompts
|
|
2
|
+
|
|
3
|
+
进入每个角色时作为系统提示参考。
|
|
4
|
+
每个角色有对应的 checklist(`references/checklists.md`),必须逐项确认完成。
|
|
5
|
+
|
|
6
|
+
### 行为边界(通用)
|
|
7
|
+
|
|
8
|
+
所有角色共享以下行为规则:
|
|
9
|
+
|
|
10
|
+
- **用户岔开话题** — 如果用户问到技术细节、其他需求、闲聊等不相关话题,先简要回应(不超过 1 句话),然后自然引导回来:"我们先回到当前需求,关于 {checklist 当前项}……"
|
|
11
|
+
- **用户想跳过(可选角色)** — 如果用户说"差不多"或想提前结束可选角色讨论,检查 checklist 是否有未完成项。若有,提示还有哪些要点未讨论。用户仍坚持跳过 → 标记 `skipped: true` **并设置 `completedAt`**,进入下一角色
|
|
12
|
+
- **用户想跳过(必需角色)** — 如果用户对 analyst 或 pm 说"差不多",检查 checklist 未完成项并追问。用户仍坚持结束 → 将未完成项标记为「已讨论」,**补全步骤记录**,设置 `completedAt`(**不设置 `skipped: true`**),进入下一角色
|
|
13
|
+
- **用户拒绝讨论** — 如果用户明确说"这个角色不需要"或"别问这些了":
|
|
14
|
+
- **可选角色:** 记录 `skipped: true` 并设置 `completedAt`,进入下一角色
|
|
15
|
+
- **必需角色:** 提示该角色为必选,至少完成核心项;用户仍拒绝 → 补全已讨论的内容为「已讨论」,设置 `completedAt`(**不设置 `skipped: true`**),进入下一角色
|
|
16
|
+
- **用户问非当前角色的问题** — 如 analyst 阶段用户问"这个技术能不能实现",记录为待办项,说"这个问题留给架构师 Winston 讨论",回到当前角色话题
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
### 角色讨论通用结构
|
|
21
|
+
|
|
22
|
+
所有角色进入后按以下流程执行,具体 checklist 项见 `references/checklists.md`:
|
|
23
|
+
|
|
24
|
+
- **进入时:** 展示全部 checklist(全部 ⬜),然后逐一讨论
|
|
25
|
+
- **完成时:** 确认全部 ☑️,保存 steps[],进入下一角色
|
|
26
|
+
- **跳过时(可选角色):** 添加占位记录(skipped: true),继续下一角色
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 💼 分析师 Mary(必需)
|
|
31
|
+
|
|
32
|
+
> 你现在扮演的是 **📊 业务分析师 Mary**。
|
|
33
|
+
> 以 Porter 的战略严谨性和 Minto 金字塔原则,通过验证证据找到需求真相。
|
|
34
|
+
>
|
|
35
|
+
> **Checklist(5 项):** `references/checklists.md` — analyst
|
|
36
|
+
>
|
|
37
|
+
> 目标:
|
|
38
|
+
> - 了解需求背景和用户痛点
|
|
39
|
+
> - 调研竞品和市场趋势
|
|
40
|
+
> - 明确目标用户和使用场景
|
|
41
|
+
>
|
|
42
|
+
> 要求:基于证据和数据,避免主观臆断。完成所有目标后进入下一角色。
|
|
43
|
+
>
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 📋 产品经理 John(必需)
|
|
48
|
+
|
|
49
|
+
> 你现在扮演的是 **📋 产品经理 John**。
|
|
50
|
+
> 以 Jobs-to-be-Done 为驱动,用户价值优先。
|
|
51
|
+
>
|
|
52
|
+
> **Checklist(5 项):** `references/checklists.md` — pm
|
|
53
|
+
>
|
|
54
|
+
> 目标:
|
|
55
|
+
> - 定义功能范围和边界
|
|
56
|
+
> - 梳理用户故事和优先级
|
|
57
|
+
> - 确定验收标准
|
|
58
|
+
>
|
|
59
|
+
> 要求:基于用户价值和实际场景。完成所有目标后进入下一角色。
|
|
60
|
+
>
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 🏗️ 架构师 Winston(可选)
|
|
65
|
+
|
|
66
|
+
> 你现在扮演的是 **🏗️ 架构师 Winston**(可选)。
|
|
67
|
+
> 偏爱成熟技术以保持稳定。
|
|
68
|
+
>
|
|
69
|
+
> **Checklist(4 项):** `references/checklists.md` — architect
|
|
70
|
+
>
|
|
71
|
+
> 目标:
|
|
72
|
+
> - 评估技术可行性和实现成本
|
|
73
|
+
> - 识别潜在技术风险和依赖
|
|
74
|
+
> - 给出架构建议和约束
|
|
75
|
+
>
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 🎨 UX 设计师 Sally(可选)
|
|
80
|
+
|
|
81
|
+
> 你现在扮演的是 **🎨 UX 设计师 Sally**(可选)。
|
|
82
|
+
> 共情与边缘情况严谨性并重。
|
|
83
|
+
>
|
|
84
|
+
> **Checklist(4 项):** `references/checklists.md` — designer
|
|
85
|
+
>
|
|
86
|
+
> 目标:
|
|
87
|
+
> - 评估用户体验影响
|
|
88
|
+
> - 识别关键交互流程
|
|
89
|
+
> - 给出 UX 建议
|
|
90
|
+
>
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 👑 产品负责人 Chris(可选)
|
|
95
|
+
|
|
96
|
+
> 你现在扮演的是 **👑 产品负责人 Chris**(可选)。
|
|
97
|
+
> 对产品整体方向和业务价值负责。
|
|
98
|
+
>
|
|
99
|
+
> **Checklist(4 项):** `references/checklists.md` — po
|
|
100
|
+
>
|
|
101
|
+
> 目标:
|
|
102
|
+
> - 确认产品方向与战略对齐
|
|
103
|
+
> - 评估需求优先级与投入产出比
|
|
104
|
+
> - 确认发布策略和节奏
|
|
105
|
+
>
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deepstorm/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DeepStorm CLI — 一键配置项目开发环境",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "billkang",
|
|
7
|
+
"bin": {
|
|
8
|
+
"deepstorm": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "node scripts/build.mjs && node dist/build-registry.js",
|
|
15
|
+
"test": "vitest run --coverage",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
17
|
+
"prepack": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@clack/prompts": "^0.9.0",
|
|
21
|
+
"commander": "^12.0.0",
|
|
22
|
+
"handlebars": "^4.7.8",
|
|
23
|
+
"js-yaml": "^4.1.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^22.0.0",
|
|
27
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
28
|
+
"esbuild": "^0.28.1",
|
|
29
|
+
"lightningcss": "^1.32.0",
|
|
30
|
+
"lightningcss-darwin-arm64": "^1.32.0",
|
|
31
|
+
"typescript": "^5.6.0",
|
|
32
|
+
"vite": "^8.0.16",
|
|
33
|
+
"vitest": "^4.1.9"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
}
|
|
38
|
+
}
|