draftgo-cli 4.0.23 → 4.0.24
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 +1 -1
- package/bin/draftgo.js +8 -8
- package/package.json +72 -72
- package/resources/custom-service-sdk/auth_test.go +1 -1
- package/resources/custom-service-sdk/manifest.json +11 -11
- package/resources/custom-service-sdk/platform.go +10 -3
- package/resources/custom-service-sdk/resources.go +1 -0
- package/resources/custom-service-sdk/resources_scope_test.go +10 -5
- package/resources/custom-service-sdk/sdk.go +4 -3
- package/resources/skill/SKILL.md +1 -1
- package/resources/skill/manifest.json +1 -1
- package/resources/skill/references/aihub.md +74 -74
- package/resources/skill/references/app-api.md +78 -78
- package/resources/skill/references/architecture.md +40 -40
- package/resources/skill/references/checkout.md +105 -105
- package/resources/skill/references/custom-services.md +4 -4
- package/resources/skill/references/data.md +168 -168
- package/resources/skill/references/methods.md +3 -0
- package/resources/skill/references/modules.md +47 -47
- package/resources/skill/references/runtime.md +95 -96
- package/resources/skill/story/SKILL.md +264 -264
- package/src/commands/help.js +72 -72
- package/src/commands/listTargets.js +12 -12
- package/src/commands/status.js +2 -2
- package/src/commands/uninstall.js +45 -45
- package/src/commands/update.js +20 -20
- package/src/customServices.js +5 -4
- package/src/detect.js +14 -14
- package/src/fsx.js +67 -67
- package/src/index.js +25 -25
- package/src/localRuntime/detect.js +76 -76
- package/src/localRuntime/mysqlClient.js +138 -138
- package/src/logger.js +37 -37
- package/src/mcp/client.js +586 -595
- package/src/mcp/hosts.js +520 -520
- package/src/mcp/protocol.js +167 -167
- package/src/prompt.js +94 -94
- package/src/updateCheck.js +16 -16
|
@@ -1,265 +1,265 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: draftgo-story
|
|
3
|
-
description: "Use this skill to build, load, evolve, or conflict-check the project's Story file (.draftgo/story.yaml). Use it when the user requests product-story work, when an existing Story conflicts with a requested product decision, or when preserving a durable product decision is valuable."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# DraftGo Story System
|
|
7
|
-
|
|
8
|
-
> Story 记录产品身份、设计总述、长期决策和当前方向。项目已有 Story 且请求触及定位或既有决策时加载;用户要求或形成需要长期保留的产品决策时创建或更新。
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## 核心原则
|
|
13
|
-
|
|
14
|
-
| 原则 | 含义 |
|
|
15
|
-
|------|------|
|
|
16
|
-
| Decision record | 记录会影响后续取舍的产品定位与决策 |
|
|
17
|
-
| AI 维护,人确认 | 开发者只聊天,AI 负责提炼和写入 |
|
|
18
|
-
| 三层结构 | 身份(稳) → 决策(只增) → 当前(频变) |
|
|
19
|
-
| 决策日志最值钱 | 取舍依据是代码永远表达不了的信息 |
|
|
20
|
-
| 工具无关 | 使用可移植的 YAML 文件 |
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 文件位置与结构
|
|
25
|
-
|
|
26
|
-
**路径:** `.draftgo/story.yaml`(项目根,进 git)
|
|
27
|
-
|
|
28
|
-
```yaml
|
|
29
|
-
# .draftgo/story.yaml
|
|
30
|
-
meta:
|
|
31
|
-
version: 1
|
|
32
|
-
created: YYYY-MM-DD
|
|
33
|
-
last_touched: YYYY-MM-DD
|
|
34
|
-
maturity: seed # seed | growing | stable
|
|
35
|
-
|
|
36
|
-
# === 第一层:身份(极少变动)===
|
|
37
|
-
identity:
|
|
38
|
-
what: "一句话讲清这是什么,不超过 30 字"
|
|
39
|
-
why: |
|
|
40
|
-
解决什么具体痛点,给谁用。
|
|
41
|
-
用两三句具体描述说明使用者和场景。
|
|
42
|
-
not:
|
|
43
|
-
- "不是 XX"
|
|
44
|
-
- "不变成 YY"
|
|
45
|
-
|
|
46
|
-
# === 第二层:设计总述(随功能演进更新)===
|
|
47
|
-
design:
|
|
48
|
-
overview: |
|
|
49
|
-
用一段话描述系统的核心流转逻辑。
|
|
50
|
-
用户从哪进来 → 经过什么 → 得到什么价值。
|
|
51
|
-
管理侧怎么运作。
|
|
52
|
-
modules:
|
|
53
|
-
- name: "模块名"
|
|
54
|
-
role: "这个模块在系统里的定位(核心/辅助/基座),一句话"
|
|
55
|
-
|
|
56
|
-
# === 第三层:决策日志(只增不删)===
|
|
57
|
-
decisions:
|
|
58
|
-
- id: D001
|
|
59
|
-
date: YYYY-MM-DD
|
|
60
|
-
chose: "选了什么"
|
|
61
|
-
over: "拒绝了什么"
|
|
62
|
-
because: "原因(短,能解释取舍依据)"
|
|
63
|
-
status: active # active | superseded
|
|
64
|
-
# superseded_by: D00X # 被覆盖时填
|
|
65
|
-
|
|
66
|
-
# === 第四层:当前方向(频繁更新)===
|
|
67
|
-
now:
|
|
68
|
-
focus: "当前阶段在做什么"
|
|
69
|
-
next: "下一步的大致方向"
|
|
70
|
-
open_questions:
|
|
71
|
-
- "还没想清楚的事"
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## 触发协议
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
需要 Story 时:
|
|
80
|
-
|
|
81
|
-
1. 静默检查 .draftgo/story.yaml
|
|
82
|
-
2. 分流:
|
|
83
|
-
├─ 不存在 → 用户要求创建或需要沉淀关键决策时,进入「构建流程」
|
|
84
|
-
├─ maturity = seed → 加载并把不确定项作为后续判断背景
|
|
85
|
-
└─ growing / stable → 静默加载,直接开始
|
|
86
|
-
3. 整个对话期间,Story 作为最高优先级上下文锚定
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## 构建流程
|
|
92
|
-
|
|
93
|
-
### 路径选择(先判断再走)
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
通过 MCP 实时摘要和项目内可保留的决策记录判断走哪条路径:
|
|
97
|
-
|
|
98
|
-
├─ MCP 显示存在用户自建内容(非 tag="系统" 的页面、db_meta、custom_scripts)→ 路径 A
|
|
99
|
-
├─ 用户提供了设计文档(PRD、原型图描述、需求文档等)→ 路径 A(以文档为分析素材)
|
|
100
|
-
└─ 只有内置系统页面,无用户自建内容,无设计文档 → 路径 B(对话采集)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### 路径 A:已有系统或已有设计文档
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
输出:[ Story 文件生成中...正在分析项目 ]
|
|
107
|
-
|
|
108
|
-
1. 查询项目结构(以及读取用户提供的设计文档,如有):
|
|
109
|
-
- MCP project_overview/resource_list → 资源总览
|
|
110
|
-
- MCP resource_search/get_metadata → 页面与导航元数据(跳过 tag="系统" 的内置页)
|
|
111
|
-
- MCP api_search/api_describe/api_call → db_meta 与自定义服务结构
|
|
112
|
-
- 只有必须分析完整 pages/nav/docs 正文时才 checkout;不要要求 MCP 返回全文
|
|
1
|
+
---
|
|
2
|
+
name: draftgo-story
|
|
3
|
+
description: "Use this skill to build, load, evolve, or conflict-check the project's Story file (.draftgo/story.yaml). Use it when the user requests product-story work, when an existing Story conflicts with a requested product decision, or when preserving a durable product decision is valuable."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DraftGo Story System
|
|
7
|
+
|
|
8
|
+
> Story 记录产品身份、设计总述、长期决策和当前方向。项目已有 Story 且请求触及定位或既有决策时加载;用户要求或形成需要长期保留的产品决策时创建或更新。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 核心原则
|
|
13
|
+
|
|
14
|
+
| 原则 | 含义 |
|
|
15
|
+
|------|------|
|
|
16
|
+
| Decision record | 记录会影响后续取舍的产品定位与决策 |
|
|
17
|
+
| AI 维护,人确认 | 开发者只聊天,AI 负责提炼和写入 |
|
|
18
|
+
| 三层结构 | 身份(稳) → 决策(只增) → 当前(频变) |
|
|
19
|
+
| 决策日志最值钱 | 取舍依据是代码永远表达不了的信息 |
|
|
20
|
+
| 工具无关 | 使用可移植的 YAML 文件 |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 文件位置与结构
|
|
25
|
+
|
|
26
|
+
**路径:** `.draftgo/story.yaml`(项目根,进 git)
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
# .draftgo/story.yaml
|
|
30
|
+
meta:
|
|
31
|
+
version: 1
|
|
32
|
+
created: YYYY-MM-DD
|
|
33
|
+
last_touched: YYYY-MM-DD
|
|
34
|
+
maturity: seed # seed | growing | stable
|
|
35
|
+
|
|
36
|
+
# === 第一层:身份(极少变动)===
|
|
37
|
+
identity:
|
|
38
|
+
what: "一句话讲清这是什么,不超过 30 字"
|
|
39
|
+
why: |
|
|
40
|
+
解决什么具体痛点,给谁用。
|
|
41
|
+
用两三句具体描述说明使用者和场景。
|
|
42
|
+
not:
|
|
43
|
+
- "不是 XX"
|
|
44
|
+
- "不变成 YY"
|
|
45
|
+
|
|
46
|
+
# === 第二层:设计总述(随功能演进更新)===
|
|
47
|
+
design:
|
|
48
|
+
overview: |
|
|
49
|
+
用一段话描述系统的核心流转逻辑。
|
|
50
|
+
用户从哪进来 → 经过什么 → 得到什么价值。
|
|
51
|
+
管理侧怎么运作。
|
|
52
|
+
modules:
|
|
53
|
+
- name: "模块名"
|
|
54
|
+
role: "这个模块在系统里的定位(核心/辅助/基座),一句话"
|
|
55
|
+
|
|
56
|
+
# === 第三层:决策日志(只增不删)===
|
|
57
|
+
decisions:
|
|
58
|
+
- id: D001
|
|
59
|
+
date: YYYY-MM-DD
|
|
60
|
+
chose: "选了什么"
|
|
61
|
+
over: "拒绝了什么"
|
|
62
|
+
because: "原因(短,能解释取舍依据)"
|
|
63
|
+
status: active # active | superseded
|
|
64
|
+
# superseded_by: D00X # 被覆盖时填
|
|
65
|
+
|
|
66
|
+
# === 第四层:当前方向(频繁更新)===
|
|
67
|
+
now:
|
|
68
|
+
focus: "当前阶段在做什么"
|
|
69
|
+
next: "下一步的大致方向"
|
|
70
|
+
open_questions:
|
|
71
|
+
- "还没想清楚的事"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 触发协议
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
需要 Story 时:
|
|
80
|
+
|
|
81
|
+
1. 静默检查 .draftgo/story.yaml
|
|
82
|
+
2. 分流:
|
|
83
|
+
├─ 不存在 → 用户要求创建或需要沉淀关键决策时,进入「构建流程」
|
|
84
|
+
├─ maturity = seed → 加载并把不确定项作为后续判断背景
|
|
85
|
+
└─ growing / stable → 静默加载,直接开始
|
|
86
|
+
3. 整个对话期间,Story 作为最高优先级上下文锚定
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 构建流程
|
|
92
|
+
|
|
93
|
+
### 路径选择(先判断再走)
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
通过 MCP 实时摘要和项目内可保留的决策记录判断走哪条路径:
|
|
97
|
+
|
|
98
|
+
├─ MCP 显示存在用户自建内容(非 tag="系统" 的页面、db_meta、custom_scripts)→ 路径 A
|
|
99
|
+
├─ 用户提供了设计文档(PRD、原型图描述、需求文档等)→ 路径 A(以文档为分析素材)
|
|
100
|
+
└─ 只有内置系统页面,无用户自建内容,无设计文档 → 路径 B(对话采集)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 路径 A:已有系统或已有设计文档
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
输出:[ Story 文件生成中...正在分析项目 ]
|
|
107
|
+
|
|
108
|
+
1. 查询项目结构(以及读取用户提供的设计文档,如有):
|
|
109
|
+
- MCP project_overview/resource_list → 资源总览
|
|
110
|
+
- MCP resource_search/get_metadata → 页面与导航元数据(跳过 tag="系统" 的内置页)
|
|
111
|
+
- MCP api_search/api_describe/api_call → db_meta 与自定义服务结构
|
|
112
|
+
- 只有必须分析完整 pages/nav/docs 正文时才 checkout;不要要求 MCP 返回全文
|
|
113
113
|
- .draftgo/worklog.md → 工作进度与完成记录
|
|
114
|
-
- .draftgo/lessons/ → 开发经验记录
|
|
115
|
-
- 用户提供的设计文档(PRD / 原型说明 / 需求文档)→ 提取产品意图
|
|
116
|
-
|
|
117
|
-
2. 从已有数据推断系统画像,生成推断版 Story(含 design.overview 和 modules)
|
|
118
|
-
|
|
119
|
-
3. 向开发者复述(带 ❓ 标记不确定项):
|
|
120
|
-
"我看下来这个系统是【X】,给【Y】用,主要解决【Z】。对吗?"
|
|
121
|
-
|
|
122
|
-
4. 关键确认(最多 3-5 个问题,追问必带推测):
|
|
123
|
-
- 身份是否准确
|
|
124
|
-
- 有没有重要的"不做什么"我漏了
|
|
125
|
-
- 核心流转和模块定位是否准确
|
|
126
|
-
- 当前最关心的方向是什么
|
|
127
|
-
|
|
128
|
-
5. 落盘 .draftgo/story.yaml (maturity: growing)
|
|
129
|
-
|
|
130
|
-
6. 回到开发者最初的请求
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### 路径 B:全新系统(只有 DraftGo 脚手架和内置系统页面,无用户自建内容)
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
输出:[ 检测到全新项目,先聊一下你想做什么 ]
|
|
137
|
-
|
|
138
|
-
通过简短对话采集,信息足够后即进入提炼:
|
|
139
|
-
|
|
140
|
-
Q1: 这个系统的整体定位和存在理由是什么?
|
|
141
|
-
Q2: 谁会用它?什么场景下用?
|
|
142
|
-
Q3: 类似的东西可能有哪些?你想做出什么不同?
|
|
143
|
-
Q4: 大致有哪些模块/功能块?它们之间怎么串起来?
|
|
144
|
-
Q5: 第一版能用,最少要包含什么?
|
|
145
|
-
|
|
146
|
-
→ 提炼 → 复述确认 → 落盘 (maturity: seed) → 开始开发
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
**克制原则**:问到够用就停,开发者回答很简短时不追问细节。
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## 加载策略
|
|
154
|
-
|
|
155
|
-
每次新对话开头,AI 内部执行:
|
|
156
|
-
|
|
157
|
-
```
|
|
158
|
-
1. 读取 .draftgo/story.yaml 全文 → 作为最高优先级上下文
|
|
159
|
-
2. 解析 design → 理解系统核心流转和模块定位
|
|
160
|
-
3. 解析 decisions(status: active)→ 提取产品取舍依据
|
|
161
|
-
4. 解析 identity.not → 建立硬边界
|
|
162
|
-
5. 解析 now → 知道当前重点
|
|
163
|
-
6. open_questions → 适时主动追问
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## 冲突检测
|
|
169
|
-
|
|
170
|
-
**触发条件:**
|
|
171
|
-
- 请求触碰 `identity.not` 边界
|
|
172
|
-
- 请求方向偏离 `now.focus` 过远
|
|
173
|
-
- 请求与某个 active 状态的 decision 取舍相反
|
|
174
|
-
|
|
175
|
-
**AI 行为:不直接拒绝,也不默默服从,明确摊牌。**
|
|
176
|
-
|
|
177
|
-
示例输出格式:
|
|
178
|
-
|
|
179
|
-
```
|
|
180
|
-
这个请求和 Story 有冲突:
|
|
181
|
-
|
|
182
|
-
identity.not: "不是给业务运营人员用的低代码平台"
|
|
183
|
-
D001: "做后台脚手架" over "做完整 SaaS 框架"
|
|
184
|
-
|
|
185
|
-
你想怎么处理:
|
|
186
|
-
|
|
187
|
-
A) 想法变了 → 我更新 Story(旧决策标 superseded,新增决策记录转向原因)
|
|
188
|
-
B) 双轨并行 → 扩展受众,保留原有定位
|
|
189
|
-
C) 只是特例 → 这次按新方向做,Story 不动
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
用户选 A 时:把相关 decisions 标记 `status: superseded` + `superseded_by: D00X`,更新 identity,新增决策条目记录这次转向。
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## 主动沉淀
|
|
197
|
-
|
|
198
|
-
AI 在开发过程中检测到"方向性决策"时,主动提议沉淀:
|
|
199
|
-
|
|
200
|
-
**触发条件:**
|
|
201
|
-
- 开发者明确拒绝了某个建议("不要这样做")
|
|
202
|
-
- 开发者在两个方案中做了选择
|
|
203
|
-
- 开发者表达了对系统定位、功能边界或文案语气的偏好
|
|
204
|
-
|
|
205
|
-
**AI 行为:**
|
|
206
|
-
|
|
207
|
-
```
|
|
208
|
-
刚才你选了 X 而不是 Y,看起来是因为【...】。
|
|
209
|
-
要记到 Story decisions 里吗?以后我做类似判断会用这个原则。
|
|
210
|
-
|
|
211
|
-
→ [是] / [否] / [改改措辞]
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## now 的更新
|
|
217
|
-
|
|
218
|
-
每次对话结束时(或里程碑达成),AI 可以提议:
|
|
219
|
-
|
|
220
|
-
```
|
|
221
|
-
今天我们做了 X、Y、Z。要更新 story.yaml 的 now 部分吗?
|
|
222
|
-
当前是【...】,看起来可以改成【...】
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
开发者确认后更新 `now.focus` / `now.next` / `now.open_questions`,同时更新 `meta.last_touched`。
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
## 维护规则
|
|
230
|
-
|
|
231
|
-
| 字段 | 更新频率 | 规则 |
|
|
232
|
-
|------|---------|------|
|
|
233
|
-
| `identity.*` | 极少 | 仅重大方向转向时(冲突检测中确认) |
|
|
234
|
-
| `design.overview` | 里程碑级 | 核心流转发生结构性变化时更新 |
|
|
235
|
-
| `design.modules` | 新增模块时 | 只增/改,不删已有模块(模块下线标注即可) |
|
|
236
|
-
| `decisions` | 只增不删 | supersede 时不删旧的只标记 |
|
|
237
|
-
| `now.focus` | 周/里程碑 | 对话结束时 AI 提议更新 |
|
|
238
|
-
| `now.next` | 周 | 同上 |
|
|
239
|
-
| `now.open_questions` | 随时 | 出现新的悬而未决事项 |
|
|
240
|
-
| `meta.last_touched` | 每次更新 | 自动 |
|
|
241
|
-
| `meta.maturity` | 手动 | seed→growing: 首次确认后; growing→stable: 决策≥5条且identity不再变 |
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## 操作流程汇总
|
|
246
|
-
|
|
247
|
-
### 构建 Story
|
|
248
|
-
|
|
249
|
-
1. 检查 `.draftgo/story.yaml` 是否存在
|
|
250
|
-
2. 不存在 → 根据 MCP project_overview/resource_list 和用户提供的设计材料判断路径 A 还是 B
|
|
251
|
-
3. 走对应构建流程
|
|
252
|
-
4. 落盘 → 回到用户原始请求
|
|
253
|
-
|
|
254
|
-
### 更新 Story(冲突 / 沉淀 / now 更新)
|
|
255
|
-
|
|
256
|
-
1. Read `.draftgo/story.yaml`
|
|
257
|
-
2. 修改对应字段
|
|
258
|
-
3. 更新 `meta.last_touched`
|
|
259
|
-
4. Write 回去
|
|
260
|
-
|
|
261
|
-
### 加载 Story(每次对话)
|
|
262
|
-
|
|
263
|
-
1. Read `.draftgo/story.yaml`
|
|
264
|
-
2. 作为上下文锚定,不输出给用户(静默)
|
|
265
|
-
3. 如果 `maturity: seed`,提示"Story 还在早期,开发中会持续补充"
|
|
114
|
+
- .draftgo/lessons/ → 开发经验记录
|
|
115
|
+
- 用户提供的设计文档(PRD / 原型说明 / 需求文档)→ 提取产品意图
|
|
116
|
+
|
|
117
|
+
2. 从已有数据推断系统画像,生成推断版 Story(含 design.overview 和 modules)
|
|
118
|
+
|
|
119
|
+
3. 向开发者复述(带 ❓ 标记不确定项):
|
|
120
|
+
"我看下来这个系统是【X】,给【Y】用,主要解决【Z】。对吗?"
|
|
121
|
+
|
|
122
|
+
4. 关键确认(最多 3-5 个问题,追问必带推测):
|
|
123
|
+
- 身份是否准确
|
|
124
|
+
- 有没有重要的"不做什么"我漏了
|
|
125
|
+
- 核心流转和模块定位是否准确
|
|
126
|
+
- 当前最关心的方向是什么
|
|
127
|
+
|
|
128
|
+
5. 落盘 .draftgo/story.yaml (maturity: growing)
|
|
129
|
+
|
|
130
|
+
6. 回到开发者最初的请求
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 路径 B:全新系统(只有 DraftGo 脚手架和内置系统页面,无用户自建内容)
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
输出:[ 检测到全新项目,先聊一下你想做什么 ]
|
|
137
|
+
|
|
138
|
+
通过简短对话采集,信息足够后即进入提炼:
|
|
139
|
+
|
|
140
|
+
Q1: 这个系统的整体定位和存在理由是什么?
|
|
141
|
+
Q2: 谁会用它?什么场景下用?
|
|
142
|
+
Q3: 类似的东西可能有哪些?你想做出什么不同?
|
|
143
|
+
Q4: 大致有哪些模块/功能块?它们之间怎么串起来?
|
|
144
|
+
Q5: 第一版能用,最少要包含什么?
|
|
145
|
+
|
|
146
|
+
→ 提炼 → 复述确认 → 落盘 (maturity: seed) → 开始开发
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**克制原则**:问到够用就停,开发者回答很简短时不追问细节。
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 加载策略
|
|
154
|
+
|
|
155
|
+
每次新对话开头,AI 内部执行:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
1. 读取 .draftgo/story.yaml 全文 → 作为最高优先级上下文
|
|
159
|
+
2. 解析 design → 理解系统核心流转和模块定位
|
|
160
|
+
3. 解析 decisions(status: active)→ 提取产品取舍依据
|
|
161
|
+
4. 解析 identity.not → 建立硬边界
|
|
162
|
+
5. 解析 now → 知道当前重点
|
|
163
|
+
6. open_questions → 适时主动追问
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 冲突检测
|
|
169
|
+
|
|
170
|
+
**触发条件:**
|
|
171
|
+
- 请求触碰 `identity.not` 边界
|
|
172
|
+
- 请求方向偏离 `now.focus` 过远
|
|
173
|
+
- 请求与某个 active 状态的 decision 取舍相反
|
|
174
|
+
|
|
175
|
+
**AI 行为:不直接拒绝,也不默默服从,明确摊牌。**
|
|
176
|
+
|
|
177
|
+
示例输出格式:
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
这个请求和 Story 有冲突:
|
|
181
|
+
|
|
182
|
+
identity.not: "不是给业务运营人员用的低代码平台"
|
|
183
|
+
D001: "做后台脚手架" over "做完整 SaaS 框架"
|
|
184
|
+
|
|
185
|
+
你想怎么处理:
|
|
186
|
+
|
|
187
|
+
A) 想法变了 → 我更新 Story(旧决策标 superseded,新增决策记录转向原因)
|
|
188
|
+
B) 双轨并行 → 扩展受众,保留原有定位
|
|
189
|
+
C) 只是特例 → 这次按新方向做,Story 不动
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
用户选 A 时:把相关 decisions 标记 `status: superseded` + `superseded_by: D00X`,更新 identity,新增决策条目记录这次转向。
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 主动沉淀
|
|
197
|
+
|
|
198
|
+
AI 在开发过程中检测到"方向性决策"时,主动提议沉淀:
|
|
199
|
+
|
|
200
|
+
**触发条件:**
|
|
201
|
+
- 开发者明确拒绝了某个建议("不要这样做")
|
|
202
|
+
- 开发者在两个方案中做了选择
|
|
203
|
+
- 开发者表达了对系统定位、功能边界或文案语气的偏好
|
|
204
|
+
|
|
205
|
+
**AI 行为:**
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
刚才你选了 X 而不是 Y,看起来是因为【...】。
|
|
209
|
+
要记到 Story decisions 里吗?以后我做类似判断会用这个原则。
|
|
210
|
+
|
|
211
|
+
→ [是] / [否] / [改改措辞]
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## now 的更新
|
|
217
|
+
|
|
218
|
+
每次对话结束时(或里程碑达成),AI 可以提议:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
今天我们做了 X、Y、Z。要更新 story.yaml 的 now 部分吗?
|
|
222
|
+
当前是【...】,看起来可以改成【...】
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
开发者确认后更新 `now.focus` / `now.next` / `now.open_questions`,同时更新 `meta.last_touched`。
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 维护规则
|
|
230
|
+
|
|
231
|
+
| 字段 | 更新频率 | 规则 |
|
|
232
|
+
|------|---------|------|
|
|
233
|
+
| `identity.*` | 极少 | 仅重大方向转向时(冲突检测中确认) |
|
|
234
|
+
| `design.overview` | 里程碑级 | 核心流转发生结构性变化时更新 |
|
|
235
|
+
| `design.modules` | 新增模块时 | 只增/改,不删已有模块(模块下线标注即可) |
|
|
236
|
+
| `decisions` | 只增不删 | supersede 时不删旧的只标记 |
|
|
237
|
+
| `now.focus` | 周/里程碑 | 对话结束时 AI 提议更新 |
|
|
238
|
+
| `now.next` | 周 | 同上 |
|
|
239
|
+
| `now.open_questions` | 随时 | 出现新的悬而未决事项 |
|
|
240
|
+
| `meta.last_touched` | 每次更新 | 自动 |
|
|
241
|
+
| `meta.maturity` | 手动 | seed→growing: 首次确认后; growing→stable: 决策≥5条且identity不再变 |
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 操作流程汇总
|
|
246
|
+
|
|
247
|
+
### 构建 Story
|
|
248
|
+
|
|
249
|
+
1. 检查 `.draftgo/story.yaml` 是否存在
|
|
250
|
+
2. 不存在 → 根据 MCP project_overview/resource_list 和用户提供的设计材料判断路径 A 还是 B
|
|
251
|
+
3. 走对应构建流程
|
|
252
|
+
4. 落盘 → 回到用户原始请求
|
|
253
|
+
|
|
254
|
+
### 更新 Story(冲突 / 沉淀 / now 更新)
|
|
255
|
+
|
|
256
|
+
1. Read `.draftgo/story.yaml`
|
|
257
|
+
2. 修改对应字段
|
|
258
|
+
3. 更新 `meta.last_touched`
|
|
259
|
+
4. Write 回去
|
|
260
|
+
|
|
261
|
+
### 加载 Story(每次对话)
|
|
262
|
+
|
|
263
|
+
1. Read `.draftgo/story.yaml`
|
|
264
|
+
2. 作为上下文锚定,不输出给用户(静默)
|
|
265
|
+
3. 如果 `maturity: seed`,提示"Story 还在早期,开发中会持续补充"
|